/ Hex Artifact Content
Login

Artifact 430ae75d8850ea9e3c7ceba8e05adb105300ddb4:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 23 69 6e 63 6c 75 64 65 20 22 77 68 65 72 65  .#include "where
0350: 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 52 65  Int.h"../*.** Re
0360: 74 75 72 6e 20 74 68 65 20 65 73 74 69 6d 61 74  turn the estimat
0370: 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  ed number of out
0380: 70 75 74 20 72 6f 77 73 20 66 72 6f 6d 20 61 20  put rows from a 
0390: 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2f 0a  WHERE clause.*/.
03a0: 75 36 34 20 73 71 6c 69 74 65 33 57 68 65 72 65  u64 sqlite3Where
03b0: 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 57  OutputRowCount(W
03c0: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
03d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
03e0: 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70  te3LogEstToInt(p
03f0: 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b  WInfo->nRowOut);
0400: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
0410: 20 6f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52   one of the WHER
0420: 45 5f 44 49 53 54 49 4e 43 54 5f 78 78 78 78 78  E_DISTINCT_xxxxx
0430: 20 76 61 6c 75 65 73 20 74 6f 20 69 6e 64 69 63   values to indic
0440: 61 74 65 20 68 6f 77 20 74 68 69 73 0a 2a 2a 20  ate how this.** 
0450: 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65 74  WHERE clause ret
0460: 75 72 6e 73 20 6f 75 74 70 75 74 73 20 66 6f 72  urns outputs for
0470: 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73   DISTINCT proces
0480: 73 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sing..*/.int sql
0490: 69 74 65 33 57 68 65 72 65 49 73 44 69 73 74 69  ite3WhereIsDisti
04a0: 6e 63 74 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  nct(WhereInfo *p
04b0: 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e  WInfo){.  return
04c0: 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
04d0: 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ct;.}../*.** Ret
04e0: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
04f0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65 74  WHERE clause ret
0500: 75 72 6e 73 20 72 6f 77 73 20 69 6e 20 4f 52 44  urns rows in ORD
0510: 45 52 20 42 59 20 6f 72 64 65 72 2e 0a 2a 2a 20  ER BY order..** 
0520: 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20  Return FALSE if 
0530: 74 68 65 20 6f 75 74 70 75 74 20 6e 65 65 64 73  the output needs
0540: 20 74 6f 20 62 65 20 73 6f 72 74 65 64 2e 0a 2a   to be sorted..*
0550: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  /.int sqlite3Whe
0560: 72 65 49 73 4f 72 64 65 72 65 64 28 57 68 65 72  reIsOrdered(Wher
0570: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
0580: 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d    return pWInfo-
0590: 3e 6e 4f 42 53 61 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  >nOBSat;.}../*.*
05a0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 44 42  * Return the VDB
05b0: 45 20 61 64 64 72 65 73 73 20 6f 72 20 6c 61 62  E address or lab
05c0: 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69 6e  el to jump to in
05d0: 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 74 69 6e   order to contin
05e0: 75 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  ue.** immediatel
05f0: 79 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20  y with the next 
0600: 72 6f 77 20 6f 66 20 61 20 57 48 45 52 45 20 63  row of a WHERE c
0610: 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  lause..*/.int sq
0620: 6c 69 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e  lite3WhereContin
0630: 75 65 4c 61 62 65 6c 28 57 68 65 72 65 49 6e 66  ueLabel(WhereInf
0640: 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 61 73  o *pWInfo){.  as
0650: 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 69 43  sert( pWInfo->iC
0660: 6f 6e 74 69 6e 75 65 21 3d 30 20 29 3b 0a 20 20  ontinue!=0 );.  
0670: 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 69  return pWInfo->i
0680: 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
0690: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 44  ** Return the VD
06a0: 42 45 20 61 64 64 72 65 73 73 20 6f 72 20 6c 61  BE address or la
06b0: 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69  bel to jump to i
06c0: 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 65 61 6b  n order to break
06d0: 0a 2a 2a 20 6f 75 74 20 6f 66 20 61 20 57 48 45  .** out of a WHE
06e0: 52 45 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20  RE loop..*/.int 
06f0: 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65 61  sqlite3WhereBrea
0700: 6b 4c 61 62 65 6c 28 57 68 65 72 65 49 6e 66 6f  kLabel(WhereInfo
0710: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74   *pWInfo){.  ret
0720: 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  urn pWInfo->iBre
0730: 61 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ak;.}../*.** Ret
0740: 75 72 6e 20 54 52 55 45 20 69 66 20 61 6e 20 55  urn TRUE if an U
0750: 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
0760: 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 20 6f 70  statement can op
0770: 65 72 61 74 65 20 64 69 72 65 63 74 6c 79 20 6f  erate directly o
0780: 6e 0a 2a 2a 20 74 68 65 20 72 6f 77 69 64 73 20  n.** the rowids 
0790: 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 57 48  returned by a WH
07a0: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 52 65 74  ERE clause.  Ret
07b0: 75 72 6e 20 46 41 4c 53 45 20 69 66 20 64 6f 69  urn FALSE if doi
07c0: 6e 67 20 61 6e 0a 2a 2a 20 55 50 44 41 54 45 20  ng an.** UPDATE 
07d0: 6f 72 20 44 45 4c 45 54 45 20 6d 69 67 68 74 20  or DELETE might 
07e0: 63 68 61 6e 67 65 20 73 75 62 73 65 71 75 65 6e  change subsequen
07f0: 74 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 72  t WHERE clause r
0800: 65 73 75 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  esults..**.** If
0810: 20 74 68 65 20 4f 4e 45 50 41 53 53 20 6f 70 74   the ONEPASS opt
0820: 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65  imization is use
0830: 64 20 28 69 66 20 74 68 69 73 20 72 6f 75 74 69  d (if this routi
0840: 6e 65 20 72 65 74 75 72 6e 73 20 74 72 75 65 29  ne returns true)
0850: 0a 2a 2a 20 74 68 65 6e 20 61 6c 73 6f 20 77 72  .** then also wr
0860: 69 74 65 20 74 68 65 20 69 6e 64 69 63 65 73 20  ite the indices 
0870: 6f 66 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 20  of open cursors 
0880: 75 73 65 64 20 62 79 20 4f 4e 45 50 41 53 53 0a  used by ONEPASS.
0890: 2a 2a 20 69 6e 74 6f 20 61 69 43 75 72 5b 30 5d  ** into aiCur[0]
08a0: 20 61 6e 64 20 61 69 43 75 72 5b 31 5d 2e 20 20   and aiCur[1].  
08b0: 69 61 43 75 72 5b 30 5d 20 67 65 74 73 20 74 68  iaCur[0] gets th
08c0: 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20  e cursor of the 
08d0: 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20 61 6e  data.** table an
08e0: 64 20 69 61 43 75 72 5b 31 5d 20 67 65 74 73 20  d iaCur[1] gets 
08f0: 74 68 65 20 63 75 72 73 6f 72 20 75 73 65 64 20  the cursor used 
0900: 62 79 20 61 6e 20 61 75 78 69 6c 69 61 72 79 20  by an auxiliary 
0910: 69 6e 64 65 78 2e 0a 2a 2a 20 45 69 74 68 65 72  index..** Either
0920: 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 2d 31   value may be -1
0930: 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61  , indicating tha
0940: 74 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  t cursor is not 
0950: 75 73 65 64 2e 0a 2a 2a 20 41 6e 79 20 63 75 72  used..** Any cur
0960: 73 6f 72 73 20 72 65 74 75 72 6e 65 64 20 77 69  sors returned wi
0970: 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65  ll have been ope
0980: 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67 2e  ned for writing.
0990: 0a 2a 2a 0a 2a 2a 20 61 69 43 75 72 5b 30 5d 20  .**.** aiCur[0] 
09a0: 61 6e 64 20 61 69 43 75 72 5b 31 5d 20 62 6f 74  and aiCur[1] bot
09b0: 68 20 67 65 74 20 2d 31 20 69 66 20 74 68 65 20  h get -1 if the 
09c0: 77 68 65 72 65 2d 63 6c 61 75 73 65 20 6c 6f 67  where-clause log
09d0: 69 63 20 69 73 0a 2a 2a 20 75 6e 61 62 6c 65 20  ic is.** unable 
09e0: 74 6f 20 75 73 65 20 74 68 65 20 4f 4e 45 50 41  to use the ONEPA
09f0: 53 53 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  SS optimization.
0a00: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57  .*/.int sqlite3W
0a10: 68 65 72 65 4f 6b 4f 6e 65 50 61 73 73 28 57 68  hereOkOnePass(Wh
0a20: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
0a30: 20 69 6e 74 20 2a 61 69 43 75 72 29 7b 0a 20 20   int *aiCur){.  
0a40: 6d 65 6d 63 70 79 28 61 69 43 75 72 2c 20 70 57  memcpy(aiCur, pW
0a50: 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61  Info->aiCurOnePa
0a60: 73 73 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a  ss, sizeof(int)*
0a70: 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49  2);.  return pWI
0a80: 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 3b 0a  nfo->okOnePass;.
0a90: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
0aa0: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 53 72  e content of pSr
0ab0: 63 20 69 6e 74 6f 20 70 44 65 73 74 0a 2a 2f 0a  c into pDest.*/.
0ac0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
0ad0: 65 4f 72 4d 6f 76 65 28 57 68 65 72 65 4f 72 53  eOrMove(WhereOrS
0ae0: 65 74 20 2a 70 44 65 73 74 2c 20 57 68 65 72 65  et *pDest, Where
0af0: 4f 72 53 65 74 20 2a 70 53 72 63 29 7b 0a 20 20  OrSet *pSrc){.  
0b00: 70 44 65 73 74 2d 3e 6e 20 3d 20 70 53 72 63 2d  pDest->n = pSrc-
0b10: 3e 6e 3b 0a 20 20 6d 65 6d 63 70 79 28 70 44 65  >n;.  memcpy(pDe
0b20: 73 74 2d 3e 61 2c 20 70 53 72 63 2d 3e 61 2c 20  st->a, pSrc->a, 
0b30: 70 44 65 73 74 2d 3e 6e 2a 73 69 7a 65 6f 66 28  pDest->n*sizeof(
0b40: 70 44 65 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 7d  pDest->a[0]));.}
0b50: 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 69  ../*.** Try to i
0b60: 6e 73 65 72 74 20 61 20 6e 65 77 20 70 72 65 72  nsert a new prer
0b70: 65 71 75 69 73 69 74 65 2f 63 6f 73 74 20 65 6e  equisite/cost en
0b80: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 57 68 65  try into the Whe
0b90: 72 65 4f 72 53 65 74 20 70 53 65 74 2e 0a 2a 2a  reOrSet pSet..**
0ba0: 0a 2a 2a 20 54 68 65 20 6e 65 77 20 65 6e 74 72  .** The new entr
0bb0: 79 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69 74  y might overwrit
0bc0: 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65 6e  e an existing en
0bd0: 74 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68 74  try, or it might
0be0: 20 62 65 0a 2a 2a 20 61 70 70 65 6e 64 65 64 2c   be.** appended,
0bf0: 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65 20   or it might be 
0c00: 64 69 73 63 61 72 64 65 64 2e 20 20 44 6f 20 77  discarded.  Do w
0c10: 68 61 74 65 76 65 72 20 69 73 20 74 68 65 20 72  hatever is the r
0c20: 69 67 68 74 20 74 68 69 6e 67 0a 2a 2a 20 73 6f  ight thing.** so
0c30: 20 74 68 61 74 20 70 53 65 74 20 6b 65 65 70 73   that pSet keeps
0c40: 20 74 68 65 20 4e 5f 4f 52 5f 43 4f 53 54 20 62   the N_OR_COST b
0c50: 65 73 74 20 65 6e 74 72 69 65 73 20 73 65 65 6e  est entries seen
0c60: 20 73 6f 20 66 61 72 2e 0a 2a 2f 0a 73 74 61 74   so far..*/.stat
0c70: 69 63 20 69 6e 74 20 77 68 65 72 65 4f 72 49 6e  ic int whereOrIn
0c80: 73 65 72 74 28 0a 20 20 57 68 65 72 65 4f 72 53  sert(.  WhereOrS
0c90: 65 74 20 2a 70 53 65 74 2c 20 20 20 20 20 20 2f  et *pSet,      /
0ca0: 2a 20 54 68 65 20 57 68 65 72 65 4f 72 53 65 74  * The WhereOrSet
0cb0: 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 2a   to be updated *
0cc0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72  /.  Bitmask prer
0cd0: 65 71 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 72  eq,        /* Pr
0ce0: 65 72 65 71 75 69 73 69 74 65 73 20 6f 66 20 74  erequisites of t
0cf0: 68 65 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a  he new entry */.
0d00: 20 20 4c 6f 67 45 73 74 20 72 52 75 6e 2c 20 20    LogEst rRun,  
0d10: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 75 6e 2d           /* Run-
0d20: 63 6f 73 74 20 6f 66 20 74 68 65 20 6e 65 77 20  cost of the new 
0d30: 65 6e 74 72 79 20 2a 2f 0a 20 20 4c 6f 67 45 73  entry */.  LogEs
0d40: 74 20 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20  t nOut          
0d50: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
0d60: 75 74 70 75 74 73 20 66 6f 72 20 74 68 65 20 6e  utputs for the n
0d70: 65 77 20 65 6e 74 72 79 20 2a 2f 0a 29 7b 0a 20  ew entry */.){. 
0d80: 20 75 31 36 20 69 3b 0a 20 20 57 68 65 72 65 4f   u16 i;.  WhereO
0d90: 72 43 6f 73 74 20 2a 70 3b 0a 20 20 66 6f 72 28  rCost *p;.  for(
0da0: 69 3d 70 53 65 74 2d 3e 6e 2c 20 70 3d 70 53 65  i=pSet->n, p=pSe
0db0: 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  t->a; i>0; i--, 
0dc0: 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 72 52  p++){.    if( rR
0dd0: 75 6e 3c 3d 70 2d 3e 72 52 75 6e 20 26 26 20 28  un<=p->rRun && (
0de0: 70 72 65 72 65 71 20 26 20 70 2d 3e 70 72 65 72  prereq & p->prer
0df0: 65 71 29 3d 3d 70 72 65 72 65 71 20 29 7b 0a 20  eq)==prereq ){. 
0e00: 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 4f       goto whereO
0e10: 72 49 6e 73 65 72 74 5f 64 6f 6e 65 3b 0a 20 20  rInsert_done;.  
0e20: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 72    }.    if( p->r
0e30: 52 75 6e 3c 3d 72 52 75 6e 20 26 26 20 28 70 2d  Run<=rRun && (p-
0e40: 3e 70 72 65 72 65 71 20 26 20 70 72 65 72 65 71  >prereq & prereq
0e50: 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20 29 7b 0a  )==p->prereq ){.
0e60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
0e70: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
0e80: 70 53 65 74 2d 3e 6e 3c 4e 5f 4f 52 5f 43 4f 53  pSet->n<N_OR_COS
0e90: 54 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 53  T ){.    p = &pS
0ea0: 65 74 2d 3e 61 5b 70 53 65 74 2d 3e 6e 2b 2b 5d  et->a[pSet->n++]
0eb0: 3b 0a 20 20 20 20 70 2d 3e 6e 4f 75 74 20 3d 20  ;.    p->nOut = 
0ec0: 6e 4f 75 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nOut;.  }else{. 
0ed0: 20 20 20 70 20 3d 20 70 53 65 74 2d 3e 61 3b 0a     p = pSet->a;.
0ee0: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70      for(i=1; i<p
0ef0: 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Set->n; i++){.  
0f00: 20 20 20 20 69 66 28 20 70 2d 3e 72 52 75 6e 3e      if( p->rRun>
0f10: 70 53 65 74 2d 3e 61 5b 69 5d 2e 72 52 75 6e 20  pSet->a[i].rRun 
0f20: 29 20 70 20 3d 20 70 53 65 74 2d 3e 61 20 2b 20  ) p = pSet->a + 
0f30: 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  i;.    }.    if(
0f40: 20 70 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20 29   p->rRun<=rRun )
0f50: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 77   return 0;.  }.w
0f60: 68 65 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f 6e  hereOrInsert_don
0f70: 65 3a 0a 20 20 70 2d 3e 70 72 65 72 65 71 20 3d  e:.  p->prereq =
0f80: 20 70 72 65 72 65 71 3b 0a 20 20 70 2d 3e 72 52   prereq;.  p->rR
0f90: 75 6e 20 3d 20 72 52 75 6e 3b 0a 20 20 69 66 28  un = rRun;.  if(
0fa0: 20 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29 20   p->nOut>nOut ) 
0fb0: 70 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 3b 0a  p->nOut = nOut;.
0fc0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
0fd0: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
0fe0: 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 57  a preallocated W
0ff0: 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63  hereClause struc
1000: 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
1010: 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73 65  void whereClause
1020: 49 6e 69 74 28 0a 20 20 57 68 65 72 65 43 6c 61  Init(.  WhereCla
1030: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
1040: 20 2f 2a 20 54 68 65 20 57 68 65 72 65 43 6c 61   /* The WhereCla
1050: 75 73 65 20 74 6f 20 62 65 20 69 6e 69 74 69 61  use to be initia
1060: 6c 69 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72 65  lized */.  Where
1070: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 20 20 20  Info *pWInfo    
1080: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
1090: 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74   processing cont
10a0: 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 70 57 43 2d  ext */.){.  pWC-
10b0: 3e 70 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f  >pWInfo = pWInfo
10c0: 3b 0a 20 20 70 57 43 2d 3e 70 4f 75 74 65 72 20  ;.  pWC->pOuter 
10d0: 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 54 65 72  = 0;.  pWC->nTer
10e0: 6d 20 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 53  m = 0;.  pWC->nS
10f0: 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65 28  lot = ArraySize(
1100: 70 57 43 2d 3e 61 53 74 61 74 69 63 29 3b 0a 20  pWC->aStatic);. 
1110: 20 70 57 43 2d 3e 61 20 3d 20 70 57 43 2d 3e 61   pWC->a = pWC->a
1120: 53 74 61 74 69 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  Static;.}../* Fo
1130: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
1140: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
1150: 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28  hereClauseClear(
1160: 57 68 65 72 65 43 6c 61 75 73 65 2a 29 3b 0a 0a  WhereClause*);..
1170: 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65  /*.** Deallocate
1180: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f   all memory asso
1190: 63 69 61 74 65 64 20 77 69 74 68 20 61 20 57 68  ciated with a Wh
11a0: 65 72 65 4f 72 49 6e 66 6f 20 6f 62 6a 65 63 74  ereOrInfo object
11b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11c0: 20 77 68 65 72 65 4f 72 49 6e 66 6f 44 65 6c 65   whereOrInfoDele
11d0: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
11e0: 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70 29 7b  WhereOrInfo *p){
11f0: 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c  .  whereClauseCl
1200: 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20 73  ear(&p->wc);.  s
1210: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1220: 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   p);.}../*.** De
1230: 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d  allocate all mem
1240: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
1250: 69 74 68 20 61 20 57 68 65 72 65 41 6e 64 49 6e  ith a WhereAndIn
1260: 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  fo object..*/.st
1270: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 41  atic void whereA
1280: 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c  ndInfoDelete(sql
1290: 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 41  ite3 *db, WhereA
12a0: 6e 64 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 77 68  ndInfo *p){.  wh
12b0: 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26  ereClauseClear(&
12c0: 70 2d 3e 77 63 29 3b 0a 20 20 73 71 6c 69 74 65  p->wc);.  sqlite
12d0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
12e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  }../*.** Dealloc
12f0: 61 74 65 20 61 20 57 68 65 72 65 43 6c 61 75 73  ate a WhereClaus
1300: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  e structure.  Th
1310: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  e WhereClause st
1320: 72 75 63 74 75 72 65 0a 2a 2a 20 69 74 73 65 6c  ructure.** itsel
1330: 66 20 69 73 20 6e 6f 74 20 66 72 65 65 64 2e 20  f is not freed. 
1340: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1350: 20 74 68 65 20 69 6e 76 65 72 73 65 20 6f 66 20   the inverse of 
1360: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28  whereClauseInit(
1370: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
1380: 64 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65  d whereClauseCle
1390: 61 72 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a  ar(WhereClause *
13a0: 70 57 43 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  pWC){.  int i;. 
13b0: 20 57 68 65 72 65 54 65 72 6d 20 2a 61 3b 0a 20   WhereTerm *a;. 
13c0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
13d0: 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72  WC->pWInfo->pPar
13e0: 73 65 2d 3e 64 62 3b 0a 20 20 66 6f 72 28 69 3d  se->db;.  for(i=
13f0: 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 2c 20 61 3d  pWC->nTerm-1, a=
1400: 70 57 43 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d  pWC->a; i>=0; i-
1410: 2d 2c 20 61 2b 2b 29 7b 0a 20 20 20 20 69 66 28  -, a++){.    if(
1420: 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45   a->wtFlags & TE
1430: 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20  RM_DYNAMIC ){.  
1440: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
1450: 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 70 45 78  elete(db, a->pEx
1460: 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  pr);.    }.    i
1470: 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20  f( a->wtFlags & 
1480: 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 29 7b 0a 20  TERM_ORINFO ){. 
1490: 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e 66 6f       whereOrInfo
14a0: 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e  Delete(db, a->u.
14b0: 70 4f 72 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 65  pOrInfo);.    }e
14c0: 6c 73 65 20 69 66 28 20 61 2d 3e 77 74 46 6c 61  lse if( a->wtFla
14d0: 67 73 20 26 20 54 45 52 4d 5f 41 4e 44 49 4e 46  gs & TERM_ANDINF
14e0: 4f 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65  O ){.      where
14f0: 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 64 62  AndInfoDelete(db
1500: 2c 20 61 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 29  , a->u.pAndInfo)
1510: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
1520: 28 20 70 57 43 2d 3e 61 21 3d 70 57 43 2d 3e 61  ( pWC->a!=pWC->a
1530: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 73 71  Static ){.    sq
1540: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1550: 70 57 43 2d 3e 61 29 3b 0a 20 20 7d 0a 7d 0a 0a  pWC->a);.  }.}..
1560: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67  /*.** Add a sing
1570: 6c 65 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d  le new WhereTerm
1580: 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 57 68   entry to the Wh
1590: 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74  ereClause object
15a0: 20 70 57 43 2e 0a 2a 2a 20 54 68 65 20 6e 65 77   pWC..** The new
15b0: 20 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63   WhereTerm objec
15c0: 74 20 69 73 20 63 6f 6e 73 74 72 75 63 74 65 64  t is constructed
15d0: 20 66 72 6f 6d 20 45 78 70 72 20 70 20 61 6e 64   from Expr p and
15e0: 20 77 69 74 68 20 77 74 46 6c 61 67 73 2e 0a 2a   with wtFlags..*
15f0: 2a 20 54 68 65 20 69 6e 64 65 78 20 69 6e 20 70  * The index in p
1600: 57 43 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 6e  WC->a[] of the n
1610: 65 77 20 57 68 65 72 65 54 65 72 6d 20 69 73 20  ew WhereTerm is 
1620: 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
1630: 65 73 73 2e 0a 2a 2a 20 30 20 69 73 20 72 65 74  ess..** 0 is ret
1640: 75 72 6e 65 64 20 69 66 20 74 68 65 20 6e 65 77  urned if the new
1650: 20 57 68 65 72 65 54 65 72 6d 20 63 6f 75 6c 64   WhereTerm could
1660: 20 6e 6f 74 20 62 65 20 61 64 64 65 64 20 64 75   not be added du
1670: 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79 0a 2a 2a  e to a memory.**
1680: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
1690: 72 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 61  r.  The memory a
16a0: 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72  llocation failur
16b0: 65 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 72 64  e will be record
16c0: 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 62 2d  ed in.** the db-
16d0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c  >mallocFailed fl
16e0: 61 67 20 73 6f 20 74 68 61 74 20 68 69 67 68 65  ag so that highe
16f0: 72 2d 6c 65 76 65 6c 20 66 75 6e 63 74 69 6f 6e  r-level function
1700: 73 20 63 61 6e 20 64 65 74 65 63 74 20 69 74 2e  s can detect it.
1710: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1720: 69 6e 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73  ine will increas
1730: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
1740: 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79  e pWC->a[] array
1750: 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   as necessary..*
1760: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 74 46 6c  *.** If the wtFl
1770: 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 6e 63  ags argument inc
1780: 6c 75 64 65 73 20 54 45 52 4d 5f 44 59 4e 41 4d  ludes TERM_DYNAM
1790: 49 43 2c 20 74 68 65 6e 20 72 65 73 70 6f 6e 73  IC, then respons
17a0: 69 62 69 6c 69 74 79 0a 2a 2a 20 66 6f 72 20 66  ibility.** for f
17b0: 72 65 65 69 6e 67 20 74 68 65 20 65 78 70 72 65  reeing the expre
17c0: 73 73 69 6f 6e 20 70 20 69 73 20 61 73 73 75 6d  ssion p is assum
17d0: 65 64 20 62 79 20 74 68 65 20 57 68 65 72 65 43  ed by the WhereC
17e0: 6c 61 75 73 65 20 6f 62 6a 65 63 74 20 70 57 43  lause object pWC
17f0: 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 72 75  ..** This is tru
1800: 65 20 65 76 65 6e 20 69 66 20 74 68 69 73 20 72  e even if this r
1810: 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 74 6f 20  outine fails to 
1820: 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 57  allocate a new W
1830: 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20  hereTerm..**.** 
1840: 57 41 52 4e 49 4e 47 3a 20 20 54 68 69 73 20 72  WARNING:  This r
1850: 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65 61  outine might rea
1860: 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 70 61 63  llocate the spac
1870: 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a  e used to store.
1880: 2a 2a 20 57 68 65 72 65 54 65 72 6d 73 2e 20 20  ** WhereTerms.  
1890: 41 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  All pointers to 
18a0: 57 68 65 72 65 54 65 72 6d 73 20 73 68 6f 75 6c  WhereTerms shoul
18b0: 64 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64  d be invalidated
18c0: 20 61 66 74 65 72 0a 2a 2a 20 63 61 6c 6c 69 6e   after.** callin
18d0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
18e0: 20 53 75 63 68 20 70 6f 69 6e 74 65 72 73 20 6d   Such pointers m
18f0: 61 79 20 62 65 20 72 65 69 6e 69 74 69 61 6c 69  ay be reinitiali
1900: 7a 65 64 20 62 79 20 72 65 66 65 72 65 6e 63 69  zed by referenci
1910: 6e 67 0a 2a 2a 20 74 68 65 20 70 57 43 2d 3e 61  ng.** the pWC->a
1920: 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61  [] array..*/.sta
1930: 74 69 63 20 69 6e 74 20 77 68 65 72 65 43 6c 61  tic int whereCla
1940: 75 73 65 49 6e 73 65 72 74 28 57 68 65 72 65 43  useInsert(WhereC
1950: 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72  lause *pWC, Expr
1960: 20 2a 70 2c 20 75 31 36 20 77 74 46 6c 61 67 73   *p, u16 wtFlags
1970: 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  ){.  WhereTerm *
1980: 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 64 78  pTerm;.  int idx
1990: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 77 74  ;.  testcase( wt
19a0: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
19b0: 54 55 41 4c 20 29 3b 0a 20 20 69 66 28 20 70 57  TUAL );.  if( pW
19c0: 43 2d 3e 6e 54 65 72 6d 3e 3d 70 57 43 2d 3e 6e  C->nTerm>=pWC->n
19d0: 53 6c 6f 74 20 29 7b 0a 20 20 20 20 57 68 65 72  Slot ){.    Wher
19e0: 65 54 65 72 6d 20 2a 70 4f 6c 64 20 3d 20 70 57  eTerm *pOld = pW
19f0: 43 2d 3e 61 3b 0a 20 20 20 20 73 71 6c 69 74 65  C->a;.    sqlite
1a00: 33 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70 57 49  3 *db = pWC->pWI
1a10: 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b  nfo->pParse->db;
1a20: 0a 20 20 20 20 70 57 43 2d 3e 61 20 3d 20 73 71  .    pWC->a = sq
1a30: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
1a40: 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d  (db, sizeof(pWC-
1a50: 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 53 6c 6f  >a[0])*pWC->nSlo
1a60: 74 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70  t*2 );.    if( p
1a70: 57 43 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20  WC->a==0 ){.    
1a80: 20 20 69 66 28 20 77 74 46 6c 61 67 73 20 26 20    if( wtFlags & 
1a90: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a  TERM_DYNAMIC ){.
1aa0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1ab0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 29  xprDelete(db, p)
1ac0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1ad0: 70 57 43 2d 3e 61 20 3d 20 70 4f 6c 64 3b 0a 20  pWC->a = pOld;. 
1ae0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
1af0: 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28     }.    memcpy(
1b00: 70 57 43 2d 3e 61 2c 20 70 4f 6c 64 2c 20 73 69  pWC->a, pOld, si
1b10: 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a  zeof(pWC->a[0])*
1b20: 70 57 43 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20  pWC->nTerm);.   
1b30: 20 69 66 28 20 70 4f 6c 64 21 3d 70 57 43 2d 3e   if( pOld!=pWC->
1b40: 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20  aStatic ){.     
1b50: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1b60: 62 2c 20 70 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a  b, pOld);.    }.
1b70: 20 20 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d      pWC->nSlot =
1b80: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
1b90: 53 69 7a 65 28 64 62 2c 20 70 57 43 2d 3e 61 29  Size(db, pWC->a)
1ba0: 2f 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30  /sizeof(pWC->a[0
1bb0: 5d 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  ]);.    memset(&
1bc0: 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72  pWC->a[pWC->nTer
1bd0: 6d 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 57  m], 0, sizeof(pW
1be0: 43 2d 3e 61 5b 30 5d 29 2a 28 70 57 43 2d 3e 6e  C->a[0])*(pWC->n
1bf0: 53 6c 6f 74 2d 70 57 43 2d 3e 6e 54 65 72 6d 29  Slot-pWC->nTerm)
1c00: 29 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d  );.  }.  pTerm =
1c10: 20 26 70 57 43 2d 3e 61 5b 69 64 78 20 3d 20 70   &pWC->a[idx = p
1c20: 57 43 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b 0a 20 20  WC->nTerm++];.  
1c30: 69 66 28 20 70 20 26 26 20 45 78 70 72 48 61 73  if( p && ExprHas
1c40: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 55  Property(p, EP_U
1c50: 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a 20 20 20 20  nlikely) ){.    
1c60: 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
1c70: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
1c80: 28 70 2d 3e 69 54 61 62 6c 65 29 20 2d 20 32 37  (p->iTable) - 27
1c90: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
1ca0: 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
1cb0: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 54 65 72   = 1;.  }.  pTer
1cc0: 6d 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c 69 74  m->pExpr = sqlit
1cd0: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
1ce0: 65 28 70 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 77  e(p);.  pTerm->w
1cf0: 74 46 6c 61 67 73 20 3d 20 77 74 46 6c 61 67 73  tFlags = wtFlags
1d00: 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 57 43 20 3d  ;.  pTerm->pWC =
1d10: 20 70 57 43 3b 0a 20 20 70 54 65 72 6d 2d 3e 69   pWC;.  pTerm->i
1d20: 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 72  Parent = -1;.  r
1d30: 65 74 75 72 6e 20 69 64 78 3b 0a 7d 0a 0a 2f 2a  eturn idx;.}../*
1d40: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1d50: 20 69 64 65 6e 74 69 66 69 65 73 20 73 75 62 65   identifies sube
1d60: 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68  xpressions in th
1d70: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 77  e WHERE clause w
1d80: 68 65 72 65 0a 2a 2a 20 65 61 63 68 20 73 75 62  here.** each sub
1d90: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65  expression is se
1da0: 70 61 72 61 74 65 64 20 62 79 20 74 68 65 20 41  parated by the A
1db0: 4e 44 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73  ND operator or s
1dc0: 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 6f 70 65  ome other.** ope
1dd0: 72 61 74 6f 72 20 73 70 65 63 69 66 69 65 64 20  rator specified 
1de0: 69 6e 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65  in the op parame
1df0: 74 65 72 2e 20 20 54 68 65 20 57 68 65 72 65 43  ter.  The WhereC
1e00: 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a  lause structure.
1e10: 2a 2a 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74  ** is filled wit
1e20: 68 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 75  h pointers to su
1e30: 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 46  bexpressions.  F
1e40: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
1e50: 2a 20 20 20 20 57 48 45 52 45 20 20 61 3d 3d 27  *    WHERE  a=='
1e60: 68 65 6c 6c 6f 27 20 41 4e 44 20 63 6f 61 6c 65  hello' AND coale
1e70: 73 63 65 28 62 2c 31 31 29 3c 31 30 20 41 4e 44  sce(b,11)<10 AND
1e80: 20 28 63 2b 31 32 21 3d 64 20 4f 52 20 63 3d 3d   (c+12!=d OR c==
1e90: 32 32 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  22).**          
1ea0: 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20   \________/     
1eb0: 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  \_______________
1ec0: 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f  /     \_________
1ed0: 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20  _______/.**     
1ee0: 20 20 20 20 20 20 20 73 6c 6f 74 5b 30 5d 20 20         slot[0]  
1ef0: 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 31            slot[1
1f00: 5d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ]               
1f10: 73 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54 68  slot[2].**.** Th
1f20: 65 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45  e original WHERE
1f30: 20 63 6c 61 75 73 65 20 69 6e 20 70 45 78 70 72   clause in pExpr
1f40: 20 69 73 20 75 6e 61 6c 74 65 72 65 64 2e 20 20   is unaltered.  
1f50: 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  All this routine
1f60: 0a 2a 2a 20 64 6f 65 73 20 69 73 20 6d 61 6b 65  .** does is make
1f70: 20 73 6c 6f 74 5b 5d 20 65 6e 74 72 69 65 73 20   slot[] entries 
1f80: 70 6f 69 6e 74 20 74 6f 20 73 75 62 73 74 72 75  point to substru
1f90: 63 74 75 72 65 20 77 69 74 68 69 6e 20 70 45 78  cture within pEx
1fa0: 70 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  pr..**.** In the
1fb0: 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e   previous senten
1fc0: 63 65 20 61 6e 64 20 69 6e 20 74 68 65 20 64 69  ce and in the di
1fd0: 61 67 72 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22 20  agram, "slot[]" 
1fe0: 72 65 66 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65  refers to.** the
1ff0: 20 57 68 65 72 65 43 6c 61 75 73 65 2e 61 5b 5d   WhereClause.a[]
2000: 20 61 72 72 61 79 2e 20 20 54 68 65 20 73 6c 6f   array.  The slo
2010: 74 5b 5d 20 61 72 72 61 79 20 67 72 6f 77 73 20  t[] array grows 
2020: 61 73 20 6e 65 65 64 65 64 20 74 6f 20 63 6f 6e  as needed to con
2030: 74 61 69 6e 0a 2a 2a 20 61 6c 6c 20 74 65 72 6d  tain.** all term
2040: 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
2050: 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  lause..*/.static
2060: 20 76 6f 69 64 20 77 68 65 72 65 53 70 6c 69 74   void whereSplit
2070: 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57  (WhereClause *pW
2080: 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  C, Expr *pExpr, 
2090: 75 38 20 6f 70 29 7b 0a 20 20 45 78 70 72 20 2a  u8 op){.  Expr *
20a0: 70 45 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pE2 = sqlite3Exp
20b0: 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 78  rSkipCollate(pEx
20c0: 70 72 29 3b 0a 20 20 70 57 43 2d 3e 6f 70 20 3d  pr);.  pWC->op =
20d0: 20 6f 70 3b 0a 20 20 69 66 28 20 70 45 32 3d 3d   op;.  if( pE2==
20e0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
20f0: 28 20 70 45 32 2d 3e 6f 70 21 3d 6f 70 20 29 7b  ( pE2->op!=op ){
2100: 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75 73 65  .    whereClause
2110: 49 6e 73 65 72 74 28 70 57 43 2c 20 70 45 78 70  Insert(pWC, pExp
2120: 72 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  r, 0);.  }else{.
2130: 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70      whereSplit(p
2140: 57 43 2c 20 70 45 32 2d 3e 70 4c 65 66 74 2c 20  WC, pE2->pLeft, 
2150: 6f 70 29 3b 0a 20 20 20 20 77 68 65 72 65 53 70  op);.    whereSp
2160: 6c 69 74 28 70 57 43 2c 20 70 45 32 2d 3e 70 52  lit(pWC, pE2->pR
2170: 69 67 68 74 2c 20 6f 70 29 3b 0a 20 20 7d 0a 7d  ight, op);.  }.}
2180: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
2190: 7a 65 20 61 20 57 68 65 72 65 4d 61 73 6b 53 65  ze a WhereMaskSe
21a0: 74 20 6f 62 6a 65 63 74 0a 2a 2f 0a 23 64 65 66  t object.*/.#def
21b0: 69 6e 65 20 69 6e 69 74 4d 61 73 6b 53 65 74 28  ine initMaskSet(
21c0: 50 29 20 20 28 50 29 2d 3e 6e 3d 30 0a 0a 2f 2a  P)  (P)->n=0../*
21d0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 62  .** Return the b
21e0: 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20 67  itmask for the g
21f0: 69 76 65 6e 20 63 75 72 73 6f 72 20 6e 75 6d 62  iven cursor numb
2200: 65 72 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  er.  Return 0 if
2210: 0a 2a 2a 20 69 43 75 72 73 6f 72 20 69 73 20 6e  .** iCursor is n
2220: 6f 74 20 69 6e 20 74 68 65 20 73 65 74 2e 0a 2a  ot in the set..*
2230: 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  /.static Bitmask
2240: 20 67 65 74 4d 61 73 6b 28 57 68 65 72 65 4d 61   getMask(WhereMa
2250: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
2260: 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20   int iCursor){. 
2270: 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
2280: 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 3c 3d 28  ( pMaskSet->n<=(
2290: 69 6e 74 29 73 69 7a 65 6f 66 28 42 69 74 6d 61  int)sizeof(Bitma
22a0: 73 6b 29 2a 38 20 29 3b 0a 20 20 66 6f 72 28 69  sk)*8 );.  for(i
22b0: 3d 30 3b 20 69 3c 70 4d 61 73 6b 53 65 74 2d 3e  =0; i<pMaskSet->
22c0: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  n; i++){.    if(
22d0: 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 69 5d   pMaskSet->ix[i]
22e0: 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ==iCursor ){.   
22f0: 20 20 20 72 65 74 75 72 6e 20 4d 41 53 4b 42 49     return MASKBI
2300: 54 28 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  T(i);.    }.  }.
2310: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
2320: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
2330: 77 20 6d 61 73 6b 20 66 6f 72 20 63 75 72 73 6f  w mask for curso
2340: 72 20 69 43 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  r iCursor..**.**
2350: 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 63 75   There is one cu
2360: 72 73 6f 72 20 70 65 72 20 74 61 62 6c 65 20 69  rsor per table i
2370: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
2380: 65 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  e.  The number o
2390: 66 0a 2a 2a 20 74 61 62 6c 65 73 20 69 6e 20 74  f.** tables in t
23a0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
23b0: 73 20 6c 69 6d 69 74 65 64 20 62 79 20 61 20 74  s limited by a t
23c0: 65 73 74 20 65 61 72 6c 79 20 69 6e 20 74 68 65  est early in the
23d0: 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65  .** sqlite3Where
23e0: 42 65 67 69 6e 28 29 20 72 6f 75 74 69 6e 65 2e  Begin() routine.
23f0: 20 20 53 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61    So we know tha
2400: 74 20 74 68 65 20 70 4d 61 73 6b 53 65 74 2d 3e  t the pMaskSet->
2410: 69 78 5b 5d 0a 2a 2a 20 61 72 72 61 79 20 77 69  ix[].** array wi
2420: 6c 6c 20 6e 65 76 65 72 20 6f 76 65 72 66 6c 6f  ll never overflo
2430: 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  w..*/.static voi
2440: 64 20 63 72 65 61 74 65 4d 61 73 6b 28 57 68 65  d createMask(Whe
2450: 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  reMaskSet *pMask
2460: 53 65 74 2c 20 69 6e 74 20 69 43 75 72 73 6f 72  Set, int iCursor
2470: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61  ){.  assert( pMa
2480: 73 6b 53 65 74 2d 3e 6e 20 3c 20 41 72 72 61 79  skSet->n < Array
2490: 53 69 7a 65 28 70 4d 61 73 6b 53 65 74 2d 3e 69  Size(pMaskSet->i
24a0: 78 29 20 29 3b 0a 20 20 70 4d 61 73 6b 53 65 74  x) );.  pMaskSet
24b0: 2d 3e 69 78 5b 70 4d 61 73 6b 53 65 74 2d 3e 6e  ->ix[pMaskSet->n
24c0: 2b 2b 5d 20 3d 20 69 43 75 72 73 6f 72 3b 0a 7d  ++] = iCursor;.}
24d0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f  ../*.** These ro
24e0: 75 74 69 6e 65 73 20 77 61 6c 6b 20 28 72 65 63  utines walk (rec
24f0: 75 72 73 69 76 65 6c 79 29 20 61 6e 20 65 78 70  ursively) an exp
2500: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 61 6e 64  ression tree and
2510: 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 61 20 62   generate.** a b
2520: 69 74 6d 61 73 6b 20 69 6e 64 69 63 61 74 69 6e  itmask indicatin
2530: 67 20 77 68 69 63 68 20 74 61 62 6c 65 73 20 61  g which tables a
2540: 72 65 20 75 73 65 64 20 69 6e 20 74 68 61 74 20  re used in that 
2550: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 72  expression.** tr
2560: 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69  ee..*/.static Bi
2570: 74 6d 61 73 6b 20 65 78 70 72 4c 69 73 74 54 61  tmask exprListTa
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 2a 2c 20 45 78 70 72 4c 69 73 74  skSet*, ExprList
25a0: 2a 29 3b 0a 73 74 61 74 69 63 20 42 69 74 6d 61  *);.static Bitma
25b0: 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61 62  sk exprSelectTab
25c0: 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73  leUsage(WhereMas
25d0: 6b 53 65 74 2a 2c 20 53 65 6c 65 63 74 2a 29 3b  kSet*, Select*);
25e0: 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20  .static Bitmask 
25f0: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 57  exprTableUsage(W
2600: 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
2610: 73 6b 53 65 74 2c 20 45 78 70 72 20 2a 70 29 7b  skSet, Expr *p){
2620: 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20  .  Bitmask mask 
2630: 3d 20 30 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  = 0;.  if( p==0 
2640: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
2650: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  ( p->op==TK_COLU
2660: 4d 4e 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 3d  MN ){.    mask =
2670: 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65   getMask(pMaskSe
2680: 74 2c 20 70 2d 3e 69 54 61 62 6c 65 29 3b 0a 20  t, p->iTable);. 
2690: 20 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a     return mask;.
26a0: 20 20 7d 0a 20 20 6d 61 73 6b 20 3d 20 65 78 70    }.  mask = exp
26b0: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
26c0: 6b 53 65 74 2c 20 70 2d 3e 70 52 69 67 68 74 29  kSet, p->pRight)
26d0: 3b 0a 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72  ;.  mask |= expr
26e0: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
26f0: 53 65 74 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a  Set, p->pLeft);.
2700: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
2710: 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53  perty(p, EP_xIsS
2720: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 6d 61  elect) ){.    ma
2730: 73 6b 20 7c 3d 20 65 78 70 72 53 65 6c 65 63 74  sk |= exprSelect
2740: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
2750: 53 65 74 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63  Set, p->x.pSelec
2760: 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
2770: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73   mask |= exprLis
2780: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
2790: 6b 53 65 74 2c 20 70 2d 3e 78 2e 70 4c 69 73 74  kSet, p->x.pList
27a0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
27b0: 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74 69 63 20 42  mask;.}.static B
27c0: 69 74 6d 61 73 6b 20 65 78 70 72 4c 69 73 74 54  itmask exprListT
27d0: 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d  ableUsage(WhereM
27e0: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
27f0: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
2800: 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 42  t){.  int i;.  B
2810: 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b  itmask mask = 0;
2820: 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
2830: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
2840: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
2850: 29 7b 0a 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d  ){.      mask |=
2860: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
2870: 70 4d 61 73 6b 53 65 74 2c 20 70 4c 69 73 74 2d  pMaskSet, pList-
2880: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
2890: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
28a0: 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74 69 63 20   mask;.}.static 
28b0: 42 69 74 6d 61 73 6b 20 65 78 70 72 53 65 6c 65  Bitmask exprSele
28c0: 63 74 54 61 62 6c 65 55 73 61 67 65 28 57 68 65  ctTableUsage(Whe
28d0: 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  reMaskSet *pMask
28e0: 53 65 74 2c 20 53 65 6c 65 63 74 20 2a 70 53 29  Set, Select *pS)
28f0: 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b  {.  Bitmask mask
2900: 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70   = 0;.  while( p
2910: 53 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74  S ){.    SrcList
2920: 20 2a 70 53 72 63 20 3d 20 70 53 2d 3e 70 53 72   *pSrc = pS->pSr
2930: 63 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  c;.    mask |= e
2940: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
2950: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e  e(pMaskSet, pS->
2960: 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 6d 61 73  pEList);.    mas
2970: 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62  k |= exprListTab
2980: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
2990: 2c 20 70 53 2d 3e 70 47 72 6f 75 70 42 79 29 3b  , pS->pGroupBy);
29a0: 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70  .    mask |= exp
29b0: 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28  rListTableUsage(
29c0: 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 4f  pMaskSet, pS->pO
29d0: 72 64 65 72 42 79 29 3b 0a 20 20 20 20 6d 61 73  rderBy);.    mas
29e0: 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73  k |= exprTableUs
29f0: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53  age(pMaskSet, pS
2a00: 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 6d  ->pWhere);.    m
2a10: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
2a20: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
2a30: 70 53 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20  pS->pHaving);.  
2a40: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 53 72    if( ALWAYS(pSr
2a50: 63 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 69  c!=0) ){.      i
2a60: 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt i;.      for(
2a70: 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72  i=0; i<pSrc->nSr
2a80: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  c; i++){.       
2a90: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 53 65 6c   mask |= exprSel
2aa0: 65 63 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  ectTableUsage(pM
2ab0: 61 73 6b 53 65 74 2c 20 70 53 72 63 2d 3e 61 5b  askSet, pSrc->a[
2ac0: 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  i].pSelect);.   
2ad0: 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70       mask |= exp
2ae0: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
2af0: 6b 53 65 74 2c 20 70 53 72 63 2d 3e 61 5b 69 5d  kSet, pSrc->a[i]
2b00: 2e 70 4f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  .pOn);.      }. 
2b10: 20 20 20 7d 0a 20 20 20 20 70 53 20 3d 20 70 53     }.    pS = pS
2b20: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 7d 0a 20 20  ->pPrior;.  }.  
2b30: 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a  return mask;.}..
2b40: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
2b50: 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 6f  E if the given o
2b60: 70 65 72 61 74 6f 72 20 69 73 20 6f 6e 65 20 6f  perator is one o
2b70: 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20  f the operators 
2b80: 74 68 61 74 20 69 73 0a 2a 2a 20 61 6c 6c 6f 77  that is.** allow
2b90: 65 64 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 61  ed for an indexa
2ba0: 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ble WHERE clause
2bb0: 20 74 65 72 6d 2e 20 20 54 68 65 20 61 6c 6c 6f   term.  The allo
2bc0: 77 65 64 20 6f 70 65 72 61 74 6f 72 73 20 61 72  wed operators ar
2bd0: 65 0a 2a 2a 20 22 3d 22 2c 20 22 3c 22 2c 20 22  e.** "=", "<", "
2be0: 3e 22 2c 20 22 3c 3d 22 2c 20 22 3e 3d 22 2c 20  >", "<=", ">=", 
2bf0: 22 49 4e 22 2c 20 61 6e 64 20 22 49 53 20 4e 55  "IN", and "IS NU
2c00: 4c 4c 22 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  LL".*/.static in
2c10: 74 20 61 6c 6c 6f 77 65 64 4f 70 28 69 6e 74 20  t allowedOp(int 
2c20: 6f 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 54  op){.  assert( T
2c30: 4b 5f 47 54 3e 54 4b 5f 45 51 20 26 26 20 54 4b  K_GT>TK_EQ && TK
2c40: 5f 47 54 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61  _GT<TK_GE );.  a
2c50: 73 73 65 72 74 28 20 54 4b 5f 4c 54 3e 54 4b 5f  ssert( TK_LT>TK_
2c60: 45 51 20 26 26 20 54 4b 5f 4c 54 3c 54 4b 5f 47  EQ && TK_LT<TK_G
2c70: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 54  E );.  assert( T
2c80: 4b 5f 4c 45 3e 54 4b 5f 45 51 20 26 26 20 54 4b  K_LE>TK_EQ && TK
2c90: 5f 4c 45 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61  _LE<TK_GE );.  a
2ca0: 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b  ssert( TK_GE==TK
2cb0: 5f 45 51 2b 34 20 29 3b 0a 20 20 72 65 74 75 72  _EQ+4 );.  retur
2cc0: 6e 20 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 28  n op==TK_IN || (
2cd0: 6f 70 3e 3d 54 4b 5f 45 51 20 26 26 20 6f 70 3c  op>=TK_EQ && op<
2ce0: 3d 54 4b 5f 47 45 29 20 7c 7c 20 6f 70 3d 3d 54  =TK_GE) || op==T
2cf0: 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d  K_ISNULL || op==
2d00: 54 4b 5f 49 53 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TK_IS;.}../*.** 
2d10: 43 6f 6d 6d 75 74 65 20 61 20 63 6f 6d 70 61 72  Commute a compar
2d20: 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20  ison operator.  
2d30: 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74  Expressions of t
2d40: 68 65 20 66 6f 72 6d 20 22 58 20 6f 70 20 59 22  he form "X op Y"
2d50: 0a 2a 2a 20 61 72 65 20 63 6f 6e 76 65 72 74 65  .** are converte
2d60: 64 20 69 6e 74 6f 20 22 59 20 6f 70 20 58 22 2e  d into "Y op X".
2d70: 0a 2a 2a 0a 2a 2a 20 49 66 20 6c 65 66 74 2f 72  .**.** If left/r
2d80: 69 67 68 74 20 70 72 65 63 65 64 65 6e 63 65 20  ight precedence 
2d90: 72 75 6c 65 73 20 63 6f 6d 65 20 69 6e 74 6f 20  rules come into 
2da0: 70 6c 61 79 20 77 68 65 6e 20 64 65 74 65 72 6d  play when determ
2db0: 69 6e 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6c  ining the.** col
2dc0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2c  lating sequence,
2dd0: 20 74 68 65 6e 20 43 4f 4c 4c 41 54 45 20 6f 70   then COLLATE op
2de0: 65 72 61 74 6f 72 73 20 61 72 65 20 61 64 6a 75  erators are adju
2df0: 73 74 65 64 20 74 6f 20 65 6e 73 75 72 65 0a 2a  sted to ensure.*
2e00: 2a 20 74 68 61 74 20 74 68 65 20 63 6f 6c 6c 61  * that the colla
2e10: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 64 6f  ting sequence do
2e20: 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 2e 20 20  es not change.  
2e30: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 20  For example:.** 
2e40: 22 59 20 63 6f 6c 6c 61 74 65 20 4e 4f 43 41 53  "Y collate NOCAS
2e50: 45 20 6f 70 20 58 22 20 62 65 63 6f 6d 65 73 20  E op X" becomes 
2e60: 22 58 20 6f 70 20 59 22 20 62 65 63 61 75 73 65  "X op Y" because
2e70: 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   any collation s
2e80: 65 71 75 65 6e 63 65 20 6f 6e 0a 2a 2a 20 74 68  equence on.** th
2e90: 65 20 6c 65 66 74 20 68 61 6e 64 20 73 69 64 65  e left hand side
2ea0: 20 6f 66 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e   of a comparison
2eb0: 20 6f 76 65 72 72 69 64 65 73 20 61 6e 79 20 63   overrides any c
2ec0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
2ed0: 65 20 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 74  e .** attached t
2ee0: 6f 20 74 68 65 20 72 69 67 68 74 2e 20 46 6f 72  o the right. For
2ef0: 20 74 68 65 20 73 61 6d 65 20 72 65 61 73 6f 6e   the same reason
2f00: 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20   the EP_Collate 
2f10: 66 6c 61 67 0a 2a 2a 20 69 73 20 6e 6f 74 20 63  flag.** is not c
2f20: 6f 6d 6d 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  ommuted..*/.stat
2f30: 69 63 20 76 6f 69 64 20 65 78 70 72 43 6f 6d 6d  ic void exprComm
2f40: 75 74 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ute(Parse *pPars
2f50: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
2f60: 0a 20 20 75 31 36 20 65 78 70 52 69 67 68 74 20  .  u16 expRight 
2f70: 3d 20 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  = (pExpr->pRight
2f80: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c  ->flags & EP_Col
2f90: 6c 61 74 65 29 3b 0a 20 20 75 31 36 20 65 78 70  late);.  u16 exp
2fa0: 4c 65 66 74 20 3d 20 28 70 45 78 70 72 2d 3e 70  Left = (pExpr->p
2fb0: 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50  Left->flags & EP
2fc0: 5f 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 61 73 73  _Collate);.  ass
2fd0: 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70  ert( allowedOp(p
2fe0: 45 78 70 72 2d 3e 6f 70 29 20 26 26 20 70 45 78  Expr->op) && pEx
2ff0: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 20 29 3b  pr->op!=TK_IN );
3000: 0a 20 20 69 66 28 20 65 78 70 52 69 67 68 74 3d  .  if( expRight=
3010: 3d 65 78 70 4c 65 66 74 20 29 7b 0a 20 20 20 20  =expLeft ){.    
3020: 2f 2a 20 45 69 74 68 65 72 20 58 20 61 6e 64 20  /* Either X and 
3030: 59 20 62 6f 74 68 20 68 61 76 65 20 43 4f 4c 4c  Y both have COLL
3040: 41 54 45 20 6f 70 65 72 61 74 6f 72 20 6f 72 20  ATE operator or 
3050: 6e 65 69 74 68 65 72 20 64 6f 20 2a 2f 0a 20 20  neither do */.  
3060: 20 20 69 66 28 20 65 78 70 52 69 67 68 74 20 29    if( expRight )
3070: 7b 0a 20 20 20 20 20 20 2f 2a 20 42 6f 74 68 20  {.      /* Both 
3080: 58 20 61 6e 64 20 59 20 68 61 76 65 20 43 4f 4c  X and Y have COL
3090: 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 73 2e 20  LATE operators. 
30a0: 20 4d 61 6b 65 20 73 75 72 65 20 58 20 69 73 20   Make sure X is 
30b0: 61 6c 77 61 79 73 0a 20 20 20 20 20 20 2a 2a 20  always.      ** 
30c0: 75 73 65 64 20 62 79 20 63 6c 65 61 72 69 6e 67  used by clearing
30d0: 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20   the EP_Collate 
30e0: 66 6c 61 67 20 66 72 6f 6d 20 59 2e 20 2a 2f 0a  flag from Y. */.
30f0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69        pExpr->pRi
3100: 67 68 74 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 45  ght->flags &= ~E
3110: 50 5f 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 7d  P_Collate;.    }
3120: 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
3130: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
3140: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
3150: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )!=0 ){.      /*
3160: 20 4e 65 69 74 68 65 72 20 58 20 6e 6f 72 20 59   Neither X nor Y
3170: 20 68 61 76 65 20 43 4f 4c 4c 41 54 45 20 6f 70   have COLLATE op
3180: 65 72 61 74 6f 72 73 2c 20 62 75 74 20 58 20 68  erators, but X h
3190: 61 73 20 61 20 6e 6f 6e 2d 64 65 66 61 75 6c 74  as a non-default
31a0: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74  .      ** collat
31b0: 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 20 20 53  ing sequence.  S
31c0: 6f 20 61 64 64 20 74 68 65 20 45 50 5f 43 6f 6c  o add the EP_Col
31d0: 6c 61 74 65 20 6d 61 72 6b 65 72 20 6f 6e 20 58  late marker on X
31e0: 20 74 6f 20 63 61 75 73 65 0a 20 20 20 20 20 20   to cause.      
31f0: 2a 2a 20 69 74 20 74 6f 20 62 65 20 73 65 61 72  ** it to be sear
3200: 63 68 65 64 20 66 69 72 73 74 2e 20 2a 2f 0a 20  ched first. */. 
3210: 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66       pExpr->pLef
3220: 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 43  t->flags |= EP_C
3230: 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20  ollate;.    }.  
3240: 7d 0a 20 20 53 57 41 50 28 45 78 70 72 2a 2c 70  }.  SWAP(Expr*,p
3250: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 70 45 78  Expr->pRight,pEx
3260: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66  pr->pLeft);.  if
3270: 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f  ( pExpr->op>=TK_
3280: 47 54 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  GT ){.    assert
3290: 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32  ( TK_LT==TK_GT+2
32a0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
32b0: 54 4b 5f 47 45 3d 3d 54 4b 5f 4c 45 2b 32 20 29  TK_GE==TK_LE+2 )
32c0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b  ;.    assert( TK
32d0: 5f 47 54 3e 54 4b 5f 45 51 20 29 3b 0a 20 20 20  _GT>TK_EQ );.   
32e0: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3c 54   assert( TK_GT<T
32f0: 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73 73 65  K_LE );.    asse
3300: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54  rt( pExpr->op>=T
3310: 4b 5f 47 54 20 26 26 20 70 45 78 70 72 2d 3e 6f  K_GT && pExpr->o
3320: 70 3c 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20  p<=TK_GE );.    
3330: 70 45 78 70 72 2d 3e 6f 70 20 3d 20 28 28 70 45  pExpr->op = ((pE
3340: 78 70 72 2d 3e 6f 70 2d 54 4b 5f 47 54 29 5e 32  xpr->op-TK_GT)^2
3350: 29 2b 54 4b 5f 47 54 3b 0a 20 20 7d 0a 7d 0a 0a  )+TK_GT;.  }.}..
3360: 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20  /*.** Translate 
3370: 66 72 6f 6d 20 54 4b 5f 78 78 20 6f 70 65 72 61  from TK_xx opera
3380: 74 6f 72 20 74 6f 20 57 4f 5f 78 78 20 62 69 74  tor to WO_xx bit
3390: 6d 61 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mask..*/.static 
33a0: 75 31 36 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b  u16 operatorMask
33b0: 28 69 6e 74 20 6f 70 29 7b 0a 20 20 75 31 36 20  (int op){.  u16 
33c0: 63 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6c 6c  c;.  assert( all
33d0: 6f 77 65 64 4f 70 28 6f 70 29 20 29 3b 0a 20 20  owedOp(op) );.  
33e0: 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b  if( op==TK_IN ){
33f0: 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49 4e 3b 0a  .    c = WO_IN;.
3400: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d    }else if( op==
3410: 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20  TK_ISNULL ){.   
3420: 20 63 20 3d 20 57 4f 5f 49 53 4e 55 4c 4c 3b 0a   c = WO_ISNULL;.
3430: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d    }else if( op==
3440: 54 4b 5f 49 53 20 29 7b 0a 20 20 20 20 63 20 3d  TK_IS ){.    c =
3450: 20 57 4f 5f 49 53 3b 0a 20 20 7d 65 6c 73 65 7b   WO_IS;.  }else{
3460: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 57 4f  .    assert( (WO
3470: 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29 29  _EQ<<(op-TK_EQ))
3480: 20 3c 20 30 78 37 66 66 66 20 29 3b 0a 20 20 20   < 0x7fff );.   
3490: 20 63 20 3d 20 28 75 31 36 29 28 57 4f 5f 45 51   c = (u16)(WO_EQ
34a0: 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29 29 3b 0a 20  <<(op-TK_EQ));. 
34b0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21   }.  assert( op!
34c0: 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 63 3d  =TK_ISNULL || c=
34d0: 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20  =WO_ISNULL );.  
34e0: 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49  assert( op!=TK_I
34f0: 4e 20 7c 7c 20 63 3d 3d 57 4f 5f 49 4e 20 29 3b  N || c==WO_IN );
3500: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54  .  assert( op!=T
3510: 4b 5f 45 51 20 7c 7c 20 63 3d 3d 57 4f 5f 45 51  K_EQ || c==WO_EQ
3520: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
3530: 21 3d 54 4b 5f 4c 54 20 7c 7c 20 63 3d 3d 57 4f  !=TK_LT || c==WO
3540: 5f 4c 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _LT );.  assert(
3550: 20 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 63 3d   op!=TK_LE || c=
3560: 3d 57 4f 5f 4c 45 20 29 3b 0a 20 20 61 73 73 65  =WO_LE );.  asse
3570: 72 74 28 20 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c  rt( op!=TK_GT ||
3580: 20 63 3d 3d 57 4f 5f 47 54 20 29 3b 0a 20 20 61   c==WO_GT );.  a
3590: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 47 45  ssert( op!=TK_GE
35a0: 20 7c 7c 20 63 3d 3d 57 4f 5f 47 45 20 29 3b 0a   || c==WO_GE );.
35b0: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
35c0: 5f 49 53 20 7c 7c 20 63 3d 3d 57 4f 5f 49 53 20  _IS || c==WO_IS 
35d0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d  );.  return c;.}
35e0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ../*.** Advance 
35f0: 74 6f 20 74 68 65 20 6e 65 78 74 20 57 68 65 72  to the next Wher
3600: 65 54 65 72 6d 20 74 68 61 74 20 6d 61 74 63 68  eTerm that match
3610: 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  es according to 
3620: 74 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20  the criteria.** 
3630: 65 73 74 61 62 6c 69 73 68 65 64 20 77 68 65 6e  established when
3640: 20 74 68 65 20 70 53 63 61 6e 20 6f 62 6a 65 63   the pScan objec
3650: 74 20 77 61 73 20 69 6e 69 74 69 61 6c 69 7a 65  t was initialize
3660: 64 20 62 79 20 77 68 65 72 65 53 63 61 6e 49 6e  d by whereScanIn
3670: 69 74 28 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  it()..** Return 
3680: 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20 61 72  NULL if there ar
3690: 65 20 6e 6f 20 6d 6f 72 65 20 6d 61 74 63 68 69  e no more matchi
36a0: 6e 67 20 57 68 65 72 65 54 65 72 6d 73 2e 0a 2a  ng WhereTerms..*
36b0: 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 54 65  /.static WhereTe
36c0: 72 6d 20 2a 77 68 65 72 65 53 63 61 6e 4e 65 78  rm *whereScanNex
36d0: 74 28 57 68 65 72 65 53 63 61 6e 20 2a 70 53 63  t(WhereScan *pSc
36e0: 61 6e 29 7b 0a 20 20 69 6e 74 20 69 43 75 72 3b  an){.  int iCur;
36f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
3700: 68 65 20 63 75 72 73 6f 72 20 6f 6e 20 74 68 65  he cursor on the
3710: 20 4c 48 53 20 6f 66 20 74 68 65 20 74 65 72 6d   LHS of the term
3720: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d   */.  int iColum
3730: 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  n;         /* Th
3740: 65 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20  e column on the 
3750: 4c 48 53 20 6f 66 20 74 68 65 20 74 65 72 6d 2e  LHS of the term.
3760: 20 20 2d 31 20 66 6f 72 20 49 50 4b 20 2a 2f 0a    -1 for IPK */.
3770: 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20    Expr *pX;     
3780: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 70         /* An exp
3790: 72 65 73 73 69 6f 6e 20 62 65 69 6e 67 20 74 65  ression being te
37a0: 73 74 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 43  sted */.  WhereC
37b0: 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 2f  lause *pWC;    /
37c0: 2a 20 53 68 6f 72 74 68 61 6e 64 20 66 6f 72 20  * Shorthand for 
37d0: 70 53 63 61 6e 2d 3e 70 57 43 20 2a 2f 0a 20 20  pScan->pWC */.  
37e0: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
37f0: 3b 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d  ;    /* The term
3800: 20 62 65 69 6e 67 20 74 65 73 74 65 64 20 2a 2f   being tested */
3810: 0a 20 20 69 6e 74 20 6b 20 3d 20 70 53 63 61 6e  .  int k = pScan
3820: 2d 3e 6b 3b 20 20 20 20 2f 2a 20 57 68 65 72 65  ->k;    /* Where
3830: 20 74 6f 20 73 74 61 72 74 20 73 63 61 6e 6e 69   to start scanni
3840: 6e 67 20 2a 2f 0a 0a 20 20 77 68 69 6c 65 28 20  ng */..  while( 
3850: 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 3c 3d 70  pScan->iEquiv<=p
3860: 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20 29 7b 0a  Scan->nEquiv ){.
3870: 20 20 20 20 69 43 75 72 20 3d 20 70 53 63 61 6e      iCur = pScan
3880: 2d 3e 61 45 71 75 69 76 5b 70 53 63 61 6e 2d 3e  ->aEquiv[pScan->
3890: 69 45 71 75 69 76 2d 32 5d 3b 0a 20 20 20 20 69  iEquiv-2];.    i
38a0: 43 6f 6c 75 6d 6e 20 3d 20 70 53 63 61 6e 2d 3e  Column = pScan->
38b0: 61 45 71 75 69 76 5b 70 53 63 61 6e 2d 3e 69 45  aEquiv[pScan->iE
38c0: 71 75 69 76 2d 31 5d 3b 0a 20 20 20 20 77 68 69  quiv-1];.    whi
38d0: 6c 65 28 20 28 70 57 43 20 3d 20 70 53 63 61 6e  le( (pWC = pScan
38e0: 2d 3e 70 57 43 29 21 3d 30 20 29 7b 0a 20 20 20  ->pWC)!=0 ){.   
38f0: 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43     for(pTerm=pWC
3900: 2d 3e 61 2b 6b 3b 20 6b 3c 70 57 43 2d 3e 6e 54  ->a+k; k<pWC->nT
3910: 65 72 6d 3b 20 6b 2b 2b 2c 20 70 54 65 72 6d 2b  erm; k++, pTerm+
3920: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
3930: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
3940: 72 3d 3d 69 43 75 72 0a 20 20 20 20 20 20 20 20  r==iCur.        
3950: 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66   && pTerm->u.lef
3960: 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e  tColumn==iColumn
3970: 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 53  .         && (pS
3980: 63 61 6e 2d 3e 69 45 71 75 69 76 3c 3d 32 20 7c  can->iEquiv<=2 |
3990: 7c 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  | !ExprHasProper
39a0: 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  ty(pTerm->pExpr,
39b0: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20   EP_FromJoin)). 
39c0: 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
39d0: 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
39e0: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45  eOperator & WO_E
39f0: 51 55 49 56 29 21 3d 30 0a 20 20 20 20 20 20 20  QUIV)!=0.       
3a00: 20 20 20 20 26 26 20 70 53 63 61 6e 2d 3e 6e 45      && pScan->nE
3a10: 71 75 69 76 3c 41 72 72 61 79 53 69 7a 65 28 70  quiv<ArraySize(p
3a20: 53 63 61 6e 2d 3e 61 45 71 75 69 76 29 0a 20 20  Scan->aEquiv).  
3a30: 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
3a40: 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
3a50: 20 20 20 20 20 20 20 20 20 20 70 58 20 3d 20 73            pX = s
3a60: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
3a70: 6c 6c 61 74 65 28 70 54 65 72 6d 2d 3e 70 45 78  llate(pTerm->pEx
3a80: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
3a90: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
3aa0: 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55   pX->op==TK_COLU
3ab0: 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  MN );.          
3ac0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 53 63    for(j=0; j<pSc
3ad0: 61 6e 2d 3e 6e 45 71 75 69 76 3b 20 6a 2b 3d 32  an->nEquiv; j+=2
3ae0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
3af0: 20 69 66 28 20 70 53 63 61 6e 2d 3e 61 45 71 75   if( pScan->aEqu
3b00: 69 76 5b 6a 5d 3d 3d 70 58 2d 3e 69 54 61 62 6c  iv[j]==pX->iTabl
3b10: 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e.              
3b20: 20 26 26 20 70 53 63 61 6e 2d 3e 61 45 71 75 69   && pScan->aEqui
3b30: 76 5b 6a 2b 31 5d 3d 3d 70 58 2d 3e 69 43 6f 6c  v[j+1]==pX->iCol
3b40: 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
3b50: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
3b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
3b70: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
3b80: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d            if( j=
3b90: 3d 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20 29  =pScan->nEquiv )
3ba0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
3bb0: 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 5d  pScan->aEquiv[j]
3bc0: 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b 0a 20   = pX->iTable;. 
3bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53 63               pSc
3be0: 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 2b 31 5d 20  an->aEquiv[j+1] 
3bf0: 3d 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  = pX->iColumn;. 
3c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53 63               pSc
3c10: 61 6e 2d 3e 6e 45 71 75 69 76 20 2b 3d 20 32 3b  an->nEquiv += 2;
3c20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
3c30: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
3c40: 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
3c50: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 70 53 63  >eOperator & pSc
3c60: 61 6e 2d 3e 6f 70 4d 61 73 6b 29 21 3d 30 20 29  an->opMask)!=0 )
3c70: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
3c80: 20 56 65 72 69 66 79 20 74 68 65 20 61 66 66 69   Verify the affi
3c90: 6e 69 74 79 20 61 6e 64 20 63 6f 6c 6c 61 74 69  nity and collati
3ca0: 6e 67 20 73 65 71 75 65 6e 63 65 20 6d 61 74 63  ng sequence matc
3cb0: 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  h */.           
3cc0: 20 69 66 28 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c   if( pScan->zCol
3cd0: 6c 4e 61 6d 65 20 26 26 20 28 70 54 65 72 6d 2d  lName && (pTerm-
3ce0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
3cf0: 49 53 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20  ISNULL)==0 ){.  
3d00: 20 20 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c              Coll
3d10: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20  Seq *pColl;.    
3d20: 20 20 20 20 20 20 20 20 20 20 50 61 72 73 65 20            Parse 
3d30: 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70  *pParse = pWC->p
3d40: 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20  WInfo->pParse;. 
3d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58 20               pX 
3d60: 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
3d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
3d80: 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41  ( !sqlite3IndexA
3d90: 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c 20 70 53  ffinityOk(pX, pS
3da0: 63 61 6e 2d 3e 69 64 78 61 66 66 29 20 29 7b 0a  can->idxaff) ){.
3db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3dc0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
3dd0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3de0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70          assert(p
3df0: 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  X->pLeft);.     
3e00: 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d           pColl =
3e10: 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
3e20: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
3e30: 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
3e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e60: 20 20 20 20 20 20 20 70 58 2d 3e 70 4c 65 66 74         pX->pLeft
3e70: 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20  , pX->pRight);. 
3e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
3e90: 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c   pColl==0 ) pCol
3ea0: 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  l = pParse->db->
3eb0: 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
3ec0: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
3ed0: 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c  ite3StrICmp(pCol
3ee0: 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 53 63 61 6e 2d  l->zName, pScan-
3ef0: 3e 7a 43 6f 6c 6c 4e 61 6d 65 29 20 29 7b 0a 20  >zCollName) ){. 
3f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
3f10: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
3f20: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3f30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
3f40: 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
3f50: 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45  Operator & (WO_E
3f60: 51 7c 57 4f 5f 49 53 29 29 21 3d 30 0a 20 20 20  Q|WO_IS))!=0.   
3f70: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 58            && (pX
3f80: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d   = pTerm->pExpr-
3f90: 3e 70 52 69 67 68 74 29 2d 3e 6f 70 3d 3d 54 4b  >pRight)->op==TK
3fa0: 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20 20  _COLUMN.        
3fb0: 20 20 20 20 20 26 26 20 70 58 2d 3e 69 54 61 62       && pX->iTab
3fc0: 6c 65 3d 3d 70 53 63 61 6e 2d 3e 61 45 71 75 69  le==pScan->aEqui
3fd0: 76 5b 30 5d 0a 20 20 20 20 20 20 20 20 20 20 20  v[0].           
3fe0: 20 20 26 26 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e    && pX->iColumn
3ff0: 3d 3d 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b  ==pScan->aEquiv[
4000: 31 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  1].            )
4010: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
4020: 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
4030: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
4040: 49 53 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  IS );.          
4050: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
4060: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
4070: 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 6b          pScan->k
4080: 20 3d 20 6b 2b 31 3b 0a 20 20 20 20 20 20 20 20   = k+1;.        
4090: 20 20 20 20 72 65 74 75 72 6e 20 70 54 65 72 6d      return pTerm
40a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
40b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
40c0: 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 70 57 43        pScan->pWC
40d0: 20 3d 20 70 53 63 61 6e 2d 3e 70 57 43 2d 3e 70   = pScan->pWC->p
40e0: 4f 75 74 65 72 3b 0a 20 20 20 20 20 20 6b 20 3d  Outer;.      k =
40f0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53   0;.    }.    pS
4100: 63 61 6e 2d 3e 70 57 43 20 3d 20 70 53 63 61 6e  can->pWC = pScan
4110: 2d 3e 70 4f 72 69 67 57 43 3b 0a 20 20 20 20 6b  ->pOrigWC;.    k
4120: 20 3d 20 30 3b 0a 20 20 20 20 70 53 63 61 6e 2d   = 0;.    pScan-
4130: 3e 69 45 71 75 69 76 20 2b 3d 20 32 3b 0a 20 20  >iEquiv += 2;.  
4140: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
4150: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
4160: 65 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  e a WHERE clause
4170: 20 73 63 61 6e 6e 65 72 20 6f 62 6a 65 63 74 2e   scanner object.
4180: 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
4190: 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 66 69 72  er to the.** fir
41a0: 73 74 20 6d 61 74 63 68 2e 20 20 52 65 74 75 72  st match.  Retur
41b0: 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20  n NULL if there 
41c0: 61 72 65 20 6e 6f 20 6d 61 74 63 68 65 73 2e 0a  are no matches..
41d0: 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 61 6e 6e 65  **.** The scanne
41e0: 72 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68  r will be search
41f0: 69 6e 67 20 74 68 65 20 57 48 45 52 45 20 63 6c  ing the WHERE cl
4200: 61 75 73 65 20 70 57 43 2e 20 20 49 74 20 77 69  ause pWC.  It wi
4210: 6c 6c 20 6c 6f 6f 6b 0a 2a 2a 20 66 6f 72 20 74  ll look.** for t
4220: 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  erms of the form
4230: 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22   "X <op> <expr>"
4240: 20 77 68 65 72 65 20 58 20 69 73 20 63 6f 6c 75   where X is colu
4250: 6d 6e 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61  mn iColumn of ta
4260: 62 6c 65 0a 2a 2a 20 69 43 75 72 2e 20 20 54 68  ble.** iCur.  Th
4270: 65 20 3c 6f 70 3e 20 6d 75 73 74 20 62 65 20 6f  e <op> must be o
4280: 6e 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74  ne of the operat
4290: 6f 72 73 20 64 65 73 63 72 69 62 65 64 20 62 79  ors described by
42a0: 20 6f 70 4d 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49   opMask..**.** I
42b0: 66 20 74 68 65 20 73 65 61 72 63 68 20 69 73 20  f the search is 
42c0: 66 6f 72 20 58 20 61 6e 64 20 74 68 65 20 57 48  for X and the WH
42d0: 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61  ERE clause conta
42e0: 69 6e 73 20 74 65 72 6d 73 20 6f 66 20 74 68 65  ins terms of the
42f0: 0a 2a 2a 20 66 6f 72 6d 20 58 3d 59 20 74 68 65  .** form X=Y the
4300: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  n this routine m
4310: 69 67 68 74 20 61 6c 73 6f 20 72 65 74 75 72 6e  ight also return
4320: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f   terms of the fo
4330: 72 6d 0a 2a 2a 20 22 59 20 3c 6f 70 3e 20 3c 65  rm.** "Y <op> <e
4340: 78 70 72 3e 22 2e 20 20 54 68 65 20 6e 75 6d 62  xpr>".  The numb
4350: 65 72 20 6f 66 20 6c 65 76 65 6c 73 20 6f 66 20  er of levels of 
4360: 74 72 61 6e 73 69 74 69 76 69 74 79 20 69 73 20  transitivity is 
4370: 6c 69 6d 69 74 65 64 2c 0a 2a 2a 20 62 75 74 20  limited,.** but 
4380: 69 73 20 65 6e 6f 75 67 68 20 74 6f 20 68 61 6e  is enough to han
4390: 64 6c 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e 6c  dle most commonl
43a0: 79 20 6f 63 63 75 72 72 69 6e 67 20 53 51 4c 20  y occurring SQL 
43b0: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a  statements..**.*
43c0: 2a 20 49 66 20 58 20 69 73 20 6e 6f 74 20 74 68  * If X is not th
43d0: 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  e INTEGER PRIMAR
43e0: 59 20 4b 45 59 20 74 68 65 6e 20 58 20 6d 75 73  Y KEY then X mus
43f0: 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20  t be compatible 
4400: 77 69 74 68 0a 2a 2a 20 69 6e 64 65 78 20 70 49  with.** index pI
4410: 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68  dx..*/.static Wh
4420: 65 72 65 54 65 72 6d 20 2a 77 68 65 72 65 53 63  ereTerm *whereSc
4430: 61 6e 49 6e 69 74 28 0a 20 20 57 68 65 72 65 53  anInit(.  WhereS
4440: 63 61 6e 20 2a 70 53 63 61 6e 2c 20 20 20 20 20  can *pScan,     
4450: 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 53 63    /* The WhereSc
4460: 61 6e 20 6f 62 6a 65 63 74 20 62 65 69 6e 67 20  an object being 
4470: 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20  initialized */. 
4480: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
4490: 43 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  C,       /* The 
44a0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
44b0: 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20  be scanned */.  
44c0: 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20 20  int iCur,       
44d0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
44e0: 72 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f  r to scan for */
44f0: 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20  .  int iColumn, 
4500: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
4510: 6c 75 6d 6e 20 74 6f 20 73 63 61 6e 20 66 6f 72  lumn to scan for
4520: 20 2a 2f 0a 20 20 75 33 32 20 6f 70 4d 61 73 6b   */.  u32 opMask
4530: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
4540: 20 4f 70 65 72 61 74 6f 72 28 73 29 20 74 6f 20   Operator(s) to 
4550: 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 49 6e  scan for */.  In
4560: 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20  dex *pIdx       
4570: 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65        /* Must be
4580: 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
4590: 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 29   this index */.)
45a0: 7b 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 2f 2a  {.  int j;..  /*
45b0: 20 6d 65 6d 73 65 74 28 70 53 63 61 6e 2c 20 30   memset(pScan, 0
45c0: 2c 20 73 69 7a 65 6f 66 28 2a 70 53 63 61 6e 29  , sizeof(*pScan)
45d0: 29 3b 20 2a 2f 0a 20 20 70 53 63 61 6e 2d 3e 70  ); */.  pScan->p
45e0: 4f 72 69 67 57 43 20 3d 20 70 57 43 3b 0a 20 20  OrigWC = pWC;.  
45f0: 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70 57 43  pScan->pWC = pWC
4600: 3b 0a 20 20 69 66 28 20 70 49 64 78 20 26 26 20  ;.  if( pIdx && 
4610: 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20  iColumn>=0 ){.  
4620: 20 20 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 20    pScan->idxaff 
4630: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
4640: 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66  aCol[iColumn].af
4650: 66 69 6e 69 74 79 3b 0a 20 20 20 20 66 6f 72 28  finity;.    for(
4660: 6a 3d 30 3b 20 70 49 64 78 2d 3e 61 69 43 6f 6c  j=0; pIdx->aiCol
4670: 75 6d 6e 5b 6a 5d 21 3d 69 43 6f 6c 75 6d 6e 3b  umn[j]!=iColumn;
4680: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
4690: 20 4e 45 56 45 52 28 6a 3e 70 49 64 78 2d 3e 6e   NEVER(j>pIdx->n
46a0: 43 6f 6c 75 6d 6e 29 20 29 20 72 65 74 75 72 6e  Column) ) return
46b0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53   0;.    }.    pS
46c0: 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d  can->zCollName =
46d0: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d   pIdx->azColl[j]
46e0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
46f0: 53 63 61 6e 2d 3e 69 64 78 61 66 66 20 3d 20 30  Scan->idxaff = 0
4700: 3b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 7a 43 6f  ;.    pScan->zCo
4710: 6c 6c 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a  llName = 0;.  }.
4720: 20 20 70 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 20    pScan->opMask 
4730: 3d 20 6f 70 4d 61 73 6b 3b 0a 20 20 70 53 63 61  = opMask;.  pSca
4740: 6e 2d 3e 6b 20 3d 20 30 3b 0a 20 20 70 53 63 61  n->k = 0;.  pSca
4750: 6e 2d 3e 61 45 71 75 69 76 5b 30 5d 20 3d 20 69  n->aEquiv[0] = i
4760: 43 75 72 3b 0a 20 20 70 53 63 61 6e 2d 3e 61 45  Cur;.  pScan->aE
4770: 71 75 69 76 5b 31 5d 20 3d 20 69 43 6f 6c 75 6d  quiv[1] = iColum
4780: 6e 3b 0a 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75  n;.  pScan->nEqu
4790: 69 76 20 3d 20 32 3b 0a 20 20 70 53 63 61 6e 2d  iv = 2;.  pScan-
47a0: 3e 69 45 71 75 69 76 20 3d 20 32 3b 0a 20 20 72  >iEquiv = 2;.  r
47b0: 65 74 75 72 6e 20 77 68 65 72 65 53 63 61 6e 4e  eturn whereScanN
47c0: 65 78 74 28 70 53 63 61 6e 29 3b 0a 7d 0a 0a 2f  ext(pScan);.}../
47d0: 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20  *.** Search for 
47e0: 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48  a term in the WH
47f0: 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20  ERE clause that 
4800: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  is of the form "
4810: 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a  X <op> <expr>".*
4820: 2a 20 77 68 65 72 65 20 58 20 69 73 20 61 20 72  * where X is a r
4830: 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
4840: 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65  iColumn of table
4850: 20 69 43 75 72 20 61 6e 64 20 3c 6f 70 3e 20 69   iCur and <op> i
4860: 73 20 6f 6e 65 20 6f 66 0a 2a 2a 20 74 68 65 20  s one of.** the 
4870: 57 4f 5f 78 78 20 6f 70 65 72 61 74 6f 72 20 63  WO_xx operator c
4880: 6f 64 65 73 20 73 70 65 63 69 66 69 65 64 20 62  odes specified b
4890: 79 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74  y the op paramet
48a0: 65 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  er..** Return a 
48b0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74  pointer to the t
48c0: 65 72 6d 2e 20 20 52 65 74 75 72 6e 20 30 20 69  erm.  Return 0 i
48d0: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a  f not found..**.
48e0: 2a 2a 20 54 68 65 20 74 65 72 6d 20 72 65 74 75  ** The term retu
48f0: 72 6e 65 64 20 6d 69 67 68 74 20 62 79 20 59 3d  rned might by Y=
4900: 3c 65 78 70 72 3e 20 69 66 20 74 68 65 72 65 20  <expr> if there 
4910: 69 73 20 61 6e 6f 74 68 65 72 20 63 6f 6e 73 74  is another const
4920: 72 61 69 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20  raint in.** the 
4930: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
4940: 74 20 73 70 65 63 69 66 69 65 73 20 74 68 61 74  t specifies that
4950: 20 58 3d 59 2e 20 20 41 6e 79 20 73 75 63 68 20   X=Y.  Any such 
4960: 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 69 6c 6c  constraints will
4970: 20 62 65 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65   be.** identifie
4980: 64 20 62 79 20 74 68 65 20 57 4f 5f 45 51 55 49  d by the WO_EQUI
4990: 56 20 62 69 74 20 69 6e 20 74 68 65 20 70 54 65  V bit in the pTe
49a0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 66 69  rm->eOperator fi
49b0: 65 6c 64 2e 20 20 54 68 65 0a 2a 2a 20 61 45 71  eld.  The.** aEq
49c0: 75 69 76 5b 5d 20 61 72 72 61 79 20 68 6f 6c 64  uiv[] array hold
49d0: 73 20 58 20 61 6e 64 20 61 6c 6c 20 69 74 73 20  s X and all its 
49e0: 65 71 75 69 76 61 6c 65 6e 74 73 2c 20 77 69 74  equivalents, wit
49f0: 68 20 65 61 63 68 20 53 51 4c 20 76 61 72 69 61  h each SQL varia
4a00: 62 6c 65 0a 2a 2a 20 74 61 6b 69 6e 67 20 75 70  ble.** taking up
4a10: 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20 61 45   two slots in aE
4a20: 71 75 69 76 5b 5d 2e 20 20 54 68 65 20 66 69 72  quiv[].  The fir
4a30: 73 74 20 73 6c 6f 74 20 69 73 20 66 6f 72 20 74  st slot is for t
4a40: 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
4a50: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 65 63 6f  .** and the seco
4a60: 6e 64 20 69 73 20 66 6f 72 20 74 68 65 20 63 6f  nd is for the co
4a70: 6c 75 6d 6e 20 6e 75 6d 62 65 72 2e 20 20 54 68  lumn number.  Th
4a80: 65 72 65 20 61 72 65 20 32 32 20 73 6c 6f 74 73  ere are 22 slots
4a90: 20 69 6e 20 61 45 71 75 69 76 5b 5d 0a 2a 2a 20   in aEquiv[].** 
4aa0: 73 6f 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65  so that means we
4ab0: 20 63 61 6e 20 6c 6f 6f 6b 20 66 6f 72 20 58 20   can look for X 
4ac0: 70 6c 75 73 20 75 70 20 74 6f 20 31 30 20 6f 74  plus up to 10 ot
4ad0: 68 65 72 20 65 71 75 69 76 61 6c 65 6e 74 20 76  her equivalent v
4ae0: 61 6c 75 65 73 2e 0a 2a 2a 20 48 65 6e 63 65 20  alues..** Hence 
4af0: 61 20 73 65 61 72 63 68 20 66 6f 72 20 58 20 77  a search for X w
4b00: 69 6c 6c 20 72 65 74 75 72 6e 20 3c 65 78 70 72  ill return <expr
4b10: 3e 20 69 66 20 58 3d 41 31 20 61 6e 64 20 41 31  > if X=A1 and A1
4b20: 3d 41 32 20 61 6e 64 20 41 32 3d 41 33 0a 2a 2a  =A2 and A2=A3.**
4b30: 20 61 6e 64 20 2e 2e 2e 20 61 6e 64 20 41 39 3d   and ... and A9=
4b40: 41 31 30 20 61 6e 64 20 41 31 30 3d 3c 65 78 70  A10 and A10=<exp
4b50: 72 3e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  r>..**.** If the
4b60: 72 65 20 61 72 65 20 6d 75 6c 74 69 70 6c 65 20  re are multiple 
4b70: 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48 45  terms in the WHE
4b80: 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  RE clause of the
4b90: 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65   form "X <op> <e
4ba0: 78 70 72 3e 22 0a 2a 2a 20 74 68 65 6e 20 74 72  xpr>".** then tr
4bb0: 79 20 66 6f 72 20 74 68 65 20 6f 6e 65 20 77 69  y for the one wi
4bc0: 74 68 20 6e 6f 20 64 65 70 65 6e 64 65 6e 63 69  th no dependenci
4bd0: 65 73 20 6f 6e 20 3c 65 78 70 72 3e 20 2d 20 69  es on <expr> - i
4be0: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20 77 68  n other words wh
4bf0: 65 72 65 0a 2a 2a 20 3c 65 78 70 72 3e 20 69 73  ere.** <expr> is
4c00: 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72   a constant expr
4c10: 65 73 73 69 6f 6e 20 6f 66 20 73 6f 6d 65 20 6b  ession of some k
4c20: 69 6e 64 2e 20 20 4f 6e 6c 79 20 72 65 74 75 72  ind.  Only retur
4c30: 6e 20 65 6e 74 72 69 65 73 20 6f 66 0a 2a 2a 20  n entries of.** 
4c40: 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e  the form "X <op>
4c50: 20 59 22 20 77 68 65 72 65 20 59 20 69 73 20 61   Y" where Y is a
4c60: 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 6e 6f 74 68   column in anoth
4c70: 65 72 20 74 61 62 6c 65 20 69 66 20 6e 6f 20 74  er table if no t
4c80: 65 72 6d 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66  erms of.** the f
4c90: 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 63 6f 6e  orm "X <op> <con
4ca0: 73 74 2d 65 78 70 72 3e 22 20 65 78 69 73 74 2e  st-expr>" exist.
4cb0: 20 20 20 49 66 20 6e 6f 20 74 65 72 6d 73 20 77     If no terms w
4cc0: 69 74 68 20 61 20 63 6f 6e 73 74 61 6e 74 20 52  ith a constant R
4cd0: 48 53 0a 2a 2a 20 65 78 69 73 74 2c 20 74 72 79  HS.** exist, try
4ce0: 20 74 6f 20 72 65 74 75 72 6e 20 61 20 74 65 72   to return a ter
4cf0: 6d 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  m that does not 
4d00: 75 73 65 20 57 4f 5f 45 51 55 49 56 2e 0a 2a 2f  use WO_EQUIV..*/
4d10: 0a 73 74 61 74 69 63 20 57 68 65 72 65 54 65 72  .static WhereTer
4d20: 6d 20 2a 66 69 6e 64 54 65 72 6d 28 0a 20 20 57  m *findTerm(.  W
4d30: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
4d40: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
4d50: 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73  E clause to be s
4d60: 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 69 6e 74  earched */.  int
4d70: 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20   iCur,          
4d80: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
4d90: 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20  ber of LHS */.  
4da0: 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20  int iColumn,    
4db0: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
4dc0: 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f  number of LHS */
4dd0: 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
4de0: 61 64 79 2c 20 20 20 20 20 2f 2a 20 52 48 53 20  ady,     /* RHS 
4df0: 6d 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61 70  must not overlap
4e00: 20 77 69 74 68 20 74 68 69 73 20 6d 61 73 6b 20   with this mask 
4e10: 2a 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20 20 20  */.  u32 op,    
4e20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
4e30: 73 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61 6c 75  sk of WO_xx valu
4e40: 65 73 20 64 65 73 63 72 69 62 69 6e 67 20 6f 70  es describing op
4e50: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e 64 65  erator */.  Inde
4e60: 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20  x *pIdx         
4e70: 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d    /* Must be com
4e80: 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 69  patible with thi
4e90: 73 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74 20  s index, if not 
4ea0: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68 65  NULL */.){.  Whe
4eb0: 72 65 54 65 72 6d 20 2a 70 52 65 73 75 6c 74 20  reTerm *pResult 
4ec0: 3d 20 30 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  = 0;.  WhereTerm
4ed0: 20 2a 70 3b 0a 20 20 57 68 65 72 65 53 63 61 6e   *p;.  WhereScan
4ee0: 20 73 63 61 6e 3b 0a 0a 20 20 70 20 3d 20 77 68   scan;..  p = wh
4ef0: 65 72 65 53 63 61 6e 49 6e 69 74 28 26 73 63 61  ereScanInit(&sca
4f00: 6e 2c 20 70 57 43 2c 20 69 43 75 72 2c 20 69 43  n, pWC, iCur, iC
4f10: 6f 6c 75 6d 6e 2c 20 6f 70 2c 20 70 49 64 78 29  olumn, op, pIdx)
4f20: 3b 0a 20 20 6f 70 20 26 3d 20 57 4f 5f 45 51 7c  ;.  op &= WO_EQ|
4f30: 57 4f 5f 49 53 3b 0a 20 20 77 68 69 6c 65 28 20  WO_IS;.  while( 
4f40: 70 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d  p ){.    if( (p-
4f50: 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6e  >prereqRight & n
4f60: 6f 74 52 65 61 64 79 29 3d 3d 30 20 29 7b 0a 20  otReady)==0 ){. 
4f70: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 72 65 72       if( p->prer
4f80: 65 71 52 69 67 68 74 3d 3d 30 20 26 26 20 28 70  eqRight==0 && (p
4f90: 2d 3e 65 4f 70 65 72 61 74 6f 72 26 6f 70 29 21  ->eOperator&op)!
4fa0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65  =0 ){.        te
4fb0: 73 74 63 61 73 65 28 20 70 2d 3e 65 4f 70 65 72  stcase( p->eOper
4fc0: 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a  ator & WO_IS );.
4fd0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
4fe0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4ff0: 69 66 28 20 70 52 65 73 75 6c 74 3d 3d 30 20 29  if( pResult==0 )
5000: 20 70 52 65 73 75 6c 74 20 3d 20 70 3b 0a 20 20   pResult = p;.  
5010: 20 20 7d 0a 20 20 20 20 70 20 3d 20 77 68 65 72    }.    p = wher
5020: 65 53 63 61 6e 4e 65 78 74 28 26 73 63 61 6e 29  eScanNext(&scan)
5030: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
5040: 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 20 46 6f  Result;.}../* Fo
5050: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
5060: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
5070: 78 70 72 41 6e 61 6c 79 7a 65 28 53 72 63 4c 69  xprAnalyze(SrcLi
5080: 73 74 2a 2c 20 57 68 65 72 65 43 6c 61 75 73 65  st*, WhereClause
5090: 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20  *, int);../*.** 
50a0: 43 61 6c 6c 20 65 78 70 72 41 6e 61 6c 79 7a 65  Call exprAnalyze
50b0: 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 69 6e   on all terms in
50c0: 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e   a WHERE clause.
50d0: 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69    .*/.static voi
50e0: 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c  d exprAnalyzeAll
50f0: 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  (.  SrcList *pTa
5100: 62 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20  bList,       /* 
5110: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
5120: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
5130: 20 2a 70 57 43 20 20 20 20 20 20 20 20 20 2f 2a   *pWC         /*
5140: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
5150: 65 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  e to be analyzed
5160: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
5170: 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65    for(i=pWC->nTe
5180: 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  rm-1; i>=0; i--)
5190: 7b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a  {.    exprAnalyz
51a0: 65 28 70 54 61 62 4c 69 73 74 2c 20 70 57 43 2c  e(pTabList, pWC,
51b0: 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e   i);.  }.}..#ifn
51c0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
51d0: 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  LIKE_OPTIMIZATIO
51e0: 4e 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  N./*.** Check to
51f0: 20 73 65 65 20 69 66 20 74 68 65 20 67 69 76 65   see if the give
5200: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  n expression is 
5210: 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20 6f  a LIKE or GLOB o
5220: 70 65 72 61 74 6f 72 20 74 68 61 74 0a 2a 2a 20  perator that.** 
5230: 63 61 6e 20 62 65 20 6f 70 74 69 6d 69 7a 65 64  can be optimized
5240: 20 75 73 69 6e 67 20 69 6e 65 71 75 61 6c 69 74   using inequalit
5250: 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20  y constraints.  
5260: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69  Return TRUE if i
5270: 74 20 69 73 0a 2a 2a 20 73 6f 20 61 6e 64 20 66  t is.** so and f
5280: 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a  alse if not..**.
5290: 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66 6f 72 20  ** In order for 
52a0: 74 68 65 20 6f 70 65 72 61 74 6f 72 20 74 6f 20  the operator to 
52b0: 62 65 20 6f 70 74 69 6d 69 7a 69 62 6c 65 2c 20  be optimizible, 
52c0: 74 68 65 20 52 48 53 20 6d 75 73 74 20 62 65 20  the RHS must be 
52d0: 61 20 73 74 72 69 6e 67 0a 2a 2a 20 6c 69 74 65  a string.** lite
52e0: 72 61 6c 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ral that does no
52f0: 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 77  t begin with a w
5300: 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20 4c 48  ildcard.  The LH
5310: 53 20 6d 75 73 74 20 62 65 20 61 20 63 6f 6c 75  S must be a colu
5320: 6d 6e 0a 2a 2a 20 74 68 61 74 20 6d 61 79 20 6f  mn.** that may o
5330: 6e 6c 79 20 62 65 20 4e 55 4c 4c 2c 20 61 20 73  nly be NULL, a s
5340: 74 72 69 6e 67 2c 20 6f 72 20 61 20 42 4c 4f 42  tring, or a BLOB
5350: 2c 20 6e 65 76 65 72 20 61 20 6e 75 6d 62 65 72  , never a number
5360: 2e 20 28 54 68 69 73 20 6d 65 61 6e 73 0a 2a 2a  . (This means.**
5370: 20 74 68 61 74 20 76 69 72 74 75 61 6c 20 74 61   that virtual ta
5380: 62 6c 65 73 20 63 61 6e 6e 6f 74 20 70 61 72 74  bles cannot part
5390: 69 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 4c  icipate in the L
53a0: 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  IKE optimization
53b0: 2e 29 20 20 54 68 65 0a 2a 2a 20 63 6f 6c 6c 61  .)  The.** colla
53c0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
53d0: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 6e 20  r the column on 
53e0: 74 68 65 20 4c 48 53 20 6d 75 73 74 20 62 65 20  the LHS must be 
53f0: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 0a  appropriate for.
5400: 2a 2a 20 74 68 65 20 6f 70 65 72 61 74 6f 72 2e  ** the operator.
5410: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
5420: 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 0a 20 20 50  sLikeOrGlob(.  P
5430: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
5440: 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20   /* Parsing and 
5450: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
5460: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
5470: 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f  r *pExpr,      /
5480: 2a 20 54 65 73 74 20 74 68 69 73 20 65 78 70 72  * Test this expr
5490: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72  ession */.  Expr
54a0: 20 2a 2a 70 70 50 72 65 66 69 78 2c 20 20 2f 2a   **ppPrefix,  /*
54b0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 54 4b 5f 53   Pointer to TK_S
54c0: 54 52 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e  TRING expression
54d0: 20 77 69 74 68 20 70 61 74 74 65 72 6e 20 70 72   with pattern pr
54e0: 65 66 69 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  efix */.  int *p
54f0: 69 73 43 6f 6d 70 6c 65 74 65 2c 20 2f 2a 20 54  isComplete, /* T
5500: 72 75 65 20 69 66 20 74 68 65 20 6f 6e 6c 79 20  rue if the only 
5510: 77 69 6c 64 63 61 72 64 20 69 73 20 25 20 69 6e  wildcard is % in
5520: 20 74 68 65 20 6c 61 73 74 20 63 68 61 72 61 63   the last charac
5530: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ter */.  int *pn
5540: 6f 43 61 73 65 20 20 20 20 20 20 2f 2a 20 54 72  oCase      /* Tr
5550: 75 65 20 69 66 20 75 70 70 65 72 63 61 73 65 20  ue if uppercase 
5560: 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
5570: 20 6c 6f 77 65 72 63 61 73 65 20 2a 2f 0a 29 7b   lowercase */.){
5580: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5590: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
55a0: 20 53 74 72 69 6e 67 20 6f 6e 20 52 48 53 20 6f   String on RHS o
55b0: 66 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20  f LIKE operator 
55c0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68  */.  Expr *pRigh
55d0: 74 2c 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20  t, *pLeft;      
55e0: 2f 2a 20 52 69 67 68 74 20 61 6e 64 20 6c 65 66  /* Right and lef
55f0: 74 20 73 69 7a 65 20 6f 66 20 4c 49 4b 45 20 6f  t size of LIKE o
5600: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70  perator */.  Exp
5610: 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20  rList *pList;   
5620: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
5630: 6f 66 20 6f 70 65 72 61 6e 64 73 20 74 6f 20 74  of operands to t
5640: 68 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72  he LIKE operator
5650: 20 2a 2f 0a 20 20 69 6e 74 20 63 3b 20 20 20 20   */.  int c;    
5660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5670: 20 2f 2a 20 4f 6e 65 20 63 68 61 72 61 63 74 65   /* One characte
5680: 72 20 69 6e 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e  r in z[] */.  in
5690: 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20  t cnt;          
56a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
56b0: 65 72 20 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63 61  er of non-wildca
56c0: 72 64 20 70 72 65 66 69 78 20 63 68 61 72 61 63  rd prefix charac
56d0: 74 65 72 73 20 2a 2f 0a 20 20 63 68 61 72 20 77  ters */.  char w
56e0: 63 5b 33 5d 3b 20 20 20 20 20 20 20 20 20 20 20  c[3];           
56f0: 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64       /* Wildcard
5700: 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20   characters */. 
5710: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
5720: 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44  Parse->db;  /* D
5730: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
5740: 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  on */.  sqlite3_
5750: 76 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b  value *pVal = 0;
5760: 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20  .  int op;      
5770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5780: 20 4f 70 63 6f 64 65 20 6f 66 20 70 52 69 67 68   Opcode of pRigh
5790: 74 20 2a 2f 0a 0a 20 20 69 66 28 20 21 73 71 6c  t */..  if( !sql
57a0: 69 74 65 33 49 73 4c 69 6b 65 46 75 6e 63 74 69  ite3IsLikeFuncti
57b0: 6f 6e 28 64 62 2c 20 70 45 78 70 72 2c 20 70 6e  on(db, pExpr, pn
57c0: 6f 43 61 73 65 2c 20 77 63 29 20 29 7b 0a 20 20  oCase, wc) ){.  
57d0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
57e0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 42  #ifdef SQLITE_EB
57f0: 43 44 49 43 0a 20 20 69 66 28 20 2a 70 6e 6f 43  CDIC.  if( *pnoC
5800: 61 73 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ase ) return 0;.
5810: 23 65 6e 64 69 66 0a 20 20 70 4c 69 73 74 20 3d  #endif.  pList =
5820: 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
5830: 0a 20 20 70 4c 65 66 74 20 3d 20 70 4c 69 73 74  .  pLeft = pList
5840: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[1].pExpr;.  
5850: 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 21 3d 54  if( pLeft->op!=T
5860: 4b 5f 43 4f 4c 55 4d 4e 20 0a 20 20 20 7c 7c 20  K_COLUMN .   || 
5870: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
5880: 69 74 79 28 70 4c 65 66 74 29 21 3d 53 51 4c 49  ity(pLeft)!=SQLI
5890: 54 45 5f 41 46 46 5f 54 45 58 54 20 0a 20 20 20  TE_AFF_TEXT .   
58a0: 7c 7c 20 49 73 56 69 72 74 75 61 6c 28 70 4c 65  || IsVirtual(pLe
58b0: 66 74 2d 3e 70 54 61 62 29 20 20 2f 2a 20 56 61  ft->pTab)  /* Va
58c0: 6c 75 65 20 6d 69 67 68 74 20 62 65 20 6e 75 6d  lue might be num
58d0: 65 72 69 63 20 2a 2f 0a 20 20 29 7b 0a 20 20 20  eric */.  ){.   
58e0: 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 32 30 36 35   /* IMP: R-02065
58f0: 2d 34 39 34 36 35 20 54 68 65 20 6c 65 66 74 2d  -49465 The left-
5900: 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
5910: 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20 6f 70   LIKE or GLOB op
5920: 65 72 61 74 6f 72 20 6d 75 73 74 0a 20 20 20 20  erator must.    
5930: 2a 2a 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f  ** be the name o
5940: 66 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c  f an indexed col
5950: 75 6d 6e 20 77 69 74 68 20 54 45 58 54 20 61 66  umn with TEXT af
5960: 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 72  finity. */.    r
5970: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61  eturn 0;.  }.  a
5980: 73 73 65 72 74 28 20 70 4c 65 66 74 2d 3e 69 43  ssert( pLeft->iC
5990: 6f 6c 75 6d 6e 21 3d 28 2d 31 29 20 29 3b 20 2f  olumn!=(-1) ); /
59a0: 2a 20 42 65 63 61 75 73 65 20 49 50 4b 20 6e 65  * Because IPK ne
59b0: 76 65 72 20 68 61 73 20 41 46 46 5f 54 45 58 54  ver has AFF_TEXT
59c0: 20 2a 2f 0a 0a 20 20 70 52 69 67 68 74 20 3d 20   */..  pRight = 
59d0: 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
59e0: 6f 6c 6c 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b  ollate(pList->a[
59f0: 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 6f 70 20  0].pExpr);.  op 
5a00: 3d 20 70 52 69 67 68 74 2d 3e 6f 70 3b 0a 20 20  = pRight->op;.  
5a10: 69 66 28 20 6f 70 3d 3d 54 4b 5f 56 41 52 49 41  if( op==TK_VARIA
5a20: 42 4c 45 20 29 7b 0a 20 20 20 20 56 64 62 65 20  BLE ){.    Vdbe 
5a30: 2a 70 52 65 70 72 65 70 61 72 65 20 3d 20 70 50  *pReprepare = pP
5a40: 61 72 73 65 2d 3e 70 52 65 70 72 65 70 61 72 65  arse->pReprepare
5a50: 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d  ;.    int iCol =
5a60: 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e   pRight->iColumn
5a70: 3b 0a 20 20 20 20 70 56 61 6c 20 3d 20 73 71 6c  ;.    pVal = sql
5a80: 69 74 65 33 56 64 62 65 47 65 74 42 6f 75 6e 64  ite3VdbeGetBound
5a90: 56 61 6c 75 65 28 70 52 65 70 72 65 70 61 72 65  Value(pReprepare
5aa0: 2c 20 69 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 41  , iCol, SQLITE_A
5ab0: 46 46 5f 4e 4f 4e 45 29 3b 0a 20 20 20 20 69 66  FF_NONE);.    if
5ac0: 28 20 70 56 61 6c 20 26 26 20 73 71 6c 69 74 65  ( pVal && sqlite
5ad0: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 56 61  3_value_type(pVa
5ae0: 6c 29 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20  l)==SQLITE_TEXT 
5af0: 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 28 63 68  ){.      z = (ch
5b00: 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  ar *)sqlite3_val
5b10: 75 65 5f 74 65 78 74 28 70 56 61 6c 29 3b 0a 20  ue_text(pVal);. 
5b20: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
5b30: 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 70  VdbeSetVarmask(p
5b40: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 69 43  Parse->pVdbe, iC
5b50: 6f 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ol);.    assert(
5b60: 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f   pRight->op==TK_
5b70: 56 41 52 49 41 42 4c 45 20 7c 7c 20 70 52 69 67  VARIABLE || pRig
5b80: 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  ht->op==TK_REGIS
5b90: 54 45 52 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69  TER );.  }else i
5ba0: 66 28 20 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47  f( op==TK_STRING
5bb0: 20 29 7b 0a 20 20 20 20 7a 20 3d 20 70 52 69 67   ){.    z = pRig
5bc0: 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  ht->u.zToken;.  
5bd0: 7d 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20  }.  if( z ){.   
5be0: 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77 68   cnt = 0;.    wh
5bf0: 69 6c 65 28 20 28 63 3d 7a 5b 63 6e 74 5d 29 21  ile( (c=z[cnt])!
5c00: 3d 30 20 26 26 20 63 21 3d 77 63 5b 30 5d 20 26  =0 && c!=wc[0] &
5c10: 26 20 63 21 3d 77 63 5b 31 5d 20 26 26 20 63 21  & c!=wc[1] && c!
5c20: 3d 77 63 5b 32 5d 20 29 7b 0a 20 20 20 20 20 20  =wc[2] ){.      
5c30: 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  cnt++;.    }.   
5c40: 20 69 66 28 20 63 6e 74 21 3d 30 20 26 26 20 32   if( cnt!=0 && 2
5c50: 35 35 21 3d 28 75 38 29 7a 5b 63 6e 74 2d 31 5d  55!=(u8)z[cnt-1]
5c60: 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
5c70: 70 50 72 65 66 69 78 3b 0a 20 20 20 20 20 20 2a  pPrefix;.      *
5c80: 70 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 63 3d  pisComplete = c=
5c90: 3d 77 63 5b 30 5d 20 26 26 20 7a 5b 63 6e 74 2b  =wc[0] && z[cnt+
5ca0: 31 5d 3d 3d 30 3b 0a 20 20 20 20 20 20 70 50 72  1]==0;.      pPr
5cb0: 65 66 69 78 20 3d 20 73 71 6c 69 74 65 33 45 78  efix = sqlite3Ex
5cc0: 70 72 28 64 62 2c 20 54 4b 5f 53 54 52 49 4e 47  pr(db, TK_STRING
5cd0: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , z);.      if( 
5ce0: 70 50 72 65 66 69 78 20 29 20 70 50 72 65 66 69  pPrefix ) pPrefi
5cf0: 78 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 63 6e 74 5d  x->u.zToken[cnt]
5d00: 20 3d 20 30 3b 0a 20 20 20 20 20 20 2a 70 70 50   = 0;.      *ppP
5d10: 72 65 66 69 78 20 3d 20 70 50 72 65 66 69 78 3b  refix = pPrefix;
5d20: 0a 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 54  .      if( op==T
5d30: 4b 5f 56 41 52 49 41 42 4c 45 20 29 7b 0a 20 20  K_VARIABLE ){.  
5d40: 20 20 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20        Vdbe *v = 
5d50: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
5d60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5d70: 62 65 53 65 74 56 61 72 6d 61 73 6b 28 76 2c 20  beSetVarmask(v, 
5d80: 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 29  pRight->iColumn)
5d90: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 70  ;.        if( *p
5da0: 69 73 43 6f 6d 70 6c 65 74 65 20 26 26 20 70 52  isComplete && pR
5db0: 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31  ight->u.zToken[1
5dc0: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ] ){.          /
5dd0: 2a 20 49 66 20 74 68 65 20 72 68 73 20 6f 66 20  * If the rhs of 
5de0: 74 68 65 20 4c 49 4b 45 20 65 78 70 72 65 73 73  the LIKE express
5df0: 69 6f 6e 20 69 73 20 61 20 76 61 72 69 61 62 6c  ion is a variabl
5e00: 65 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65  e, and the curre
5e10: 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nt.          ** 
5e20: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 76 61 72  value of the var
5e30: 69 61 62 6c 65 20 6d 65 61 6e 73 20 74 68 65 72  iable means ther
5e40: 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
5e50: 69 6e 76 6f 6b 65 20 74 68 65 20 4c 49 4b 45 0a  invoke the LIKE.
5e60: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e            ** fun
5e70: 63 74 69 6f 6e 2c 20 74 68 65 6e 20 6e 6f 20 4f  ction, then no O
5e80: 50 5f 56 61 72 69 61 62 6c 65 20 77 69 6c 6c 20  P_Variable will 
5e90: 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  be added to the 
5ea0: 70 72 6f 67 72 61 6d 2e 0a 20 20 20 20 20 20 20  program..       
5eb0: 20 20 20 2a 2a 20 54 68 69 73 20 63 61 75 73 65     ** This cause
5ec0: 73 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20 74  s problems for t
5ed0: 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  he sqlite3_bind_
5ee0: 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 29  parameter_name()
5ef0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 41 50  .          ** AP
5f00: 49 2e 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  I. To work aroun
5f10: 64 20 74 68 65 6d 2c 20 61 64 64 20 61 20 64 75  d them, add a du
5f20: 6d 6d 79 20 4f 50 5f 56 61 72 69 61 62 6c 65 20  mmy OP_Variable 
5f30: 68 65 72 65 2e 0a 20 20 20 20 20 20 20 20 20 20  here..          
5f40: 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20 69 6e  */ .          in
5f50: 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
5f60: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
5f70: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
5f80: 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
5f90: 74 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  t(pParse, pRight
5fa0: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20  , r1);.         
5fb0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
5fc0: 67 65 50 33 28 76 2c 20 73 71 6c 69 74 65 33 56  geP3(v, sqlite3V
5fd0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
5fe0: 29 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  )-1, 0);.       
5ff0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
6000: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
6010: 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a   r1);.        }.
6020: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
6030: 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 30 3b 0a  e{.      z = 0;.
6040: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c      }.  }..  sql
6050: 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56  ite3ValueFree(pV
6060: 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 7a  al);.  return (z
6070: 21 3d 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  !=0);.}.#endif /
6080: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49  * SQLITE_OMIT_LI
6090: 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  KE_OPTIMIZATION 
60a0: 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  */...#ifndef SQL
60b0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
60c0: 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 43 68 65 63  TABLE./*.** Chec
60d0: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
60e0: 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
60f0: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a   is of the form.
6100: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6f  **.**         co
6110: 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78 70 72 0a  lumn MATCH expr.
6120: 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 74  **.** If it is t
6130: 68 65 6e 20 72 65 74 75 72 6e 20 54 52 55 45 2e  hen return TRUE.
6140: 20 20 49 66 20 6e 6f 74 2c 20 72 65 74 75 72 6e    If not, return
6150: 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69   FALSE..*/.stati
6160: 63 20 69 6e 74 20 69 73 4d 61 74 63 68 4f 66 43  c int isMatchOfC
6170: 6f 6c 75 6d 6e 28 0a 20 20 45 78 70 72 20 2a 70  olumn(.  Expr *p
6180: 45 78 70 72 20 20 20 20 20 20 2f 2a 20 54 65 73  Expr      /* Tes
6190: 74 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f  t this expressio
61a0: 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69  n */.){.  ExprLi
61b0: 73 74 20 2a 70 4c 69 73 74 3b 0a 0a 20 20 69 66  st *pList;..  if
61c0: 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
61d0: 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20  FUNCTION ){.    
61e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
61f0: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
6200: 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  mp(pExpr->u.zTok
6210: 65 6e 2c 22 6d 61 74 63 68 22 29 21 3d 30 20 29  en,"match")!=0 )
6220: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
6230: 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20 70 45    }.  pList = pE
6240: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
6250: 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  if( pList->nExpr
6260: 21 3d 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=2 ){.    retur
6270: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 0;.  }.  if( p
6280: 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
6290: 2d 3e 6f 70 20 21 3d 20 54 4b 5f 43 4f 4c 55 4d  ->op != TK_COLUM
62a0: 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  N ){.    return 
62b0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
62c0: 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  1;.}.#endif /* S
62d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
62e0: 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a  ALTABLE */../*.*
62f0: 2a 20 49 66 20 74 68 65 20 70 42 61 73 65 20 65  * If the pBase e
6300: 78 70 72 65 73 73 69 6f 6e 20 6f 72 69 67 69 6e  xpression origin
6310: 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f  ated in the ON o
6320: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  r USING clause o
6330: 66 0a 2a 2a 20 61 20 6a 6f 69 6e 2c 20 74 68 65  f.** a join, the
6340: 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65 20 61  n transfer the a
6350: 70 70 72 6f 70 72 69 61 74 65 20 6d 61 72 6b 69  ppropriate marki
6360: 6e 67 73 20 6f 76 65 72 20 74 6f 20 64 65 72 69  ngs over to deri
6370: 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ved..*/.static v
6380: 6f 69 64 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e  oid transferJoin
6390: 4d 61 72 6b 69 6e 67 73 28 45 78 70 72 20 2a 70  Markings(Expr *p
63a0: 44 65 72 69 76 65 64 2c 20 45 78 70 72 20 2a 70  Derived, Expr *p
63b0: 42 61 73 65 29 7b 0a 20 20 69 66 28 20 70 44 65  Base){.  if( pDe
63c0: 72 69 76 65 64 20 29 7b 0a 20 20 20 20 70 44 65  rived ){.    pDe
63d0: 72 69 76 65 64 2d 3e 66 6c 61 67 73 20 7c 3d 20  rived->flags |= 
63e0: 70 42 61 73 65 2d 3e 66 6c 61 67 73 20 26 20 45  pBase->flags & E
63f0: 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 20 20  P_FromJoin;.    
6400: 70 44 65 72 69 76 65 64 2d 3e 69 52 69 67 68 74  pDerived->iRight
6410: 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70 42 61 73  JoinTable = pBas
6420: 65 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  e->iRightJoinTab
6430: 6c 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  le;.  }.}../*.**
6440: 20 4d 61 72 6b 20 74 65 72 6d 20 69 43 68 69 6c   Mark term iChil
6450: 64 20 61 73 20 62 65 69 6e 67 20 61 20 63 68 69  d as being a chi
6460: 6c 64 20 6f 66 20 74 65 72 6d 20 69 50 61 72 65  ld of term iPare
6470: 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  nt.*/.static voi
6480: 64 20 6d 61 72 6b 54 65 72 6d 41 73 43 68 69 6c  d markTermAsChil
6490: 64 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70  d(WhereClause *p
64a0: 57 43 2c 20 69 6e 74 20 69 43 68 69 6c 64 2c 20  WC, int iChild, 
64b0: 69 6e 74 20 69 50 61 72 65 6e 74 29 7b 0a 20 20  int iParent){.  
64c0: 70 57 43 2d 3e 61 5b 69 43 68 69 6c 64 5d 2e 69  pWC->a[iChild].i
64d0: 50 61 72 65 6e 74 20 3d 20 69 50 61 72 65 6e 74  Parent = iParent
64e0: 3b 0a 20 20 70 57 43 2d 3e 61 5b 69 43 68 69 6c  ;.  pWC->a[iChil
64f0: 64 5d 2e 74 72 75 74 68 50 72 6f 62 20 3d 20 70  d].truthProb = p
6500: 57 43 2d 3e 61 5b 69 50 61 72 65 6e 74 5d 2e 74  WC->a[iParent].t
6510: 72 75 74 68 50 72 6f 62 3b 0a 20 20 70 57 43 2d  ruthProb;.  pWC-
6520: 3e 61 5b 69 50 61 72 65 6e 74 5d 2e 6e 43 68 69  >a[iParent].nChi
6530: 6c 64 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ld++;.}../*.** R
6540: 65 74 75 72 6e 20 74 68 65 20 4e 2d 74 68 20 41  eturn the N-th A
6550: 4e 44 2d 63 6f 6e 6e 65 63 74 65 64 20 73 75 62  ND-connected sub
6560: 74 65 72 6d 20 6f 66 20 70 54 65 72 6d 2e 20 20  term of pTerm.  
6570: 4f 72 20 69 66 20 70 54 65 72 6d 20 69 73 20 6e  Or if pTerm is n
6580: 6f 74 0a 2a 2a 20 61 20 63 6f 6e 6a 75 6e 63 74  ot.** a conjunct
6590: 69 6f 6e 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  ion, then return
65a0: 20 6a 75 73 74 20 70 54 65 72 6d 20 77 68 65 6e   just pTerm when
65b0: 20 4e 3d 3d 30 2e 20 20 49 66 20 4e 20 69 73 20   N==0.  If N is 
65c0: 65 78 63 65 65 64 73 0a 2a 2a 20 74 68 65 20 6e  exceeds.** the n
65d0: 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62  umber of availab
65e0: 6c 65 20 73 75 62 74 65 72 6d 73 2c 20 72 65 74  le subterms, ret
65f0: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61  urn NULL..*/.sta
6600: 74 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a 77  tic WhereTerm *w
6610: 68 65 72 65 4e 74 68 53 75 62 74 65 72 6d 28 57  hereNthSubterm(W
6620: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c  hereTerm *pTerm,
6630: 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70   int N){.  if( p
6640: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21  Term->eOperator!
6650: 3d 57 4f 5f 41 4e 44 20 29 7b 0a 20 20 20 20 72  =WO_AND ){.    r
6660: 65 74 75 72 6e 20 4e 3d 3d 30 20 3f 20 70 54 65  eturn N==0 ? pTe
6670: 72 6d 20 3a 20 30 3b 0a 20 20 7d 0a 20 20 69 66  rm : 0;.  }.  if
6680: 28 20 4e 3c 70 54 65 72 6d 2d 3e 75 2e 70 41 6e  ( N<pTerm->u.pAn
6690: 64 49 6e 66 6f 2d 3e 77 63 2e 6e 54 65 72 6d 20  dInfo->wc.nTerm 
66a0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 70  ){.    return &p
66b0: 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f  Term->u.pAndInfo
66c0: 2d 3e 77 63 2e 61 5b 4e 5d 3b 0a 20 20 7d 0a 20  ->wc.a[N];.  }. 
66d0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
66e0: 0a 2a 2a 20 53 75 62 74 65 72 6d 73 20 70 4f 6e  .** Subterms pOn
66f0: 65 20 61 6e 64 20 70 54 77 6f 20 61 72 65 20 63  e and pTwo are c
6700: 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20  ontained within 
6710: 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 57 43  WHERE clause pWC
6720: 2e 20 20 54 68 65 0a 2a 2a 20 74 77 6f 20 73 75  .  The.** two su
6730: 62 74 65 72 6d 73 20 61 72 65 20 69 6e 20 64 69  bterms are in di
6740: 73 6a 75 6e 63 74 69 6f 6e 20 2d 20 74 68 65 79  sjunction - they
6750: 20 61 72 65 20 4f 52 2d 65 64 20 74 6f 67 65 74   are OR-ed toget
6760: 68 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  her..**.** If th
6770: 65 73 65 20 74 77 6f 20 74 65 72 6d 73 20 61 72  ese two terms ar
6780: 65 20 62 6f 74 68 20 6f 66 20 74 68 65 20 66 6f  e both of the fo
6790: 72 6d 3a 20 20 22 41 20 6f 70 20 42 22 20 77 69  rm:  "A op B" wi
67a0: 74 68 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 41  th the same.** A
67b0: 20 61 6e 64 20 42 20 76 61 6c 75 65 73 20 62 75   and B values bu
67c0: 74 20 64 69 66 66 65 72 65 6e 74 20 6f 70 65 72  t different oper
67d0: 61 74 6f 72 73 20 61 6e 64 20 69 66 20 74 68 65  ators and if the
67e0: 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65 0a 2a   operators are.*
67f0: 2a 20 63 6f 6d 70 61 74 69 62 6c 65 20 28 69 66  * compatible (if
6800: 20 6f 6e 65 20 69 73 20 3d 20 61 6e 64 20 74 68   one is = and th
6810: 65 20 6f 74 68 65 72 20 69 73 20 3c 2c 20 66 6f  e other is <, fo
6820: 72 20 65 78 61 6d 70 6c 65 29 20 74 68 65 6e 0a  r example) then.
6830: 2a 2a 20 61 64 64 20 61 20 6e 65 77 20 76 69 72  ** add a new vir
6840: 74 75 61 6c 20 41 4e 44 20 74 65 72 6d 20 74 6f  tual AND term to
6850: 20 70 57 43 20 74 68 61 74 20 69 73 20 74 68 65   pWC that is the
6860: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20   combination of 
6870: 74 68 65 0a 2a 2a 20 74 77 6f 2e 0a 2a 2a 0a 2a  the.** two..**.*
6880: 2a 20 53 6f 6d 65 20 65 78 61 6d 70 6c 65 73 3a  * Some examples:
6890: 0a 2a 2a 0a 2a 2a 20 20 20 20 78 3c 79 20 4f 52  .**.**    x<y OR
68a0: 20 78 3d 79 20 20 20 20 2d 2d 3e 20 20 20 20 20   x=y    -->     
68b0: 78 3c 3d 79 0a 2a 2a 20 20 20 20 78 3d 79 20 4f  x<=y.**    x=y O
68c0: 52 20 78 3d 79 20 20 20 20 2d 2d 3e 20 20 20 20  R x=y    -->    
68d0: 20 78 3d 79 0a 2a 2a 20 20 20 20 78 3c 3d 79 20   x=y.**    x<=y 
68e0: 4f 52 20 78 3c 79 20 20 20 2d 2d 3e 20 20 20 20  OR x<y   -->    
68f0: 20 78 3c 3d 79 0a 2a 2a 0a 2a 2a 20 54 68 65 20   x<=y.**.** The 
6900: 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 4e 4f 54  following is NOT
6910: 20 67 65 6e 65 72 61 74 65 64 3a 0a 2a 2a 0a 2a   generated:.**.*
6920: 2a 20 20 20 20 78 3c 79 20 4f 52 20 78 3e 79 20  *    x<y OR x>y 
6930: 20 20 20 2d 2d 3e 20 20 20 20 20 78 21 3d 79 20     -->     x!=y 
6940: 20 20 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76      .*/.static v
6950: 6f 69 64 20 77 68 65 72 65 43 6f 6d 62 69 6e 65  oid whereCombine
6960: 44 69 73 6a 75 6e 63 74 73 28 0a 20 20 53 72 63  Disjuncts(.  Src
6970: 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
6980: 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20      /* the FROM 
6990: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  clause */.  Wher
69a0: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
69b0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65     /* The comple
69c0: 74 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  te WHERE clause 
69d0: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
69e0: 70 4f 6e 65 2c 20 20 20 20 20 20 20 2f 2a 20 46  pOne,       /* F
69f0: 69 72 73 74 20 64 69 73 6a 75 6e 63 74 20 2a 2f  irst disjunct */
6a00: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
6a10: 77 6f 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63  wo        /* Sec
6a20: 6f 6e 64 20 64 69 73 6a 75 6e 63 74 20 2a 2f 0a  ond disjunct */.
6a30: 29 7b 0a 20 20 75 31 36 20 65 4f 70 20 3d 20 70  ){.  u16 eOp = p
6a40: 4f 6e 65 2d 3e 65 4f 70 65 72 61 74 6f 72 20 7c  One->eOperator |
6a50: 20 70 54 77 6f 2d 3e 65 4f 70 65 72 61 74 6f 72   pTwo->eOperator
6a60: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
6a70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
6a80: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
6a90: 6e 20 28 66 6f 72 20 6d 61 6c 6c 6f 63 29 20 2a  n (for malloc) *
6aa0: 2f 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 20  /.  Expr *pNew; 
6ab0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
6ac0: 77 20 76 69 72 74 75 61 6c 20 65 78 70 72 65 73  w virtual expres
6ad0: 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  sion */.  int op
6ae0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6af0: 20 2f 2a 20 4f 70 65 72 61 74 6f 72 20 66 6f 72   /* Operator for
6b00: 20 74 68 65 20 63 6f 6d 62 69 6e 65 64 20 65 78   the combined ex
6b10: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e  pression */.  in
6b20: 74 20 69 64 78 4e 65 77 3b 20 20 20 20 20 20 20  t idxNew;       
6b30: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
6b40: 20 70 57 43 20 6f 66 20 74 68 65 20 6e 65 78 74   pWC of the next
6b50: 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 2a 2f   virtual term */
6b60: 0a 0a 20 20 69 66 28 20 28 70 4f 6e 65 2d 3e 65  ..  if( (pOne->e
6b70: 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45  Operator & (WO_E
6b80: 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f  Q|WO_LT|WO_LE|WO
6b90: 5f 47 54 7c 57 4f 5f 47 45 29 29 3d 3d 30 20 29  _GT|WO_GE))==0 )
6ba0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28   return;.  if( (
6bb0: 70 54 77 6f 2d 3e 65 4f 70 65 72 61 74 6f 72 20  pTwo->eOperator 
6bc0: 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57  & (WO_EQ|WO_LT|W
6bd0: 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45  O_LE|WO_GT|WO_GE
6be0: 29 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ))==0 ) return;.
6bf0: 20 20 69 66 28 20 28 65 4f 70 20 26 20 28 57 4f    if( (eOp & (WO
6c00: 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29  _EQ|WO_LT|WO_LE)
6c10: 29 21 3d 65 4f 70 0a 20 20 20 26 26 20 28 65 4f  )!=eOp.   && (eO
6c20: 70 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 47 54  p & (WO_EQ|WO_GT
6c30: 7c 57 4f 5f 47 45 29 29 21 3d 65 4f 70 20 29 20  |WO_GE))!=eOp ) 
6c40: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
6c50: 28 20 70 4f 6e 65 2d 3e 70 45 78 70 72 2d 3e 70  ( pOne->pExpr->p
6c60: 4c 65 66 74 21 3d 30 20 26 26 20 70 4f 6e 65 2d  Left!=0 && pOne-
6c70: 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 21 3d  >pExpr->pRight!=
6c80: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
6c90: 54 77 6f 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66  Two->pExpr->pLef
6ca0: 74 21 3d 30 20 26 26 20 70 54 77 6f 2d 3e 70 45  t!=0 && pTwo->pE
6cb0: 78 70 72 2d 3e 70 52 69 67 68 74 21 3d 30 20 29  xpr->pRight!=0 )
6cc0: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45  ;.  if( sqlite3E
6cd0: 78 70 72 43 6f 6d 70 61 72 65 28 70 4f 6e 65 2d  xprCompare(pOne-
6ce0: 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70  >pExpr->pLeft, p
6cf0: 54 77 6f 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66  Two->pExpr->pLef
6d00: 74 2c 20 2d 31 29 20 29 20 72 65 74 75 72 6e 3b  t, -1) ) return;
6d10: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
6d20: 70 72 43 6f 6d 70 61 72 65 28 70 4f 6e 65 2d 3e  prCompare(pOne->
6d30: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 70  pExpr->pRight, p
6d40: 54 77 6f 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  Two->pExpr->pRig
6d50: 68 74 2c 20 2d 31 29 20 29 72 65 74 75 72 6e 3b  ht, -1) )return;
6d60: 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63  .  /* If we reac
6d70: 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74  h this point, it
6d80: 20 6d 65 61 6e 73 20 74 68 65 20 74 77 6f 20 73   means the two s
6d90: 75 62 74 65 72 6d 73 20 63 61 6e 20 62 65 20 63  ubterms can be c
6da0: 6f 6d 62 69 6e 65 64 20 2a 2f 0a 20 20 69 66 28  ombined */.  if(
6db0: 20 28 65 4f 70 20 26 20 28 65 4f 70 2d 31 29 29   (eOp & (eOp-1))
6dc0: 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 65  !=0 ){.    if( e
6dd0: 4f 70 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c  Op & (WO_LT|WO_L
6de0: 45 29 20 29 7b 0a 20 20 20 20 20 20 65 4f 70 20  E) ){.      eOp 
6df0: 3d 20 57 4f 5f 4c 45 3b 0a 20 20 20 20 7d 65 6c  = WO_LE;.    }el
6e00: 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
6e10: 28 20 65 4f 70 20 26 20 28 57 4f 5f 47 54 7c 57  ( eOp & (WO_GT|W
6e20: 4f 5f 47 45 29 20 29 3b 0a 20 20 20 20 20 20 65  O_GE) );.      e
6e30: 4f 70 20 3d 20 57 4f 5f 47 45 3b 0a 20 20 20 20  Op = WO_GE;.    
6e40: 7d 0a 20 20 7d 0a 20 20 64 62 20 3d 20 70 57 43  }.  }.  db = pWC
6e50: 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  ->pWInfo->pParse
6e60: 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73  ->db;.  pNew = s
6e70: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
6e80: 2c 20 70 4f 6e 65 2d 3e 70 45 78 70 72 2c 20 30  , pOne->pExpr, 0
6e90: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
6ea0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
6eb0: 28 6f 70 3d 54 4b 5f 45 51 3b 20 65 4f 70 21 3d  (op=TK_EQ; eOp!=
6ec0: 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45  (WO_EQ<<(op-TK_E
6ed0: 51 29 29 3b 20 6f 70 2b 2b 29 7b 20 61 73 73 65  Q)); op++){ asse
6ee0: 72 74 28 20 6f 70 3c 54 4b 5f 47 45 20 29 3b 20  rt( op<TK_GE ); 
6ef0: 7d 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 6f  }.  pNew->op = o
6f00: 70 3b 0a 20 20 69 64 78 4e 65 77 20 3d 20 77 68  p;.  idxNew = wh
6f10: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
6f20: 70 57 43 2c 20 70 4e 65 77 2c 20 54 45 52 4d 5f  pWC, pNew, TERM_
6f30: 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
6f40: 41 4d 49 43 29 3b 0a 20 20 65 78 70 72 41 6e 61  AMIC);.  exprAna
6f50: 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20  lyze(pSrc, pWC, 
6f60: 69 64 78 4e 65 77 29 3b 0a 7d 0a 0a 23 69 66 20  idxNew);.}..#if 
6f70: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
6f80: 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
6f90: 54 49 4f 4e 29 20 26 26 20 21 64 65 66 69 6e 65  TION) && !define
6fa0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
6fb0: 42 51 55 45 52 59 29 0a 2f 2a 0a 2a 2a 20 41 6e  BQUERY)./*.** An
6fc0: 61 6c 79 7a 65 20 61 20 74 65 72 6d 20 74 68 61  alyze a term tha
6fd0: 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 77  t consists of tw
6fe0: 6f 20 6f 72 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e  o or more OR-con
6ff0: 6e 65 63 74 65 64 0a 2a 2a 20 73 75 62 74 65 72  nected.** subter
7000: 6d 73 2e 20 20 53 6f 20 69 6e 3a 0a 2a 2a 0a 2a  ms.  So in:.**.*
7010: 2a 20 20 20 20 20 2e 2e 2e 20 57 48 45 52 45 20  *     ... WHERE 
7020: 20 28 61 3d 35 29 20 41 4e 44 20 28 62 3d 37 20   (a=5) AND (b=7 
7030: 4f 52 20 63 3d 39 20 4f 52 20 64 3d 31 33 29 20  OR c=9 OR d=13) 
7040: 41 4e 44 20 28 64 3d 31 33 29 0a 2a 2a 20 20 20  AND (d=13).**   
7050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7060: 20 20 20 20 20 20 20 5e 5e 5e 5e 5e 5e 5e 5e 5e         ^^^^^^^^^
7070: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a  ^^^^^^^^^^^.**.*
7080: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
7090: 6e 61 6c 79 7a 65 73 20 74 65 72 6d 73 20 73 75  nalyzes terms su
70a0: 63 68 20 61 73 20 74 68 65 20 6d 69 64 64 6c 65  ch as the middle
70b0: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 61 62 6f   term in the abo
70c0: 76 65 20 65 78 61 6d 70 6c 65 2e 0a 2a 2a 20 41  ve example..** A
70d0: 20 57 68 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a   WhereOrTerm obj
70e0: 65 63 74 20 69 73 20 63 6f 6d 70 75 74 65 64 20  ect is computed 
70f0: 61 6e 64 20 61 74 74 61 63 68 65 64 20 74 6f 20  and attached to 
7100: 74 68 65 20 74 65 72 6d 20 75 6e 64 65 72 0a 2a  the term under.*
7110: 2a 20 61 6e 61 6c 79 73 69 73 2c 20 72 65 67 61  * analysis, rega
7120: 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 6f 75  rdless of the ou
7130: 74 63 6f 6d 65 20 6f 66 20 74 68 65 20 61 6e 61  tcome of the ana
7140: 6c 79 73 69 73 2e 20 20 48 65 6e 63 65 3a 0a 2a  lysis.  Hence:.*
7150: 2a 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65  *.**     WhereTe
7160: 72 6d 2e 77 74 46 6c 61 67 73 20 20 20 7c 3d 20  rm.wtFlags   |= 
7170: 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 0a 2a 2a 20   TERM_ORINFO.** 
7180: 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 75 2e      WhereTerm.u.
7190: 70 4f 72 49 6e 66 6f 20 20 3d 20 20 61 20 64 79  pOrInfo  =  a dy
71a0: 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61  namically alloca
71b0: 74 65 64 20 57 68 65 72 65 4f 72 54 65 72 6d 20  ted WhereOrTerm 
71c0: 6f 62 6a 65 63 74 0a 2a 2a 0a 2a 2a 20 54 68 65  object.**.** The
71d0: 20 74 65 72 6d 20 62 65 69 6e 67 20 61 6e 61 6c   term being anal
71e0: 79 7a 65 64 20 6d 75 73 74 20 68 61 76 65 20 74  yzed must have t
71f0: 77 6f 20 6f 72 20 6d 6f 72 65 20 6f 66 20 4f 52  wo or more of OR
7200: 2d 63 6f 6e 6e 65 63 74 65 64 20 73 75 62 74 65  -connected subte
7210: 72 6d 73 2e 0a 2a 2a 20 41 20 73 69 6e 67 6c 65  rms..** A single
7220: 20 73 75 62 74 65 72 6d 20 6d 69 67 68 74 20 62   subterm might b
7230: 65 20 61 20 73 65 74 20 6f 66 20 41 4e 44 2d 63  e a set of AND-c
7240: 6f 6e 6e 65 63 74 65 64 20 73 75 62 2d 73 75 62  onnected sub-sub
7250: 74 65 72 6d 73 2e 0a 2a 2a 20 45 78 61 6d 70 6c  terms..** Exampl
7260: 65 73 20 6f 66 20 74 65 72 6d 73 20 75 6e 64 65  es of terms unde
7270: 72 20 61 6e 61 6c 79 73 69 73 3a 0a 2a 2a 0a 2a  r analysis:.**.*
7280: 2a 20 20 20 20 20 28 41 29 20 20 20 20 20 74 31  *     (A)     t1
7290: 2e 78 3d 74 32 2e 79 20 4f 52 20 74 31 2e 78 3d  .x=t2.y OR t1.x=
72a0: 74 32 2e 7a 20 4f 52 20 74 31 2e 79 3d 31 35 20  t2.z OR t1.y=15 
72b0: 4f 52 20 74 31 2e 7a 3d 74 33 2e 61 2b 35 0a 2a  OR t1.z=t3.a+5.*
72c0: 2a 20 20 20 20 20 28 42 29 20 20 20 20 20 78 3d  *     (B)     x=
72d0: 65 78 70 72 31 20 4f 52 20 65 78 70 72 32 3d 78  expr1 OR expr2=x
72e0: 20 4f 52 20 78 3d 65 78 70 72 33 0a 2a 2a 20 20   OR x=expr3.**  
72f0: 20 20 20 28 43 29 20 20 20 20 20 74 31 2e 78 3d     (C)     t1.x=
7300: 74 32 2e 79 20 4f 52 20 28 74 31 2e 78 3d 74 32  t2.y OR (t1.x=t2
7310: 2e 7a 20 41 4e 44 20 74 31 2e 79 3d 31 35 29 0a  .z AND t1.y=15).
7320: 2a 2a 20 20 20 20 20 28 44 29 20 20 20 20 20 78  **     (D)     x
7330: 3d 65 78 70 72 31 20 4f 52 20 28 79 3e 31 31 20  =expr1 OR (y>11 
7340: 41 4e 44 20 79 3c 32 32 20 41 4e 44 20 7a 20 4c  AND y<22 AND z L
7350: 49 4b 45 20 27 2a 68 65 6c 6c 6f 2a 27 29 0a 2a  IKE '*hello*').*
7360: 2a 20 20 20 20 20 28 45 29 20 20 20 20 20 28 70  *     (E)     (p
7370: 2e 61 3d 31 20 41 4e 44 20 71 2e 62 3d 32 20 41  .a=1 AND q.b=2 A
7380: 4e 44 20 72 2e 63 3d 33 29 20 4f 52 20 28 70 2e  ND r.c=3) OR (p.
7390: 78 3d 34 20 41 4e 44 20 71 2e 79 3d 35 20 41 4e  x=4 AND q.y=5 AN
73a0: 44 20 72 2e 7a 3d 36 29 0a 2a 2a 20 20 20 20 20  D r.z=6).**     
73b0: 28 46 29 20 20 20 20 20 78 3e 41 20 4f 52 20 28  (F)     x>A OR (
73c0: 78 3d 41 20 41 4e 44 20 79 3e 3d 42 29 0a 2a 2a  x=A AND y>=B).**
73d0: 0a 2a 2a 20 43 41 53 45 20 31 3a 0a 2a 2a 0a 2a  .** CASE 1:.**.*
73e0: 2a 20 49 66 20 61 6c 6c 20 73 75 62 74 65 72 6d  * If all subterm
73f0: 73 20 61 72 65 20 6f 66 20 74 68 65 20 66 6f 72  s are of the for
7400: 6d 20 54 2e 43 3d 65 78 70 72 20 66 6f 72 20 73  m T.C=expr for s
7410: 6f 6d 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  ome single colum
7420: 6e 20 6f 66 20 43 20 61 6e 64 0a 2a 2a 20 61 20  n of C and.** a 
7430: 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 54 20 28  single table T (
7440: 61 73 20 73 68 6f 77 6e 20 69 6e 20 65 78 61 6d  as shown in exam
7450: 70 6c 65 20 42 20 61 62 6f 76 65 29 20 74 68 65  ple B above) the
7460: 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 76  n create a new v
7470: 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 74  irtual.** term t
7480: 68 61 74 20 69 73 20 61 6e 20 65 71 75 69 76 61  hat is an equiva
7490: 6c 65 6e 74 20 49 4e 20 65 78 70 72 65 73 73 69  lent IN expressi
74a0: 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  on.  In other wo
74b0: 72 64 73 2c 20 69 66 20 74 68 65 20 74 65 72 6d  rds, if the term
74c0: 0a 2a 2a 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a  .** being analyz
74d0: 65 64 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ed is:.**.**    
74e0: 20 20 78 20 3d 20 65 78 70 72 31 20 20 4f 52 20    x = expr1  OR 
74f0: 20 65 78 70 72 32 20 3d 20 78 20 20 4f 52 20 20   expr2 = x  OR  
7500: 78 20 3d 20 65 78 70 72 33 0a 2a 2a 0a 2a 2a 20  x = expr3.**.** 
7510: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65  then create a ne
7520: 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6c  w virtual term l
7530: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
7540: 20 20 20 20 20 78 20 49 4e 20 28 65 78 70 72 31       x IN (expr1
7550: 2c 65 78 70 72 32 2c 65 78 70 72 33 29 0a 2a 2a  ,expr2,expr3).**
7560: 0a 2a 2a 20 43 41 53 45 20 32 3a 0a 2a 2a 0a 2a  .** CASE 2:.**.*
7570: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 65  * If there are e
7580: 78 61 63 74 6c 79 20 74 77 6f 20 64 69 73 6a 75  xactly two disju
7590: 6e 63 74 73 20 6f 6e 65 20 73 69 64 65 20 68 61  ncts one side ha
75a0: 73 20 78 3e 41 20 61 6e 64 20 74 68 65 20 6f 74  s x>A and the ot
75b0: 68 65 72 20 73 69 64 65 0a 2a 2a 20 68 61 73 20  her side.** has 
75c0: 78 3d 41 20 28 66 6f 72 20 74 68 65 20 73 61 6d  x=A (for the sam
75d0: 65 20 78 20 61 6e 64 20 41 29 20 74 68 65 6e 20  e x and A) then 
75e0: 61 64 64 20 61 20 6e 65 77 20 76 69 72 74 75 61  add a new virtua
75f0: 6c 20 63 6f 6e 6a 75 6e 63 74 20 74 65 72 6d 20  l conjunct term 
7600: 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20  to the.** WHERE 
7610: 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f  clause of the fo
7620: 72 6d 20 22 78 3e 3d 41 22 2e 20 20 45 78 61 6d  rm "x>=A".  Exam
7630: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ple:.**.**      
7640: 78 3e 41 20 4f 52 20 28 78 3d 41 20 41 4e 44 20  x>A OR (x=A AND 
7650: 79 3e 42 29 20 20 20 20 61 64 64 73 3a 20 20 20  y>B)    adds:   
7660: 20 78 3e 3d 41 0a 2a 2a 0a 2a 2a 20 54 68 65 20   x>=A.**.** The 
7670: 61 64 64 65 64 20 63 6f 6e 6a 75 6e 63 74 20 63  added conjunct c
7680: 61 6e 20 73 6f 6d 65 74 69 6d 65 73 20 62 65 20  an sometimes be 
7690: 68 65 6c 70 66 75 6c 20 69 6e 20 71 75 65 72 79  helpful in query
76a0: 20 70 6c 61 6e 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a   planning..**.**
76b0: 20 43 41 53 45 20 33 3a 0a 2a 2a 0a 2a 2a 20 49   CASE 3:.**.** I
76c0: 66 20 61 6c 6c 20 73 75 62 74 65 72 6d 73 20 61  f all subterms a
76d0: 72 65 20 69 6e 64 65 78 61 62 6c 65 20 62 79 20  re indexable by 
76e0: 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 54  a single table T
76f0: 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a 0a 2a 2a  , then set.**.**
7700: 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 65       WhereTerm.e
7710: 4f 70 65 72 61 74 6f 72 20 20 20 20 20 20 20 20  Operator        
7720: 20 20 20 20 20 20 3d 20 20 57 4f 5f 4f 52 0a 2a        =  WO_OR.*
7730: 2a 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e  *     WhereTerm.
7740: 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78  u.pOrInfo->index
7750: 61 62 6c 65 20 20 7c 3d 20 20 74 68 65 20 63 75  able  |=  the cu
7760: 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
7770: 74 61 62 6c 65 20 54 0a 2a 2a 0a 2a 2a 20 41 20  table T.**.** A 
7780: 73 75 62 74 65 72 6d 20 69 73 20 22 69 6e 64 65  subterm is "inde
7790: 78 61 62 6c 65 22 20 69 66 20 69 74 20 69 73 20  xable" if it is 
77a0: 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 20 22  of the form.** "
77b0: 54 2e 43 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22  T.C <op> <expr>"
77c0: 20 77 68 65 72 65 20 43 20 69 73 20 61 6e 79 20   where C is any 
77d0: 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20  column of table 
77e0: 54 20 61 6e 64 20 0a 2a 2a 20 3c 6f 70 3e 20 69  T and .** <op> i
77f0: 73 20 6f 6e 65 20 6f 66 20 22 3d 22 2c 20 22 3c  s one of "=", "<
7800: 22 2c 20 22 3c 3d 22 2c 20 22 3e 22 2c 20 22 3e  ", "<=", ">", ">
7810: 3d 22 2c 20 22 49 53 20 4e 55 4c 4c 22 2c 20 6f  =", "IS NULL", o
7820: 72 20 22 49 4e 22 2e 0a 2a 2a 20 41 20 73 75 62  r "IN"..** A sub
7830: 74 65 72 6d 20 69 73 20 61 6c 73 6f 20 69 6e 64  term is also ind
7840: 65 78 61 62 6c 65 20 69 66 20 69 74 20 69 73 20  exable if it is 
7850: 61 6e 20 41 4e 44 20 6f 66 20 74 77 6f 20 6f 72  an AND of two or
7860: 20 6d 6f 72 65 0a 2a 2a 20 73 75 62 73 75 62 74   more.** subsubt
7870: 65 72 6d 73 20 61 74 20 6c 65 61 73 74 20 6f 6e  erms at least on
7880: 65 20 6f 66 20 77 68 69 63 68 20 69 73 20 69 6e  e of which is in
7890: 64 65 78 61 62 6c 65 2e 20 20 49 6e 64 65 78 61  dexable.  Indexa
78a0: 62 6c 65 20 41 4e 44 20 0a 2a 2a 20 73 75 62 74  ble AND .** subt
78b0: 65 72 6d 73 20 68 61 76 65 20 74 68 65 69 72 20  erms have their 
78c0: 65 4f 70 65 72 61 74 6f 72 20 73 65 74 20 74 6f  eOperator set to
78d0: 20 57 4f 5f 41 4e 44 20 61 6e 64 20 74 68 65 79   WO_AND and they
78e0: 20 68 61 76 65 0a 2a 2a 20 75 2e 70 41 6e 64 49   have.** u.pAndI
78f0: 6e 66 6f 20 73 65 74 20 74 6f 20 61 20 64 79 6e  nfo set to a dyn
7900: 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74  amically allocat
7910: 65 64 20 57 68 65 72 65 41 6e 64 54 65 72 6d 20  ed WhereAndTerm 
7920: 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 46 72  object..**.** Fr
7930: 6f 6d 20 61 6e 6f 74 68 65 72 20 70 6f 69 6e 74  om another point
7940: 20 6f 66 20 76 69 65 77 2c 20 22 69 6e 64 65 78   of view, "index
7950: 61 62 6c 65 22 20 6d 65 61 6e 73 20 74 68 61 74  able" means that
7960: 20 74 68 65 20 73 75 62 74 65 72 6d 20 63 6f 75   the subterm cou
7970: 6c 64 0a 2a 2a 20 70 6f 74 65 6e 74 69 61 6c 6c  ld.** potentiall
7980: 79 20 62 65 20 75 73 65 64 20 77 69 74 68 20 61  y be used with a
7990: 6e 20 69 6e 64 65 78 20 69 66 20 61 6e 20 61 70  n index if an ap
79a0: 70 72 6f 70 72 69 61 74 65 20 69 6e 64 65 78 20  propriate index 
79b0: 65 78 69 73 74 73 2e 0a 2a 2a 20 54 68 69 73 20  exists..** This 
79c0: 61 6e 61 6c 79 73 69 73 20 64 6f 65 73 20 6e 6f  analysis does no
79d0: 74 20 63 6f 6e 73 69 64 65 72 20 77 68 65 74 68  t consider wheth
79e0: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 69 6e  er or not the in
79f0: 64 65 78 20 65 78 69 73 74 73 3b 20 74 68 61 74  dex exists; that
7a00: 0a 2a 2a 20 69 73 20 64 65 63 69 64 65 64 20 65  .** is decided e
7a10: 6c 73 65 77 68 65 72 65 2e 20 20 54 68 69 73 20  lsewhere.  This 
7a20: 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 6c 6f  analysis only lo
7a30: 6f 6b 73 20 61 74 20 77 68 65 74 68 65 72 20 73  oks at whether s
7a40: 75 62 74 65 72 6d 73 0a 2a 2a 20 61 70 70 72 6f  ubterms.** appro
7a50: 70 72 69 61 74 65 20 66 6f 72 20 69 6e 64 65 78  priate for index
7a60: 69 6e 67 20 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a  ing exist..**.**
7a70: 20 41 6c 6c 20 65 78 61 6d 70 6c 65 73 20 41 20   All examples A 
7a80: 74 68 72 6f 75 67 68 20 45 20 61 62 6f 76 65 20  through E above 
7a90: 73 61 74 69 73 66 79 20 63 61 73 65 20 32 2e 20  satisfy case 2. 
7aa0: 20 42 75 74 20 69 66 20 61 20 74 65 72 6d 0a 2a   But if a term.*
7ab0: 2a 20 61 6c 73 6f 20 73 61 74 69 73 66 69 65 73  * also satisfies
7ac0: 20 63 61 73 65 20 31 20 28 73 75 63 68 20 61 73   case 1 (such as
7ad0: 20 42 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74   B) we know that
7ae0: 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 77   the optimizer w
7af0: 69 6c 6c 0a 2a 2a 20 61 6c 77 61 79 73 20 70 72  ill.** always pr
7b00: 65 66 65 72 20 63 61 73 65 20 31 2c 20 73 6f 20  efer case 1, so 
7b10: 69 6e 20 74 68 61 74 20 63 61 73 65 20 77 65 20  in that case we 
7b20: 70 72 65 74 65 6e 64 20 74 68 61 74 20 63 61 73  pretend that cas
7b30: 65 20 32 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 61  e 2 is not.** sa
7b40: 74 69 73 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  tisfied..**.** I
7b50: 74 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63  t might be the c
7b60: 61 73 65 20 74 68 61 74 20 6d 75 6c 74 69 70 6c  ase that multipl
7b70: 65 20 74 61 62 6c 65 73 20 61 72 65 20 69 6e 64  e tables are ind
7b80: 65 78 61 62 6c 65 2e 20 20 46 6f 72 20 65 78 61  exable.  For exa
7b90: 6d 70 6c 65 2c 0a 2a 2a 20 28 45 29 20 61 62 6f  mple,.** (E) abo
7ba0: 76 65 20 69 73 20 69 6e 64 65 78 61 62 6c 65 20  ve is indexable 
7bb0: 6f 6e 20 74 61 62 6c 65 73 20 50 2c 20 51 2c 20  on tables P, Q, 
7bc0: 61 6e 64 20 52 2e 0a 2a 2a 0a 2a 2a 20 54 65 72  and R..**.** Ter
7bd0: 6d 73 20 74 68 61 74 20 73 61 74 69 73 66 79 20  ms that satisfy 
7be0: 63 61 73 65 20 32 20 61 72 65 20 63 61 6e 64 69  case 2 are candi
7bf0: 64 61 74 65 73 20 66 6f 72 20 6c 6f 6f 6b 75 70  dates for lookup
7c00: 20 62 79 20 75 73 69 6e 67 0a 2a 2a 20 73 65 70   by using.** sep
7c10: 61 72 61 74 65 20 69 6e 64 69 63 65 73 20 74 6f  arate indices to
7c20: 20 66 69 6e 64 20 72 6f 77 69 64 73 20 66 6f 72   find rowids for
7c30: 20 65 61 63 68 20 73 75 62 74 65 72 6d 20 61 6e   each subterm an
7c40: 64 20 63 6f 6d 70 6f 73 69 6e 67 0a 2a 2a 20 74  d composing.** t
7c50: 68 65 20 75 6e 69 6f 6e 20 6f 66 20 61 6c 6c 20  he union of all 
7c60: 72 6f 77 69 64 73 20 75 73 69 6e 67 20 61 20 52  rowids using a R
7c70: 6f 77 53 65 74 20 6f 62 6a 65 63 74 2e 20 20 54  owSet object.  T
7c80: 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72 0a 2a  his is similar.*
7c90: 2a 20 74 6f 20 22 62 69 74 6d 61 70 20 69 6e 64  * to "bitmap ind
7ca0: 69 63 65 73 22 20 69 6e 20 6f 74 68 65 72 20 64  ices" in other d
7cb0: 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65 73 2e  atabase engines.
7cc0: 0a 2a 2a 0a 2a 2a 20 4f 54 48 45 52 57 49 53 45  .**.** OTHERWISE
7cd0: 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65 69 74 68  :.**.** If neith
7ce0: 65 72 20 63 61 73 65 20 31 20 6e 6f 72 20 63 61  er case 1 nor ca
7cf0: 73 65 20 32 20 61 70 70 6c 79 2c 20 74 68 65 6e  se 2 apply, then
7d00: 20 6c 65 61 76 65 20 74 68 65 20 65 4f 70 65 72   leave the eOper
7d10: 61 74 6f 72 20 73 65 74 20 74 6f 0a 2a 2a 20 7a  ator set to.** z
7d20: 65 72 6f 2e 20 20 54 68 69 73 20 74 65 72 6d 20  ero.  This term 
7d30: 69 73 20 6e 6f 74 20 75 73 65 66 75 6c 20 66 6f  is not useful fo
7d40: 72 20 73 65 61 72 63 68 2e 0a 2a 2f 0a 73 74 61  r search..*/.sta
7d50: 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61  tic void exprAna
7d60: 6c 79 7a 65 4f 72 54 65 72 6d 28 0a 20 20 53 72  lyzeOrTerm(.  Sr
7d70: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
7d80: 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46          /* the F
7d90: 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
7da0: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
7db0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65  ,         /* the
7dc0: 20 63 6f 6d 70 6c 65 74 65 20 57 48 45 52 45 20   complete WHERE 
7dd0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
7de0: 69 64 78 54 65 72 6d 20 20 20 20 20 20 20 20 20  idxTerm         
7df0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
7e00: 66 20 74 68 65 20 4f 52 2d 74 65 72 6d 20 74 6f  f the OR-term to
7e10: 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a   be analyzed */.
7e20: 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
7e30: 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57  pWInfo = pWC->pW
7e40: 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 2f 2a 20  Info;        /* 
7e50: 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f  WHERE clause pro
7e60: 63 65 73 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  cessing context 
7e70: 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
7e80: 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  se = pWInfo->pPa
7e90: 72 73 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  rse;         /* 
7ea0: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
7eb0: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
7ec0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
7ed0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
7ee0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
7ef0: 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  on */.  WhereTer
7f00: 6d 20 2a 70 54 65 72 6d 20 3d 20 26 70 57 43 2d  m *pTerm = &pWC-
7f10: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 20 20 20 20  >a[idxTerm];    
7f20: 2f 2a 20 54 68 65 20 74 65 72 6d 20 74 6f 20 62  /* The term to b
7f30: 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20  e analyzed */.  
7f40: 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54  Expr *pExpr = pT
7f50: 65 72 6d 2d 3e 70 45 78 70 72 3b 20 20 20 20 20  erm->pExpr;     
7f60: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65          /* The e
7f70: 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 68 65  xpression of the
7f80: 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 69   term */.  int i
7f90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fb0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
7fc0: 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ers */.  WhereCl
7fd0: 61 75 73 65 20 2a 70 4f 72 57 63 3b 20 20 20 20  ause *pOrWc;    
7fe0: 20 20 20 2f 2a 20 42 72 65 61 6b 75 70 20 6f 66     /* Breakup of
7ff0: 20 70 54 65 72 6d 20 69 6e 74 6f 20 73 75 62 74   pTerm into subt
8000: 65 72 6d 73 20 2a 2f 0a 20 20 57 68 65 72 65 54  erms */.  WhereT
8010: 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 20 20 20  erm *pOrTerm;   
8020: 20 20 20 20 2f 2a 20 41 20 53 75 62 2d 74 65 72      /* A Sub-ter
8030: 6d 20 77 69 74 68 69 6e 20 74 68 65 20 70 4f 72  m within the pOr
8040: 57 63 20 2a 2f 0a 20 20 57 68 65 72 65 4f 72 49  Wc */.  WhereOrI
8050: 6e 66 6f 20 2a 70 4f 72 49 6e 66 6f 3b 20 20 20  nfo *pOrInfo;   
8060: 20 20 2f 2a 20 41 64 64 69 74 69 6f 6e 61 6c 20    /* Additional 
8070: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 73 73 6f  information asso
8080: 63 69 61 74 65 64 20 77 69 74 68 20 70 54 65 72  ciated with pTer
8090: 6d 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 63  m */.  Bitmask c
80a0: 68 6e 67 54 6f 49 4e 3b 20 20 20 20 20 20 20 20  hngToIN;        
80b0: 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74 20   /* Tables that 
80c0: 6d 69 67 68 74 20 73 61 74 69 73 66 79 20 63 61  might satisfy ca
80d0: 73 65 20 31 20 2a 2f 0a 20 20 42 69 74 6d 61 73  se 1 */.  Bitmas
80e0: 6b 20 69 6e 64 65 78 61 62 6c 65 3b 20 20 20 20  k indexable;    
80f0: 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74 68      /* Tables th
8100: 61 74 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65  at are indexable
8110: 2c 20 73 61 74 69 73 66 79 69 6e 67 20 63 61 73  , satisfying cas
8120: 65 20 32 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a  e 2 */..  /*.  *
8130: 2a 20 42 72 65 61 6b 20 74 68 65 20 4f 52 20 63  * Break the OR c
8140: 6c 61 75 73 65 20 69 6e 74 6f 20 69 74 73 20 73  lause into its s
8150: 65 70 61 72 61 74 65 20 73 75 62 74 65 72 6d 73  eparate subterms
8160: 2e 20 20 54 68 65 20 73 75 62 74 65 72 6d 73 20  .  The subterms 
8170: 61 72 65 0a 20 20 2a 2a 20 73 74 6f 72 65 64 20  are.  ** stored 
8180: 69 6e 20 61 20 57 68 65 72 65 43 6c 61 75 73 65  in a WhereClause
8190: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
81a0: 69 6e 69 6e 67 20 77 69 74 68 69 6e 20 74 68 65  ining within the
81b0: 20 57 68 65 72 65 4f 72 49 6e 66 6f 0a 20 20 2a   WhereOrInfo.  *
81c0: 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 73  * object that is
81d0: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65   attached to the
81e0: 20 6f 72 69 67 69 6e 61 6c 20 4f 52 20 63 6c 61   original OR cla
81f0: 75 73 65 20 74 65 72 6d 2e 0a 20 20 2a 2f 0a 20  use term..  */. 
8200: 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d   assert( (pTerm-
8210: 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d  >wtFlags & (TERM
8220: 5f 44 59 4e 41 4d 49 43 7c 54 45 52 4d 5f 4f 52  _DYNAMIC|TERM_OR
8230: 49 4e 46 4f 7c 54 45 52 4d 5f 41 4e 44 49 4e 46  INFO|TERM_ANDINF
8240: 4f 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  O))==0 );.  asse
8250: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
8260: 4b 5f 4f 52 20 29 3b 0a 20 20 70 54 65 72 6d 2d  K_OR );.  pTerm-
8270: 3e 75 2e 70 4f 72 49 6e 66 6f 20 3d 20 70 4f 72  >u.pOrInfo = pOr
8280: 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62  Info = sqlite3Db
8290: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
82a0: 69 7a 65 6f 66 28 2a 70 4f 72 49 6e 66 6f 29 29  izeof(*pOrInfo))
82b0: 3b 0a 20 20 69 66 28 20 70 4f 72 49 6e 66 6f 3d  ;.  if( pOrInfo=
82c0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  =0 ) return;.  p
82d0: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d  Term->wtFlags |=
82e0: 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 3b 0a 20 20   TERM_ORINFO;.  
82f0: 70 4f 72 57 63 20 3d 20 26 70 4f 72 49 6e 66 6f  pOrWc = &pOrInfo
8300: 2d 3e 77 63 3b 0a 20 20 77 68 65 72 65 43 6c 61  ->wc;.  whereCla
8310: 75 73 65 49 6e 69 74 28 70 4f 72 57 63 2c 20 70  useInit(pOrWc, p
8320: 57 49 6e 66 6f 29 3b 0a 20 20 77 68 65 72 65 53  WInfo);.  whereS
8330: 70 6c 69 74 28 70 4f 72 57 63 2c 20 70 45 78 70  plit(pOrWc, pExp
8340: 72 2c 20 54 4b 5f 4f 52 29 3b 0a 20 20 65 78 70  r, TK_OR);.  exp
8350: 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63  rAnalyzeAll(pSrc
8360: 2c 20 70 4f 72 57 63 29 3b 0a 20 20 69 66 28 20  , pOrWc);.  if( 
8370: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
8380: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
8390: 65 72 74 28 20 70 4f 72 57 63 2d 3e 6e 54 65 72  ert( pOrWc->nTer
83a0: 6d 3e 3d 32 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20  m>=2 );..  /*.  
83b0: 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 73  ** Compute the s
83c0: 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61  et of tables tha
83d0: 74 20 6d 69 67 68 74 20 73 61 74 69 73 66 79 20  t might satisfy 
83e0: 63 61 73 65 73 20 31 20 6f 72 20 32 2e 0a 20 20  cases 1 or 2..  
83f0: 2a 2f 0a 20 20 69 6e 64 65 78 61 62 6c 65 20 3d  */.  indexable =
8400: 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20   ~(Bitmask)0;.  
8410: 63 68 6e 67 54 6f 49 4e 20 3d 20 7e 28 42 69 74  chngToIN = ~(Bit
8420: 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69 3d  mask)0;.  for(i=
8430: 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c 20  pOrWc->nTerm-1, 
8440: 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d 3e 61  pOrTerm=pOrWc->a
8450: 3b 20 69 3e 3d 30 20 26 26 20 69 6e 64 65 78 61  ; i>=0 && indexa
8460: 62 6c 65 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72  ble; i--, pOrTer
8470: 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70  m++){.    if( (p
8480: 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
8490: 72 20 26 20 57 4f 5f 53 49 4e 47 4c 45 29 3d 3d  r & WO_SINGLE)==
84a0: 30 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65  0 ){.      Where
84b0: 41 6e 64 49 6e 66 6f 20 2a 70 41 6e 64 49 6e 66  AndInfo *pAndInf
84c0: 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  o;.      assert(
84d0: 20 28 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61   (pOrTerm->wtFla
84e0: 67 73 20 26 20 28 54 45 52 4d 5f 41 4e 44 49 4e  gs & (TERM_ANDIN
84f0: 46 4f 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 29  FO|TERM_ORINFO))
8500: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 68 6e  ==0 );.      chn
8510: 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20  gToIN = 0;.     
8520: 20 70 41 6e 64 49 6e 66 6f 20 3d 20 73 71 6c 69   pAndInfo = sqli
8530: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
8540: 62 2c 20 73 69 7a 65 6f 66 28 2a 70 41 6e 64 49  b, sizeof(*pAndI
8550: 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 69 66 28  nfo));.      if(
8560: 20 70 41 6e 64 49 6e 66 6f 20 29 7b 0a 20 20 20   pAndInfo ){.   
8570: 20 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65       WhereClause
8580: 20 2a 70 41 6e 64 57 43 3b 0a 20 20 20 20 20 20   *pAndWC;.      
8590: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 41 6e    WhereTerm *pAn
85a0: 64 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69  dTerm;.        i
85b0: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 42 69  nt j;.        Bi
85c0: 74 6d 61 73 6b 20 62 20 3d 20 30 3b 0a 20 20 20  tmask b = 0;.   
85d0: 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 75 2e       pOrTerm->u.
85e0: 70 41 6e 64 49 6e 66 6f 20 3d 20 70 41 6e 64 49  pAndInfo = pAndI
85f0: 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 70 4f 72  nfo;.        pOr
8600: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d  Term->wtFlags |=
8610: 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 3b 0a 20   TERM_ANDINFO;. 
8620: 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e         pOrTerm->
8630: 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 41  eOperator = WO_A
8640: 4e 44 3b 0a 20 20 20 20 20 20 20 20 70 41 6e 64  ND;.        pAnd
8650: 57 43 20 3d 20 26 70 41 6e 64 49 6e 66 6f 2d 3e  WC = &pAndInfo->
8660: 77 63 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72  wc;.        wher
8670: 65 43 6c 61 75 73 65 49 6e 69 74 28 70 41 6e 64  eClauseInit(pAnd
8680: 57 43 2c 20 70 57 43 2d 3e 70 57 49 6e 66 6f 29  WC, pWC->pWInfo)
8690: 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 53  ;.        whereS
86a0: 70 6c 69 74 28 70 41 6e 64 57 43 2c 20 70 4f 72  plit(pAndWC, pOr
86b0: 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 54 4b 5f  Term->pExpr, TK_
86c0: 41 4e 44 29 3b 0a 20 20 20 20 20 20 20 20 65 78  AND);.        ex
86d0: 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 53 72  prAnalyzeAll(pSr
86e0: 63 2c 20 70 41 6e 64 57 43 29 3b 0a 20 20 20 20  c, pAndWC);.    
86f0: 20 20 20 20 70 41 6e 64 57 43 2d 3e 70 4f 75 74      pAndWC->pOut
8700: 65 72 20 3d 20 70 57 43 3b 0a 20 20 20 20 20 20  er = pWC;.      
8710: 20 20 74 65 73 74 63 61 73 65 28 20 64 62 2d 3e    testcase( db->
8720: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
8730: 20 20 20 20 20 20 20 20 69 66 28 20 21 64 62 2d          if( !db-
8740: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
8750: 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a  .          for(j
8760: 3d 30 2c 20 70 41 6e 64 54 65 72 6d 3d 70 41 6e  =0, pAndTerm=pAn
8770: 64 57 43 2d 3e 61 3b 20 6a 3c 70 41 6e 64 57 43  dWC->a; j<pAndWC
8780: 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 41  ->nTerm; j++, pA
8790: 6e 64 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20  ndTerm++){.     
87a0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
87b0: 41 6e 64 54 65 72 6d 2d 3e 70 45 78 70 72 20 29  AndTerm->pExpr )
87c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
87d0: 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70 41 6e 64  ( allowedOp(pAnd
87e0: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 29  Term->pExpr->op)
87f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
8800: 20 20 62 20 7c 3d 20 67 65 74 4d 61 73 6b 28 26    b |= getMask(&
8810: 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
8820: 2c 20 70 41 6e 64 54 65 72 6d 2d 3e 6c 65 66 74  , pAndTerm->left
8830: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20  Cursor);.       
8840: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
8850: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
8860: 20 20 20 20 20 69 6e 64 65 78 61 62 6c 65 20 26       indexable &
8870: 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = b;.      }.   
8880: 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65   }else if( pOrTe
8890: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
88a0: 52 4d 5f 43 4f 50 49 45 44 20 29 7b 0a 20 20 20  RM_COPIED ){.   
88b0: 20 20 20 2f 2a 20 53 6b 69 70 20 74 68 69 73 20     /* Skip this 
88c0: 74 65 72 6d 20 66 6f 72 20 6e 6f 77 2e 20 20 57  term for now.  W
88d0: 65 20 72 65 76 69 73 69 74 20 69 74 20 77 68 65  e revisit it whe
88e0: 6e 20 77 65 20 70 72 6f 63 65 73 73 20 74 68 65  n we process the
88f0: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 65 73  .      ** corres
8900: 70 6f 6e 64 69 6e 67 20 54 45 52 4d 5f 56 49 52  ponding TERM_VIR
8910: 54 55 41 4c 20 74 65 72 6d 20 2a 2f 0a 20 20 20  TUAL term */.   
8920: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 69   }else{.      Bi
8930: 74 6d 61 73 6b 20 62 3b 0a 20 20 20 20 20 20 62  tmask b;.      b
8940: 20 3d 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e   = getMask(&pWIn
8950: 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 4f  fo->sMaskSet, pO
8960: 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  rTerm->leftCurso
8970: 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  r);.      if( pO
8980: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
8990: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 7b   TERM_VIRTUAL ){
89a0: 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 54 65  .        WhereTe
89b0: 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 4f  rm *pOther = &pO
89c0: 72 57 63 2d 3e 61 5b 70 4f 72 54 65 72 6d 2d 3e  rWc->a[pOrTerm->
89d0: 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20  iParent];.      
89e0: 20 20 62 20 7c 3d 20 67 65 74 4d 61 73 6b 28 26    b |= getMask(&
89f0: 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
8a00: 2c 20 70 4f 74 68 65 72 2d 3e 6c 65 66 74 43 75  , pOther->leftCu
8a10: 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rsor);.      }. 
8a20: 20 20 20 20 20 69 6e 64 65 78 61 62 6c 65 20 26       indexable &
8a30: 3d 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20 28  = b;.      if( (
8a40: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
8a50: 6f 72 20 26 20 57 4f 5f 45 51 29 3d 3d 30 20 29  or & WO_EQ)==0 )
8a60: 7b 0a 20 20 20 20 20 20 20 20 63 68 6e 67 54 6f  {.        chngTo
8a70: 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  IN = 0;.      }e
8a80: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 68 6e  lse{.        chn
8a90: 67 54 6f 49 4e 20 26 3d 20 62 3b 0a 20 20 20 20  gToIN &= b;.    
8aa0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
8ab0: 20 2f 2a 0a 20 20 2a 2a 20 52 65 63 6f 72 64 20   /*.  ** Record 
8ac0: 74 68 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65  the set of table
8ad0: 73 20 74 68 61 74 20 73 61 74 69 73 66 79 20 63  s that satisfy c
8ae0: 61 73 65 20 33 2e 20 20 54 68 65 20 73 65 74 20  ase 3.  The set 
8af0: 6d 69 67 68 74 20 62 65 0a 20 20 2a 2a 20 65 6d  might be.  ** em
8b00: 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 70 4f 72 49  pty..  */.  pOrI
8b10: 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 3d  nfo->indexable =
8b20: 20 69 6e 64 65 78 61 62 6c 65 3b 0a 20 20 70 54   indexable;.  pT
8b30: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d  erm->eOperator =
8b40: 20 69 6e 64 65 78 61 62 6c 65 3d 3d 30 20 3f 20   indexable==0 ? 
8b50: 30 20 3a 20 57 4f 5f 4f 52 3b 0a 0a 20 20 2f 2a  0 : WO_OR;..  /*
8b60: 20 46 6f 72 20 61 20 74 77 6f 2d 77 61 79 20 4f   For a two-way O
8b70: 52 2c 20 61 74 74 65 6d 70 74 20 74 6f 20 69 6d  R, attempt to im
8b80: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 63 61 73  plementation cas
8b90: 65 20 32 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  e 2..  */.  if( 
8ba0: 69 6e 64 65 78 61 62 6c 65 20 26 26 20 70 4f 72  indexable && pOr
8bb0: 57 63 2d 3e 6e 54 65 72 6d 3d 3d 32 20 29 7b 0a  Wc->nTerm==2 ){.
8bc0: 20 20 20 20 69 6e 74 20 69 4f 6e 65 20 3d 20 30      int iOne = 0
8bd0: 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  ;.    WhereTerm 
8be0: 2a 70 4f 6e 65 3b 0a 20 20 20 20 77 68 69 6c 65  *pOne;.    while
8bf0: 28 20 28 70 4f 6e 65 20 3d 20 77 68 65 72 65 4e  ( (pOne = whereN
8c00: 74 68 53 75 62 74 65 72 6d 28 26 70 4f 72 57 63  thSubterm(&pOrWc
8c10: 2d 3e 61 5b 30 5d 2c 69 4f 6e 65 2b 2b 29 29 21  ->a[0],iOne++))!
8c20: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
8c30: 69 54 77 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20  iTwo = 0;.      
8c40: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 77 6f 3b  WhereTerm *pTwo;
8c50: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 70  .      while( (p
8c60: 54 77 6f 20 3d 20 77 68 65 72 65 4e 74 68 53 75  Two = whereNthSu
8c70: 62 74 65 72 6d 28 26 70 4f 72 57 63 2d 3e 61 5b  bterm(&pOrWc->a[
8c80: 31 5d 2c 69 54 77 6f 2b 2b 29 29 21 3d 30 20 29  1],iTwo++))!=0 )
8c90: 7b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 43  {.        whereC
8ca0: 6f 6d 62 69 6e 65 44 69 73 6a 75 6e 63 74 73 28  ombineDisjuncts(
8cb0: 70 53 72 63 2c 20 70 57 43 2c 20 70 4f 6e 65 2c  pSrc, pWC, pOne,
8cc0: 20 70 54 77 6f 29 3b 0a 20 20 20 20 20 20 7d 0a   pTwo);.      }.
8cd0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a      }.  }..  /*.
8ce0: 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 68 6f    ** chngToIN ho
8cf0: 6c 64 73 20 61 20 73 65 74 20 6f 66 20 74 61 62  lds a set of tab
8d00: 6c 65 73 20 74 68 61 74 20 2a 6d 69 67 68 74 2a  les that *might*
8d10: 20 73 61 74 69 73 66 79 20 63 61 73 65 20 31 2e   satisfy case 1.
8d20: 20 20 42 75 74 0a 20 20 2a 2a 20 77 65 20 68 61    But.  ** we ha
8d30: 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20 61 64  ve to do some ad
8d40: 64 69 74 69 6f 6e 61 6c 20 63 68 65 63 6b 69 6e  ditional checkin
8d50: 67 20 74 6f 20 73 65 65 20 69 66 20 63 61 73 65  g to see if case
8d60: 20 31 20 72 65 61 6c 6c 79 0a 20 20 2a 2a 20 69   1 really.  ** i
8d70: 73 20 73 61 74 69 73 66 69 65 64 2e 0a 20 20 2a  s satisfied..  *
8d80: 2a 0a 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20  *.  ** chngToIN 
8d90: 77 69 6c 6c 20 68 6f 6c 64 20 65 69 74 68 65 72  will hold either
8da0: 20 30 2c 20 31 2c 20 6f 72 20 32 20 62 69 74 73   0, 1, or 2 bits
8db0: 2e 20 20 54 68 65 20 30 2d 62 69 74 20 63 61 73  .  The 0-bit cas
8dc0: 65 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61  e means.  ** tha
8dd0: 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f  t there is no po
8de0: 73 73 69 62 69 6c 69 74 79 20 6f 66 20 74 72 61  ssibility of tra
8df0: 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65 20 4f 52  nsforming the OR
8e00: 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 61 6e 0a   clause into an.
8e10: 20 20 2a 2a 20 49 4e 20 6f 70 65 72 61 74 6f 72    ** IN operator
8e20: 20 62 65 63 61 75 73 65 20 6f 6e 65 20 6f 72 20   because one or 
8e30: 6d 6f 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68  more terms in th
8e40: 65 20 4f 52 20 63 6c 61 75 73 65 20 63 6f 6e 74  e OR clause cont
8e50: 61 69 6e 0a 20 20 2a 2a 20 73 6f 6d 65 74 68 69  ain.  ** somethi
8e60: 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 3d 3d  ng other than ==
8e70: 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   on a column in 
8e80: 74 68 65 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  the single table
8e90: 2e 20 20 54 68 65 20 31 2d 62 69 74 0a 20 20 2a  .  The 1-bit.  *
8ea0: 2a 20 63 61 73 65 20 6d 65 61 6e 73 20 74 68 61  * case means tha
8eb0: 74 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20  t every term of 
8ec0: 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 69 73  the OR clause is
8ed0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 20 20 2a   of the form.  *
8ee0: 2a 20 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 3d  * "table.column=
8ef0: 65 78 70 72 22 20 66 6f 72 20 73 6f 6d 65 20 73  expr" for some s
8f00: 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20 20 54 68  ingle table.  Th
8f10: 65 20 6f 6e 65 20 62 69 74 20 74 68 61 74 20 69  e one bit that i
8f20: 73 20 73 65 74 0a 20 20 2a 2a 20 77 69 6c 6c 20  s set.  ** will 
8f30: 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68  correspond to th
8f40: 65 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 2e 20  e common table. 
8f50: 20 57 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74   We still need t
8f60: 6f 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 0a  o check to make.
8f70: 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20 73 61    ** sure the sa
8f80: 6d 65 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65  me column is use
8f90: 64 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 2e 20  d on all terms. 
8fa0: 20 54 68 65 20 32 2d 62 69 74 20 63 61 73 65 20   The 2-bit case 
8fb0: 69 73 20 77 68 65 6e 0a 20 20 2a 2a 20 74 68 65  is when.  ** the
8fc0: 20 61 6c 6c 20 74 65 72 6d 73 20 61 72 65 20 6f   all terms are o
8fd0: 66 20 74 68 65 20 66 6f 72 6d 20 22 74 61 62 6c  f the form "tabl
8fe0: 65 31 2e 63 6f 6c 75 6d 6e 3d 74 61 62 6c 65 32  e1.column=table2
8ff0: 2e 63 6f 6c 75 6d 6e 22 2e 20 20 49 74 0a 20 20  .column".  It.  
9000: 2a 2a 20 6d 69 67 68 74 20 62 65 20 70 6f 73 73  ** might be poss
9010: 69 62 6c 65 20 74 6f 20 66 6f 72 6d 20 61 6e 20  ible to form an 
9020: 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68  IN operator with
9030: 20 65 69 74 68 65 72 20 74 61 62 6c 65 31 2e 63   either table1.c
9040: 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6f 72 20 74 61  olumn.  ** or ta
9050: 62 6c 65 32 2e 63 6f 6c 75 6d 6e 20 61 73 20 74  ble2.column as t
9060: 68 65 20 4c 48 53 20 69 66 20 65 69 74 68 65 72  he LHS if either
9070: 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76   is common to ev
9080: 65 72 79 20 74 65 72 6d 20 6f 66 0a 20 20 2a 2a  ery term of.  **
9090: 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 2e 0a   the OR clause..
90a0: 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74    **.  ** Note t
90b0: 68 61 74 20 74 65 72 6d 73 20 6f 66 20 74 68 65  hat terms of the
90c0: 20 66 6f 72 6d 20 22 74 61 62 6c 65 2e 63 6f 6c   form "table.col
90d0: 75 6d 6e 31 3d 74 61 62 6c 65 2e 63 6f 6c 75 6d  umn1=table.colum
90e0: 6e 32 22 20 28 74 68 65 0a 20 20 2a 2a 20 73 61  n2" (the.  ** sa
90f0: 6d 65 20 74 61 62 6c 65 20 6f 6e 20 62 6f 74 68  me table on both
9100: 20 73 69 7a 65 73 20 6f 66 20 74 68 65 20 3d 3d   sizes of the ==
9110: 29 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69  ) cannot be opti
9120: 6d 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  mized..  */.  if
9130: 28 20 63 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20  ( chngToIN ){.  
9140: 20 20 69 6e 74 20 6f 6b 54 6f 43 68 6e 67 54 6f    int okToChngTo
9150: 49 4e 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54  IN = 0;     /* T
9160: 72 75 65 20 69 66 20 74 68 65 20 63 6f 6e 76 65  rue if the conve
9170: 72 73 69 6f 6e 20 74 6f 20 49 4e 20 69 73 20 76  rsion to IN is v
9180: 61 6c 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  alid */.    int 
9190: 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 20 20 20  iColumn = -1;   
91a0: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
91b0: 69 6e 64 65 78 20 6f 6e 20 6c 68 73 20 6f 66 20  index on lhs of 
91c0: 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
91d0: 20 20 20 69 6e 74 20 69 43 75 72 73 6f 72 20 3d     int iCursor =
91e0: 20 2d 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   -1;         /* 
91f0: 54 61 62 6c 65 20 63 75 72 73 6f 72 20 63 6f 6d  Table cursor com
9200: 6d 6f 6e 20 74 6f 20 61 6c 6c 20 74 65 72 6d 73  mon to all terms
9210: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20   */.    int j = 
9220: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
9230: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
9240: 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 61  r */..    /* Sea
9250: 72 63 68 20 66 6f 72 20 61 20 74 61 62 6c 65 20  rch for a table 
9260: 61 6e 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  and column that 
9270: 61 70 70 65 61 72 73 20 6f 6e 20 6f 6e 65 20 73  appears on one s
9280: 69 64 65 20 6f 72 20 74 68 65 0a 20 20 20 20 2a  ide or the.    *
9290: 2a 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 3d  * other of the =
92a0: 3d 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 65 76  = operator in ev
92b0: 65 72 79 20 73 75 62 74 65 72 6d 2e 20 20 54 68  ery subterm.  Th
92c0: 61 74 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c  at table and col
92d0: 75 6d 6e 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20  umn.    ** will 
92e0: 62 65 20 72 65 63 6f 72 64 65 64 20 69 6e 20 69  be recorded in i
92f0: 43 75 72 73 6f 72 20 61 6e 64 20 69 43 6f 6c 75  Cursor and iColu
9300: 6d 6e 2e 20 20 54 68 65 72 65 20 6d 69 67 68 74  mn.  There might
9310: 20 6e 6f 74 20 62 65 20 61 6e 79 0a 20 20 20 20   not be any.    
9320: 2a 2a 20 73 75 63 68 20 74 61 62 6c 65 20 61 6e  ** such table an
9330: 64 20 63 6f 6c 75 6d 6e 2e 20 20 53 65 74 20 6f  d column.  Set o
9340: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69 66 20 61  kToChngToIN if a
9350: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 74 61  n appropriate ta
9360: 62 6c 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 63  ble.    ** and c
9370: 6f 6c 75 6d 6e 20 69 73 20 66 6f 75 6e 64 20 62  olumn is found b
9380: 75 74 20 6c 65 61 76 65 20 6f 6b 54 6f 43 68 6e  ut leave okToChn
9390: 67 54 6f 49 4e 20 66 61 6c 73 65 20 69 66 20 6e  gToIN false if n
93a0: 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 20 20 2a 2f  ot found..    */
93b0: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
93c0: 32 20 26 26 20 21 6f 6b 54 6f 43 68 6e 67 54 6f  2 && !okToChngTo
93d0: 49 4e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  IN; j++){.      
93e0: 70 4f 72 54 65 72 6d 20 3d 20 70 4f 72 57 63 2d  pOrTerm = pOrWc-
93f0: 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  >a;.      for(i=
9400: 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 3b 20  pOrWc->nTerm-1; 
9410: 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72 54 65  i>=0; i--, pOrTe
9420: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61  rm++){.        a
9430: 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e  ssert( pOrTerm->
9440: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45  eOperator & WO_E
9450: 51 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 72  Q );.        pOr
9460: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 3d  Term->wtFlags &=
9470: 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20   ~TERM_OR_OK;.  
9480: 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72        if( pOrTer
9490: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  m->leftCursor==i
94a0: 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20  Cursor ){.      
94b0: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
94c0: 68 65 20 32 2d 62 69 74 20 63 61 73 65 20 61 6e  he 2-bit case an
94d0: 64 20 77 65 20 61 72 65 20 6f 6e 20 74 68 65 20  d we are on the 
94e0: 73 65 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e  second iteration
94f0: 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a   and.          *
9500: 2a 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 69  * current term i
9510: 73 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74  s from the first
9520: 20 69 74 65 72 61 74 69 6f 6e 2e 20 20 53 6f 20   iteration.  So 
9530: 73 6b 69 70 20 74 68 69 73 20 74 65 72 6d 2e 20  skip this term. 
9540: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
9550: 65 72 74 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20  ert( j==1 );.   
9560: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
9570: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
9580: 20 20 20 69 66 28 20 28 63 68 6e 67 54 6f 49 4e     if( (chngToIN
9590: 20 26 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e   & getMask(&pWIn
95a0: 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 4f  fo->sMaskSet, pO
95b0: 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  rTerm->leftCurso
95c0: 72 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  r))==0 ){.      
95d0: 20 20 20 20 2f 2a 20 54 68 69 73 20 74 65 72 6d      /* This term
95e0: 20 6d 75 73 74 20 62 65 20 6f 66 20 74 68 65 20   must be of the 
95f0: 66 6f 72 6d 20 74 31 2e 61 3d 3d 74 32 2e 62 20  form t1.a==t2.b 
9600: 77 68 65 72 65 20 74 32 20 69 73 20 69 6e 20 74  where t2 is in t
9610: 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
9620: 63 68 6e 67 54 6f 49 4e 20 73 65 74 20 62 75 74  chngToIN set but
9630: 20 74 31 20 69 73 20 6e 6f 74 2e 20 20 54 68 69   t1 is not.  Thi
9640: 73 20 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 65  s term will be e
9650: 69 74 68 65 72 20 70 72 65 63 65 64 65 64 0a 20  ither preceded. 
9660: 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 66           ** or f
9670: 6f 6c 6c 77 65 64 20 62 79 20 61 6e 20 69 6e 76  ollwed by an inv
9680: 65 72 74 65 64 20 63 6f 70 79 20 28 74 32 2e 62  erted copy (t2.b
9690: 3d 3d 74 31 2e 61 29 2e 20 20 53 6b 69 70 20 74  ==t1.a).  Skip t
96a0: 68 69 73 20 74 65 72 6d 20 0a 20 20 20 20 20 20  his term .      
96b0: 20 20 20 20 2a 2a 20 61 6e 64 20 75 73 65 20 69      ** and use i
96c0: 74 73 20 69 6e 76 65 72 73 69 6f 6e 2e 20 2a 2f  ts inversion. */
96d0: 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
96e0: 61 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74  ase( pOrTerm->wt
96f0: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50  Flags & TERM_COP
9700: 49 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 20  IED );.         
9710: 20 74 65 73 74 63 61 73 65 28 20 70 4f 72 54 65   testcase( pOrTe
9720: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
9730: 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20  RM_VIRTUAL );.  
9740: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9750: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
9760: 20 26 20 28 54 45 52 4d 5f 43 4f 50 49 45 44 7c   & (TERM_COPIED|
9770: 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 20 29 3b  TERM_VIRTUAL) );
9780: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
9790: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nue;.        }. 
97a0: 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d         iColumn =
97b0: 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   pOrTerm->u.left
97c0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
97d0: 69 43 75 72 73 6f 72 20 3d 20 70 4f 72 54 65 72  iCursor = pOrTer
97e0: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3b 0a 20  m->leftCursor;. 
97f0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9800: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
9810: 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  i<0 ){.        /
9820: 2a 20 4e 6f 20 63 61 6e 64 69 64 61 74 65 20 74  * No candidate t
9830: 61 62 6c 65 2b 63 6f 6c 75 6d 6e 20 77 61 73 20  able+column was 
9840: 66 6f 75 6e 64 2e 20 20 54 68 69 73 20 63 61 6e  found.  This can
9850: 20 6f 6e 6c 79 20 6f 63 63 75 72 0a 20 20 20 20   only occur.    
9860: 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73 65      ** on the se
9870: 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20 2a  cond iteration *
9880: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
9890: 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  ( j==1 );.      
98a0: 20 20 61 73 73 65 72 74 28 20 49 73 50 6f 77 65    assert( IsPowe
98b0: 72 4f 66 54 77 6f 28 63 68 6e 67 54 6f 49 4e 29  rOfTwo(chngToIN)
98c0: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
98d0: 72 74 28 20 63 68 6e 67 54 6f 49 4e 3d 3d 67 65  rt( chngToIN==ge
98e0: 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73  tMask(&pWInfo->s
98f0: 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 73 6f 72  MaskSet, iCursor
9900: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ) );.        bre
9910: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
9920: 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 31    testcase( j==1
9930: 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 65   );..      /* We
9940: 20 68 61 76 65 20 66 6f 75 6e 64 20 61 20 63 61   have found a ca
9950: 6e 64 69 64 61 74 65 20 74 61 62 6c 65 20 61 6e  ndidate table an
9960: 64 20 63 6f 6c 75 6d 6e 2e 20 20 43 68 65 63 6b  d column.  Check
9970: 20 74 6f 20 73 65 65 20 69 66 20 74 68 61 74 0a   to see if that.
9980: 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61        ** table a
9990: 6e 64 20 63 6f 6c 75 6d 6e 20 69 73 20 63 6f 6d  nd column is com
99a0: 6d 6f 6e 20 74 6f 20 65 76 65 72 79 20 74 65 72  mon to every ter
99b0: 6d 20 69 6e 20 74 68 65 20 4f 52 20 63 6c 61 75  m in the OR clau
99c0: 73 65 20 2a 2f 0a 20 20 20 20 20 20 6f 6b 54 6f  se */.      okTo
99d0: 43 68 6e 67 54 6f 49 4e 20 3d 20 31 3b 0a 20 20  ChngToIN = 1;.  
99e0: 20 20 20 20 66 6f 72 28 3b 20 69 3e 3d 30 20 26      for(; i>=0 &
99f0: 26 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20  & okToChngToIN; 
9a00: 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b  i--, pOrTerm++){
9a10: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
9a20: 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61   pOrTerm->eOpera
9a30: 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20  tor & WO_EQ );. 
9a40: 20 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65         if( pOrTe
9a50: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d  rm->leftCursor!=
9a60: 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20  iCursor ){.     
9a70: 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74       pOrTerm->wt
9a80: 46 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f  Flags &= ~TERM_O
9a90: 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65  R_OK;.        }e
9aa0: 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d  lse if( pOrTerm-
9ab0: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 21 3d 69  >u.leftColumn!=i
9ac0: 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
9ad0: 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e      okToChngToIN
9ae0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
9af0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
9b00: 6e 74 20 61 66 66 4c 65 66 74 2c 20 61 66 66 52  nt affLeft, affR
9b10: 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20  ight;.          
9b20: 2f 2a 20 49 66 20 74 68 65 20 72 69 67 68 74 2d  /* If the right-
9b30: 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 6c 73  hand side is als
9b40: 6f 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e  o a column, then
9b50: 20 74 68 65 20 61 66 66 69 6e 69 74 69 65 73 0a   the affinities.
9b60: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20            ** of 
9b70: 62 6f 74 68 20 72 69 67 68 74 20 61 6e 64 20 6c  both right and l
9b80: 65 66 74 20 73 69 64 65 73 20 6d 75 73 74 20 62  eft sides must b
9b90: 65 20 73 75 63 68 20 74 68 61 74 20 6e 6f 20 74  e such that no t
9ba0: 79 70 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ype.          **
9bb0: 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 61 72 65   conversions are
9bc0: 20 72 65 71 75 69 72 65 64 20 6f 6e 20 74 68 65   required on the
9bd0: 20 72 69 67 68 74 2e 20 20 28 54 69 63 6b 65 74   right.  (Ticket
9be0: 20 23 32 32 34 39 29 0a 20 20 20 20 20 20 20 20   #2249).        
9bf0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61    */.          a
9c00: 66 66 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65  ffRight = sqlite
9c10: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4f  3ExprAffinity(pO
9c20: 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52  rTerm->pExpr->pR
9c30: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20  ight);.         
9c40: 20 61 66 66 4c 65 66 74 20 3d 20 73 71 6c 69 74   affLeft = sqlit
9c50: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
9c60: 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70  OrTerm->pExpr->p
9c70: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Left);.         
9c80: 20 69 66 28 20 61 66 66 52 69 67 68 74 21 3d 30   if( affRight!=0
9c90: 20 26 26 20 61 66 66 52 69 67 68 74 21 3d 61 66   && affRight!=af
9ca0: 66 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20  fLeft ){.       
9cb0: 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49       okToChngToI
9cc0: 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  N = 0;.         
9cd0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
9ce0: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46      pOrTerm->wtF
9cf0: 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 5f  lags |= TERM_OR_
9d00: 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  OK;.          }.
9d10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9d20: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
9d30: 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6f  At this point, o
9d40: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69 73 20 74  kToChngToIN is t
9d50: 72 75 65 20 69 66 20 6f 72 69 67 69 6e 61 6c 20  rue if original 
9d60: 70 54 65 72 6d 20 73 61 74 69 73 66 69 65 73 0a  pTerm satisfies.
9d70: 20 20 20 20 2a 2a 20 63 61 73 65 20 31 2e 20 20      ** case 1.  
9d80: 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 63 6f  In that case, co
9d90: 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 76 69  nstruct a new vi
9da0: 72 74 75 61 6c 20 74 65 72 6d 20 74 68 61 74 20  rtual term that 
9db0: 69 73 20 0a 20 20 20 20 2a 2a 20 70 54 65 72 6d  is .    ** pTerm
9dc0: 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
9dd0: 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a  an IN operator..
9de0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f      */.    if( o
9df0: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 29 7b 0a 20  kToChngToIN ){. 
9e00: 20 20 20 20 20 45 78 70 72 20 2a 70 44 75 70 3b       Expr *pDup;
9e10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
9e20: 20 74 72 61 6e 73 69 65 6e 74 20 64 75 70 6c 69   transient dupli
9e30: 63 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20  cate expression 
9e40: 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73  */.      ExprLis
9e50: 74 20 2a 70 4c 69 73 74 20 3d 20 30 3b 20 20 20  t *pList = 0;   
9e60: 2f 2a 20 54 68 65 20 52 48 53 20 6f 66 20 74 68  /* The RHS of th
9e70: 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  e IN operator */
9e80: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65  .      Expr *pLe
9e90: 66 74 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  ft = 0;       /*
9ea0: 20 54 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20   The LHS of the 
9eb0: 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
9ec0: 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b       Expr *pNew;
9ed0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
9ee0: 68 65 20 63 6f 6d 70 6c 65 74 65 20 49 4e 20 6f  he complete IN o
9ef0: 70 65 72 61 74 6f 72 20 2a 2f 0a 0a 20 20 20 20  perator */..    
9f00: 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e    for(i=pOrWc->n
9f10: 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d  Term-1, pOrTerm=
9f20: 70 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 3b 20  pOrWc->a; i>=0; 
9f30: 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b  i--, pOrTerm++){
9f40: 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4f  .        if( (pO
9f50: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
9f60: 20 54 45 52 4d 5f 4f 52 5f 4f 4b 29 3d 3d 30 20   TERM_OR_OK)==0 
9f70: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
9f80: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54      assert( pOrT
9f90: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
9fa0: 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20   WO_EQ );.      
9fb0: 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72    assert( pOrTer
9fc0: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  m->leftCursor==i
9fd0: 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 20 20  Cursor );.      
9fe0: 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72    assert( pOrTer
9ff0: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d  m->u.leftColumn=
a000: 3d 69 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20  =iColumn );.    
a010: 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74      pDup = sqlit
a020: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f  e3ExprDup(db, pO
a030: 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52  rTerm->pExpr->pR
a040: 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  ight, 0);.      
a050: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
a060: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
a070: 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20  pWInfo->pParse, 
a080: 70 4c 69 73 74 2c 20 70 44 75 70 29 3b 0a 20 20  pList, pDup);.  
a090: 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 70 4f        pLeft = pO
a0a0: 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c  rTerm->pExpr->pL
a0b0: 65 66 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eft;.      }.   
a0c0: 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74     assert( pLeft
a0d0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 44 75  !=0 );.      pDu
a0e0: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  p = sqlite3ExprD
a0f0: 75 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29  up(db, pLeft, 0)
a100: 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73  ;.      pNew = s
a110: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
a120: 73 65 2c 20 54 4b 5f 49 4e 2c 20 70 44 75 70 2c  se, TK_IN, pDup,
a130: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
a140: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( pNew ){.      
a150: 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20    int idxNew;.  
a160: 20 20 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f        transferJo
a170: 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 2c  inMarkings(pNew,
a180: 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20   pExpr);.       
a190: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
a1a0: 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20  sProperty(pNew, 
a1b0: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
a1c0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78  .        pNew->x
a1d0: 2e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a  .pList = pList;.
a1e0: 20 20 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d          idxNew =
a1f0: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
a200: 72 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 54 45  rt(pWC, pNew, TE
a210: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
a220: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
a230: 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e    testcase( idxN
a240: 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ew==0 );.       
a250: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72   exprAnalyze(pSr
a260: 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b  c, pWC, idxNew);
a270: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d  .        pTerm =
a280: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
a290: 5d 3b 0a 20 20 20 20 20 20 20 20 6d 61 72 6b 54  ];.        markT
a2a0: 65 72 6d 41 73 43 68 69 6c 64 28 70 57 43 2c 20  ermAsChild(pWC, 
a2b0: 69 64 78 4e 65 77 2c 20 69 64 78 54 65 72 6d 29  idxNew, idxTerm)
a2c0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
a2d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
a2e0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
a2f0: 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d   pList);.      }
a300: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f  .      pTerm->eO
a310: 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4e 4f 4f  perator = WO_NOO
a320: 50 3b 20 20 2f 2a 20 63 61 73 65 20 31 20 74 72  P;  /* case 1 tr
a330: 75 6d 70 73 20 63 61 73 65 20 33 20 2a 2f 0a 20  umps case 3 */. 
a340: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
a350: 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49  f /* !SQLITE_OMI
a360: 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
a370: 4e 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49  N && !SQLITE_OMI
a380: 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f  T_SUBQUERY */../
a390: 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74 20 74  *.** The input t
a3a0: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
a3b0: 73 20 61 6e 20 57 68 65 72 65 54 65 72 6d 20 73  s an WhereTerm s
a3c0: 74 72 75 63 74 75 72 65 20 77 69 74 68 20 6f 6e  tructure with on
a3d0: 6c 79 20 74 68 65 0a 2a 2a 20 22 70 45 78 70 72  ly the.** "pExpr
a3e0: 22 20 66 69 65 6c 64 20 66 69 6c 6c 65 64 20 69  " field filled i
a3f0: 6e 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66 20 74  n.  The job of t
a400: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
a410: 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65 0a 2a 2a  o analyze the.**
a420: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 61   subexpression a
a430: 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6c 6c 20  nd populate all 
a440: 74 68 65 20 6f 74 68 65 72 20 66 69 65 6c 64 73  the other fields
a450: 20 6f 66 20 74 68 65 20 57 68 65 72 65 54 65 72   of the WhereTer
a460: 6d 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a  m.** structure..
a470: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  **.** If the exp
a480: 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68  ression is of th
a490: 65 20 66 6f 72 6d 20 22 3c 65 78 70 72 3e 20 3c  e form "<expr> <
a4a0: 6f 70 3e 20 58 22 20 69 74 20 67 65 74 73 20 63  op> X" it gets c
a4b0: 6f 6d 6d 75 74 65 64 0a 2a 2a 20 74 6f 20 74 68  ommuted.** to th
a4c0: 65 20 73 74 61 6e 64 61 72 64 20 66 6f 72 6d 20  e standard form 
a4d0: 6f 66 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  of "X <op> <expr
a4e0: 3e 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  >"..**.** If the
a4f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f   expression is o
a500: 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f  f the form "X <o
a510: 70 3e 20 59 22 20 77 68 65 72 65 20 62 6f 74 68  p> Y" where both
a520: 20 58 20 61 6e 64 20 59 20 61 72 65 0a 2a 2a 20   X and Y are.** 
a530: 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 74 68  columns, then th
a540: 65 20 6f 72 69 67 69 6e 61 6c 20 65 78 70 72 65  e original expre
a550: 73 73 69 6f 6e 20 69 73 20 75 6e 63 68 61 6e 67  ssion is unchang
a560: 65 64 20 61 6e 64 20 61 20 6e 65 77 20 76 69 72  ed and a new vir
a570: 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 6f 66 20  tual.** term of 
a580: 74 68 65 20 66 6f 72 6d 20 22 59 20 3c 6f 70 3e  the form "Y <op>
a590: 20 58 22 20 69 73 20 61 64 64 65 64 20 74 6f 20   X" is added to 
a5a0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
a5b0: 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64   and.** analyzed
a5c0: 20 73 65 70 61 72 61 74 65 6c 79 2e 20 20 54 68   separately.  Th
a5d0: 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d 20  e original term 
a5e0: 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20 54  is marked with T
a5f0: 45 52 4d 5f 43 4f 50 49 45 44 0a 2a 2a 20 61 6e  ERM_COPIED.** an
a600: 64 20 74 68 65 20 6e 65 77 20 74 65 72 6d 20 69  d the new term i
a610: 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20 54 45  s marked with TE
a620: 52 4d 5f 44 59 4e 41 4d 49 43 20 28 62 65 63 61  RM_DYNAMIC (beca
a630: 75 73 65 20 69 74 27 73 20 70 45 78 70 72 0a 2a  use it's pExpr.*
a640: 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72  * needs to be fr
a650: 65 65 64 20 77 69 74 68 20 74 68 65 20 57 68 65  eed with the Whe
a660: 72 65 43 6c 61 75 73 65 29 20 61 6e 64 20 54 45  reClause) and TE
a670: 52 4d 5f 56 49 52 54 55 41 4c 20 28 62 65 63 61  RM_VIRTUAL (beca
a680: 75 73 65 20 69 74 0a 2a 2a 20 69 73 20 61 20 63  use it.** is a c
a690: 6f 6d 6d 75 74 65 64 20 63 6f 70 79 20 6f 66 20  ommuted copy of 
a6a0: 61 20 70 72 69 6f 72 20 74 65 72 6d 2e 29 20 20  a prior term.)  
a6b0: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72  The original ter
a6c0: 6d 20 68 61 73 20 6e 43 68 69 6c 64 3d 31 0a 2a  m has nChild=1.*
a6d0: 2a 20 61 6e 64 20 74 68 65 20 63 6f 70 79 20 68  * and the copy h
a6e0: 61 73 20 69 64 78 50 61 72 65 6e 74 20 73 65 74  as idxParent set
a6f0: 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
a700: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65   the original te
a710: 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  rm..*/.static vo
a720: 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 0a  id exprAnalyze(.
a730: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c    SrcList *pSrc,
a740: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74              /* t
a750: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
a760: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
a770: 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a  *pWC,         /*
a780: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
a790: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 54 65  e */.  int idxTe
a7a0: 72 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rm              
a7b0: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
a7c0: 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c   term to be anal
a7d0: 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57 68 65  yzed */.){.  Whe
a7e0: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d  reInfo *pWInfo =
a7f0: 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 20 2f 2a   pWC->pWInfo; /*
a800: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72   WHERE clause pr
a810: 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74 65 78 74  ocessing context
a820: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
a830: 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  *pTerm;         
a840: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65         /* The te
a850: 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65  rm to be analyze
a860: 64 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b  d */.  WhereMask
a870: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20  Set *pMaskSet;  
a880: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6f          /* Set o
a890: 66 20 74 61 62 6c 65 20 69 6e 64 65 78 20 6d 61  f table index ma
a8a0: 73 6b 73 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  sks */.  Expr *p
a8b0: 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20  Expr;           
a8c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
a8d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62   expression to b
a8e0: 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20  e analyzed */.  
a8f0: 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 4c 65  Bitmask prereqLe
a900: 66 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ft;             
a910: 20 2f 2a 20 50 72 65 72 65 71 75 65 73 69 74 65   /* Prerequesite
a920: 73 20 6f 66 20 74 68 65 20 70 45 78 70 72 2d 3e  s of the pExpr->
a930: 70 4c 65 66 74 20 2a 2f 0a 20 20 42 69 74 6d 61  pLeft */.  Bitma
a940: 73 6b 20 70 72 65 72 65 71 41 6c 6c 3b 20 20 20  sk prereqAll;   
a950: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
a960: 72 65 72 65 71 75 65 73 69 74 65 73 20 6f 66 20  rerequesites of 
a970: 70 45 78 70 72 20 2a 2f 0a 20 20 42 69 74 6d 61  pExpr */.  Bitma
a980: 73 6b 20 65 78 74 72 61 52 69 67 68 74 20 3d 20  sk extraRight = 
a990: 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  0;          /* E
a9a0: 78 74 72 61 20 64 65 70 65 6e 64 65 6e 63 69 65  xtra dependencie
a9b0: 73 20 6f 6e 20 4c 45 46 54 20 4a 4f 49 4e 20 2a  s on LEFT JOIN *
a9c0: 2f 0a 20 20 45 78 70 72 20 2a 70 53 74 72 31 20  /.  Expr *pStr1 
a9d0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
a9e0: 20 20 20 20 20 2f 2a 20 52 48 53 20 6f 66 20 4c       /* RHS of L
a9f0: 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f  IKE/GLOB operato
aa00: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d  r */.  int isCom
aa10: 70 6c 65 74 65 20 3d 20 30 3b 20 20 20 20 20 20  plete = 0;      
aa20: 20 20 20 20 20 20 20 20 2f 2a 20 52 48 53 20 6f          /* RHS o
aa30: 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 65 6e 64 73  f LIKE/GLOB ends
aa40: 20 77 69 74 68 20 77 69 6c 64 63 61 72 64 20 2a   with wildcard *
aa50: 2f 0a 20 20 69 6e 74 20 6e 6f 43 61 73 65 20 3d  /.  int noCase =
aa60: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
aa70: 20 20 20 20 20 2f 2a 20 75 70 70 65 72 63 61 73       /* uppercas
aa80: 65 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  e equivalent to 
aa90: 6c 6f 77 65 72 63 61 73 65 20 2a 2f 0a 20 20 69  lowercase */.  i
aaa0: 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
aab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aac0: 2f 2a 20 54 6f 70 2d 6c 65 76 65 6c 20 6f 70 65  /* Top-level ope
aad0: 72 61 74 6f 72 2e 20 20 70 45 78 70 72 2d 3e 6f  rator.  pExpr->o
aae0: 70 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  p */.  Parse *pP
aaf0: 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  arse = pWInfo->p
ab00: 50 61 72 73 65 3b 20 20 2f 2a 20 50 61 72 73 69  Parse;  /* Parsi
ab10: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
ab20: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
ab30: 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20  arse->db;       
ab40: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
ab50: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66  nection */..  if
ab60: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
ab70: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
ab80: 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20  ;.  }.  pTerm = 
ab90: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
aba0: 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 26  ;.  pMaskSet = &
abb0: 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
abc0: 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 54 65 72  ;.  pExpr = pTer
abd0: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 61 73 73 65  m->pExpr;.  asse
abe0: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
abf0: 4b 5f 41 53 20 26 26 20 70 45 78 70 72 2d 3e 6f  K_AS && pExpr->o
ac00: 70 21 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b  p!=TK_COLLATE );
ac10: 0a 20 20 70 72 65 72 65 71 4c 65 66 74 20 3d 20  .  prereqLeft = 
ac20: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
ac30: 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e  MaskSet, pExpr->
ac40: 70 4c 65 66 74 29 3b 0a 20 20 6f 70 20 3d 20 70  pLeft);.  op = p
ac50: 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20  Expr->op;.  if( 
ac60: 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20  op==TK_IN ){.   
ac70: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
ac80: 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20  pRight==0 );.   
ac90: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
aca0: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
acb0: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
acc0: 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71     pTerm->prereq
acd0: 52 69 67 68 74 20 3d 20 65 78 70 72 53 65 6c 65  Right = exprSele
ace0: 63 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  ctTableUsage(pMa
acf0: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e  skSet, pExpr->x.
ad00: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65  pSelect);.    }e
ad10: 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 65 72 6d  lse{.      pTerm
ad20: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20  ->prereqRight = 
ad30: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
ad40: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78  ge(pMaskSet, pEx
ad50: 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20  pr->x.pList);.  
ad60: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
ad70: 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b  op==TK_ISNULL ){
ad80: 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72  .    pTerm->prer
ad90: 65 71 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 7d  eqRight = 0;.  }
ada0: 65 6c 73 65 7b 0a 20 20 20 20 70 54 65 72 6d 2d  else{.    pTerm-
adb0: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 65  >prereqRight = e
adc0: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
add0: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70  askSet, pExpr->p
ade0: 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70 72  Right);.  }.  pr
adf0: 65 72 65 71 41 6c 6c 20 3d 20 65 78 70 72 54 61  ereqAll = exprTa
ae00: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
ae10: 74 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28  t, pExpr);.  if(
ae20: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
ae30: 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
ae40: 6f 69 6e 29 20 29 7b 0a 20 20 20 20 42 69 74 6d  oin) ){.    Bitm
ae50: 61 73 6b 20 78 20 3d 20 67 65 74 4d 61 73 6b 28  ask x = getMask(
ae60: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d  pMaskSet, pExpr-
ae70: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
ae80: 29 3b 0a 20 20 20 20 70 72 65 72 65 71 41 6c 6c  );.    prereqAll
ae90: 20 7c 3d 20 78 3b 0a 20 20 20 20 65 78 74 72 61   |= x;.    extra
aea0: 52 69 67 68 74 20 3d 20 78 2d 31 3b 20 20 2f 2a  Right = x-1;  /*
aeb0: 20 4f 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73   ON clause terms
aec0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 75 73 65 64   may not be used
aed0: 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 0a 20   with an index. 
aee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aef0: 20 20 20 20 20 20 2a 2a 20 6f 6e 20 6c 65 66 74        ** on left
af00: 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54   table of a LEFT
af10: 20 4a 4f 49 4e 2e 20 20 54 69 63 6b 65 74 20 23   JOIN.  Ticket #
af20: 33 30 31 35 20 2a 2f 0a 20 20 7d 0a 20 20 70 54  3015 */.  }.  pT
af30: 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d  erm->prereqAll =
af40: 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 70 54   prereqAll;.  pT
af50: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  erm->leftCursor 
af60: 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 69  = -1;.  pTerm->i
af70: 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 70  Parent = -1;.  p
af80: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
af90: 3d 20 30 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 77  = 0;.  if( allow
afa0: 65 64 4f 70 28 6f 70 29 20 29 7b 0a 20 20 20 20  edOp(op) ){.    
afb0: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 73 71  Expr *pLeft = sq
afc0: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
afd0: 6c 61 74 65 28 70 45 78 70 72 2d 3e 70 4c 65 66  late(pExpr->pLef
afe0: 74 29 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52  t);.    Expr *pR
aff0: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78  ight = sqlite3Ex
b000: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45  prSkipCollate(pE
b010: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
b020: 20 20 75 31 36 20 6f 70 4d 61 73 6b 20 3d 20 28    u16 opMask = (
b030: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
b040: 68 74 20 26 20 70 72 65 72 65 71 4c 65 66 74 29  ht & prereqLeft)
b050: 3d 3d 30 20 3f 20 57 4f 5f 41 4c 4c 20 3a 20 57  ==0 ? WO_ALL : W
b060: 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20 69 66 28  O_EQUIV;.    if(
b070: 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43   pLeft->op==TK_C
b080: 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 70  OLUMN ){.      p
b090: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
b0a0: 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65   = pLeft->iTable
b0b0: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 75  ;.      pTerm->u
b0c0: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c  .leftColumn = pL
b0d0: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  eft->iColumn;.  
b0e0: 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72      pTerm->eOper
b0f0: 61 74 6f 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d  ator = operatorM
b100: 61 73 6b 28 6f 70 29 20 26 20 6f 70 4d 61 73 6b  ask(op) & opMask
b110: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
b120: 6f 70 3d 3d 54 4b 5f 49 53 20 29 20 70 54 65 72  op==TK_IS ) pTer
b130: 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
b140: 52 4d 5f 49 53 3b 0a 20 20 20 20 69 66 28 20 70  RM_IS;.    if( p
b150: 52 69 67 68 74 20 26 26 20 70 52 69 67 68 74 2d  Right && pRight-
b160: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
b170: 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  {.      WhereTer
b180: 6d 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 45  m *pNew;.      E
b190: 78 70 72 20 2a 70 44 75 70 3b 0a 20 20 20 20 20  xpr *pDup;.     
b1a0: 20 75 31 36 20 65 45 78 74 72 61 4f 70 20 3d 20   u16 eExtraOp = 
b1b0: 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74  0;        /* Ext
b1c0: 72 61 20 62 69 74 73 20 66 6f 72 20 70 4e 65 77  ra bits for pNew
b1d0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  ->eOperator */. 
b1e0: 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
b1f0: 6c 65 66 74 43 75 72 73 6f 72 3e 3d 30 20 29 7b  leftCursor>=0 ){
b200: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 64 78  .        int idx
b210: 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70 44 75  New;.        pDu
b220: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  p = sqlite3ExprD
b230: 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29  up(db, pExpr, 0)
b240: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  ;.        if( db
b250: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
b260: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
b270: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
b280: 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20  , pDup);.       
b290: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
b2a0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 64 78     }.        idx
b2b0: 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73  New = whereClaus
b2c0: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 44 75  eInsert(pWC, pDu
b2d0: 70 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  p, TERM_VIRTUAL|
b2e0: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  TERM_DYNAMIC);. 
b2f0: 20 20 20 20 20 20 20 69 66 28 20 69 64 78 4e 65         if( idxNe
b300: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  w==0 ) return;. 
b310: 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 26 70         pNew = &p
b320: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20  WC->a[idxNew];. 
b330: 20 20 20 20 20 20 20 6d 61 72 6b 54 65 72 6d 41         markTermA
b340: 73 43 68 69 6c 64 28 70 57 43 2c 20 69 64 78 4e  sChild(pWC, idxN
b350: 65 77 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20 20  ew, idxTerm);.  
b360: 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
b370: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
b380: 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77          pTerm->w
b390: 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
b3a0: 4f 50 49 45 44 3b 0a 20 20 20 20 20 20 20 20 69  OPIED;.        i
b3b0: 66 28 20 28 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c  f( (op==TK_EQ ||
b3c0: 20 6f 70 3d 3d 54 4b 5f 49 53 29 0a 20 20 20 20   op==TK_IS).    
b3d0: 20 20 20 20 20 26 26 20 21 45 78 70 72 48 61 73       && !ExprHas
b3e0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
b3f0: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20  EP_FromJoin).   
b400: 20 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a        && Optimiz
b410: 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c  ationEnabled(db,
b420: 20 53 51 4c 49 54 45 5f 54 72 61 6e 73 69 74 69   SQLITE_Transiti
b430: 76 65 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  ve).        ){. 
b440: 20 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e           pTerm->
b450: 65 4f 70 65 72 61 74 6f 72 20 7c 3d 20 57 4f 5f  eOperator |= WO_
b460: 45 51 55 49 56 3b 0a 20 20 20 20 20 20 20 20 20  EQUIV;.         
b470: 20 65 45 78 74 72 61 4f 70 20 3d 20 57 4f 5f 45   eExtraOp = WO_E
b480: 51 55 49 56 3b 0a 20 20 20 20 20 20 20 20 7d 0a  QUIV;.        }.
b490: 20 20 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d          if( op==
b4a0: 54 4b 5f 49 53 20 29 20 70 4e 65 77 2d 3e 77 74  TK_IS ) pNew->wt
b4b0: 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 49 53  Flags |= TERM_IS
b4c0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
b4d0: 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 70 45         pDup = pE
b4e0: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  xpr;.        pNe
b4f0: 77 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  w = pTerm;.     
b500: 20 7d 0a 20 20 20 20 20 20 65 78 70 72 43 6f 6d   }.      exprCom
b510: 6d 75 74 65 28 70 50 61 72 73 65 2c 20 70 44 75  mute(pParse, pDu
b520: 70 29 3b 0a 20 20 20 20 20 20 70 4c 65 66 74 20  p);.      pLeft 
b530: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
b540: 70 43 6f 6c 6c 61 74 65 28 70 44 75 70 2d 3e 70  pCollate(pDup->p
b550: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 70 4e 65  Left);.      pNe
b560: 77 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20  w->leftCursor = 
b570: 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20  pLeft->iTable;. 
b580: 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 6c 65 66       pNew->u.lef
b590: 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d  tColumn = pLeft-
b5a0: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
b5b0: 74 65 73 74 63 61 73 65 28 20 28 70 72 65 72 65  testcase( (prere
b5c0: 71 4c 65 66 74 20 7c 20 65 78 74 72 61 52 69 67  qLeft | extraRig
b5d0: 68 74 29 20 21 3d 20 70 72 65 72 65 71 4c 65 66  ht) != prereqLef
b5e0: 74 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  t );.      pNew-
b5f0: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 70  >prereqRight = p
b600: 72 65 72 65 71 4c 65 66 74 20 7c 20 65 78 74 72  rereqLeft | extr
b610: 61 52 69 67 68 74 3b 0a 20 20 20 20 20 20 70 4e  aRight;.      pN
b620: 65 77 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20  ew->prereqAll = 
b630: 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 20  prereqAll;.     
b640: 20 70 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f 72   pNew->eOperator
b650: 20 3d 20 28 6f 70 65 72 61 74 6f 72 4d 61 73 6b   = (operatorMask
b660: 28 70 44 75 70 2d 3e 6f 70 29 20 2b 20 65 45 78  (pDup->op) + eEx
b670: 74 72 61 4f 70 29 20 26 20 6f 70 4d 61 73 6b 3b  traOp) & opMask;
b680: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 6e  .    }.  }..#ifn
b690: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
b6a0: 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41  BETWEEN_OPTIMIZA
b6b0: 54 49 4f 4e 0a 20 20 2f 2a 20 49 66 20 61 20 74  TION.  /* If a t
b6c0: 65 72 6d 20 69 73 20 74 68 65 20 42 45 54 57 45  erm is the BETWE
b6d0: 45 4e 20 6f 70 65 72 61 74 6f 72 2c 20 63 72 65  EN operator, cre
b6e0: 61 74 65 20 74 77 6f 20 6e 65 77 20 76 69 72 74  ate two new virt
b6f0: 75 61 6c 20 74 65 72 6d 73 0a 20 20 2a 2a 20 74  ual terms.  ** t
b700: 68 61 74 20 64 65 66 69 6e 65 20 74 68 65 20 72  hat define the r
b710: 61 6e 67 65 20 74 68 61 74 20 74 68 65 20 42 45  ange that the BE
b720: 54 57 45 45 4e 20 69 6d 70 6c 65 6d 65 6e 74 73  TWEEN implements
b730: 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  .  For example:.
b740: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 61    **.  **      a
b750: 20 42 45 54 57 45 45 4e 20 62 20 41 4e 44 20 63   BETWEEN b AND c
b760: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 63 6f  .  **.  ** is co
b770: 6e 76 65 72 74 65 64 20 69 6e 74 6f 3a 0a 20 20  nverted into:.  
b780: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 28 61 20  **.  **      (a 
b790: 42 45 54 57 45 45 4e 20 62 20 41 4e 44 20 63 29  BETWEEN b AND c)
b7a0: 20 41 4e 44 20 28 61 3e 3d 62 29 20 41 4e 44 20   AND (a>=b) AND 
b7b0: 28 61 3c 3d 63 29 0a 20 20 2a 2a 0a 20 20 2a 2a  (a<=c).  **.  **
b7c0: 20 54 68 65 20 74 77 6f 20 6e 65 77 20 74 65 72   The two new ter
b7d0: 6d 73 20 61 72 65 20 61 64 64 65 64 20 6f 6e 74  ms are added ont
b7e0: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
b7f0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f 62 6a   WhereClause obj
b800: 65 63 74 2e 0a 20 20 2a 2a 20 54 68 65 20 6e 65  ect..  ** The ne
b810: 77 20 74 65 72 6d 73 20 61 72 65 20 22 64 79 6e  w terms are "dyn
b820: 61 6d 69 63 22 20 61 6e 64 20 61 72 65 20 63 68  amic" and are ch
b830: 69 6c 64 72 65 6e 20 6f 66 20 74 68 65 20 6f 72  ildren of the or
b840: 69 67 69 6e 61 6c 20 42 45 54 57 45 45 4e 0a 20  iginal BETWEEN. 
b850: 20 2a 2a 20 74 65 72 6d 2e 20 20 54 68 61 74 20   ** term.  That 
b860: 6d 65 61 6e 73 20 74 68 61 74 20 69 66 20 74 68  means that if th
b870: 65 20 42 45 54 57 45 45 4e 20 74 65 72 6d 20 69  e BETWEEN term i
b880: 73 20 63 6f 64 65 64 2c 20 74 68 65 20 63 68 69  s coded, the chi
b890: 6c 64 72 65 6e 20 61 72 65 0a 20 20 2a 2a 20 73  ldren are.  ** s
b8a0: 6b 69 70 70 65 64 2e 20 20 4f 72 2c 20 69 66 20  kipped.  Or, if 
b8b0: 74 68 65 20 63 68 69 6c 64 72 65 6e 20 61 72 65  the children are
b8c0: 20 73 61 74 69 73 66 69 65 64 20 62 79 20 61 6e   satisfied by an
b8d0: 20 69 6e 64 65 78 2c 20 74 68 65 20 6f 72 69 67   index, the orig
b8e0: 69 6e 61 6c 0a 20 20 2a 2a 20 42 45 54 57 45 45  inal.  ** BETWEE
b8f0: 4e 20 74 65 72 6d 20 69 73 20 73 6b 69 70 70 65  N term is skippe
b900: 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69  d..  */.  else i
b910: 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
b920: 5f 42 45 54 57 45 45 4e 20 26 26 20 70 57 43 2d  _BETWEEN && pWC-
b930: 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20  >op==TK_AND ){. 
b940: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
b950: 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st = pExpr->x.pL
b960: 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ist;.    int i;.
b970: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
b980: 20 75 38 20 6f 70 73 5b 5d 20 3d 20 7b 54 4b 5f   u8 ops[] = {TK_
b990: 47 45 2c 20 54 4b 5f 4c 45 7d 3b 0a 20 20 20 20  GE, TK_LE};.    
b9a0: 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
b9b0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
b9c0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 32 20  pList->nExpr==2 
b9d0: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
b9e0: 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<2; i++){.     
b9f0: 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b   Expr *pNewExpr;
ba00: 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65  .      int idxNe
ba10: 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 45 78 70  w;.      pNewExp
ba20: 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
ba30: 28 70 50 61 72 73 65 2c 20 6f 70 73 5b 69 5d 2c  (pParse, ops[i],
ba40: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
ba50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
ba60: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
ba70: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
ba80: 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  0),.            
ba90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
baa0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
bab0: 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  db, pList->a[i].
bac0: 70 45 78 70 72 2c 20 30 29 2c 20 30 29 3b 0a 20  pExpr, 0), 0);. 
bad0: 20 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69       transferJoi
bae0: 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 45 78  nMarkings(pNewEx
baf0: 70 72 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  pr, pExpr);.    
bb00: 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65    idxNew = where
bb10: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
bb20: 2c 20 70 4e 65 77 45 78 70 72 2c 20 54 45 52 4d  , pNewExpr, TERM
bb30: 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59  _VIRTUAL|TERM_DY
bb40: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 74 65  NAMIC);.      te
bb50: 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d  stcase( idxNew==
bb60: 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 41  0 );.      exprA
bb70: 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43  nalyze(pSrc, pWC
bb80: 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20 20  , idxNew);.     
bb90: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
bba0: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20  [idxTerm];.     
bbb0: 20 6d 61 72 6b 54 65 72 6d 41 73 43 68 69 6c 64   markTermAsChild
bbc0: 28 70 57 43 2c 20 69 64 78 4e 65 77 2c 20 69 64  (pWC, idxNew, id
bbd0: 78 54 65 72 6d 29 3b 0a 20 20 20 20 7d 0a 20 20  xTerm);.    }.  
bbe0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
bbf0: 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f  TE_OMIT_BETWEEN_
bc00: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a  OPTIMIZATION */.
bc10: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
bc20: 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54  LITE_OMIT_OR_OPT
bc30: 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26 20 21 64  IMIZATION) && !d
bc40: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
bc50: 49 54 5f 53 55 42 51 55 45 52 59 29 0a 20 20 2f  IT_SUBQUERY).  /
bc60: 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74 65 72 6d  * Analyze a term
bc70: 20 74 68 61 74 20 69 73 20 63 6f 6d 70 6f 73 65   that is compose
bc80: 64 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  d of two or more
bc90: 20 73 75 62 74 65 72 6d 73 20 63 6f 6e 6e 65 63   subterms connec
bca0: 74 65 64 20 62 79 0a 20 20 2a 2a 20 61 6e 20 4f  ted by.  ** an O
bcb0: 52 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f  R operator..  */
bcc0: 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45 78 70  .  else if( pExp
bcd0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 7b 0a  r->op==TK_OR ){.
bce0: 20 20 20 20 61 73 73 65 72 74 28 20 70 57 43 2d      assert( pWC-
bcf0: 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20  >op==TK_AND );. 
bd00: 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72     exprAnalyzeOr
bd10: 54 65 72 6d 28 70 53 72 63 2c 20 70 57 43 2c 20  Term(pSrc, pWC, 
bd20: 69 64 78 54 65 72 6d 29 3b 0a 20 20 20 20 70 54  idxTerm);.    pT
bd30: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
bd40: 78 54 65 72 6d 5d 3b 0a 20 20 7d 0a 23 65 6e 64  xTerm];.  }.#end
bd50: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
bd60: 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
bd70: 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  N */..#ifndef SQ
bd80: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f  LITE_OMIT_LIKE_O
bd90: 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a  PTIMIZATION.  /*
bda0: 20 41 64 64 20 63 6f 6e 73 74 72 61 69 6e 74 73   Add constraints
bdb0: 20 74 6f 20 72 65 64 75 63 65 20 74 68 65 20 73   to reduce the s
bdc0: 65 61 72 63 68 20 73 70 61 63 65 20 6f 6e 20 61  earch space on a
bdd0: 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 0a 20 20   LIKE or GLOB.  
bde0: 2a 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a  ** operator..  *
bdf0: 2a 0a 20 20 2a 2a 20 41 20 6c 69 6b 65 20 70 61  *.  ** A like pa
be00: 74 74 65 72 6e 20 6f 66 20 74 68 65 20 66 6f 72  ttern of the for
be10: 6d 20 22 78 20 4c 49 4b 45 20 27 61 42 63 25 27  m "x LIKE 'aBc%'
be20: 22 20 69 73 20 63 68 61 6e 67 65 64 20 69 6e 74  " is changed int
be30: 6f 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20  o constraints.  
be40: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
be50: 20 78 3e 3d 27 41 42 43 27 20 41 4e 44 20 78 3c   x>='ABC' AND x<
be60: 27 61 62 64 27 20 41 4e 44 20 78 20 4c 49 4b 45  'abd' AND x LIKE
be70: 20 27 61 42 63 25 27 0a 20 20 2a 2a 0a 20 20 2a   'aBc%'.  **.  *
be80: 2a 20 54 68 65 20 6c 61 73 74 20 63 68 61 72 61  * The last chara
be90: 63 74 65 72 20 6f 66 20 74 68 65 20 70 72 65 66  cter of the pref
bea0: 69 78 20 22 61 62 63 22 20 69 73 20 69 6e 63 72  ix "abc" is incr
beb0: 65 6d 65 6e 74 65 64 20 74 6f 20 66 6f 72 6d 20  emented to form 
bec0: 74 68 65 0a 20 20 2a 2a 20 74 65 72 6d 69 6e 61  the.  ** termina
bed0: 74 69 6f 6e 20 63 6f 6e 64 69 74 69 6f 6e 20 22  tion condition "
bee0: 61 62 64 22 2e 20 20 49 66 20 63 61 73 65 20 69  abd".  If case i
bef0: 73 20 6e 6f 74 20 73 69 67 6e 69 66 69 63 61 6e  s not significan
bf00: 74 20 28 74 68 65 20 64 65 66 61 75 6c 74 0a 20  t (the default. 
bf10: 20 2a 2a 20 66 6f 72 20 4c 49 4b 45 29 20 74 68   ** for LIKE) th
bf20: 65 6e 20 74 68 65 20 6c 6f 77 65 72 2d 62 6f 75  en the lower-bou
bf30: 6e 64 20 69 73 20 6d 61 64 65 20 61 6c 6c 20 75  nd is made all u
bf40: 70 70 65 72 63 61 73 65 20 61 6e 64 20 74 68 65  ppercase and the
bf50: 20 75 70 70 65 72 2d 0a 20 20 2a 2a 20 62 6f 75   upper-.  ** bou
bf60: 6e 64 20 69 73 20 6d 61 64 65 20 61 6c 6c 20 6c  nd is made all l
bf70: 6f 77 65 72 63 61 73 65 20 73 6f 20 74 68 61 74  owercase so that
bf80: 20 74 68 65 20 62 6f 75 6e 64 73 20 61 6c 73 6f   the bounds also
bf90: 20 77 6f 72 6b 20 77 68 65 6e 20 63 6f 6d 70 61   work when compa
bfa0: 72 69 6e 67 0a 20 20 2a 2a 20 42 4c 4f 42 73 2e  ring.  ** BLOBs.
bfb0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 43 2d  .  */.  if( pWC-
bfc0: 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 0a 20 20 20  >op==TK_AND .   
bfd0: 26 26 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28  && isLikeOrGlob(
bfe0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26  pParse, pExpr, &
bff0: 70 53 74 72 31 2c 20 26 69 73 43 6f 6d 70 6c 65  pStr1, &isComple
c000: 74 65 2c 20 26 6e 6f 43 61 73 65 29 0a 20 20 29  te, &noCase).  )
c010: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66  {.    Expr *pLef
c020: 74 3b 20 20 20 20 20 20 20 2f 2a 20 4c 48 53 20  t;       /* LHS 
c030: 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65  of LIKE/GLOB ope
c040: 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70  rator */.    Exp
c050: 72 20 2a 70 53 74 72 32 3b 20 20 20 20 20 20 20  r *pStr2;       
c060: 2f 2a 20 43 6f 70 79 20 6f 66 20 70 53 74 72 31  /* Copy of pStr1
c070: 20 2d 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47   - RHS of LIKE/G
c080: 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  LOB operator */.
c090: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78      Expr *pNewEx
c0a0: 70 72 31 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  pr1;.    Expr *p
c0b0: 4e 65 77 45 78 70 72 32 3b 0a 20 20 20 20 69 6e  NewExpr2;.    in
c0c0: 74 20 69 64 78 4e 65 77 31 3b 0a 20 20 20 20 69  t idxNew1;.    i
c0d0: 6e 74 20 69 64 78 4e 65 77 32 3b 0a 20 20 20 20  nt idxNew2;.    
c0e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
c0f0: 6c 53 65 71 4e 61 6d 65 3b 20 20 20 20 20 2f 2a  lSeqName;     /*
c100: 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69   Name of collati
c110: 6e 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20  ng sequence */. 
c120: 20 20 20 63 6f 6e 73 74 20 75 31 36 20 77 74 46     const u16 wtF
c130: 6c 61 67 73 20 3d 20 54 45 52 4d 5f 4c 49 4b 45  lags = TERM_LIKE
c140: 4f 50 54 20 7c 20 54 45 52 4d 5f 56 49 52 54 55  OPT | TERM_VIRTU
c150: 41 4c 20 7c 20 54 45 52 4d 5f 44 59 4e 41 4d 49  AL | TERM_DYNAMI
c160: 43 3b 0a 0a 20 20 20 20 70 4c 65 66 74 20 3d 20  C;..    pLeft = 
c170: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
c180: 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[1].pExpr;.    
c190: 70 53 74 72 32 20 3d 20 73 71 6c 69 74 65 33 45  pStr2 = sqlite3E
c1a0: 78 70 72 44 75 70 28 64 62 2c 20 70 53 74 72 31  xprDup(db, pStr1
c1b0: 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  , 0);..    /* Co
c1c0: 6e 76 65 72 74 20 74 68 65 20 6c 6f 77 65 72 20  nvert the lower 
c1d0: 62 6f 75 6e 64 20 74 6f 20 75 70 70 65 72 2d 63  bound to upper-c
c1e0: 61 73 65 20 61 6e 64 20 74 68 65 20 75 70 70 65  ase and the uppe
c1f0: 72 20 62 6f 75 6e 64 20 74 6f 0a 20 20 20 20 2a  r bound to.    *
c200: 2a 20 6c 6f 77 65 72 2d 63 61 73 65 20 28 75 70  * lower-case (up
c210: 70 65 72 2d 63 61 73 65 20 69 73 20 6c 65 73 73  per-case is less
c220: 20 74 68 61 6e 20 6c 6f 77 65 72 2d 63 61 73 65   than lower-case
c230: 20 69 6e 20 41 53 43 49 49 29 20 73 6f 20 74 68   in ASCII) so th
c240: 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 61  at.    ** the ra
c250: 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  nge constraints 
c260: 61 6c 73 6f 20 77 6f 72 6b 20 66 6f 72 20 42 4c  also work for BL
c270: 4f 42 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  OBs.    */.    i
c280: 66 28 20 6e 6f 43 61 73 65 20 26 26 20 21 70 50  f( noCase && !pP
c290: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
c2a0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
c2b0: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 63 68 61  int i;.      cha
c2c0: 72 20 63 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  r c;.      pTerm
c2d0: 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
c2e0: 4d 5f 4c 49 4b 45 3b 0a 20 20 20 20 20 20 66 6f  M_LIKE;.      fo
c2f0: 72 28 69 3d 30 3b 20 28 63 20 3d 20 70 53 74 72  r(i=0; (c = pStr
c300: 31 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 69 5d 29 21  1->u.zToken[i])!
c310: 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  =0; i++){.      
c320: 20 20 70 53 74 72 31 2d 3e 75 2e 7a 54 6f 6b 65    pStr1->u.zToke
c330: 6e 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 54 6f  n[i] = sqlite3To
c340: 75 70 70 65 72 28 63 29 3b 0a 20 20 20 20 20 20  upper(c);.      
c350: 20 20 70 53 74 72 32 2d 3e 75 2e 7a 54 6f 6b 65    pStr2->u.zToke
c360: 6e 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 54 6f  n[i] = sqlite3To
c370: 6c 6f 77 65 72 28 63 29 3b 0a 20 20 20 20 20 20  lower(c);.      
c380: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  }.    }..    if(
c390: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
c3a0: 65 64 20 29 7b 0a 20 20 20 20 20 20 75 38 20 63  ed ){.      u8 c
c3b0: 2c 20 2a 70 43 3b 20 20 20 20 20 20 20 2f 2a 20  , *pC;       /* 
c3c0: 4c 61 73 74 20 63 68 61 72 61 63 74 65 72 20 62  Last character b
c3d0: 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20  efore the first 
c3e0: 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20 20 20 20  wildcard */.    
c3f0: 20 20 70 43 20 3d 20 28 75 38 2a 29 26 70 53 74    pC = (u8*)&pSt
c400: 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 73 71 6c  r2->u.zToken[sql
c410: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 53 74  ite3Strlen30(pSt
c420: 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2d 31 5d  r2->u.zToken)-1]
c430: 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a 70 43 3b  ;.      c = *pC;
c440: 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43 61 73  .      if( noCas
c450: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
c460: 54 68 65 20 70 6f 69 6e 74 20 69 73 20 74 6f 20  The point is to 
c470: 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 6c 61  increment the la
c480: 73 74 20 63 68 61 72 61 63 74 65 72 20 62 65 66  st character bef
c490: 6f 72 65 20 74 68 65 20 66 69 72 73 74 0a 20 20  ore the first.  
c4a0: 20 20 20 20 20 20 2a 2a 20 77 69 6c 64 63 61 72        ** wildcar
c4b0: 64 2e 20 20 42 75 74 20 69 66 20 77 65 20 69 6e  d.  But if we in
c4c0: 63 72 65 6d 65 6e 74 20 27 40 27 2c 20 74 68 61  crement '@', tha
c4d0: 74 20 77 69 6c 6c 20 70 75 73 68 20 69 74 20 69  t will push it i
c4e0: 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20  nto the.        
c4f0: 2a 2a 20 61 6c 70 68 61 62 65 74 69 63 20 72 61  ** alphabetic ra
c500: 6e 67 65 20 77 68 65 72 65 20 63 61 73 65 20 63  nge where case c
c510: 6f 6e 76 65 72 73 69 6f 6e 73 20 77 69 6c 6c 20  onversions will 
c520: 6d 65 73 73 20 75 70 20 74 68 65 20 0a 20 20 20  mess up the .   
c530: 20 20 20 20 20 2a 2a 20 69 6e 65 71 75 61 6c 69       ** inequali
c540: 74 79 2e 20 20 54 6f 20 61 76 6f 69 64 20 74 68  ty.  To avoid th
c550: 69 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 6f  is, make sure to
c560: 20 61 6c 73 6f 20 72 75 6e 20 74 68 65 20 66 75   also run the fu
c570: 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 4c 49  ll.        ** LI
c580: 4b 45 20 6f 6e 20 61 6c 6c 20 63 61 6e 64 69 64  KE on all candid
c590: 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ate expressions 
c5a0: 62 79 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20  by clearing the 
c5b0: 69 73 43 6f 6d 70 6c 65 74 65 20 66 6c 61 67 0a  isComplete flag.
c5c0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
c5d0: 20 20 20 69 66 28 20 63 3d 3d 27 41 27 2d 31 20     if( c=='A'-1 
c5e0: 29 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30  ) isComplete = 0
c5f0: 3b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 73 71  ;.        c = sq
c600: 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65  lite3UpperToLowe
c610: 72 5b 63 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  r[c];.      }.  
c620: 20 20 20 20 2a 70 43 20 3d 20 63 20 2b 20 31 3b      *pC = c + 1;
c630: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43 6f 6c 6c  .    }.    zColl
c640: 53 65 71 4e 61 6d 65 20 3d 20 6e 6f 43 61 73 65  SeqName = noCase
c650: 20 3f 20 22 4e 4f 43 41 53 45 22 20 3a 20 22 42   ? "NOCASE" : "B
c660: 49 4e 41 52 59 22 3b 0a 20 20 20 20 70 4e 65 77  INARY";.    pNew
c670: 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65 33 45  Expr1 = sqlite3E
c680: 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74  xprDup(db, pLeft
c690: 2c 20 30 29 3b 0a 20 20 20 20 70 4e 65 77 45 78  , 0);.    pNewEx
c6a0: 70 72 31 20 3d 20 73 71 6c 69 74 65 33 50 45 78  pr1 = sqlite3PEx
c6b0: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 47 45  pr(pParse, TK_GE
c6c0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  ,.           sql
c6d0: 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61  ite3ExprAddColla
c6e0: 74 65 53 74 72 69 6e 67 28 70 50 61 72 73 65 2c  teString(pParse,
c6f0: 70 4e 65 77 45 78 70 72 31 2c 7a 43 6f 6c 6c 53  pNewExpr1,zCollS
c700: 65 71 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20  eqName),.       
c710: 20 20 20 20 70 53 74 72 31 2c 20 30 29 3b 0a 20      pStr1, 0);. 
c720: 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d     transferJoinM
c730: 61 72 6b 69 6e 67 73 28 70 4e 65 77 45 78 70 72  arkings(pNewExpr
c740: 31 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 69  1, pExpr);.    i
c750: 64 78 4e 65 77 31 20 3d 20 77 68 65 72 65 43 6c  dxNew1 = whereCl
c760: 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
c770: 70 4e 65 77 45 78 70 72 31 2c 20 77 74 46 6c 61  pNewExpr1, wtFla
c780: 67 73 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  gs);.    testcas
c790: 65 28 20 69 64 78 4e 65 77 31 3d 3d 30 20 29 3b  e( idxNew1==0 );
c7a0: 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65  .    exprAnalyze
c7b0: 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e  (pSrc, pWC, idxN
c7c0: 65 77 31 29 3b 0a 20 20 20 20 70 4e 65 77 45 78  ew1);.    pNewEx
c7d0: 70 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pr2 = sqlite3Exp
c7e0: 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74 2c 20  rDup(db, pLeft, 
c7f0: 30 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72  0);.    pNewExpr
c800: 32 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  2 = sqlite3PExpr
c810: 28 70 50 61 72 73 65 2c 20 54 4b 5f 4c 54 2c 0a  (pParse, TK_LT,.
c820: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
c830: 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65  e3ExprAddCollate
c840: 53 74 72 69 6e 67 28 70 50 61 72 73 65 2c 70 4e  String(pParse,pN
c850: 65 77 45 78 70 72 32 2c 7a 43 6f 6c 6c 53 65 71  ewExpr2,zCollSeq
c860: 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20  Name),.         
c870: 20 20 70 53 74 72 32 2c 20 30 29 3b 0a 20 20 20    pStr2, 0);.   
c880: 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72   transferJoinMar
c890: 6b 69 6e 67 73 28 70 4e 65 77 45 78 70 72 32 2c  kings(pNewExpr2,
c8a0: 20 70 45 78 70 72 29 3b 0a 20 20 20 20 69 64 78   pExpr);.    idx
c8b0: 4e 65 77 32 20 3d 20 77 68 65 72 65 43 6c 61 75  New2 = whereClau
c8c0: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e  seInsert(pWC, pN
c8d0: 65 77 45 78 70 72 32 2c 20 77 74 46 6c 61 67 73  ewExpr2, wtFlags
c8e0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
c8f0: 20 69 64 78 4e 65 77 32 3d 3d 30 20 29 3b 0a 20   idxNew2==0 );. 
c900: 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70     exprAnalyze(p
c910: 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77  Src, pWC, idxNew
c920: 32 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20  2);.    pTerm = 
c930: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
c940: 3b 0a 20 20 20 20 69 66 28 20 69 73 43 6f 6d 70  ;.    if( isComp
c950: 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 6d 61  lete ){.      ma
c960: 72 6b 54 65 72 6d 41 73 43 68 69 6c 64 28 70 57  rkTermAsChild(pW
c970: 43 2c 20 69 64 78 4e 65 77 31 2c 20 69 64 78 54  C, idxNew1, idxT
c980: 65 72 6d 29 3b 0a 20 20 20 20 20 20 6d 61 72 6b  erm);.      mark
c990: 54 65 72 6d 41 73 43 68 69 6c 64 28 70 57 43 2c  TermAsChild(pWC,
c9a0: 20 69 64 78 4e 65 77 32 2c 20 69 64 78 54 65 72   idxNew2, idxTer
c9b0: 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  m);.    }.  }.#e
c9c0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
c9d0: 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a  MIT_LIKE_OPTIMIZ
c9e0: 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65  ATION */..#ifnde
c9f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
ca00: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20  RTUALTABLE.  /* 
ca10: 41 64 64 20 61 20 57 4f 5f 4d 41 54 43 48 20 61  Add a WO_MATCH a
ca20: 75 78 69 6c 69 61 72 79 20 74 65 72 6d 20 74 6f  uxiliary term to
ca30: 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
ca40: 73 65 74 20 69 66 20 74 68 65 0a 20 20 2a 2a 20  set if the.  ** 
ca50: 63 75 72 72 65 6e 74 20 65 78 70 72 65 73 73 69  current expressi
ca60: 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  on is of the for
ca70: 6d 3a 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48  m:  column MATCH
ca80: 20 65 78 70 72 2e 0a 20 20 2a 2a 20 54 68 69 73   expr..  ** This
ca90: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
caa0: 75 73 65 64 20 62 79 20 74 68 65 20 78 42 65 73  used by the xBes
cab0: 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 73 20 6f  tIndex methods o
cac0: 66 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74  f.  ** virtual t
cad0: 61 62 6c 65 73 2e 20 20 54 68 65 20 6e 61 74 69  ables.  The nati
cae0: 76 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69 7a  ve query optimiz
caf0: 65 72 20 64 6f 65 73 20 6e 6f 74 20 61 74 74 65  er does not atte
cb00: 6d 70 74 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 61  mpt.  ** to do a
cb10: 6e 79 74 68 69 6e 67 20 77 69 74 68 20 4d 41 54  nything with MAT
cb20: 43 48 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20  CH functions..  
cb30: 2a 2f 0a 20 20 69 66 28 20 69 73 4d 61 74 63 68  */.  if( isMatch
cb40: 4f 66 43 6f 6c 75 6d 6e 28 70 45 78 70 72 29 20  OfColumn(pExpr) 
cb50: 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65  ){.    int idxNe
cb60: 77 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69  w;.    Expr *pRi
cb70: 67 68 74 2c 20 2a 70 4c 65 66 74 3b 0a 20 20 20  ght, *pLeft;.   
cb80: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e 65 77   WhereTerm *pNew
cb90: 54 65 72 6d 3b 0a 20 20 20 20 42 69 74 6d 61 73  Term;.    Bitmas
cba0: 6b 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 2c 20  k prereqColumn, 
cbb0: 70 72 65 72 65 71 45 78 70 72 3b 0a 0a 20 20 20  prereqExpr;..   
cbc0: 20 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d   pRight = pExpr-
cbd0: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  >x.pList->a[0].p
cbe0: 45 78 70 72 3b 0a 20 20 20 20 70 4c 65 66 74 20  Expr;.    pLeft 
cbf0: 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
cc00: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[1].pExpr;.  
cc10: 20 20 70 72 65 72 65 71 45 78 70 72 20 3d 20 65    prereqExpr = e
cc20: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
cc30: 61 73 6b 53 65 74 2c 20 70 52 69 67 68 74 29 3b  askSet, pRight);
cc40: 0a 20 20 20 20 70 72 65 72 65 71 43 6f 6c 75 6d  .    prereqColum
cc50: 6e 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61  n = exprTableUsa
cc60: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c 65  ge(pMaskSet, pLe
cc70: 66 74 29 3b 0a 20 20 20 20 69 66 28 20 28 70 72  ft);.    if( (pr
cc80: 65 72 65 71 45 78 70 72 20 26 20 70 72 65 72 65  ereqExpr & prere
cc90: 71 43 6f 6c 75 6d 6e 29 3d 3d 30 20 29 7b 0a 20  qColumn)==0 ){. 
cca0: 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45       Expr *pNewE
ccb0: 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 45  xpr;.      pNewE
ccc0: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78  xpr = sqlite3PEx
ccd0: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4d 41  pr(pParse, TK_MA
cce0: 54 43 48 2c 20 0a 20 20 20 20 20 20 20 20 20 20  TCH, .          
ccf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd00: 20 20 20 20 30 2c 20 73 71 6c 69 74 65 33 45 78      0, sqlite3Ex
cd10: 70 72 44 75 70 28 64 62 2c 20 70 52 69 67 68 74  prDup(db, pRight
cd20: 2c 20 30 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  , 0), 0);.      
cd30: 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c  idxNew = whereCl
cd40: 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
cd50: 70 4e 65 77 45 78 70 72 2c 20 54 45 52 4d 5f 56  pNewExpr, TERM_V
cd60: 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41  IRTUAL|TERM_DYNA
cd70: 4d 49 43 29 3b 0a 20 20 20 20 20 20 74 65 73 74  MIC);.      test
cd80: 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d 30 20  case( idxNew==0 
cd90: 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  );.      pNewTer
cda0: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e  m = &pWC->a[idxN
cdb0: 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  ew];.      pNewT
cdc0: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
cdd0: 20 3d 20 70 72 65 72 65 71 45 78 70 72 3b 0a 20   = prereqExpr;. 
cde0: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 6c       pNewTerm->l
cdf0: 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66  eftCursor = pLef
ce00: 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  t->iTable;.     
ce10: 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c 65 66   pNewTerm->u.lef
ce20: 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d  tColumn = pLeft-
ce30: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
ce40: 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70 65 72 61  pNewTerm->eOpera
ce50: 74 6f 72 20 3d 20 57 4f 5f 4d 41 54 43 48 3b 0a  tor = WO_MATCH;.
ce60: 20 20 20 20 20 20 6d 61 72 6b 54 65 72 6d 41 73        markTermAs
ce70: 43 68 69 6c 64 28 70 57 43 2c 20 69 64 78 4e 65  Child(pWC, idxNe
ce80: 77 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20 20 20  w, idxTerm);.   
ce90: 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
cea0: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20  >a[idxTerm];.   
ceb0: 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67     pTerm->wtFlag
cec0: 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44  s |= TERM_COPIED
ced0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
cee0: 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 54  ->prereqAll = pT
cef0: 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a  erm->prereqAll;.
cf00: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
cf10: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
cf20: 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
cf30: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
cf40: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
cf50: 54 41 54 34 0a 20 20 2f 2a 20 57 68 65 6e 20 73  TAT4.  /* When s
cf60: 71 6c 69 74 65 5f 73 74 61 74 33 20 68 69 73 74  qlite_stat3 hist
cf70: 6f 67 72 61 6d 20 64 61 74 61 20 69 73 20 61 76  ogram data is av
cf80: 61 69 6c 61 62 6c 65 20 61 6e 20 6f 70 65 72 61  ailable an opera
cf90: 74 6f 72 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  tor of the.  ** 
cfa0: 66 6f 72 6d 20 22 78 20 49 53 20 4e 4f 54 20 4e  form "x IS NOT N
cfb0: 55 4c 4c 22 20 63 61 6e 20 73 6f 6d 65 74 69 6d  ULL" can sometim
cfc0: 65 73 20 62 65 20 65 76 61 6c 75 61 74 65 64 20  es be evaluated 
cfd0: 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 6c 79  more efficiently
cfe0: 0a 20 20 2a 2a 20 61 73 20 22 78 3e 4e 55 4c 4c  .  ** as "x>NULL
cff0: 22 20 69 66 20 78 20 69 73 20 6e 6f 74 20 61 6e  " if x is not an
d000: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
d010: 20 4b 45 59 2e 20 20 53 6f 20 63 6f 6e 73 74 72   KEY.  So constr
d020: 75 63 74 20 61 0a 20 20 2a 2a 20 76 69 72 74 75  uct a.  ** virtu
d030: 61 6c 20 74 65 72 6d 20 6f 66 20 74 68 61 74 20  al term of that 
d040: 66 6f 72 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  form..  **.  ** 
d050: 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 76 69  Note that the vi
d060: 72 74 75 61 6c 20 74 65 72 6d 20 6d 75 73 74 20  rtual term must 
d070: 62 65 20 74 61 67 67 65 64 20 77 69 74 68 20 54  be tagged with T
d080: 45 52 4d 5f 56 4e 55 4c 4c 2e 0a 20 20 2a 2f 0a  ERM_VNULL..  */.
d090: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
d0a0: 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26  =TK_NOTNULL.   &
d0b0: 26 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e  & pExpr->pLeft->
d0c0: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20  op==TK_COLUMN.  
d0d0: 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 65 66 74   && pExpr->pLeft
d0e0: 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20  ->iColumn>=0.   
d0f0: 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
d100: 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  nabled(db, SQLIT
d110: 45 5f 53 74 61 74 33 34 29 0a 20 20 29 7b 0a 20  E_Stat34).  ){. 
d120: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70     Expr *pNewExp
d130: 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65  r;.    Expr *pLe
d140: 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
d150: 74 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65  t;.    int idxNe
d160: 77 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  w;.    WhereTerm
d170: 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 0a 20 20 20   *pNewTerm;..   
d180: 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69   pNewExpr = sqli
d190: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
d1a0: 20 54 4b 5f 47 54 2c 0a 20 20 20 20 20 20 20 20   TK_GT,.        
d1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1c0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
d1d0: 75 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29  up(db, pLeft, 0)
d1e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
d200: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
d210: 65 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30  e, TK_NULL, 0, 0
d220: 2c 20 30 29 2c 20 30 29 3b 0a 0a 20 20 20 20 69  , 0), 0);..    i
d230: 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61  dxNew = whereCla
d240: 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70  useInsert(pWC, p
d250: 4e 65 77 45 78 70 72 2c 0a 20 20 20 20 20 20 20  NewExpr,.       
d260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d270: 20 20 20 20 20 20 20 54 45 52 4d 5f 56 49 52 54         TERM_VIRT
d280: 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43  UAL|TERM_DYNAMIC
d290: 7c 54 45 52 4d 5f 56 4e 55 4c 4c 29 3b 0a 20 20  |TERM_VNULL);.  
d2a0: 20 20 69 66 28 20 69 64 78 4e 65 77 20 29 7b 0a    if( idxNew ){.
d2b0: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 20 3d        pNewTerm =
d2c0: 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d   &pWC->a[idxNew]
d2d0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
d2e0: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20  ->prereqRight = 
d2f0: 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  0;.      pNewTer
d300: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20  m->leftCursor = 
d310: 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20  pLeft->iTable;. 
d320: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75       pNewTerm->u
d330: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c  .leftColumn = pL
d340: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  eft->iColumn;.  
d350: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f      pNewTerm->eO
d360: 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 47 54 3b  perator = WO_GT;
d370: 0a 20 20 20 20 20 20 6d 61 72 6b 54 65 72 6d 41  .      markTermA
d380: 73 43 68 69 6c 64 28 70 57 43 2c 20 69 64 78 4e  sChild(pWC, idxN
d390: 65 77 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20 20  ew, idxTerm);.  
d3a0: 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
d3b0: 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20  ->a[idxTerm];.  
d3c0: 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
d3d0: 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45  gs |= TERM_COPIE
d3e0: 44 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  D;.      pNewTer
d3f0: 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70  m->prereqAll = p
d400: 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b  Term->prereqAll;
d410: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
d420: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
d430: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
d440: 34 20 2a 2f 0a 0a 20 20 2f 2a 20 50 72 65 76 65  4 */..  /* Preve
d450: 6e 74 20 4f 4e 20 63 6c 61 75 73 65 20 74 65 72  nt ON clause ter
d460: 6d 73 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  ms of a LEFT JOI
d470: 4e 20 66 72 6f 6d 20 62 65 69 6e 67 20 75 73 65  N from being use
d480: 64 20 74 6f 20 64 72 69 76 65 0a 20 20 2a 2a 20  d to drive.  ** 
d490: 61 6e 20 69 6e 64 65 78 20 66 6f 72 20 74 61 62  an index for tab
d4a0: 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  les to the left 
d4b0: 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a  of the join..  *
d4c0: 2f 0a 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  /.  pTerm->prere
d4d0: 71 52 69 67 68 74 20 7c 3d 20 65 78 74 72 61 52  qRight |= extraR
d4e0: 69 67 68 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ight;.}../*.** T
d4f0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 61  his function sea
d500: 72 63 68 65 73 20 70 4c 69 73 74 20 66 6f 72 20  rches pList for 
d510: 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 6d 61  an entry that ma
d520: 74 63 68 65 73 20 74 68 65 20 69 43 6f 6c 2d 74  tches the iCol-t
d530: 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 69  h column.** of i
d540: 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a  ndex pIdx..**.**
d550: 20 49 66 20 73 75 63 68 20 61 6e 20 65 78 70 72   If such an expr
d560: 65 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c  ession is found,
d570: 20 69 74 73 20 69 6e 64 65 78 20 69 6e 20 70 4c   its index in pL
d580: 69 73 74 2d 3e 61 5b 5d 20 69 73 20 72 65 74 75  ist->a[] is retu
d590: 72 6e 65 64 2e 20 49 66 0a 2a 2a 20 6e 6f 20 65  rned. If.** no e
d5a0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 6f 75  xpression is fou
d5b0: 6e 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e  nd, -1 is return
d5c0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
d5d0: 74 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 0a  t findIndexCol(.
d5e0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
d5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d600: 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
d610: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
d620: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
d630: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
d640: 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 73 65  ssion list to se
d650: 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20 69 42  arch */.  int iB
d660: 61 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ase,            
d670: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
d680: 73 6f 72 20 66 6f 72 20 74 61 62 6c 65 20 61 73  sor for table as
d690: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 49  sociated with pI
d6a0: 64 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  dx */.  Index *p
d6b0: 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Idx,            
d6c0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
d6d0: 20 74 6f 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e   to match column
d6e0: 20 6f 66 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f   of */.  int iCo
d6f0: 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l               
d700: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
d710: 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74 6f 20 6d  mn of index to m
d720: 61 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  atch */.){.  int
d730: 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   i;.  const char
d740: 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e   *zColl = pIdx->
d750: 61 7a 43 6f 6c 6c 5b 69 43 6f 6c 5d 3b 0a 0a 20  azColl[iCol];.. 
d760: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
d770: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
d780: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71      Expr *p = sq
d790: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
d7a0: 6c 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  late(pList->a[i]
d7b0: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  .pExpr);.    if(
d7c0: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d   p->op==TK_COLUM
d7d0: 4e 0a 20 20 20 20 20 26 26 20 70 2d 3e 69 43 6f  N.     && p->iCo
d7e0: 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f  lumn==pIdx->aiCo
d7f0: 6c 75 6d 6e 5b 69 43 6f 6c 5d 0a 20 20 20 20 20  lumn[iCol].     
d800: 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42  && p->iTable==iB
d810: 61 73 65 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ase.    ){.     
d820: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
d830: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
d840: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 69  lSeq(pParse, pLi
d850: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
d860: 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  .      if( pColl
d870: 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74   && 0==sqlite3St
d880: 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  rICmp(pColl->zNa
d890: 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20  me, zColl) ){.  
d8a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 3b 0a        return i;.
d8b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
d8c0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  }..  return -1;.
d8d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
d8e0: 74 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54  true if the DIST
d8f0: 49 4e 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2d  INCT expression-
d900: 6c 69 73 74 20 70 61 73 73 65 64 20 61 73 20 74  list passed as t
d910: 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
d920: 74 0a 2a 2a 20 69 73 20 72 65 64 75 6e 64 61 6e  t.** is redundan
d930: 74 2e 0a 2a 2a 0a 2a 2a 20 41 20 44 49 53 54 49  t..**.** A DISTI
d940: 4e 43 54 20 6c 69 73 74 20 69 73 20 72 65 64 75  NCT list is redu
d950: 6e 64 61 6e 74 20 69 66 20 74 68 65 20 64 61 74  ndant if the dat
d960: 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 73 20 73  abase contains s
d970: 6f 6d 65 20 73 75 62 73 65 74 20 6f 66 0a 2a 2a  ome subset of.**
d980: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72   columns that ar
d990: 65 20 75 6e 69 71 75 65 20 61 6e 64 20 6e 6f 6e  e unique and non
d9a0: 2d 6e 75 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  -null..*/.static
d9b0: 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74 52   int isDistinctR
d9c0: 65 64 75 6e 64 61 6e 74 28 0a 20 20 50 61 72 73  edundant(.  Pars
d9d0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
d9e0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
d9f0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
da00: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
da10: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46          /* The F
da20: 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
da30: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
da40: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
da50: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
da60: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69  .  ExprList *pDi
da70: 73 74 69 6e 63 74 20 20 20 20 20 20 20 2f 2a 20  stinct       /* 
da80: 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 74  The result set t
da90: 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20  hat needs to be 
daa0: 44 49 53 54 49 4e 43 54 20 2a 2f 0a 29 7b 0a 20  DISTINCT */.){. 
dab0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
dac0: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69  Index *pIdx;.  i
dad0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
dae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
daf0: 20 20 69 6e 74 20 69 42 61 73 65 3b 0a 0a 20 20    int iBase;..  
db00: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6d  /* If there is m
db10: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 74 61 62  ore than one tab
db20: 6c 65 20 6f 72 20 73 75 62 2d 73 65 6c 65 63 74  le or sub-select
db30: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
db40: 75 73 65 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73  use of.  ** this
db50: 20 71 75 65 72 79 2c 20 74 68 65 6e 20 69 74 20   query, then it 
db60: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73  will not be poss
db70: 69 62 6c 65 20 74 6f 20 73 68 6f 77 20 74 68 61  ible to show tha
db80: 74 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 0a  t the DISTINCT .
db90: 20 20 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 72    ** clause is r
dba0: 65 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 69  edundant. */.  i
dbb0: 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  f( pTabList->nSr
dbc0: 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  c!=1 ) return 0;
dbd0: 0a 20 20 69 42 61 73 65 20 3d 20 70 54 61 62 4c  .  iBase = pTabL
dbe0: 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f  ist->a[0].iCurso
dbf0: 72 3b 0a 20 20 70 54 61 62 20 3d 20 70 54 61 62  r;.  pTab = pTab
dc00: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  List->a[0].pTab;
dc10: 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 79 20 6f 66  ..  /* If any of
dc20: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
dc30: 20 69 73 20 61 6e 20 49 50 4b 20 63 6f 6c 75 6d   is an IPK colum
dc40: 6e 20 6f 6e 20 74 61 62 6c 65 20 69 42 61 73 65  n on table iBase
dc50: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 20  , then return . 
dc60: 20 2a 2a 20 74 72 75 65 2e 20 4e 6f 74 65 3a 20   ** true. Note: 
dc70: 54 68 65 20 28 70 2d 3e 69 54 61 62 6c 65 3d 3d  The (p->iTable==
dc80: 69 42 61 73 65 29 20 70 61 72 74 20 6f 66 20 74  iBase) part of t
dc90: 68 69 73 20 74 65 73 74 20 6d 61 79 20 62 65 20  his test may be 
dca0: 66 61 6c 73 65 20 69 66 20 74 68 65 0a 20 20 2a  false if the.  *
dcb0: 2a 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54  * current SELECT
dcc0: 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64   is a correlated
dcd0: 20 73 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2f   sub-query..  */
dce0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 44  .  for(i=0; i<pD
dcf0: 69 73 74 69 6e 63 74 2d 3e 6e 45 78 70 72 3b 20  istinct->nExpr; 
dd00: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
dd10: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  p = sqlite3ExprS
dd20: 6b 69 70 43 6f 6c 6c 61 74 65 28 70 44 69 73 74  kipCollate(pDist
dd30: 69 6e 63 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  inct->a[i].pExpr
dd40: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70  );.    if( p->op
dd50: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
dd60: 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 20  ->iTable==iBase 
dd70: 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  && p->iColumn<0 
dd80: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
dd90: 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75  .  /* Loop throu
dda0: 67 68 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f  gh all indices o
ddb0: 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 63 68 65  n the table, che
ddc0: 63 6b 69 6e 67 20 65 61 63 68 20 74 6f 20 73 65  cking each to se
ddd0: 65 20 69 66 20 69 74 20 6d 61 6b 65 73 0a 20 20  e if it makes.  
dde0: 2a 2a 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  ** the DISTINCT 
ddf0: 71 75 61 6c 69 66 69 65 72 20 72 65 64 75 6e 64  qualifier redund
de00: 61 6e 74 2e 20 49 74 20 64 6f 65 73 20 73 6f 20  ant. It does so 
de10: 69 66 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  if:.  **.  **   
de20: 31 2e 20 54 68 65 20 69 6e 64 65 78 20 69 73 20  1. The index is 
de30: 69 74 73 65 6c 66 20 55 4e 49 51 55 45 2c 20 61  itself UNIQUE, a
de40: 6e 64 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 32  nd.  **.  **   2
de50: 2e 20 41 6c 6c 20 6f 66 20 74 68 65 20 63 6f 6c  . All of the col
de60: 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65  umns in the inde
de70: 78 20 61 72 65 20 65 69 74 68 65 72 20 70 61 72  x are either par
de80: 74 20 6f 66 20 74 68 65 20 70 44 69 73 74 69 6e  t of the pDistin
de90: 63 74 0a 20 20 2a 2a 20 20 20 20 20 20 6c 69 73  ct.  **      lis
dea0: 74 2c 20 6f 72 20 65 6c 73 65 20 74 68 65 20 57  t, or else the W
deb0: 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74  HERE clause cont
dec0: 61 69 6e 73 20 61 20 74 65 72 6d 20 6f 66 20 74  ains a term of t
ded0: 68 65 20 66 6f 72 6d 20 22 63 6f 6c 3d 58 22 2c  he form "col=X",
dee0: 0a 20 20 2a 2a 20 20 20 20 20 20 77 68 65 72 65  .  **      where
def0: 20 58 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74   X is a constant
df00: 20 76 61 6c 75 65 2e 20 54 68 65 20 63 6f 6c 6c   value. The coll
df10: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20  ation sequences 
df20: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 20 20 20 20  of the.  **     
df30: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 6e 64 20   comparison and 
df40: 73 65 6c 65 63 74 2d 6c 69 73 74 20 65 78 70 72  select-list expr
df50: 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 6d 61 74  essions must mat
df60: 63 68 20 74 68 6f 73 65 20 6f 66 20 74 68 65 20  ch those of the 
df70: 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  index..  **.  **
df80: 20 20 20 33 2e 20 41 6c 6c 20 6f 66 20 74 68 6f     3. All of tho
df90: 73 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73  se index columns
dfa0: 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 57   for which the W
dfb0: 48 45 52 45 20 63 6c 61 75 73 65 20 64 6f 65 73  HERE clause does
dfc0: 20 6e 6f 74 0a 20 20 2a 2a 20 20 20 20 20 20 63   not.  **      c
dfd0: 6f 6e 74 61 69 6e 20 61 20 22 63 6f 6c 3d 58 22  ontain a "col=X"
dfe0: 20 74 65 72 6d 20 61 72 65 20 73 75 62 6a 65 63   term are subjec
dff0: 74 20 74 6f 20 61 20 4e 4f 54 20 4e 55 4c 4c 20  t to a NOT NULL 
e000: 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f  constraint..  */
e010: 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62  .  for(pIdx=pTab
e020: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
e030: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
e040: 29 7b 0a 20 20 20 20 69 66 28 20 21 49 73 55 6e  ){.    if( !IsUn
e050: 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 20  iqueIndex(pIdx) 
e060: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
e070: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d  for(i=0; i<pIdx-
e080: 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nKeyCol; i++){.
e090: 20 20 20 20 20 20 69 31 36 20 69 43 6f 6c 20 3d        i16 iCol =
e0a0: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
e0b0: 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  i];.      if( 0=
e0c0: 3d 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69  =findTerm(pWC, i
e0d0: 42 61 73 65 2c 20 69 43 6f 6c 2c 20 7e 28 42 69  Base, iCol, ~(Bi
e0e0: 74 6d 61 73 6b 29 30 2c 20 57 4f 5f 45 51 2c 20  tmask)0, WO_EQ, 
e0f0: 70 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20  pIdx) ){.       
e100: 20 69 6e 74 20 69 49 64 78 43 6f 6c 20 3d 20 66   int iIdxCol = f
e110: 69 6e 64 49 6e 64 65 78 43 6f 6c 28 70 50 61 72  indIndexCol(pPar
e120: 73 65 2c 20 70 44 69 73 74 69 6e 63 74 2c 20 69  se, pDistinct, i
e130: 42 61 73 65 2c 20 70 49 64 78 2c 20 69 29 3b 0a  Base, pIdx, i);.
e140: 20 20 20 20 20 20 20 20 69 66 28 20 69 49 64 78          if( iIdx
e150: 43 6f 6c 3c 30 20 7c 7c 20 70 54 61 62 2d 3e 61  Col<0 || pTab->a
e160: 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c  Col[iCol].notNul
e170: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  l==0 ){.        
e180: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
e190: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
e1a0: 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 49 64 78  .    if( i==pIdx
e1b0: 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20  ->nKeyCol ){.   
e1c0: 20 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78     /* This index
e1d0: 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74 68   implies that th
e1e0: 65 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69  e DISTINCT quali
e1f0: 66 69 65 72 20 69 73 20 72 65 64 75 6e 64 61 6e  fier is redundan
e200: 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  t. */.      retu
e210: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
e220: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
e230: 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
e240: 74 68 65 20 6c 6f 67 61 72 69 74 68 6d 20 6f 66  the logarithm of
e250: 20 74 68 65 20 69 6e 70 75 74 20 76 61 6c 75 65   the input value
e260: 20 74 6f 20 62 61 73 65 20 32 2e 0a 2a 2f 0a 73   to base 2..*/.s
e270: 74 61 74 69 63 20 4c 6f 67 45 73 74 20 65 73 74  tatic LogEst est
e280: 4c 6f 67 28 4c 6f 67 45 73 74 20 4e 29 7b 0a 20  Log(LogEst N){. 
e290: 20 72 65 74 75 72 6e 20 4e 3c 3d 31 30 20 3f 20   return N<=10 ? 
e2a0: 30 20 3a 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  0 : sqlite3LogEs
e2b0: 74 28 4e 29 20 2d 20 33 33 3b 0a 7d 0a 0a 2f 2a  t(N) - 33;.}../*
e2c0: 0a 2a 2a 20 54 77 6f 20 72 6f 75 74 69 6e 65 73  .** Two routines
e2d0: 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 74 68   for printing th
e2e0: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20  e content of an 
e2f0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
e300: 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  fo.** structure.
e310: 20 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69    Used for testi
e320: 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ng and debugging
e330: 20 6f 6e 6c 79 2e 20 20 49 66 20 6e 65 69 74 68   only.  If neith
e340: 65 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53  er.** SQLITE_TES
e350: 54 20 6f 72 20 53 51 4c 49 54 45 5f 44 45 42 55  T or SQLITE_DEBU
e360: 47 20 61 72 65 20 64 65 66 69 6e 65 64 2c 20 74  G are defined, t
e370: 68 65 6e 20 74 68 65 73 65 20 72 6f 75 74 69 6e  hen these routin
e380: 65 73 0a 2a 2a 20 61 72 65 20 6e 6f 2d 6f 70 73  es.** are no-ops
e390: 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65  ..*/.#if !define
e3a0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
e3b0: 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64  RTUALTABLE) && d
e3c0: 65 66 69 6e 65 64 28 57 48 45 52 45 54 52 41 43  efined(WHERETRAC
e3d0: 45 5f 45 4e 41 42 4c 45 44 29 0a 73 74 61 74 69  E_ENABLED).stati
e3e0: 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58  c void TRACE_IDX
e3f0: 5f 49 4e 50 55 54 53 28 73 71 6c 69 74 65 33 5f  _INPUTS(sqlite3_
e400: 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a  index_info *p){.
e410: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21    int i;.  if( !
e420: 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
e430: 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  e ) return;.  fo
e440: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e  r(i=0; i<p->nCon
e450: 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20  straint; i++){. 
e460: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
e470: 72 69 6e 74 66 28 22 20 20 63 6f 6e 73 74 72 61  rintf("  constra
e480: 69 6e 74 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20  int[%d]: col=%d 
e490: 74 65 72 6d 69 64 3d 25 64 20 6f 70 3d 25 64 20  termid=%d op=%d 
e4a0: 75 73 61 62 6c 65 64 3d 25 64 5c 6e 22 2c 0a 20  usabled=%d\n",. 
e4b0: 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20        i,.       
e4c0: 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  p->aConstraint[i
e4d0: 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20  ].iColumn,.     
e4e0: 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
e4f0: 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 2c  [i].iTermOffset,
e500: 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
e510: 74 72 61 69 6e 74 5b 69 5d 2e 6f 70 2c 0a 20 20  traint[i].op,.  
e520: 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61       p->aConstra
e530: 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 29 3b 0a  int[i].usable);.
e540: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
e550: 3c 70 2d 3e 6e 4f 72 64 65 72 42 79 3b 20 69 2b  <p->nOrderBy; i+
e560: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  +){.    sqlite3D
e570: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72  ebugPrintf("  or
e580: 64 65 72 62 79 5b 25 64 5d 3a 20 63 6f 6c 3d 25  derby[%d]: col=%
e590: 64 20 64 65 73 63 3d 25 64 5c 6e 22 2c 0a 20 20  d desc=%d\n",.  
e5a0: 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70       i,.       p
e5b0: 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43  ->aOrderBy[i].iC
e5c0: 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d  olumn,.       p-
e5d0: 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65 73  >aOrderBy[i].des
e5e0: 63 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  c);.  }.}.static
e5f0: 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58 5f   void TRACE_IDX_
e600: 4f 55 54 50 55 54 53 28 73 71 6c 69 74 65 33 5f  OUTPUTS(sqlite3_
e610: 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a  index_info *p){.
e620: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21    int i;.  if( !
e630: 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
e640: 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  e ) return;.  fo
e650: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e  r(i=0; i<p->nCon
e660: 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20  straint; i++){. 
e670: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
e680: 72 69 6e 74 66 28 22 20 20 75 73 61 67 65 5b 25  rintf("  usage[%
e690: 64 5d 3a 20 61 72 67 76 49 64 78 3d 25 64 20 6f  d]: argvIdx=%d o
e6a0: 6d 69 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  mit=%d\n",.     
e6b0: 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61    i,.       p->a
e6c0: 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
e6d0: 69 5d 2e 61 72 67 76 49 6e 64 65 78 2c 0a 20 20  i].argvIndex,.  
e6e0: 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61       p->aConstra
e6f0: 69 6e 74 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74  intUsage[i].omit
e700: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
e710: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 69  DebugPrintf("  i
e720: 64 78 4e 75 6d 3d 25 64 5c 6e 22 2c 20 70 2d 3e  dxNum=%d\n", p->
e730: 69 64 78 4e 75 6d 29 3b 0a 20 20 73 71 6c 69 74  idxNum);.  sqlit
e740: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
e750: 20 69 64 78 53 74 72 3d 25 73 5c 6e 22 2c 20 70   idxStr=%s\n", p
e760: 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71 6c  ->idxStr);.  sql
e770: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
e780: 22 20 20 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d  "  orderByConsum
e790: 65 64 3d 25 64 5c 6e 22 2c 20 70 2d 3e 6f 72 64  ed=%d\n", p->ord
e7a0: 65 72 42 79 43 6f 6e 73 75 6d 65 64 29 3b 0a 20  erByConsumed);. 
e7b0: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
e7c0: 6e 74 66 28 22 20 20 65 73 74 69 6d 61 74 65 64  ntf("  estimated
e7d0: 43 6f 73 74 3d 25 67 5c 6e 22 2c 20 70 2d 3e 65  Cost=%g\n", p->e
e7e0: 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a 20  stimatedCost);. 
e7f0: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
e800: 6e 74 66 28 22 20 20 65 73 74 69 6d 61 74 65 64  ntf("  estimated
e810: 52 6f 77 73 3d 25 6c 6c 64 5c 6e 22 2c 20 70 2d  Rows=%lld\n", p-
e820: 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 29 3b  >estimatedRows);
e830: 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  .}.#else.#define
e840: 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54   TRACE_IDX_INPUT
e850: 53 28 41 29 0a 23 64 65 66 69 6e 65 20 54 52 41  S(A).#define TRA
e860: 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 41  CE_IDX_OUTPUTS(A
e870: 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  ).#endif..#ifnde
e880: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
e890: 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a  TOMATIC_INDEX./*
e8a0: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
e8b0: 69 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  if the WHERE cla
e8c0: 75 73 65 20 74 65 72 6d 20 70 54 65 72 6d 20 69  use term pTerm i
e8d0: 73 20 6f 66 20 61 20 66 6f 72 6d 20 77 68 65 72  s of a form wher
e8e0: 65 20 69 74 0a 2a 2a 20 63 6f 75 6c 64 20 62 65  e it.** could be
e8f0: 20 75 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e   used with an in
e900: 64 65 78 20 74 6f 20 61 63 63 65 73 73 20 70 53  dex to access pS
e910: 72 63 2c 20 61 73 73 75 6d 69 6e 67 20 61 6e 20  rc, assuming an 
e920: 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 69  appropriate.** i
e930: 6e 64 65 78 20 65 78 69 73 74 65 64 2e 0a 2a 2f  ndex existed..*/
e940: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 72 6d  .static int term
e950: 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 0a 20  CanDriveIndex(. 
e960: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
e970: 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
e980: 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  /* WHERE clause 
e990: 74 65 72 6d 20 74 6f 20 63 68 65 63 6b 20 2a 2f  term to check */
e9a0: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
e9b0: 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 20  t_item *pSrc,   
e9c0: 20 20 2f 2a 20 54 61 62 6c 65 20 77 65 20 61 72    /* Table we ar
e9d0: 65 20 74 72 79 69 6e 67 20 74 6f 20 61 63 63 65  e trying to acce
e9e0: 73 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ss */.  Bitmask 
e9f0: 6e 6f 74 52 65 61 64 79 20 20 20 20 20 20 20 20  notReady        
ea00: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73         /* Tables
ea10: 20 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20   in outer loops 
ea20: 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 29  of the join */.)
ea30: 7b 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20 20  {.  char aff;.  
ea40: 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  if( pTerm->leftC
ea50: 75 72 73 6f 72 21 3d 70 53 72 63 2d 3e 69 43 75  ursor!=pSrc->iCu
ea60: 72 73 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b  rsor ) return 0;
ea70: 0a 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65  .  if( (pTerm->e
ea80: 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45  Operator & (WO_E
ea90: 51 7c 57 4f 5f 49 53 29 29 3d 3d 30 20 29 20 72  Q|WO_IS))==0 ) r
eaa0: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28  eturn 0;.  if( (
eab0: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
eac0: 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d  ht & notReady)!=
ead0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
eae0: 69 66 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  if( pTerm->u.lef
eaf0: 74 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75  tColumn<0 ) retu
eb00: 72 6e 20 30 3b 0a 20 20 61 66 66 20 3d 20 70 53  rn 0;.  aff = pS
eb10: 72 63 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70  rc->pTab->aCol[p
eb20: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
eb30: 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20  mn].affinity;.  
eb40: 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65  if( !sqlite3Inde
eb50: 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 54 65 72  xAffinityOk(pTer
eb60: 6d 2d 3e 70 45 78 70 72 2c 20 61 66 66 29 20 29  m->pExpr, aff) )
eb70: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 74 65 73   return 0;.  tes
eb80: 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 70 45  tcase( pTerm->pE
eb90: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29  xpr->op==TK_IS )
eba0: 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ;.  return 1;.}.
ebb0: 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66  #endif...#ifndef
ebc0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
ebd0: 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a  OMATIC_INDEX./*.
ebe0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
ebf0: 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 74 68   to construct th
ec00: 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 66  e Index object f
ec10: 6f 72 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  or an automatic 
ec20: 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 6f 20  index.** and to 
ec30: 73 65 74 20 75 70 20 74 68 65 20 57 68 65 72 65  set up the Where
ec40: 4c 65 76 65 6c 20 6f 62 6a 65 63 74 20 70 4c 65  Level object pLe
ec50: 76 65 6c 20 73 6f 20 74 68 61 74 20 74 68 65 20  vel so that the 
ec60: 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a  code generator.*
ec70: 2a 20 6d 61 6b 65 73 20 75 73 65 20 6f 66 20 74  * makes use of t
ec80: 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  he automatic ind
ec90: 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ex..*/.static vo
eca0: 69 64 20 63 6f 6e 73 74 72 75 63 74 41 75 74 6f  id constructAuto
ecb0: 6d 61 74 69 63 49 6e 64 65 78 28 0a 20 20 50 61  maticIndex(.  Pa
ecc0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
ecd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
ece0: 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
ecf0: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
ed00: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20  e *pWC,         
ed10: 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
ed20: 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
ed30: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
ed40: 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20 46 52  pSrc,  /* The FR
ed50: 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74  OM clause term t
ed60: 6f 20 67 65 74 20 74 68 65 20 6e 65 78 74 20 69  o get the next i
ed70: 6e 64 65 78 20 2a 2f 0a 20 20 42 69 74 6d 61 73  ndex */.  Bitmas
ed80: 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20  k notReady,     
ed90: 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
eda0: 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72   cursors that ar
edb0: 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  e not available 
edc0: 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
edd0: 2a 70 4c 65 76 65 6c 20 20 20 20 20 20 20 20 20  *pLevel         
ede0: 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 69 6e   /* Write new in
edf0: 64 65 78 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  dex here */.){. 
ee00: 20 69 6e 74 20 6e 4b 65 79 43 6f 6c 3b 20 20 20   int nKeyCol;   
ee10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ee20: 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
ee30: 73 20 69 6e 20 74 68 65 20 63 6f 6e 73 74 72 75  s in the constru
ee40: 63 74 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20  cted index */.  
ee50: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
ee60: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
ee70: 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20   single term of 
ee80: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
ee90: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
eea0: 2a 70 57 43 45 6e 64 3b 20 20 20 20 20 20 20 20  *pWCEnd;        
eeb0: 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d    /* End of pWC-
eec0: 3e 61 5b 5d 20 2a 2f 0a 20 20 49 6e 64 65 78 20  >a[] */.  Index 
eed0: 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  *pIdx;          
eee0: 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20        /* Object 
eef0: 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 74  describing the t
ef00: 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 2a  ransient index *
ef10: 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
ef20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef30: 2f 2a 20 50 72 65 70 61 72 65 64 20 73 74 61 74  /* Prepared stat
ef40: 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73  ement under cons
ef50: 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  truction */.  in
ef60: 74 20 61 64 64 72 49 6e 69 74 3b 20 20 20 20 20  t addrInit;     
ef70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
ef80: 72 65 73 73 20 6f 66 20 74 68 65 20 69 6e 69 74  ress of the init
ef90: 69 61 6c 69 7a 61 74 69 6f 6e 20 62 79 70 61 73  ialization bypas
efa0: 73 20 6a 75 6d 70 20 2a 2f 0a 20 20 54 61 62 6c  s jump */.  Tabl
efb0: 65 20 2a 70 54 61 62 6c 65 3b 20 20 20 20 20 20  e *pTable;      
efc0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
efd0: 61 62 6c 65 20 62 65 69 6e 67 20 69 6e 64 65 78  able being index
efe0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ed */.  int addr
eff0: 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  Top;            
f000: 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68      /* Top of th
f010: 65 20 69 6e 64 65 78 20 66 69 6c 6c 20 6c 6f 6f  e index fill loo
f020: 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65  p */.  int regRe
f030: 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20 20  cord;           
f040: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
f050: 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20  olding an index 
f060: 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20  record */.  int 
f070: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
f080: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
f090: 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  n counter */.  i
f0a0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
f0b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
f0c0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
f0d0: 69 6e 74 20 6d 78 42 69 74 43 6f 6c 3b 20 20 20  int mxBitCol;   
f0e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
f0f0: 61 78 69 6d 75 6d 20 63 6f 6c 75 6d 6e 20 69 6e  aximum column in
f100: 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 2a   pSrc->colUsed *
f110: 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  /.  CollSeq *pCo
f120: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
f130: 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71  /* Collating seq
f140: 75 65 6e 63 65 20 74 6f 20 6f 6e 20 61 20 63 6f  uence to on a co
f150: 6c 75 6d 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c  lumn */.  WhereL
f160: 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20  oop *pLoop;     
f170: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 6f 6f        /* The Loo
f180: 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68  p object */.  ch
f190: 61 72 20 2a 7a 4e 6f 74 55 73 65 64 3b 20 20 20  ar *zNotUsed;   
f1a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
f1b0: 72 61 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20  ra space on the 
f1c0: 65 6e 64 20 6f 66 20 70 49 64 78 20 2a 2f 0a 20  end of pIdx */. 
f1d0: 20 42 69 74 6d 61 73 6b 20 69 64 78 43 6f 6c 73   Bitmask idxCols
f1e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
f1f0: 42 69 74 6d 61 70 20 6f 66 20 63 6f 6c 75 6d 6e  Bitmap of column
f200: 73 20 75 73 65 64 20 66 6f 72 20 69 6e 64 65 78  s used for index
f210: 69 6e 67 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ing */.  Bitmask
f220: 20 65 78 74 72 61 43 6f 6c 73 3b 20 20 20 20 20   extraCols;     
f230: 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f       /* Bitmap o
f240: 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c  f additional col
f250: 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 73 65 6e  umns */.  u8 sen
f260: 74 57 61 72 6e 69 6e 67 20 3d 20 30 3b 20 20 20  tWarning = 0;   
f270: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
f280: 20 61 20 77 61 72 6e 6e 69 6e 67 20 68 61 73 20   a warnning has 
f290: 62 65 65 6e 20 69 73 73 75 65 64 20 2a 2f 0a 20  been issued */. 
f2a0: 20 45 78 70 72 20 2a 70 50 61 72 74 69 61 6c 20   Expr *pPartial 
f2b0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
f2c0: 50 61 72 74 69 61 6c 20 49 6e 64 65 78 20 45 78  Partial Index Ex
f2d0: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e  pression */.  in
f2e0: 74 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20 30 3b  t iContinue = 0;
f2f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
f300: 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 65  p here to skip e
f310: 78 63 6c 75 64 65 64 20 72 6f 77 73 20 2a 2f 0a  xcluded rows */.
f320: 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
f330: 6f 64 65 20 74 6f 20 73 6b 69 70 20 6f 76 65 72  ode to skip over
f340: 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 61 6e   the creation an
f350: 64 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  d initialization
f360: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 74 72 61   of the.  ** tra
f370: 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 6f 6e 20  nsient index on 
f380: 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75 65  2nd and subseque
f390: 6e 74 20 69 74 65 72 61 74 69 6f 6e 73 20 6f 66  nt iterations of
f3a0: 20 74 68 65 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20   the loop. */.  
f3b0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
f3c0: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  e;.  assert( v!=
f3d0: 30 20 29 3b 0a 20 20 61 64 64 72 49 6e 69 74 20  0 );.  addrInit 
f3e0: 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63  = sqlite3CodeOnc
f3f0: 65 28 70 50 61 72 73 65 29 3b 20 56 64 62 65 43  e(pParse); VdbeC
f400: 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f  overage(v);..  /
f410: 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
f420: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68  er of columns th
f430: 61 74 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64  at will be added
f440: 20 74 6f 20 74 68 65 20 69 6e 64 65 78 0a 20 20   to the index.  
f450: 2a 2a 20 61 6e 64 20 75 73 65 64 20 74 6f 20 6d  ** and used to m
f460: 61 74 63 68 20 57 48 45 52 45 20 63 6c 61 75 73  atch WHERE claus
f470: 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  e constraints */
f480: 0a 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a  .  nKeyCol = 0;.
f490: 20 20 70 54 61 62 6c 65 20 3d 20 70 53 72 63 2d    pTable = pSrc-
f4a0: 3e 70 54 61 62 3b 0a 20 20 70 57 43 45 6e 64 20  >pTab;.  pWCEnd 
f4b0: 3d 20 26 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e  = &pWC->a[pWC->n
f4c0: 54 65 72 6d 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d  Term];.  pLoop =
f4d0: 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b   pLevel->pWLoop;
f4e0: 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a  .  idxCols = 0;.
f4f0: 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
f500: 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64  >a; pTerm<pWCEnd
f510: 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; pTerm++){.    
f520: 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54  Expr *pExpr = pT
f530: 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
f540: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
f550: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
f560: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 20 20 20  EP_FromJoin)    
f570: 2f 2a 20 70 72 65 72 65 71 20 61 6c 77 61 79 73  /* prereq always
f580: 20 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 20   non-zero */.   
f590: 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e        || pExpr->
f5a0: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 21  iRightJoinTable!
f5b0: 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 20  =pSrc->iCursor  
f5c0: 20 2f 2a 20 20 20 66 6f 72 20 74 68 65 20 72 69   /*   for the ri
f5d0: 67 68 74 2d 68 61 6e 64 20 20 20 2a 2f 0a 20 20  ght-hand   */.  
f5e0: 20 20 20 20 20 20 20 7c 7c 20 70 4c 6f 6f 70 2d         || pLoop-
f5f0: 3e 70 72 65 72 65 71 21 3d 30 20 29 3b 20 20 20  >prereq!=0 );   
f600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f610: 20 20 2f 2a 20 20 20 74 61 62 6c 65 20 6f 66 20    /*   table of 
f620: 61 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a 20  a LEFT JOIN */. 
f630: 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 70 72     if( pLoop->pr
f640: 65 72 65 71 3d 3d 30 0a 20 20 20 20 20 26 26 20  ereq==0.     && 
f650: 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  (pTerm->wtFlags 
f660: 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 3d  & TERM_VIRTUAL)=
f670: 3d 30 0a 20 20 20 20 20 26 26 20 21 45 78 70 72  =0.     && !Expr
f680: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
f690: 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a  r, EP_FromJoin).
f6a0: 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 45       && sqlite3E
f6b0: 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61  xprIsTableConsta
f6c0: 6e 74 28 70 45 78 70 72 2c 20 70 53 72 63 2d 3e  nt(pExpr, pSrc->
f6d0: 69 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20  iCursor) ){.    
f6e0: 20 20 70 50 61 72 74 69 61 6c 20 3d 20 73 71 6c    pPartial = sql
f6f0: 69 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72  ite3ExprAnd(pPar
f700: 73 65 2d 3e 64 62 2c 20 70 50 61 72 74 69 61 6c  se->db, pPartial
f710: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
f720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f730: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
f740: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78  (pParse->db, pEx
f750: 70 72 2c 20 30 29 29 3b 0a 20 20 20 20 7d 0a 20  pr, 0));.    }. 
f760: 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72     if( termCanDr
f770: 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20  iveIndex(pTerm, 
f780: 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29 20  pSrc, notReady) 
f790: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  ){.      int iCo
f7a0: 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  l = pTerm->u.lef
f7b0: 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42  tColumn;.      B
f7c0: 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69  itmask cMask = i
f7d0: 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b 42  Col>=BMS ? MASKB
f7e0: 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d 41 53 4b  IT(BMS-1) : MASK
f7f0: 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20 20 20 20  BIT(iCol);.     
f800: 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d   testcase( iCol=
f810: 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 74 65  =BMS );.      te
f820: 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d  stcase( iCol==BM
f830: 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28  S-1 );.      if(
f840: 20 21 73 65 6e 74 57 61 72 6e 69 6e 67 20 29 7b   !sentWarning ){
f850: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
f860: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e  _log(SQLITE_WARN
f870: 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58 2c 0a 20  ING_AUTOINDEX,. 
f880: 20 20 20 20 20 20 20 20 20 20 20 22 61 75 74 6f             "auto
f890: 6d 61 74 69 63 20 69 6e 64 65 78 20 6f 6e 20 25  matic index on %
f8a0: 73 28 25 73 29 22 2c 20 70 54 61 62 6c 65 2d 3e  s(%s)", pTable->
f8b0: 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  zName,.         
f8c0: 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b     pTable->aCol[
f8d0: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  iCol].zName);.  
f8e0: 20 20 20 20 20 20 73 65 6e 74 57 61 72 6e 69 6e        sentWarnin
f8f0: 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  g = 1;.      }. 
f900: 20 20 20 20 20 69 66 28 20 28 69 64 78 43 6f 6c       if( (idxCol
f910: 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b  s & cMask)==0 ){
f920: 0a 20 20 20 20 20 20 20 20 69 66 28 20 77 68 65  .        if( whe
f930: 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 70 50 61  reLoopResize(pPa
f940: 72 73 65 2d 3e 64 62 2c 20 70 4c 6f 6f 70 2c 20  rse->db, pLoop, 
f950: 6e 4b 65 79 43 6f 6c 2b 31 29 20 29 7b 0a 20 20  nKeyCol+1) ){.  
f960: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
f970: 5f 61 75 74 6f 5f 69 6e 64 65 78 5f 63 72 65 61  _auto_index_crea
f980: 74 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  te;.        }.  
f990: 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54        pLoop->aLT
f9a0: 65 72 6d 5b 6e 4b 65 79 43 6f 6c 2b 2b 5d 20 3d  erm[nKeyCol++] =
f9b0: 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20   pTerm;.        
f9c0: 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b  idxCols |= cMask
f9d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
f9e0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 4b    }.  assert( nK
f9f0: 65 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 70 4c 6f  eyCol>0 );.  pLo
fa00: 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  op->u.btree.nEq 
fa10: 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20  = pLoop->nLTerm 
fa20: 3d 20 6e 4b 65 79 43 6f 6c 3b 0a 20 20 70 4c 6f  = nKeyCol;.  pLo
fa30: 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  op->wsFlags = WH
fa40: 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20  ERE_COLUMN_EQ | 
fa50: 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c  WHERE_IDX_ONLY |
fa60: 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 0a 20   WHERE_INDEXED. 
fa70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa80: 20 20 20 20 7c 20 57 48 45 52 45 5f 41 55 54 4f      | WHERE_AUTO
fa90: 5f 49 4e 44 45 58 3b 0a 0a 20 20 2f 2a 20 43 6f  _INDEX;..  /* Co
faa0: 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
fab0: 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c  f additional col
fac0: 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20 63  umns needed to c
fad0: 72 65 61 74 65 20 61 0a 20 20 2a 2a 20 63 6f 76  reate a.  ** cov
fae0: 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 41 20  ering index.  A 
faf0: 22 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 22  "covering index"
fb00: 20 69 73 20 61 6e 20 69 6e 64 65 78 20 74 68 61   is an index tha
fb10: 74 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 20  t contains all. 
fb20: 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74   ** columns that
fb30: 20 61 72 65 20 6e 65 65 64 65 64 20 62 79 20 74   are needed by t
fb40: 68 65 20 71 75 65 72 79 2e 20 20 57 69 74 68 20  he query.  With 
fb50: 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  a covering index
fb60: 2c 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69  , the.  ** origi
fb70: 6e 61 6c 20 74 61 62 6c 65 20 6e 65 76 65 72 20  nal table never 
fb80: 6e 65 65 64 73 20 74 6f 20 62 65 20 61 63 63 65  needs to be acce
fb90: 73 73 65 64 2e 20 20 41 75 74 6f 6d 61 74 69 63  ssed.  Automatic
fba0: 20 69 6e 64 69 63 65 73 20 6d 75 73 74 0a 20 20   indices must.  
fbb0: 2a 2a 20 62 65 20 61 20 63 6f 76 65 72 69 6e 67  ** be a covering
fbc0: 20 69 6e 64 65 78 20 62 65 63 61 75 73 65 20 74   index because t
fbd0: 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 6e 6f  he index will no
fbe0: 74 20 62 65 20 75 70 64 61 74 65 64 20 69 66 20  t be updated if 
fbf0: 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61  the.  ** origina
fc00: 6c 20 74 61 62 6c 65 20 63 68 61 6e 67 65 73 20  l table changes 
fc10: 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 61 6e  and the index an
fc20: 64 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20 62  d table cannot b
fc30: 6f 74 68 20 62 65 20 75 73 65 64 0a 20 20 2a 2a  oth be used.  **
fc40: 20 69 66 20 74 68 65 79 20 67 6f 20 6f 75 74 20   if they go out 
fc50: 6f 66 20 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20  of sync..  */.  
fc60: 65 78 74 72 61 43 6f 6c 73 20 3d 20 70 53 72 63  extraCols = pSrc
fc70: 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28 7e 69 64  ->colUsed & (~id
fc80: 78 43 6f 6c 73 20 7c 20 4d 41 53 4b 42 49 54 28  xCols | MASKBIT(
fc90: 42 4d 53 2d 31 29 29 3b 0a 20 20 6d 78 42 69 74  BMS-1));.  mxBit
fca0: 43 6f 6c 20 3d 20 4d 49 4e 28 42 4d 53 2d 31 2c  Col = MIN(BMS-1,
fcb0: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 29 3b 0a 20  pTable->nCol);. 
fcc0: 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62 6c   testcase( pTabl
fcd0: 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29  e->nCol==BMS-1 )
fce0: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 54  ;.  testcase( pT
fcf0: 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d  able->nCol==BMS-
fd00: 32 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  2 );.  for(i=0; 
fd10: 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29  i<mxBitCol; i++)
fd20: 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72 61 43  {.    if( extraC
fd30: 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54 28 69 29  ols & MASKBIT(i)
fd40: 20 29 20 6e 4b 65 79 43 6f 6c 2b 2b 3b 0a 20 20   ) nKeyCol++;.  
fd50: 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63 6f  }.  if( pSrc->co
fd60: 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54 28  lUsed & MASKBIT(
fd70: 42 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20 6e 4b  BMS-1) ){.    nK
fd80: 65 79 43 6f 6c 20 2b 3d 20 70 54 61 62 6c 65 2d  eyCol += pTable-
fd90: 3e 6e 43 6f 6c 20 2d 20 42 4d 53 20 2b 20 31 3b  >nCol - BMS + 1;
fda0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74  .  }..  /* Const
fdb0: 72 75 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f  ruct the Index o
fdc0: 62 6a 65 63 74 20 74 6f 20 64 65 73 63 72 69 62  bject to describ
fdd0: 65 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a  e this index */.
fde0: 20 20 70 49 64 78 20 3d 20 73 71 6c 69 74 65 33    pIdx = sqlite3
fdf0: 41 6c 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a  AllocateIndexObj
fe00: 65 63 74 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ect(pParse->db, 
fe10: 6e 4b 65 79 43 6f 6c 2b 31 2c 20 30 2c 20 26 7a  nKeyCol+1, 0, &z
fe20: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20  NotUsed);.  if( 
fe30: 70 49 64 78 3d 3d 30 20 29 20 67 6f 74 6f 20 65  pIdx==0 ) goto e
fe40: 6e 64 5f 61 75 74 6f 5f 69 6e 64 65 78 5f 63 72  nd_auto_index_cr
fe50: 65 61 74 65 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75  eate;.  pLoop->u
fe60: 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20  .btree.pIndex = 
fe70: 70 49 64 78 3b 0a 20 20 70 49 64 78 2d 3e 7a 4e  pIdx;.  pIdx->zN
fe80: 61 6d 65 20 3d 20 22 61 75 74 6f 2d 69 6e 64 65  ame = "auto-inde
fe90: 78 22 3b 0a 20 20 70 49 64 78 2d 3e 70 54 61 62  x";.  pIdx->pTab
fea0: 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 6e  le = pTable;.  n
feb0: 20 3d 20 30 3b 0a 20 20 69 64 78 43 6f 6c 73 20   = 0;.  idxCols 
fec0: 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d  = 0;.  for(pTerm
fed0: 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70  =pWC->a; pTerm<p
fee0: 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b  WCEnd; pTerm++){
fef0: 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e  .    if( termCan
ff00: 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d  DriveIndex(pTerm
ff10: 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79  , pSrc, notReady
ff20: 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ) ){.      int i
ff30: 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c  Col = pTerm->u.l
ff40: 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  eftColumn;.     
ff50: 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d   Bitmask cMask =
ff60: 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53   iCol>=BMS ? MAS
ff70: 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d 41  KBIT(BMS-1) : MA
ff80: 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20 20  SKBIT(iCol);.   
ff90: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f     testcase( iCo
ffa0: 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20  l==BMS-1 );.    
ffb0: 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c    testcase( iCol
ffc0: 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 69  ==BMS );.      i
ffd0: 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63 4d  f( (idxCols & cM
ffe0: 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
fff0: 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54     Expr *pX = pT
10000 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
10010 20 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63      idxCols |= c
10020 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70 49  Mask;.        pI
10030 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20  dx->aiColumn[n] 
10040 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  = pTerm->u.leftC
10050 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70  olumn;.        p
10060 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69  Coll = sqlite3Bi
10070 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
10080 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  eq(pParse, pX->p
10090 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74  Left, pX->pRight
100a0 29 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d  );.        pIdx-
100b0 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 70 43 6f  >azColl[n] = pCo
100c0 6c 6c 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  ll ? pColl->zNam
100d0 65 20 3a 20 22 42 49 4e 41 52 59 22 3b 0a 20 20  e : "BINARY";.  
100e0 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20        n++;.     
100f0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61   }.    }.  }.  a
10100 73 73 65 72 74 28 20 28 75 33 32 29 6e 3d 3d 70  ssert( (u32)n==p
10110 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
10120 71 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 61  q );..  /* Add a
10130 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e  dditional column
10140 73 20 6e 65 65 64 65 64 20 74 6f 20 6d 61 6b 65  s needed to make
10150 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
10160 6e 64 65 78 20 69 6e 74 6f 0a 20 20 2a 2a 20 61  ndex into.  ** a
10170 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20   covering index 
10180 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
10190 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  mxBitCol; i++){.
101a0 20 20 20 20 69 66 28 20 65 78 74 72 61 43 6f 6c      if( extraCol
101b0 73 20 26 20 4d 41 53 4b 42 49 54 28 69 29 20 29  s & MASKBIT(i) )
101c0 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69  {.      pIdx->ai
101d0 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20  Column[n] = i;. 
101e0 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c       pIdx->azCol
101f0 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b  l[n] = "BINARY";
10200 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20  .      n++;.    
10210 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63  }.  }.  if( pSrc
10220 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b  ->colUsed & MASK
10230 42 49 54 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20  BIT(BMS-1) ){.  
10240 20 20 66 6f 72 28 69 3d 42 4d 53 2d 31 3b 20 69    for(i=BMS-1; i
10250 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69  <pTable->nCol; i
10260 2b 2b 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d  ++){.      pIdx-
10270 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69  >aiColumn[n] = i
10280 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a  ;.      pIdx->az
10290 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52  Coll[n] = "BINAR
102a0 59 22 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20  Y";.      n++;. 
102b0 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
102c0 74 28 20 6e 3d 3d 6e 4b 65 79 43 6f 6c 20 29 3b  t( n==nKeyCol );
102d0 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  .  pIdx->aiColum
102e0 6e 5b 6e 5d 20 3d 20 2d 31 3b 0a 20 20 70 49 64  n[n] = -1;.  pId
102f0 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22  x->azColl[n] = "
10300 42 49 4e 41 52 59 22 3b 0a 0a 20 20 2f 2a 20 43  BINARY";..  /* C
10310 72 65 61 74 65 20 74 68 65 20 61 75 74 6f 6d 61  reate the automa
10320 74 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20 20 61  tic index */.  a
10330 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 69  ssert( pLevel->i
10340 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20 70  IdxCur>=0 );.  p
10350 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d  Level->iIdxCur =
10360 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
10370 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
10380 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 41  dOp2(v, OP_OpenA
10390 75 74 6f 69 6e 64 65 78 2c 20 70 4c 65 76 65 6c  utoindex, pLevel
103a0 2d 3e 69 49 64 78 43 75 72 2c 20 6e 4b 65 79 43  ->iIdxCur, nKeyC
103b0 6f 6c 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ol+1);.  sqlite3
103c0 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f  VdbeSetP4KeyInfo
103d0 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a  (pParse, pIdx);.
103e0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
103f0 2c 20 22 66 6f 72 20 25 73 22 2c 20 70 54 61 62  , "for %s", pTab
10400 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20  le->zName));..  
10410 2f 2a 20 46 69 6c 6c 20 74 68 65 20 61 75 74 6f  /* Fill the auto
10420 6d 61 74 69 63 20 69 6e 64 65 78 20 77 69 74 68  matic index with
10430 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 73 71   content */.  sq
10440 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
10450 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 61 64  sh(pParse);.  ad
10460 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  drTop = sqlite3V
10470 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
10480 52 65 77 69 6e 64 2c 20 70 4c 65 76 65 6c 2d 3e  Rewind, pLevel->
10490 69 54 61 62 43 75 72 29 3b 20 56 64 62 65 43 6f  iTabCur); VdbeCo
104a0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 69 66 28  verage(v);.  if(
104b0 20 70 50 61 72 74 69 61 6c 20 29 7b 0a 20 20 20   pPartial ){.   
104c0 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c   iContinue = sql
104d0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
104e0 6c 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  l(v);.    sqlite
104f0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
10500 72 73 65 2c 20 70 50 61 72 74 69 61 6c 2c 20 69  rse, pPartial, i
10510 43 6f 6e 74 69 6e 75 65 2c 20 53 51 4c 49 54 45  Continue, SQLITE
10520 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
10530 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73    pLoop->wsFlags
10540 20 7c 3d 20 57 48 45 52 45 5f 50 41 52 54 49 41   |= WHERE_PARTIA
10550 4c 49 44 58 3b 0a 20 20 7d 0a 20 20 72 65 67 52  LIDX;.  }.  regR
10560 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47  ecord = sqlite3G
10570 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
10580 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 65 6e 65  );.  sqlite3Gene
10590 72 61 74 65 49 6e 64 65 78 4b 65 79 28 70 50 61  rateIndexKey(pPa
105a0 72 73 65 2c 20 70 49 64 78 2c 20 70 4c 65 76 65  rse, pIdx, pLeve
105b0 6c 2d 3e 69 54 61 62 43 75 72 2c 20 72 65 67 52  l->iTabCur, regR
105c0 65 63 6f 72 64 2c 20 30 2c 20 30 2c 20 30 2c 20  ecord, 0, 0, 0, 
105d0 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
105e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
105f0 78 49 6e 73 65 72 74 2c 20 70 4c 65 76 65 6c 2d  xInsert, pLevel-
10600 3e 69 49 64 78 43 75 72 2c 20 72 65 67 52 65 63  >iIdxCur, regRec
10610 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ord);.  sqlite3V
10620 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
10630 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53  PFLAG_USESEEKRES
10640 55 4c 54 29 3b 0a 20 20 69 66 28 20 70 50 61 72  ULT);.  if( pPar
10650 74 69 61 6c 20 29 20 73 71 6c 69 74 65 33 56 64  tial ) sqlite3Vd
10660 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
10670 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
10680 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10690 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 4c  2(v, OP_Next, pL
106a0 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20 61  evel->iTabCur, a
106b0 64 64 72 54 6f 70 2b 31 29 3b 20 56 64 62 65 43  ddrTop+1); VdbeC
106c0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
106d0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
106e0 35 28 76 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54  5(v, SQLITE_STMT
106f0 53 54 41 54 55 53 5f 41 55 54 4f 49 4e 44 45 58  STATUS_AUTOINDEX
10700 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
10710 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
10720 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  Top);.  sqlite3R
10730 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
10740 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29  arse, regRecord)
10750 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
10760 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
10770 0a 20 20 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65  .  .  /* Jump he
10780 72 65 20 77 68 65 6e 20 73 6b 69 70 70 69 6e 67  re when skipping
10790 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
107a0 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ion */.  sqlite3
107b0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
107c0 61 64 64 72 49 6e 69 74 29 3b 0a 0a 65 6e 64 5f  addrInit);..end_
107d0 61 75 74 6f 5f 69 6e 64 65 78 5f 63 72 65 61 74  auto_index_creat
107e0 65 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  e:.  sqlite3Expr
107f0 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
10800 62 2c 20 70 50 61 72 74 69 61 6c 29 3b 0a 7d 0a  b, pPartial);.}.
10810 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
10820 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f  _OMIT_AUTOMATIC_
10830 49 4e 44 45 58 20 2a 2f 0a 0a 23 69 66 6e 64 65  INDEX */..#ifnde
10840 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
10850 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a  RTUALTABLE./*.**
10860 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 70 6f   Allocate and po
10870 70 75 6c 61 74 65 20 61 6e 20 73 71 6c 69 74 65  pulate an sqlite
10880 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
10890 75 63 74 75 72 65 2e 20 49 74 20 69 73 20 74 68  ucture. It is th
108a0 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69  e .** responsibi
108b0 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
108c0 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79  er to eventually
108d0 20 72 65 6c 65 61 73 65 20 74 68 65 20 73 74 72   release the str
108e0 75 63 74 75 72 65 0a 2a 2a 20 62 79 20 70 61 73  ucture.** by pas
108f0 73 69 6e 67 20 74 68 65 20 70 6f 69 6e 74 65 72  sing the pointer
10900 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
10910 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 73 71  s function to sq
10920 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f  lite3_free()..*/
10930 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f  .static sqlite3_
10940 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 61 6c 6c 6f  index_info *allo
10950 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 0a 20  cateIndexInfo(. 
10960 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a   Parse *pParse,.
10970 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
10980 57 43 2c 0a 20 20 73 74 72 75 63 74 20 53 72 63  WC,.  struct Src
10990 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c  List_item *pSrc,
109a0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
109b0 64 65 72 42 79 0a 29 7b 0a 20 20 69 6e 74 20 69  derBy.){.  int i
109c0 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54 65 72 6d  , j;.  int nTerm
109d0 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
109e0 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
109f0 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20  int *pIdxCons;. 
10a00 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
10a10 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 20 2a 70  index_orderby *p
10a20 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 73 74  IdxOrderBy;.  st
10a30 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
10a40 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73  ex_constraint_us
10a50 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20 57  age *pUsage;.  W
10a60 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
10a70 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b  .  int nOrderBy;
10a80 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  .  sqlite3_index
10a90 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b  _info *pIdxInfo;
10aa0 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65  ..  /* Count the
10ab0 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 73 73 69   number of possi
10ac0 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ble WHERE clause
10ad0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72 65 66   constraints ref
10ae0 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 74  erring.  ** to t
10af0 68 69 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c  his virtual tabl
10b00 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 54 65  e */.  for(i=nTe
10b10 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d  rm=0, pTerm=pWC-
10b20 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d  >a; i<pWC->nTerm
10b30 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; i++, pTerm++){
10b40 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
10b50 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53  leftCursor != pS
10b60 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f  rc->iCursor ) co
10b70 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
10b80 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77 6f  rt( IsPowerOfTwo
10b90 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
10ba0 72 20 26 20 7e 57 4f 5f 45 51 55 49 56 29 20 29  r & ~WO_EQUIV) )
10bb0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
10bc0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
10bd0 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20   & WO_IN );.    
10be0 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
10bf0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
10c00 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65  ISNULL );.    te
10c10 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
10c20 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53  Operator & WO_IS
10c30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
10c40 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
10c50 6f 72 20 26 20 57 4f 5f 41 4c 4c 20 29 3b 0a 20  or & WO_ALL );. 
10c60 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
10c70 4f 70 65 72 61 74 6f 72 20 26 20 7e 28 57 4f 5f  Operator & ~(WO_
10c80 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51 55 49 56 7c  ISNULL|WO_EQUIV|
10c90 57 4f 5f 49 53 29 29 3d 3d 30 20 29 20 63 6f 6e  WO_IS))==0 ) con
10ca0 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
10cb0 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
10cc0 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e  TERM_VNULL ) con
10cd0 74 69 6e 75 65 3b 0a 20 20 20 20 6e 54 65 72 6d  tinue;.    nTerm
10ce0 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  ++;.  }..  /* If
10cf0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
10d00 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  ause contains on
10d10 6c 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  ly columns in th
10d20 65 20 63 75 72 72 65 6e 74 20 0a 20 20 2a 2a 20  e current .  ** 
10d30 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68  virtual table th
10d40 65 6e 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63  en allocate spac
10d50 65 20 66 6f 72 20 74 68 65 20 61 4f 72 64 65 72  e for the aOrder
10d60 42 79 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20  By part of.  ** 
10d70 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  the sqlite3_inde
10d80 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
10d90 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 72 64 65 72 42  ..  */.  nOrderB
10da0 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4f 72  y = 0;.  if( pOr
10db0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69 6e 74  derBy ){.    int
10dc0 20 6e 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e   n = pOrderBy->n
10dd0 45 78 70 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Expr;.    for(i=
10de0 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<n; i++){.  
10df0 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
10e00 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
10e10 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66  .pExpr;.      if
10e20 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
10e30 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d  COLUMN || pExpr-
10e40 3e 69 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69  >iTable!=pSrc->i
10e50 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a  Cursor ) break;.
10e60 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d      }.    if( i=
10e70 3d 6e 29 7b 0a 20 20 20 20 20 20 6e 4f 72 64 65  =n){.      nOrde
10e80 72 42 79 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20  rBy = n;.    }. 
10e90 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74   }..  /* Allocat
10ea0 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  e the sqlite3_in
10eb0 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
10ec0 72 65 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49 6e  re.  */.  pIdxIn
10ed0 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  fo = sqlite3DbMa
10ee0 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d  llocZero(pParse-
10ef0 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49 64  >db, sizeof(*pId
10f00 78 49 6e 66 6f 29 0a 20 20 20 20 20 20 20 20 20  xInfo).         
10f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f20 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a 70 49 64    + (sizeof(*pId
10f30 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65 6f 66 28  xCons) + sizeof(
10f40 2a 70 55 73 61 67 65 29 29 2a 6e 54 65 72 6d 0a  *pUsage))*nTerm.
10f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f60 20 20 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a             + siz
10f70 65 6f 66 28 2a 70 49 64 78 4f 72 64 65 72 42 79  eof(*pIdxOrderBy
10f80 29 2a 6e 4f 72 64 65 72 42 79 20 29 3b 0a 20 20  )*nOrderBy );.  
10f90 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20  if( pIdxInfo==0 
10fa0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
10fb0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
10fc0 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b  out of memory");
10fd0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
10fe0 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c   }..  /* Initial
10ff0 69 7a 65 20 74 68 65 20 73 74 72 75 63 74 75 72  ize the structur
11000 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f  e.  The sqlite3_
11010 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
11020 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20  ture contains.  
11030 2a 2a 20 6d 61 6e 79 20 66 69 65 6c 64 73 20 74  ** many fields t
11040 68 61 74 20 61 72 65 20 64 65 63 6c 61 72 65 64  hat are declared
11050 20 22 63 6f 6e 73 74 22 20 74 6f 20 70 72 65 76   "const" to prev
11060 65 6e 74 20 78 42 65 73 74 49 6e 64 65 78 20 66  ent xBestIndex f
11070 72 6f 6d 0a 20 20 2a 2a 20 63 68 61 6e 67 69 6e  rom.  ** changin
11080 67 20 74 68 65 6d 2e 20 20 57 65 20 68 61 76 65  g them.  We have
11090 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b   to do some funk
110a0 79 20 63 61 73 74 69 6e 67 20 69 6e 20 6f 72 64  y casting in ord
110b0 65 72 20 74 6f 0a 20 20 2a 2a 20 69 6e 69 74 69  er to.  ** initi
110c0 61 6c 69 7a 65 20 74 68 6f 73 65 20 66 69 65 6c  alize those fiel
110d0 64 73 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43  ds..  */.  pIdxC
110e0 6f 6e 73 20 3d 20 28 73 74 72 75 63 74 20 73 71  ons = (struct sq
110f0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
11100 74 72 61 69 6e 74 2a 29 26 70 49 64 78 49 6e 66  traint*)&pIdxInf
11110 6f 5b 31 5d 3b 0a 20 20 70 49 64 78 4f 72 64 65  o[1];.  pIdxOrde
11120 72 42 79 20 3d 20 28 73 74 72 75 63 74 20 73 71  rBy = (struct sq
11130 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65  lite3_index_orde
11140 72 62 79 2a 29 26 70 49 64 78 43 6f 6e 73 5b 6e  rby*)&pIdxCons[n
11150 54 65 72 6d 5d 3b 0a 20 20 70 55 73 61 67 65 20  Term];.  pUsage 
11160 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65  = (struct sqlite
11170 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
11180 6e 74 5f 75 73 61 67 65 2a 29 26 70 49 64 78 4f  nt_usage*)&pIdxO
11190 72 64 65 72 42 79 5b 6e 4f 72 64 65 72 42 79 5d  rderBy[nOrderBy]
111a0 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78  ;.  *(int*)&pIdx
111b0 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
111c0 74 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a 28 69  t = nTerm;.  *(i
111d0 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e  nt*)&pIdxInfo->n
111e0 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72  OrderBy = nOrder
111f0 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73  By;.  *(struct s
11200 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
11210 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49  straint**)&pIdxI
11220 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
11230 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20 2a   = pIdxCons;.  *
11240 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
11250 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 2a 29  index_orderby**)
11260 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65  &pIdxInfo->aOrde
11270 72 42 79 20 3d 20 70 49 64 78 4f 72 64 65 72 42  rBy = pIdxOrderB
11280 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71  y;.  *(struct sq
11290 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
112a0 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 2a 29 26  traint_usage**)&
112b0 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
112c0 72 61 69 6e 74 55 73 61 67 65 20 3d 0a 20 20 20  raintUsage =.   
112d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11310 70 55 73 61 67 65 3b 0a 0a 20 20 66 6f 72 28 69  pUsage;..  for(i
11320 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d  =j=0, pTerm=pWC-
11330 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d  >a; i<pWC->nTerm
11340 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; i++, pTerm++){
11350 0a 20 20 20 20 75 38 20 6f 70 3b 0a 20 20 20 20  .    u8 op;.    
11360 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  if( pTerm->leftC
11370 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69  ursor != pSrc->i
11380 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75  Cursor ) continu
11390 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 49  e;.    assert( I
113a0 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54 65 72  sPowerOfTwo(pTer
113b0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e  m->eOperator & ~
113c0 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20 20 20  WO_EQUIV) );.   
113d0 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
113e0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
113f0 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74 63  _IN );.    testc
11400 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
11410 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b  rator & WO_IS );
11420 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
11430 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
11440 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  & WO_ISNULL );. 
11450 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
11460 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
11470 57 4f 5f 41 4c 4c 20 29 3b 0a 20 20 20 20 69 66  WO_ALL );.    if
11480 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
11490 74 6f 72 20 26 20 7e 28 57 4f 5f 49 53 4e 55 4c  tor & ~(WO_ISNUL
114a0 4c 7c 57 4f 5f 45 51 55 49 56 7c 57 4f 5f 49 53  L|WO_EQUIV|WO_IS
114b0 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ))==0 ) continue
114c0 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
114d0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
114e0 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65  VNULL ) continue
114f0 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a  ;.    pIdxCons[j
11500 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 54 65 72  ].iColumn = pTer
11510 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b  m->u.leftColumn;
11520 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d  .    pIdxCons[j]
11530 2e 69 54 65 72 6d 4f 66 66 73 65 74 20 3d 20 69  .iTermOffset = i
11540 3b 0a 20 20 20 20 6f 70 20 3d 20 28 75 38 29 70  ;.    op = (u8)p
11550 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
11560 26 20 57 4f 5f 41 4c 4c 3b 0a 20 20 20 20 69 66  & WO_ALL;.    if
11570 28 20 6f 70 3d 3d 57 4f 5f 49 4e 20 29 20 6f 70  ( op==WO_IN ) op
11580 20 3d 20 57 4f 5f 45 51 3b 0a 20 20 20 20 70 49   = WO_EQ;.    pI
11590 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 6f  dxCons[j].op = o
115a0 70 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 69  p;.    /* The di
115b0 72 65 63 74 20 61 73 73 69 67 6e 6d 65 6e 74 20  rect assignment 
115c0 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  in the previous 
115d0 6c 69 6e 65 20 69 73 20 70 6f 73 73 69 62 6c 65  line is possible
115e0 20 6f 6e 6c 79 20 62 65 63 61 75 73 65 0a 20 20   only because.  
115f0 20 20 2a 2a 20 74 68 65 20 57 4f 5f 20 61 6e 64    ** the WO_ and
11600 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f   SQLITE_INDEX_CO
11610 4e 53 54 52 41 49 4e 54 5f 20 63 6f 64 65 73 20  NSTRAINT_ codes 
11620 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e 20 20  are identical.  
11630 54 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f  The.    ** follo
11640 77 69 6e 67 20 61 73 73 65 72 74 73 20 76 65 72  wing asserts ver
11650 69 66 79 20 74 68 69 73 20 66 61 63 74 2e 20 2a  ify this fact. *
11660 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f  /.    assert( WO
11670 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _EQ==SQLITE_INDE
11680 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20  X_CONSTRAINT_EQ 
11690 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57  );.    assert( W
116a0 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_LT==SQLITE_IND
116b0 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54  EX_CONSTRAINT_LT
116c0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
116d0 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_LE==SQLITE_IN
116e0 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c  DEX_CONSTRAINT_L
116f0 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
11700 20 57 4f 5f 47 54 3d 3d 53 51 4c 49 54 45 5f 49   WO_GT==SQLITE_I
11710 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
11720 47 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  GT );.    assert
11730 28 20 57 4f 5f 47 45 3d 3d 53 51 4c 49 54 45 5f  ( WO_GE==SQLITE_
11740 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
11750 5f 47 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _GE );.    asser
11760 74 28 20 57 4f 5f 4d 41 54 43 48 3d 3d 53 51 4c  t( WO_MATCH==SQL
11770 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
11780 41 49 4e 54 5f 4d 41 54 43 48 20 29 3b 0a 20 20  AINT_MATCH );.  
11790 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
117a0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
117b0 5f 49 4e 7c 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c  _IN|WO_EQ|WO_LT|
117c0 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47  WO_LE|WO_GT|WO_G
117d0 45 7c 57 4f 5f 4d 41 54 43 48 29 20 29 3b 0a 20  E|WO_MATCH) );. 
117e0 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 66 6f     j++;.  }.  fo
117f0 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42  r(i=0; i<nOrderB
11800 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  y; i++){.    Exp
11810 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65  r *pExpr = pOrde
11820 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
11830 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79  .    pIdxOrderBy
11840 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45  [i].iColumn = pE
11850 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
11860 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d    pIdxOrderBy[i]
11870 2e 64 65 73 63 20 3d 20 70 4f 72 64 65 72 42 79  .desc = pOrderBy
11880 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
11890 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
118a0 70 49 64 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a  pIdxInfo;.}../*.
118b0 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 62 6a  ** The table obj
118c0 65 63 74 20 72 65 66 65 72 65 6e 63 65 20 70 61  ect reference pa
118d0 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
118e0 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
118f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
11900 6d 75 73 74 20 72 65 70 72 65 73 65 6e 74 20 61  must represent a
11910 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20   virtual table. 
11920 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e  This function in
11930 76 6f 6b 65 73 20 74 68 65 20 78 42 65 73 74 49  vokes the xBestI
11940 6e 64 65 78 28 29 0a 2a 2a 20 6d 65 74 68 6f 64  ndex().** method
11950 20 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 20   of the virtual 
11960 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 73  table with the s
11970 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
11980 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a  o object that.**
11990 20 63 6f 6d 65 73 20 69 6e 20 61 73 20 74 68 65   comes in as the
119a0 20 33 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f   3rd argument to
119b0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
119c0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
119d0 72 20 6f 63 63 75 72 73 2c 20 70 50 61 72 73 65  r occurs, pParse
119e0 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69   is populated wi
119f0 74 68 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  th an error mess
11a00 61 67 65 20 61 6e 64 20 61 0a 2a 2a 20 6e 6f 6e  age and a.** non
11a10 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20 72  -zero value is r
11a20 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
11a30 73 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65  se, 0 is returne
11a40 64 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74  d and the output
11a50 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20  .** part of the 
11a60 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
11a70 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
11a80 6c 65 66 74 20 70 6f 70 75 6c 61 74 65 64 2e 0a  left populated..
11a90 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72  **.** Whether or
11aa0 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20 69 73   not an error is
11ab0 20 72 65 74 75 72 6e 65 64 2c 20 69 74 20 69 73   returned, it is
11ac0 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
11ad0 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61  ity of the.** ca
11ae0 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c  ller to eventual
11af0 6c 79 20 66 72 65 65 20 70 2d 3e 69 64 78 53 74  ly free p->idxSt
11b00 72 20 69 66 20 70 2d 3e 6e 65 65 64 54 6f 46 72  r if p->needToFr
11b10 65 65 49 64 78 53 74 72 20 69 6e 64 69 63 61 74  eeIdxStr indicat
11b20 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 69 73 20  es.** that this 
11b30 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a  is required..*/.
11b40 73 74 61 74 69 63 20 69 6e 74 20 76 74 61 62 42  static int vtabB
11b50 65 73 74 49 6e 64 65 78 28 50 61 72 73 65 20 2a  estIndex(Parse *
11b60 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
11b70 54 61 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64  Tab, sqlite3_ind
11b80 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 73  ex_info *p){.  s
11b90 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
11ba0 61 62 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  ab = sqlite3GetV
11bb0 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62  Table(pParse->db
11bc0 2c 20 70 54 61 62 29 2d 3e 70 56 74 61 62 3b 0a  , pTab)->pVtab;.
11bd0 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72    int i;.  int r
11be0 63 3b 0a 0a 20 20 54 52 41 43 45 5f 49 44 58 5f  c;..  TRACE_IDX_
11bf0 49 4e 50 55 54 53 28 70 29 3b 0a 20 20 72 63 20  INPUTS(p);.  rc 
11c00 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65  = pVtab->pModule
11c10 2d 3e 78 42 65 73 74 49 6e 64 65 78 28 70 56 74  ->xBestIndex(pVt
11c20 61 62 2c 20 70 29 3b 0a 20 20 54 52 41 43 45 5f  ab, p);.  TRACE_
11c30 49 44 58 5f 4f 55 54 50 55 54 53 28 70 29 3b 0a  IDX_OUTPUTS(p);.
11c40 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
11c50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
11c60 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
11c70 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
11c80 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
11c90 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  ed = 1;.    }els
11ca0 65 20 69 66 28 20 21 70 56 74 61 62 2d 3e 7a 45  e if( !pVtab->zE
11cb0 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 73  rrMsg ){.      s
11cc0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
11cd0 50 61 72 73 65 2c 20 22 25 73 22 2c 20 73 71 6c  Parse, "%s", sql
11ce0 69 74 65 33 45 72 72 53 74 72 28 72 63 29 29 3b  ite3ErrStr(rc));
11cf0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
11d00 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
11d10 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20  g(pParse, "%s", 
11d20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b  pVtab->zErrMsg);
11d30 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
11d40 69 74 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d  ite3_free(pVtab-
11d50 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 56 74  >zErrMsg);.  pVt
11d60 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ab->zErrMsg = 0;
11d70 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ..  for(i=0; i<p
11d80 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  ->nConstraint; i
11d90 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 70 2d  ++){.    if( !p-
11da0 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e  >aConstraint[i].
11db0 75 73 61 62 6c 65 20 26 26 20 70 2d 3e 61 43 6f  usable && p->aCo
11dc0 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d  nstraintUsage[i]
11dd0 2e 61 72 67 76 49 6e 64 65 78 3e 30 20 29 7b 0a  .argvIndex>0 ){.
11de0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
11df0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
11e00 20 20 20 20 20 20 20 20 20 22 74 61 62 6c 65 20           "table 
11e10 25 73 3a 20 78 42 65 73 74 49 6e 64 65 78 20 72  %s: xBestIndex r
11e20 65 74 75 72 6e 65 64 20 61 6e 20 69 6e 76 61 6c  eturned an inval
11e30 69 64 20 70 6c 61 6e 22 2c 20 70 54 61 62 2d 3e  id plan", pTab->
11e40 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
11e50 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72  }..  return pPar
11e60 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 23 65 6e 64  se->nErr;.}.#end
11e70 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
11e80 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
11e90 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 23 69 66  ALTABLE) */..#if
11ea0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
11eb0 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
11ec0 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
11ed0 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  the location of 
11ee0 61 20 70 61 72 74 69 63 75 6c 61 72 20 6b 65 79  a particular key
11ef0 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65 79 73 20   among all keys 
11f00 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20  in an.** index. 
11f10 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
11f20 74 73 20 69 6e 20 61 53 74 61 74 20 61 73 20 66  ts in aStat as f
11f30 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
11f40 20 61 53 74 61 74 5b 30 5d 20 20 20 20 20 20 45   aStat[0]      E
11f50 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  st. number of ro
11f60 77 73 20 6c 65 73 73 20 74 68 61 6e 20 70 52 65  ws less than pRe
11f70 63 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b 31 5d  c.**    aStat[1]
11f80 20 20 20 20 20 20 45 73 74 2e 20 6e 75 6d 62 65        Est. numbe
11f90 72 20 6f 66 20 72 6f 77 73 20 65 71 75 61 6c 20  r of rows equal 
11fa0 74 6f 20 70 52 65 63 0a 2a 2a 0a 2a 2a 20 52 65  to pRec.**.** Re
11fb0 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
11fc0 66 20 74 68 65 20 73 61 6d 70 6c 65 20 74 68 61  f the sample tha
11fd0 74 20 69 73 20 74 68 65 20 73 6d 61 6c 6c 65 73  t is the smalles
11fe0 74 20 73 61 6d 70 6c 65 20 74 68 61 74 0a 2a 2a  t sample that.**
11ff0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
12000 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 70 52 65   or equal to pRe
12010 63 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69  c. Note that thi
12020 73 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 61  s index is not a
12030 6e 20 69 6e 64 65 78 0a 2a 2a 20 69 6e 74 6f 20  n index.** into 
12040 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72  the aSample[] ar
12050 72 61 79 20 2d 20 69 74 20 69 73 20 61 6e 20 69  ray - it is an i
12060 6e 64 65 78 20 69 6e 74 6f 20 61 20 76 69 72 74  ndex into a virt
12070 75 61 6c 20 73 65 74 20 6f 66 20 73 61 6d 70 6c  ual set of sampl
12080 65 73 0a 2a 2a 20 62 61 73 65 64 20 6f 6e 20 74  es.** based on t
12090 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  he contents of a
120a0 53 61 6d 70 6c 65 5b 5d 20 61 6e 64 20 74 68 65  Sample[] and the
120b0 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64   number of field
120c0 73 20 69 6e 20 72 65 63 6f 72 64 20 0a 2a 2a 20  s in record .** 
120d0 70 52 65 63 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  pRec. .*/.static
120e0 20 69 6e 74 20 77 68 65 72 65 4b 65 79 53 74 61   int whereKeySta
120f0 74 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ts(.  Parse *pPa
12100 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
12110 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
12120 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e  nnection */.  In
12130 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20  dex *pIdx,      
12140 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
12150 65 78 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 64  ex to consider d
12160 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a 20 20 55 6e  omain of */.  Un
12170 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 52  packedRecord *pR
12180 65 63 2c 20 20 20 20 20 20 20 2f 2a 20 56 65 63  ec,       /* Vec
12190 74 6f 72 20 6f 66 20 76 61 6c 75 65 73 20 74 6f  tor of values to
121a0 20 63 6f 6e 73 69 64 65 72 20 2a 2f 0a 20 20 69   consider */.  i
121b0 6e 74 20 72 6f 75 6e 64 55 70 2c 20 20 20 20 20  nt roundUp,     
121c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
121d0 75 6e 64 20 75 70 20 69 66 20 74 72 75 65 2e 20  und up if true. 
121e0 20 52 6f 75 6e 64 20 64 6f 77 6e 20 69 66 20 66   Round down if f
121f0 61 6c 73 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e  alse */.  tRowcn
12200 74 20 2a 61 53 74 61 74 20 20 20 20 20 20 20 20  t *aStat        
12210 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 73 74        /* OUT: st
12220 61 74 73 20 77 72 69 74 74 65 6e 20 68 65 72 65  ats written here
12230 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 53 61   */.){.  IndexSa
12240 6d 70 6c 65 20 2a 61 53 61 6d 70 6c 65 20 3d 20  mple *aSample = 
12250 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 3b 0a 20  pIdx->aSample;. 
12260 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20   int iCol;      
12270 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12280 49 6e 64 65 78 20 6f 66 20 72 65 71 75 69 72 65  Index of require
12290 64 20 73 74 61 74 73 20 69 6e 20 61 6e 45 71 5b  d stats in anEq[
122a0 5d 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74 20  ] etc. */.  int 
122b0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
122c0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
122d0 20 6f 66 20 66 69 72 73 74 20 73 61 6d 70 6c 65   of first sample
122e0 20 3e 3d 20 70 52 65 63 20 2a 2f 0a 20 20 69 6e   >= pRec */.  in
122f0 74 20 69 53 61 6d 70 6c 65 3b 20 20 20 20 20 20  t iSample;      
12300 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6d 61            /* Sma
12310 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20 6c 61 72  llest sample lar
12320 67 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ger than or equa
12330 6c 20 74 6f 20 70 52 65 63 20 2a 2f 0a 20 20 69  l to pRec */.  i
12340 6e 74 20 69 4d 69 6e 20 3d 20 30 3b 20 20 20 20  nt iMin = 0;    
12350 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6d             /* Sm
12360 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20 6e 6f  allest sample no
12370 74 20 79 65 74 20 74 65 73 74 65 64 20 2a 2f 0a  t yet tested */.
12380 20 20 69 6e 74 20 69 54 65 73 74 3b 20 20 20 20    int iTest;    
12390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
123a0 20 4e 65 78 74 20 73 61 6d 70 6c 65 20 74 6f 20   Next sample to 
123b0 74 65 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65  test */.  int re
123c0 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
123d0 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
123e0 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  of comparison op
123f0 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  eration */.  int
12400 20 6e 46 69 65 6c 64 3b 20 20 20 20 20 20 20 20   nField;        
12410 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
12420 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e 20  er of fields in 
12430 70 52 65 63 20 2a 2f 0a 20 20 74 52 6f 77 63 6e  pRec */.  tRowcn
12440 74 20 69 4c 6f 77 65 72 20 3d 20 30 3b 20 20 20  t iLower = 0;   
12450 20 20 20 20 20 20 2f 2a 20 61 6e 4c 74 5b 5d 20        /* anLt[] 
12460 2b 20 61 6e 45 71 5b 5d 20 6f 66 20 6c 61 72 67  + anEq[] of larg
12470 65 73 74 20 73 61 6d 70 6c 65 20 70 52 65 63 20  est sample pRec 
12480 69 73 20 3e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  is > */..#ifndef
12490 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
124a0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
124b0 28 20 70 50 61 72 73 65 20 29 3b 0a 23 65 6e 64  ( pParse );.#end
124c0 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 52 65  if.  assert( pRe
124d0 63 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  c!=0 );.  assert
124e0 28 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 3e  ( pIdx->nSample>
124f0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
12500 52 65 63 2d 3e 6e 46 69 65 6c 64 3e 30 20 26 26  Rec->nField>0 &&
12510 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3c 3d 70   pRec->nField<=p
12520 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 20  Idx->nSampleCol 
12530 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20 61 20 62 69  );..  /* Do a bi
12540 6e 61 72 79 20 73 65 61 72 63 68 20 74 6f 20 66  nary search to f
12550 69 6e 64 20 74 68 65 20 66 69 72 73 74 20 73 61  ind the first sa
12560 6d 70 6c 65 20 67 72 65 61 74 65 72 20 74 68 61  mple greater tha
12570 6e 20 6f 72 20 65 71 75 61 6c 0a 20 20 2a 2a 20  n or equal.  ** 
12580 74 6f 20 70 52 65 63 2e 20 49 66 20 70 52 65 63  to pRec. If pRec
12590 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 69 6e 67   contains a sing
125a0 6c 65 20 66 69 65 6c 64 2c 20 74 68 65 20 73 65  le field, the se
125b0 74 20 6f 66 20 73 61 6d 70 6c 65 73 20 74 6f 20  t of samples to 
125c0 73 65 61 72 63 68 0a 20 20 2a 2a 20 69 73 20 73  search.  ** is s
125d0 69 6d 70 6c 79 20 74 68 65 20 61 53 61 6d 70 6c  imply the aSampl
125e0 65 5b 5d 20 61 72 72 61 79 2e 20 49 66 20 74 68  e[] array. If th
125f0 65 20 73 61 6d 70 6c 65 73 20 69 6e 20 61 53 61  e samples in aSa
12600 6d 70 6c 65 5b 5d 20 63 6f 6e 74 61 69 6e 20 6d  mple[] contain m
12610 6f 72 65 0a 20 20 2a 2a 20 74 68 61 6e 20 6f 6e  ore.  ** than on
12620 65 20 66 69 65 6c 64 73 2c 20 61 6c 6c 20 66 69  e fields, all fi
12630 65 6c 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  elds following t
12640 68 65 20 66 69 72 73 74 20 61 72 65 20 69 67 6e  he first are ign
12650 6f 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ored..  **.  ** 
12660 49 66 20 70 52 65 63 20 63 6f 6e 74 61 69 6e 73  If pRec contains
12670 20 4e 20 66 69 65 6c 64 73 2c 20 77 68 65 72 65   N fields, where
12680 20 4e 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20   N is more than 
12690 6f 6e 65 2c 20 74 68 65 6e 20 61 73 20 77 65 6c  one, then as wel
126a0 6c 20 61 73 20 74 68 65 0a 20 20 2a 2a 20 73 61  l as the.  ** sa
126b0 6d 70 6c 65 73 20 69 6e 20 61 53 61 6d 70 6c 65  mples in aSample
126c0 5b 5d 20 28 74 72 75 6e 63 61 74 65 64 20 74 6f  [] (truncated to
126d0 20 4e 20 66 69 65 6c 64 73 29 2c 20 74 68 65 20   N fields), the 
126e0 73 65 61 72 63 68 20 61 6c 73 6f 20 68 61 73 20  search also has 
126f0 74 6f 0a 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72  to.  ** consider
12700 20 70 72 65 66 69 78 65 73 20 6f 66 20 74 68 6f   prefixes of tho
12710 73 65 20 73 61 6d 70 6c 65 73 2e 20 46 6f 72 20  se samples. For 
12720 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
12730 73 65 74 20 6f 66 20 73 61 6d 70 6c 65 73 0a 20  set of samples. 
12740 20 2a 2a 20 69 6e 20 61 53 61 6d 70 6c 65 20 69   ** in aSample i
12750 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s:.  **.  **    
12760 20 61 53 61 6d 70 6c 65 5b 30 5d 20 3d 20 28 61   aSample[0] = (a
12770 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20 20 20 61  , 5) .  **     a
12780 53 61 6d 70 6c 65 5b 31 5d 20 3d 20 28 61 2c 20  Sample[1] = (a, 
12790 31 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 61 53  10) .  **     aS
127a0 61 6d 70 6c 65 5b 32 5d 20 3d 20 28 62 2c 20 35  ample[2] = (b, 5
127b0 29 20 0a 20 20 2a 2a 20 20 20 20 20 61 53 61 6d  ) .  **     aSam
127c0 70 6c 65 5b 33 5d 20 3d 20 28 63 2c 20 31 30 30  ple[3] = (c, 100
127d0 29 20 0a 20 20 2a 2a 20 20 20 20 20 61 53 61 6d  ) .  **     aSam
127e0 70 6c 65 5b 34 5d 20 3d 20 28 63 2c 20 31 30 35  ple[4] = (c, 105
127f0 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e  ).  **.  ** Then
12800 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63   the search spac
12810 65 20 73 68 6f 75 6c 64 20 69 64 65 61 6c 6c 79  e should ideally
12820 20 62 65 20 74 68 65 20 73 61 6d 70 6c 65 73 20   be the samples 
12830 61 62 6f 76 65 20 61 6e 64 20 74 68 65 20 0a 20  above and the . 
12840 20 2a 2a 20 75 6e 69 71 75 65 20 70 72 65 66 69   ** unique prefi
12850 78 65 73 20 5b 61 5d 2c 20 5b 62 5d 20 61 6e 64  xes [a], [b] and
12860 20 5b 63 5d 2e 20 42 75 74 20 73 69 6e 63 65 20   [c]. But since 
12870 74 68 61 74 20 69 73 20 68 61 72 64 20 74 6f 20  that is hard to 
12880 6f 72 67 61 6e 69 7a 65 2c 20 0a 20 20 2a 2a 20  organize, .  ** 
12890 74 68 65 20 63 6f 64 65 20 61 63 74 75 61 6c 6c  the code actuall
128a0 79 20 73 65 61 72 63 68 65 73 20 74 68 69 73 20  y searches this 
128b0 73 65 74 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  set:.  **.  **  
128c0 20 20 20 30 3a 20 28 61 29 20 0a 20 20 2a 2a 20     0: (a) .  ** 
128d0 20 20 20 20 31 3a 20 28 61 2c 20 35 29 20 0a 20      1: (a, 5) . 
128e0 20 2a 2a 20 20 20 20 20 32 3a 20 28 61 2c 20 31   **     2: (a, 1
128f0 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 33 3a 20  0) .  **     3: 
12900 28 61 2c 20 31 30 29 20 0a 20 20 2a 2a 20 20 20  (a, 10) .  **   
12910 20 20 34 3a 20 28 62 29 20 0a 20 20 2a 2a 20 20    4: (b) .  **  
12920 20 20 20 35 3a 20 28 62 2c 20 35 29 20 0a 20 20     5: (b, 5) .  
12930 2a 2a 20 20 20 20 20 36 3a 20 28 63 29 20 0a 20  **     6: (c) . 
12940 20 2a 2a 20 20 20 20 20 37 3a 20 28 63 2c 20 31   **     7: (c, 1
12950 30 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 38 3a  00) .  **     8:
12960 20 28 63 2c 20 31 30 35 29 0a 20 20 2a 2a 20 20   (c, 105).  **  
12970 20 20 20 39 3a 20 28 63 2c 20 31 30 35 29 0a 20     9: (c, 105). 
12980 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 65 61 63   **.  ** For eac
12990 68 20 73 61 6d 70 6c 65 20 69 6e 20 74 68 65 20  h sample in the 
129a0 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 2c  aSample[] array,
129b0 20 4e 20 73 61 6d 70 6c 65 73 20 61 72 65 20 70   N samples are p
129c0 72 65 73 65 6e 74 20 69 6e 20 74 68 65 0a 20 20  resent in the.  
129d0 2a 2a 20 65 66 66 65 63 74 69 76 65 20 73 61 6d  ** effective sam
129e0 70 6c 65 20 61 72 72 61 79 2e 20 49 6e 20 74 68  ple array. In th
129f0 65 20 61 62 6f 76 65 2c 20 73 61 6d 70 6c 65 73  e above, samples
12a00 20 30 20 61 6e 64 20 31 20 61 72 65 20 62 61 73   0 and 1 are bas
12a10 65 64 20 6f 6e 20 0a 20 20 2a 2a 20 73 61 6d 70  ed on .  ** samp
12a20 6c 65 20 61 53 61 6d 70 6c 65 5b 30 5d 2e 20 53  le aSample[0]. S
12a30 61 6d 70 6c 65 73 20 32 20 61 6e 64 20 33 20 6f  amples 2 and 3 o
12a40 6e 20 61 53 61 6d 70 6c 65 5b 31 5d 20 65 74 63  n aSample[1] etc
12a50 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 66 74 65  ..  **.  ** Ofte
12a60 6e 2c 20 73 61 6d 70 6c 65 20 69 20 6f 66 20 65  n, sample i of e
12a70 61 63 68 20 62 6c 6f 63 6b 20 6f 66 20 4e 20 65  ach block of N e
12a80 66 66 65 63 74 69 76 65 20 73 61 6d 70 6c 65 73  ffective samples
12a90 20 68 61 73 20 28 69 2b 31 29 20 66 69 65 6c 64   has (i+1) field
12aa0 73 2e 0a 20 20 2a 2a 20 45 78 63 65 70 74 2c 20  s..  ** Except, 
12ab0 65 61 63 68 20 73 61 6d 70 6c 65 20 6d 61 79 20  each sample may 
12ac0 62 65 20 65 78 74 65 6e 64 65 64 20 74 6f 20 65  be extended to e
12ad0 6e 73 75 72 65 20 74 68 61 74 20 69 74 20 69 73  nsure that it is
12ae0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
12af0 0a 20 20 2a 2a 20 65 71 75 61 6c 20 74 6f 20 74  .  ** equal to t
12b00 68 65 20 70 72 65 76 69 6f 75 73 20 73 61 6d 70  he previous samp
12b10 6c 65 20 69 6e 20 74 68 65 20 61 72 72 61 79 2e  le in the array.
12b20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 6e   For example, in
12b30 20 74 68 65 20 61 62 6f 76 65 2c 20 0a 20 20 2a   the above, .  *
12b40 2a 20 73 61 6d 70 6c 65 20 32 20 69 73 20 74 68  * sample 2 is th
12b50 65 20 66 69 72 73 74 20 73 61 6d 70 6c 65 20 6f  e first sample o
12b60 66 20 61 20 62 6c 6f 63 6b 20 6f 66 20 4e 20 73  f a block of N s
12b70 61 6d 70 6c 65 73 2c 20 73 6f 20 61 74 20 66 69  amples, so at fi
12b80 72 73 74 20 69 74 20 0a 20 20 2a 2a 20 61 70 70  rst it .  ** app
12b90 65 61 72 73 20 74 68 61 74 20 69 74 20 73 68 6f  ears that it sho
12ba0 75 6c 64 20 62 65 20 31 20 66 69 65 6c 64 20 69  uld be 1 field i
12bb0 6e 20 73 69 7a 65 2e 20 48 6f 77 65 76 65 72 2c  n size. However,
12bc0 20 74 68 61 74 20 77 6f 75 6c 64 20 6d 61 6b 65   that would make
12bd0 20 69 74 20 0a 20 20 2a 2a 20 73 6d 61 6c 6c 65   it .  ** smalle
12be0 72 20 74 68 61 6e 20 73 61 6d 70 6c 65 20 31 2c  r than sample 1,
12bf0 20 73 6f 20 74 68 65 20 62 69 6e 61 72 79 20 73   so the binary s
12c00 65 61 72 63 68 20 77 6f 75 6c 64 20 6e 6f 74 20  earch would not 
12c10 77 6f 72 6b 2e 20 41 73 20 61 20 72 65 73 75 6c  work. As a resul
12c20 74 2c 20 0a 20 20 2a 2a 20 69 74 20 69 73 20 65  t, .  ** it is e
12c30 78 74 65 6e 64 65 64 20 74 6f 20 74 77 6f 20 66  xtended to two f
12c40 69 65 6c 64 73 2e 20 54 68 65 20 64 75 70 6c 69  ields. The dupli
12c50 63 61 74 65 73 20 74 68 61 74 20 74 68 69 73 20  cates that this 
12c60 63 72 65 61 74 65 73 20 64 6f 20 6e 6f 74 20 0a  creates do not .
12c70 20 20 2a 2a 20 63 61 75 73 65 20 61 6e 79 20 70    ** cause any p
12c80 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20  roblems..  */.  
12c90 6e 46 69 65 6c 64 20 3d 20 70 52 65 63 2d 3e 6e  nField = pRec->n
12ca0 46 69 65 6c 64 3b 0a 20 20 69 43 6f 6c 20 3d 20  Field;.  iCol = 
12cb0 30 3b 0a 20 20 69 53 61 6d 70 6c 65 20 3d 20 70  0;.  iSample = p
12cc0 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 2a 20 6e  Idx->nSample * n
12cd0 46 69 65 6c 64 3b 0a 20 20 64 6f 7b 0a 20 20 20  Field;.  do{.   
12ce0 20 69 6e 74 20 69 53 61 6d 70 3b 20 20 20 20 20   int iSamp;     
12cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12d00 2a 20 49 6e 64 65 78 20 69 6e 20 61 53 61 6d 70  * Index in aSamp
12d10 6c 65 5b 5d 20 6f 66 20 74 65 73 74 20 73 61 6d  le[] of test sam
12d20 70 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ple */.    int n
12d30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12d40 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
12d50 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69 6e 20  er of fields in 
12d60 74 65 73 74 20 73 61 6d 70 6c 65 20 2a 2f 0a 0a  test sample */..
12d70 20 20 20 20 69 54 65 73 74 20 3d 20 28 69 4d 69      iTest = (iMi
12d80 6e 2b 69 53 61 6d 70 6c 65 29 2f 32 3b 0a 20 20  n+iSample)/2;.  
12d90 20 20 69 53 61 6d 70 20 3d 20 69 54 65 73 74 20    iSamp = iTest 
12da0 2f 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20 69 66  / nField;.    if
12db0 28 20 69 53 61 6d 70 3e 30 20 29 7b 0a 20 20 20  ( iSamp>0 ){.   
12dc0 20 20 20 2f 2a 20 54 68 65 20 70 72 6f 70 6f 73     /* The propos
12dd0 65 64 20 65 66 66 65 63 74 69 76 65 20 73 61 6d  ed effective sam
12de0 70 6c 65 20 69 73 20 61 20 70 72 65 66 69 78 20  ple is a prefix 
12df0 6f 66 20 73 61 6d 70 6c 65 20 61 53 61 6d 70 6c  of sample aSampl
12e00 65 5b 69 53 61 6d 70 5d 2e 0a 20 20 20 20 20 20  e[iSamp]..      
12e10 2a 2a 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c  ** Specifically,
12e20 20 74 68 65 20 73 68 6f 72 74 65 73 74 20 70 72   the shortest pr
12e30 65 66 69 78 20 6f 66 20 61 74 20 6c 65 61 73 74  efix of at least
12e40 20 28 31 20 2b 20 69 54 65 73 74 25 6e 46 69 65   (1 + iTest%nFie
12e50 6c 64 29 20 0a 20 20 20 20 20 20 2a 2a 20 66 69  ld) .      ** fi
12e60 65 6c 64 73 20 74 68 61 74 20 69 73 20 67 72 65  elds that is gre
12e70 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 70 72  ater than the pr
12e80 65 76 69 6f 75 73 20 65 66 66 65 63 74 69 76 65  evious effective
12e90 20 73 61 6d 70 6c 65 2e 20 20 2a 2f 0a 20 20 20   sample.  */.   
12ea0 20 20 20 66 6f 72 28 6e 3d 28 69 54 65 73 74 20     for(n=(iTest 
12eb0 25 20 6e 46 69 65 6c 64 29 20 2b 20 31 3b 20 6e  % nField) + 1; n
12ec0 3c 6e 46 69 65 6c 64 3b 20 6e 2b 2b 29 7b 0a 20  <nField; n++){. 
12ed0 20 20 20 20 20 20 20 69 66 28 20 61 53 61 6d 70         if( aSamp
12ee0 6c 65 5b 69 53 61 6d 70 2d 31 5d 2e 61 6e 4c 74  le[iSamp-1].anLt
12ef0 5b 6e 2d 31 5d 21 3d 61 53 61 6d 70 6c 65 5b 69  [n-1]!=aSample[i
12f00 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 20  Samp].anLt[n-1] 
12f10 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
12f20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
12f30 20 20 6e 20 3d 20 69 54 65 73 74 20 2b 20 31 3b    n = iTest + 1;
12f40 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 52 65 63  .    }..    pRec
12f50 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 3b 0a 20 20  ->nField = n;.  
12f60 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56    res = sqlite3V
12f70 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
12f80 28 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e  (aSample[iSamp].
12f90 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70  n, aSample[iSamp
12fa0 5d 2e 70 2c 20 70 52 65 63 29 3b 0a 20 20 20 20  ].p, pRec);.    
12fb0 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20  if( res<0 ){.   
12fc0 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 53 61 6d     iLower = aSam
12fd0 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b  ple[iSamp].anLt[
12fe0 6e 2d 31 5d 20 2b 20 61 53 61 6d 70 6c 65 5b 69  n-1] + aSample[i
12ff0 53 61 6d 70 5d 2e 61 6e 45 71 5b 6e 2d 31 5d 3b  Samp].anEq[n-1];
13000 0a 20 20 20 20 20 20 69 4d 69 6e 20 3d 20 69 54  .      iMin = iT
13010 65 73 74 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65  est+1;.    }else
13020 20 69 66 28 20 72 65 73 3d 3d 30 20 26 26 20 6e   if( res==0 && n
13030 3c 6e 46 69 65 6c 64 20 29 7b 0a 20 20 20 20 20  <nField ){.     
13040 20 69 4c 6f 77 65 72 20 3d 20 61 53 61 6d 70 6c   iLower = aSampl
13050 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d  e[iSamp].anLt[n-
13060 31 5d 3b 0a 20 20 20 20 20 20 69 4d 69 6e 20 3d  1];.      iMin =
13070 20 69 54 65 73 74 2b 31 3b 0a 20 20 20 20 20 20   iTest+1;.      
13080 72 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65  res = -1;.    }e
13090 6c 73 65 7b 0a 20 20 20 20 20 20 69 53 61 6d 70  lse{.      iSamp
130a0 6c 65 20 3d 20 69 54 65 73 74 3b 0a 20 20 20 20  le = iTest;.    
130b0 20 20 69 43 6f 6c 20 3d 20 6e 2d 31 3b 0a 20 20    iCol = n-1;.  
130c0 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72 65    }.  }while( re
130d0 73 20 26 26 20 69 4d 69 6e 3c 69 53 61 6d 70 6c  s && iMin<iSampl
130e0 65 20 29 3b 0a 20 20 69 20 3d 20 69 53 61 6d 70  e );.  i = iSamp
130f0 6c 65 20 2f 20 6e 46 69 65 6c 64 3b 0a 0a 23 69  le / nField;..#i
13100 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
13110 47 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  G.  /* The follo
13120 77 69 6e 67 20 61 73 73 65 72 74 20 73 74 61 74  wing assert stat
13130 65 6d 65 6e 74 73 20 63 68 65 63 6b 20 74 68 61  ements check tha
13140 74 20 74 68 65 20 62 69 6e 61 72 79 20 73 65 61  t the binary sea
13150 72 63 68 20 63 6f 64 65 0a 20 20 2a 2a 20 61 62  rch code.  ** ab
13160 6f 76 65 20 66 6f 75 6e 64 20 74 68 65 20 72 69  ove found the ri
13170 67 68 74 20 61 6e 73 77 65 72 2e 20 54 68 69 73  ght answer. This
13180 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 6e 6f   block serves no
13190 20 70 75 72 70 6f 73 65 20 6f 74 68 65 72 0a 20   purpose other. 
131a0 20 2a 2a 20 74 68 61 6e 20 74 6f 20 69 6e 76 6f   ** than to invo
131b0 6b 65 20 74 68 65 20 61 73 73 65 72 74 73 2e 20  ke the asserts. 
131c0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65   */.  if( pParse
131d0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
131e0 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ed==0 ){.    if(
131f0 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20   res==0 ){.     
13200 20 2f 2a 20 49 66 20 28 72 65 73 3d 3d 30 29 20   /* If (res==0) 
13210 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 70 52  is true, then pR
13220 65 63 20 6d 75 73 74 20 62 65 20 65 71 75 61 6c  ec must be equal
13230 20 74 6f 20 73 61 6d 70 6c 65 20 69 2e 20 2a 2f   to sample i. */
13240 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
13250 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29  <pIdx->nSample )
13260 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
13270 69 43 6f 6c 3d 3d 6e 46 69 65 6c 64 2d 31 20 29  iCol==nField-1 )
13280 3b 0a 20 20 20 20 20 20 70 52 65 63 2d 3e 6e 46  ;.      pRec->nF
13290 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64 3b 0a 20  ield = nField;. 
132a0 20 20 20 20 20 61 73 73 65 72 74 28 20 30 3d 3d       assert( 0==
132b0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
132c0 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65  dCompare(aSample
132d0 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69  [i].n, aSample[i
132e0 5d 2e 70 2c 20 70 52 65 63 29 20 0a 20 20 20 20  ].p, pRec) .    
132f0 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65         || pParse
13300 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
13310 65 64 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ed .      );.   
13320 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
13330 20 55 6e 6c 65 73 73 20 69 3d 3d 70 49 64 78 2d   Unless i==pIdx-
13340 3e 6e 53 61 6d 70 6c 65 2c 20 69 6e 64 69 63 61  >nSample, indica
13350 74 69 6e 67 20 74 68 61 74 20 70 52 65 63 20 69  ting that pRec i
13360 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 20 20  s larger than.  
13370 20 20 20 20 2a 2a 20 61 6c 6c 20 73 61 6d 70 6c      ** all sampl
13380 65 73 20 69 6e 20 74 68 65 20 61 53 61 6d 70 6c  es in the aSampl
13390 65 5b 5d 20 61 72 72 61 79 2c 20 70 52 65 63 20  e[] array, pRec 
133a0 6d 75 73 74 20 62 65 20 73 6d 61 6c 6c 65 72 20  must be smaller 
133b0 74 68 61 6e 20 74 68 65 0a 20 20 20 20 20 20 2a  than the.      *
133c0 2a 20 28 69 43 6f 6c 2b 31 29 20 66 69 65 6c 64  * (iCol+1) field
133d0 20 70 72 65 66 69 78 20 6f 66 20 73 61 6d 70 6c   prefix of sampl
133e0 65 20 69 2e 20 20 2a 2f 0a 20 20 20 20 20 20 61  e i.  */.      a
133f0 73 73 65 72 74 28 20 69 3c 3d 70 49 64 78 2d 3e  ssert( i<=pIdx->
13400 6e 53 61 6d 70 6c 65 20 26 26 20 69 3e 3d 30 20  nSample && i>=0 
13410 29 3b 0a 20 20 20 20 20 20 70 52 65 63 2d 3e 6e  );.      pRec->n
13420 46 69 65 6c 64 20 3d 20 69 43 6f 6c 2b 31 3b 0a  Field = iCol+1;.
13430 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3d        assert( i=
13440 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 0a  =pIdx->nSample .
13450 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
13460 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
13470 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69  ompare(aSample[i
13480 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  ].n, aSample[i].
13490 70 2c 20 70 52 65 63 29 3e 30 0a 20 20 20 20 20  p, pRec)>0.     
134a0 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d        || pParse-
134b0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
134c0 64 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 69  d );..      /* i
134d0 66 20 69 3d 3d 30 20 61 6e 64 20 69 43 6f 6c 3d  f i==0 and iCol=
134e0 3d 30 2c 20 74 68 65 6e 20 72 65 63 6f 72 64 20  =0, then record 
134f0 70 52 65 63 20 69 73 20 73 6d 61 6c 6c 65 72 20  pRec is smaller 
13500 74 68 61 6e 20 61 6c 6c 20 73 61 6d 70 6c 65 73  than all samples
13510 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  .      ** in the
13520 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79   aSample[] array
13530 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
13540 28 69 43 6f 6c 3e 30 29 20 74 68 65 6e 20 70 52  (iCol>0) then pR
13550 65 63 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a  ec must.      **
13560 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
13570 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
13580 20 28 69 43 6f 6c 29 20 66 69 65 6c 64 20 70 72   (iCol) field pr
13590 65 66 69 78 20 6f 66 20 73 61 6d 70 6c 65 20 69  efix of sample i
135a0 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 28 69  ..      ** If (i
135b0 3e 30 29 2c 20 74 68 65 6e 20 70 52 65 63 20 6d  >0), then pRec m
135c0 75 73 74 20 61 6c 73 6f 20 62 65 20 67 72 65 61  ust also be grea
135d0 74 65 72 20 74 68 61 6e 20 73 61 6d 70 6c 65 20  ter than sample 
135e0 28 69 2d 31 29 2e 20 20 2a 2f 0a 20 20 20 20 20  (i-1).  */.     
135f0 20 69 66 28 20 69 43 6f 6c 3e 30 20 29 7b 0a 20   if( iCol>0 ){. 
13600 20 20 20 20 20 20 20 70 52 65 63 2d 3e 6e 46 69         pRec->nFi
13610 65 6c 64 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20  eld = iCol;.    
13620 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
13630 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
13640 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e  pare(aSample[i].
13650 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c  n, aSample[i].p,
13660 20 70 52 65 63 29 3c 3d 30 0a 20 20 20 20 20 20   pRec)<=0.      
13670 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65         || pParse
13680 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
13690 65 64 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ed );.      }.  
136a0 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a 20      if( i>0 ){. 
136b0 20 20 20 20 20 20 20 70 52 65 63 2d 3e 6e 46 69         pRec->nFi
136c0 65 6c 64 20 3d 20 6e 46 69 65 6c 64 3b 0a 20 20  eld = nField;.  
136d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
136e0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
136f0 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69  ompare(aSample[i
13700 2d 31 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69  -1].n, aSample[i
13710 2d 31 5d 2e 70 2c 20 70 52 65 63 29 3c 30 0a 20  -1].p, pRec)<0. 
13720 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70              || p
13730 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
13740 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
13750 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
13760 64 69 66 20 2f 2a 20 69 66 64 65 66 20 53 51 4c  dif /* ifdef SQL
13770 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 20 20  ITE_DEBUG */..  
13780 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20  if( res==0 ){.  
13790 20 20 2f 2a 20 52 65 63 6f 72 64 20 70 52 65 63    /* Record pRec
137a0 20 69 73 20 65 71 75 61 6c 20 74 6f 20 73 61 6d   is equal to sam
137b0 70 6c 65 20 69 20 2a 2f 0a 20 20 20 20 61 73 73  ple i */.    ass
137c0 65 72 74 28 20 69 43 6f 6c 3d 3d 6e 46 69 65 6c  ert( iCol==nFiel
137d0 64 2d 31 20 29 3b 0a 20 20 20 20 61 53 74 61 74  d-1 );.    aStat
137e0 5b 30 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d  [0] = aSample[i]
137f0 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20  .anLt[iCol];.   
13800 20 61 53 74 61 74 5b 31 5d 20 3d 20 61 53 61 6d   aStat[1] = aSam
13810 70 6c 65 5b 69 5d 2e 61 6e 45 71 5b 69 43 6f 6c  ple[i].anEq[iCol
13820 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ];.  }else{.    
13830 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
13840 2c 20 74 68 65 20 28 69 43 6f 6c 2b 31 29 20 66  , the (iCol+1) f
13850 69 65 6c 64 20 70 72 65 66 69 78 20 6f 66 20 61  ield prefix of a
13860 53 61 6d 70 6c 65 5b 69 5d 20 69 73 20 74 68 65  Sample[i] is the
13870 20 66 69 72 73 74 20 0a 20 20 20 20 2a 2a 20 73   first .    ** s
13880 61 6d 70 6c 65 20 74 68 61 74 20 69 73 20 67 72  ample that is gr
13890 65 61 74 65 72 20 74 68 61 6e 20 70 52 65 63 2e  eater than pRec.
138a0 20 4f 72 2c 20 69 66 20 69 3d 3d 70 49 64 78 2d   Or, if i==pIdx-
138b0 3e 6e 53 61 6d 70 6c 65 20 74 68 65 6e 20 70 52  >nSample then pR
138c0 65 63 0a 20 20 20 20 2a 2a 20 69 73 20 6c 61 72  ec.    ** is lar
138d0 67 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 6d  ger than all sam
138e0 70 6c 65 73 20 69 6e 20 74 68 65 20 61 72 72 61  ples in the arra
138f0 79 2e 20 2a 2f 0a 20 20 20 20 74 52 6f 77 63 6e  y. */.    tRowcn
13900 74 20 69 55 70 70 65 72 2c 20 69 47 61 70 3b 0a  t iUpper, iGap;.
13910 20 20 20 20 69 66 28 20 69 3e 3d 70 49 64 78 2d      if( i>=pIdx-
13920 3e 6e 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20  >nSample ){.    
13930 20 20 69 55 70 70 65 72 20 3d 20 73 71 6c 69 74    iUpper = sqlit
13940 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70 49  e3LogEstToInt(pI
13950 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b  dx->aiRowLogEst[
13960 30 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  0]);.    }else{.
13970 20 20 20 20 20 20 69 55 70 70 65 72 20 3d 20 61        iUpper = a
13980 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b 69  Sample[i].anLt[i
13990 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Col];.    }..   
139a0 20 69 66 28 20 69 4c 6f 77 65 72 3e 3d 69 55 70   if( iLower>=iUp
139b0 70 65 72 20 29 7b 0a 20 20 20 20 20 20 69 47 61  per ){.      iGa
139c0 70 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  p = 0;.    }else
139d0 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 69  {.      iGap = i
139e0 55 70 70 65 72 20 2d 20 69 4c 6f 77 65 72 3b 0a  Upper - iLower;.
139f0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 6f      }.    if( ro
13a00 75 6e 64 55 70 20 29 7b 0a 20 20 20 20 20 20 69  undUp ){.      i
13a10 47 61 70 20 3d 20 28 69 47 61 70 2a 32 29 2f 33  Gap = (iGap*2)/3
13a20 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
13a30 20 20 20 69 47 61 70 20 3d 20 69 47 61 70 2f 33     iGap = iGap/3
13a40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 53 74 61  ;.    }.    aSta
13a50 74 5b 30 5d 20 3d 20 69 4c 6f 77 65 72 20 2b 20  t[0] = iLower + 
13a60 69 47 61 70 3b 0a 20 20 20 20 61 53 74 61 74 5b  iGap;.    aStat[
13a70 31 5d 20 3d 20 70 49 64 78 2d 3e 61 41 76 67 45  1] = pIdx->aAvgE
13a80 71 5b 69 43 6f 6c 5d 3b 0a 20 20 7d 0a 0a 20 20  q[iCol];.  }..  
13a90 2f 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20 70  /* Restore the p
13aa0 52 65 63 2d 3e 6e 46 69 65 6c 64 20 76 61 6c 75  Rec->nField valu
13ab0 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
13ac0 6e 67 2e 20 20 2a 2f 0a 20 20 70 52 65 63 2d 3e  ng.  */.  pRec->
13ad0 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64 3b  nField = nField;
13ae0 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 23  .  return i;.}.#
13af0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
13b00 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
13b10 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  STAT4 */../*.** 
13b20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c  If it is not NUL
13b30 4c 2c 20 70 54 65 72 6d 20 69 73 20 61 20 74 65  L, pTerm is a te
13b40 72 6d 20 74 68 61 74 20 70 72 6f 76 69 64 65 73  rm that provides
13b50 20 61 6e 20 75 70 70 65 72 20 6f 72 20 6c 6f 77   an upper or low
13b60 65 72 0a 2a 2a 20 62 6f 75 6e 64 20 6f 6e 20 61  er.** bound on a
13b70 20 72 61 6e 67 65 20 73 63 61 6e 2e 20 57 69 74   range scan. Wit
13b80 68 6f 75 74 20 63 6f 6e 73 69 64 65 72 69 6e 67  hout considering
13b90 20 70 54 65 72 6d 2c 20 69 74 20 69 73 20 65 73   pTerm, it is es
13ba0 74 69 6d 61 74 65 64 20 0a 2a 2a 20 74 68 61 74  timated .** that
13bb0 20 74 68 65 20 73 63 61 6e 20 77 69 6c 6c 20 76   the scan will v
13bc0 69 73 69 74 20 6e 4e 65 77 20 72 6f 77 73 2e 20  isit nNew rows. 
13bd0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
13be0 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
13bf0 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64 20 74 6f  .** estimated to
13c00 20 62 65 20 76 69 73 69 74 65 64 20 61 66 74 65   be visited afte
13c10 72 20 74 61 6b 69 6e 67 20 70 54 65 72 6d 20 69  r taking pTerm i
13c20 6e 74 6f 20 61 63 63 6f 75 6e 74 2e 0a 2a 2a 0a  nto account..**.
13c30 2a 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 65  ** If the user e
13c40 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66  xplicitly specif
13c50 69 65 64 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64  ied a likelihood
13c60 28 29 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69  () value for thi
13c70 73 20 74 65 72 6d 2c 0a 2a 2a 20 74 68 65 6e 20  s term,.** then 
13c80 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
13c90 20 69 73 20 74 68 65 20 6c 69 6b 65 6c 69 68 6f   is the likeliho
13ca0 6f 64 20 6d 75 6c 74 69 70 6c 69 65 64 20 62 79  od multiplied by
13cb0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
13cc0 2a 20 69 6e 70 75 74 20 72 6f 77 73 2e 20 4f 74  * input rows. Ot
13cd0 68 65 72 77 69 73 65 2c 20 74 68 69 73 20 66 75  herwise, this fu
13ce0 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
13cf0 68 61 74 20 61 6e 20 22 49 53 20 4e 4f 54 20 4e  hat an "IS NOT N
13d00 55 4c 4c 22 20 74 65 72 6d 0a 2a 2a 20 68 61 73  ULL" term.** has
13d10 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6f 66   a likelihood of
13d20 20 30 2e 35 30 2c 20 61 6e 64 20 61 6e 79 20 6f   0.50, and any o
13d30 74 68 65 72 20 74 65 72 6d 20 61 20 6c 69 6b 65  ther term a like
13d40 6c 69 68 6f 6f 64 20 6f 66 20 30 2e 32 35 2e 0a  lihood of 0.25..
13d50 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45 73 74  */.static LogEst
13d60 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a 75 73   whereRangeAdjus
13d70 74 28 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65  t(WhereTerm *pTe
13d80 72 6d 2c 20 4c 6f 67 45 73 74 20 6e 4e 65 77 29  rm, LogEst nNew)
13d90 7b 0a 20 20 4c 6f 67 45 73 74 20 6e 52 65 74 20  {.  LogEst nRet 
13da0 3d 20 6e 4e 65 77 3b 0a 20 20 69 66 28 20 70 54  = nNew;.  if( pT
13db0 65 72 6d 20 29 7b 0a 20 20 20 20 69 66 28 20 70  erm ){.    if( p
13dc0 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c  Term->truthProb<
13dd0 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 74  =0 ){.      nRet
13de0 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74 68   += pTerm->truth
13df0 50 72 6f 62 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Prob;.    }else 
13e00 69 66 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c  if( (pTerm->wtFl
13e10 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
13e20 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 52  )==0 ){.      nR
13e30 65 74 20 2d 3d 20 32 30 3b 20 20 20 20 20 20 20  et -= 20;       
13e40 20 61 73 73 65 72 74 28 20 32 30 3d 3d 73 71 6c   assert( 20==sql
13e50 69 74 65 33 4c 6f 67 45 73 74 28 34 29 20 29 3b  ite3LogEst(4) );
13e60 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
13e70 75 72 6e 20 6e 52 65 74 3b 0a 7d 0a 0a 23 69 66  urn nRet;.}..#if
13e80 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
13e90 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
13ea0 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ./* .** This fun
13eb0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
13ec0 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20  to estimate the 
13ed0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 76  number of rows v
13ee0 69 73 69 74 65 64 20 62 79 20 61 0a 2a 2a 20 72  isited by a.** r
13ef0 61 6e 67 65 2d 73 63 61 6e 20 6f 6e 20 61 20 73  ange-scan on a s
13f00 6b 69 70 2d 73 63 61 6e 20 69 6e 64 65 78 2e 20  kip-scan index. 
13f10 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
13f20 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45  **   CREATE INDE
13f30 58 20 69 31 20 4f 4e 20 74 31 28 61 2c 20 62 2c  X i1 ON t1(a, b,
13f40 20 63 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54   c);.**   SELECT
13f50 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
13f60 20 61 3d 3f 20 41 4e 44 20 63 20 42 45 54 57 45   a=? AND c BETWE
13f70 45 4e 20 3f 20 41 4e 44 20 3f 3b 0a 2a 2a 0a 2a  EN ? AND ?;.**.*
13f80 2a 20 56 61 6c 75 65 20 70 4c 6f 6f 70 2d 3e 6e  * Value pLoop->n
13f90 4f 75 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79  Out is currently
13fa0 20 73 65 74 20 74 6f 20 74 68 65 20 65 73 74 69   set to the esti
13fb0 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20  mated number of 
13fc0 72 6f 77 73 20 0a 2a 2a 20 76 69 73 69 74 65 64  rows .** visited
13fd0 20 66 6f 72 20 73 63 61 6e 6e 69 6e 67 20 28 61   for scanning (a
13fe0 3d 3f 20 41 4e 44 20 62 3d 3f 29 2e 20 54 68 69  =? AND b=?). Thi
13ff0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 64 75 63  s function reduc
14000 65 73 20 74 68 61 74 20 65 73 74 69 6d 61 74 65  es that estimate
14010 20 0a 2a 2a 20 62 79 20 73 6f 6d 65 20 66 61 63   .** by some fac
14020 74 6f 72 20 74 6f 20 61 63 63 6f 75 6e 74 20 66  tor to account f
14030 6f 72 20 74 68 65 20 28 63 20 42 45 54 57 45 45  or the (c BETWEE
14040 4e 20 3f 20 41 4e 44 20 3f 29 20 65 78 70 72 65  N ? AND ?) expre
14050 73 73 69 6f 6e 20 62 61 73 65 64 0a 2a 2a 20 6f  ssion based.** o
14060 6e 20 74 68 65 20 73 74 61 74 34 20 64 61 74 61  n the stat4 data
14070 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 2e 20   for the index. 
14080 74 68 69 73 20 73 63 61 6e 20 77 69 6c 6c 20 62  this scan will b
14090 65 20 70 65 66 6f 72 6d 65 64 20 6d 75 6c 74 69  e peformed multi
140a0 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 20 28 6f  ple .** times (o
140b0 6e 63 65 20 66 6f 72 20 65 61 63 68 20 28 61 2c  nce for each (a,
140c0 62 29 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 74  b) combination t
140d0 68 61 74 20 6d 61 74 63 68 65 73 20 61 3d 3f 29  hat matches a=?)
140e0 20 69 73 20 64 65 61 6c 74 20 77 69 74 68 20 0a   is dealt with .
140f0 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ** by the caller
14100 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 64 6f 65 73 20  ..**.** It does 
14110 74 68 69 73 20 62 79 20 73 63 61 6e 6e 69 6e 67  this by scanning
14120 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 73 74 61   through all sta
14130 74 34 20 73 61 6d 70 6c 65 73 2c 20 63 6f 6d 70  t4 samples, comp
14140 61 72 69 6e 67 20 76 61 6c 75 65 73 0a 2a 2a 20  aring values.** 
14150 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70  extracted from p
14160 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65 72  Lower and pUpper
14170 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 73   with the corres
14180 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 69  ponding column i
14190 6e 20 65 61 63 68 0a 2a 2a 20 73 61 6d 70 6c 65  n each.** sample
141a0 2e 20 49 66 20 4c 20 61 6e 64 20 55 20 61 72 65  . If L and U are
141b0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
141c0 61 6d 70 6c 65 73 20 66 6f 75 6e 64 20 74 6f 20  amples found to 
141d0 62 65 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 0a  be less than or.
141e0 2a 2a 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  ** equal to the 
141f0 76 61 6c 75 65 73 20 65 78 74 72 61 63 74 65 64  values extracted
14200 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20 61 6e 64   from pLower and
14210 20 70 55 70 70 65 72 20 72 65 73 70 65 63 74 69   pUpper respecti
14220 76 65 6c 79 2c 20 61 6e 64 0a 2a 2a 20 4e 20 69  vely, and.** N i
14230 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
14240 65 72 20 6f 66 20 73 61 6d 70 6c 65 73 2c 20 74  er of samples, t
14250 68 65 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 76  he pLoop->nOut v
14260 61 6c 75 65 20 69 73 20 61 64 6a 75 73 74 65 64  alue is adjusted
14270 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  .** as follows:.
14280 2a 2a 0a 2a 2a 20 20 20 6e 4f 75 74 20 3d 20 6e  **.**   nOut = n
14290 4f 75 74 20 2a 20 28 20 6d 69 6e 28 55 20 2d 20  Out * ( min(U - 
142a0 4c 2c 20 31 29 20 2f 20 4e 20 29 0a 2a 2a 0a 2a  L, 1) / N ).**.*
142b0 2a 20 49 66 20 70 4c 6f 77 65 72 20 69 73 20 4e  * If pLower is N
142c0 55 4c 4c 2c 20 6f 72 20 61 20 76 61 6c 75 65 20  ULL, or a value 
142d0 63 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61 63  cannot be extrac
142e0 74 65 64 20 66 72 6f 6d 20 74 68 65 20 74 65 72  ted from the ter
142f0 6d 2c 20 4c 20 69 73 0a 2a 2a 20 73 65 74 20 74  m, L is.** set t
14300 6f 20 7a 65 72 6f 2e 20 49 66 20 70 55 70 70 65  o zero. If pUppe
14310 72 20 69 73 20 4e 55 4c 4c 2c 20 6f 72 20 61 20  r is NULL, or a 
14320 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65 20  value cannot be 
14330 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69  extracted from i
14340 74 2c 0a 2a 2a 20 55 20 69 73 20 73 65 74 20 74  t,.** U is set t
14350 6f 20 4e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61  o N..**.** Norma
14360 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69  lly, this functi
14370 6f 6e 20 73 65 74 73 20 2a 70 62 44 6f 6e 65 20  on sets *pbDone 
14380 74 6f 20 31 20 62 65 66 6f 72 65 20 72 65 74 75  to 1 before retu
14390 72 6e 69 6e 67 2e 20 48 6f 77 65 76 65 72 2c 0a  rning. However,.
143a0 2a 2a 20 69 66 20 6e 6f 20 76 61 6c 75 65 20 63  ** if no value c
143b0 61 6e 20 62 65 20 65 78 74 72 61 63 74 65 64 20  an be extracted 
143c0 66 72 6f 6d 20 65 69 74 68 65 72 20 70 4c 6f 77  from either pLow
143d0 65 72 20 6f 72 20 70 55 70 70 65 72 20 28 61 6e  er or pUpper (an
143e0 64 20 73 6f 20 74 68 65 0a 2a 2a 20 65 73 74 69  d so the.** esti
143f0 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62  mate of the numb
14400 65 72 20 6f 66 20 72 6f 77 73 20 64 65 6c 69 76  er of rows deliv
14410 65 72 65 64 20 72 65 6d 61 69 6e 73 20 75 6e 63  ered remains unc
14420 68 61 6e 67 65 64 29 2c 20 2a 70 62 44 6f 6e 65  hanged), *pbDone
14430 0a 2a 2a 20 69 73 20 6c 65 66 74 20 61 73 20 69  .** is left as i
14440 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  s..**.** If an e
14450 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
14460 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
14470 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  e is returned. O
14480 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 53 51  therwise, .** SQ
14490 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
144a0 69 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e 67  ic int whereRang
144b0 65 53 6b 69 70 53 63 61 6e 45 73 74 28 0a 20 20  eSkipScanEst(.  
144c0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
144d0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
144e0 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  & code generatin
144f0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
14500 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65 72  hereTerm *pLower
14510 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f 75  ,   /* Lower bou
14520 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e  nd on the range.
14530 20 65 78 3a 20 22 78 3e 31 32 33 22 20 4d 69 67   ex: "x>123" Mig
14540 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ht be NULL */.  
14550 57 68 65 72 65 54 65 72 6d 20 2a 70 55 70 70 65  WhereTerm *pUppe
14560 72 2c 20 20 20 2f 2a 20 55 70 70 65 72 20 62 6f  r,   /* Upper bo
14570 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65  und on the range
14580 2e 20 65 78 3a 20 22 78 3c 34 35 35 22 20 4d 69  . ex: "x<455" Mi
14590 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
145a0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
145b0 70 2c 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  p,    /* Update 
145c0 74 68 65 20 2e 6e 4f 75 74 20 76 61 6c 75 65 20  the .nOut value 
145d0 6f 66 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a  of this loop */.
145e0 20 20 69 6e 74 20 2a 70 62 44 6f 6e 65 20 20 20    int *pbDone   
145f0 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f         /* Set to
14600 20 74 72 75 65 20 69 66 20 61 74 20 6c 65 61 73   true if at leas
14610 74 20 6f 6e 65 20 65 78 70 72 2e 20 76 61 6c 75  t one expr. valu
14620 65 20 65 78 74 72 61 63 74 65 64 20 2a 2f 0a 29  e extracted */.)
14630 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70  {.  Index *p = p
14640 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
14650 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20  ndex;.  int nEq 
14660 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
14670 2e 6e 45 71 3b 0a 20 20 73 71 6c 69 74 65 33 20  .nEq;.  sqlite3 
14680 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
14690 3b 0a 20 20 69 6e 74 20 6e 4c 6f 77 65 72 20 3d  ;.  int nLower =
146a0 20 2d 31 3b 0a 20 20 69 6e 74 20 6e 55 70 70 65   -1;.  int nUppe
146b0 72 20 3d 20 70 2d 3e 6e 53 61 6d 70 6c 65 2b 31  r = p->nSample+1
146c0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
146d0 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 43  ITE_OK;.  int iC
146e0 6f 6c 20 3d 20 70 2d 3e 61 69 43 6f 6c 75 6d 6e  ol = p->aiColumn
146f0 5b 6e 45 71 5d 3b 0a 20 20 75 38 20 61 66 66 20  [nEq];.  u8 aff 
14700 3d 20 69 43 6f 6c 3e 3d 30 20 3f 20 70 2d 3e 70  = iCol>=0 ? p->p
14710 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  Table->aCol[iCol
14720 5d 2e 61 66 66 69 6e 69 74 79 20 3a 20 53 51 4c  ].affinity : SQL
14730 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b  ITE_AFF_INTEGER;
14740 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
14750 6c 3b 0a 20 20 0a 20 20 73 71 6c 69 74 65 33 5f  l;.  .  sqlite3_
14760 76 61 6c 75 65 20 2a 70 31 20 3d 20 30 3b 20 20  value *p1 = 0;  
14770 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
14780 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
14790 70 4c 6f 77 65 72 20 2a 2f 0a 20 20 73 71 6c 69  pLower */.  sqli
147a0 74 65 33 5f 76 61 6c 75 65 20 2a 70 32 20 3d 20  te3_value *p2 = 
147b0 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56  0;          /* V
147c0 61 6c 75 65 20 65 78 74 72 61 63 74 65 64 20 66  alue extracted f
147d0 72 6f 6d 20 70 55 70 70 65 72 20 2a 2f 0a 20 20  rom pUpper */.  
147e0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
147f0 56 61 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Val = 0;        
14800 2f 2a 20 56 61 6c 75 65 20 65 78 74 72 61 63 74  /* Value extract
14810 65 64 20 66 72 6f 6d 20 72 65 63 6f 72 64 20 2a  ed from record *
14820 2f 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  /..  pColl = sql
14830 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
14840 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 61 7a 43  q(pParse, p->azC
14850 6f 6c 6c 5b 6e 45 71 5d 29 3b 0a 20 20 69 66 28  oll[nEq]);.  if(
14860 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 72   pLower ){.    r
14870 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34  c = sqlite3Stat4
14880 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50  ValueFromExpr(pP
14890 61 72 73 65 2c 20 70 4c 6f 77 65 72 2d 3e 70 45  arse, pLower->pE
148a0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 61 66 66  xpr->pRight, aff
148b0 2c 20 26 70 31 29 3b 0a 20 20 20 20 6e 4c 6f 77  , &p1);.    nLow
148c0 65 72 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  er = 0;.  }.  if
148d0 28 20 70 55 70 70 65 72 20 26 26 20 72 63 3d 3d  ( pUpper && rc==
148e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
148f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61   rc = sqlite3Sta
14900 74 34 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28  t4ValueFromExpr(
14910 70 50 61 72 73 65 2c 20 70 55 70 70 65 72 2d 3e  pParse, pUpper->
14920 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 61  pExpr->pRight, a
14930 66 66 2c 20 26 70 32 29 3b 0a 20 20 20 20 6e 55  ff, &p2);.    nU
14940 70 70 65 72 20 3d 20 70 32 20 3f 20 30 20 3a 20  pper = p2 ? 0 : 
14950 70 2d 3e 6e 53 61 6d 70 6c 65 3b 0a 20 20 7d 0a  p->nSample;.  }.
14960 0a 20 20 69 66 28 20 70 31 20 7c 7c 20 70 32 20  .  if( p1 || p2 
14970 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
14980 20 20 69 6e 74 20 6e 44 69 66 66 3b 0a 20 20 20    int nDiff;.   
14990 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
149a0 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 2d 3e  LITE_OK && i<p->
149b0 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a 20  nSample; i++){. 
149c0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
149d0 33 53 74 61 74 34 43 6f 6c 75 6d 6e 28 64 62 2c  3Stat4Column(db,
149e0 20 70 2d 3e 61 53 61 6d 70 6c 65 5b 69 5d 2e 70   p->aSample[i].p
149f0 2c 20 70 2d 3e 61 53 61 6d 70 6c 65 5b 69 5d 2e  , p->aSample[i].
14a00 6e 2c 20 6e 45 71 2c 20 26 70 56 61 6c 29 3b 0a  n, nEq, &pVal);.
14a10 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
14a20 4c 49 54 45 5f 4f 4b 20 26 26 20 70 31 20 29 7b  LITE_OK && p1 ){
14a30 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 73  .        int res
14a40 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d   = sqlite3MemCom
14a50 70 61 72 65 28 70 31 2c 20 70 56 61 6c 2c 20 70  pare(p1, pVal, p
14a60 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 69  Coll);.        i
14a70 66 28 20 72 65 73 3e 3d 30 20 29 20 6e 4c 6f 77  f( res>=0 ) nLow
14a80 65 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  er++;.      }.  
14a90 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
14aa0 54 45 5f 4f 4b 20 26 26 20 70 32 20 29 7b 0a 20  TE_OK && p2 ){. 
14ab0 20 20 20 20 20 20 20 69 6e 74 20 72 65 73 20 3d         int res =
14ac0 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61   sqlite3MemCompa
14ad0 72 65 28 70 32 2c 20 70 56 61 6c 2c 20 70 43 6f  re(p2, pVal, pCo
14ae0 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ll);.        if(
14af0 20 72 65 73 3e 3d 30 20 29 20 6e 55 70 70 65 72   res>=0 ) nUpper
14b00 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
14b10 7d 0a 20 20 20 20 6e 44 69 66 66 20 3d 20 28 6e  }.    nDiff = (n
14b20 55 70 70 65 72 20 2d 20 6e 4c 6f 77 65 72 29 3b  Upper - nLower);
14b30 0a 20 20 20 20 69 66 28 20 6e 44 69 66 66 3c 3d  .    if( nDiff<=
14b40 30 20 29 20 6e 44 69 66 66 20 3d 20 31 3b 0a 0a  0 ) nDiff = 1;..
14b50 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
14b60 69 73 20 62 6f 74 68 20 61 6e 20 75 70 70 65 72  is both an upper
14b70 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f 75 6e 64   and lower bound
14b80 20 73 70 65 63 69 66 69 65 64 2c 20 61 6e 64 20   specified, and 
14b90 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 6f 6d 70  the .    ** comp
14ba0 61 72 69 73 6f 6e 73 20 69 6e 64 69 63 61 74 65  arisons indicate
14bb0 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20 63   that they are c
14bc0 6c 6f 73 65 20 74 6f 67 65 74 68 65 72 2c 20 75  lose together, u
14bd0 73 65 20 74 68 65 20 66 61 6c 6c 62 61 63 6b 0a  se the fallback.
14be0 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64 20 28 61      ** method (a
14bf0 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 73  ssume that the s
14c00 63 61 6e 20 76 69 73 69 74 73 20 31 2f 36 34 20  can visits 1/64 
14c10 6f 66 20 74 68 65 20 72 6f 77 73 29 20 66 6f 72  of the rows) for
14c20 20 65 73 74 69 6d 61 74 69 6e 67 0a 20 20 20 20   estimating.    
14c30 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
14c40 20 72 6f 77 73 20 76 69 73 69 74 65 64 2e 20 4f   rows visited. O
14c50 74 68 65 72 77 69 73 65 2c 20 65 73 74 69 6d 61  therwise, estima
14c60 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
14c70 20 72 6f 77 73 0a 20 20 20 20 2a 2a 20 75 73 69   rows.    ** usi
14c80 6e 67 20 74 68 65 20 6d 65 74 68 6f 64 20 64 65  ng the method de
14c90 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 20 68  scribed in the h
14ca0 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 66 6f  eader comment fo
14cb0 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  r this function.
14cc0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 44 69 66   */.    if( nDif
14cd0 66 21 3d 31 20 7c 7c 20 70 55 70 70 65 72 3d 3d  f!=1 || pUpper==
14ce0 30 20 7c 7c 20 70 4c 6f 77 65 72 3d 3d 30 20 29  0 || pLower==0 )
14cf0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 41 64 6a  {.      int nAdj
14d00 75 73 74 20 3d 20 28 73 71 6c 69 74 65 33 4c 6f  ust = (sqlite3Lo
14d10 67 45 73 74 28 70 2d 3e 6e 53 61 6d 70 6c 65 29  gEst(p->nSample)
14d20 20 2d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   - sqlite3LogEst
14d30 28 6e 44 69 66 66 29 29 3b 0a 20 20 20 20 20 20  (nDiff));.      
14d40 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2d 3d 20 6e  pLoop->nOut -= n
14d50 41 64 6a 75 73 74 3b 0a 20 20 20 20 20 20 2a 70  Adjust;.      *p
14d60 62 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20  bDone = 1;.     
14d70 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31 30   WHERETRACE(0x10
14d80 2c 20 28 22 72 61 6e 67 65 20 73 6b 69 70 2d 73  , ("range skip-s
14d90 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25 75 2e  can regions: %u.
14da0 2e 25 75 20 20 61 64 6a 75 73 74 3d 25 64 20 65  .%u  adjust=%d e
14db0 73 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  st=%d\n",.      
14dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14dd0 20 20 20 20 20 6e 4c 6f 77 65 72 2c 20 6e 55 70       nLower, nUp
14de0 70 65 72 2c 20 6e 41 64 6a 75 73 74 2a 2d 31 2c  per, nAdjust*-1,
14df0 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 29 29 3b 0a   pLoop->nOut));.
14e00 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a      }..  }else{.
14e10 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 62 44      assert( *pbD
14e20 6f 6e 65 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20  one==0 );.  }.. 
14e30 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
14e40 65 28 70 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  e(p1);.  sqlite3
14e50 56 61 6c 75 65 46 72 65 65 28 70 32 29 3b 0a 20  ValueFree(p2);. 
14e60 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
14e70 65 28 70 56 61 6c 29 3b 0a 0a 20 20 72 65 74 75  e(pVal);..  retu
14e80 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
14e90 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
14ea0 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20  _STAT3_OR_STAT4 
14eb0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  */../*.** This f
14ec0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
14ed0 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20  to estimate the 
14ee0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
14ef0 68 61 74 20 77 69 6c 6c 20 62 65 20 76 69 73 69  hat will be visi
14f00 74 65 64 0a 2a 2a 20 62 79 20 73 63 61 6e 6e 69  ted.** by scanni
14f10 6e 67 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 20  ng an index for 
14f20 61 20 72 61 6e 67 65 20 6f 66 20 76 61 6c 75 65  a range of value
14f30 73 2e 20 54 68 65 20 72 61 6e 67 65 20 6d 61 79  s. The range may
14f40 20 68 61 76 65 20 61 6e 20 75 70 70 65 72 0a 2a   have an upper.*
14f50 2a 20 62 6f 75 6e 64 2c 20 61 20 6c 6f 77 65 72  * bound, a lower
14f60 20 62 6f 75 6e 64 2c 20 6f 72 20 62 6f 74 68 2e   bound, or both.
14f70 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
14f80 65 20 74 65 72 6d 73 20 74 68 61 74 20 73 65 74  e terms that set
14f90 20 74 68 65 20 75 70 70 65 72 0a 2a 2a 20 61 6e   the upper.** an
14fa0 64 20 6c 6f 77 65 72 20 62 6f 75 6e 64 73 20 61  d lower bounds a
14fb0 72 65 20 72 65 70 72 65 73 65 6e 74 65 64 20 62  re represented b
14fc0 79 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70  y pLower and pUp
14fd0 70 65 72 20 72 65 73 70 65 63 74 69 76 65 6c 79  per respectively
14fe0 2e 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65  . For.** example
14ff0 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20  , assuming that 
15000 69 6e 64 65 78 20 70 20 69 73 20 6f 6e 20 74 31  index p is on t1
15010 28 61 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e  (a):.**.**   ...
15020 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
15030 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e   > ? AND a < ? .
15040 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ...**           
15050 20 20 20 20 20 20 20 20 20 7c 5f 5f 5f 5f 5f 7c           |_____|
15060 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a 20 20 20     |_____|.**   
15070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15080 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c 0a      |         |.
15090 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
150a0 20 20 20 20 20 20 20 70 4c 6f 77 65 72 20 20 20         pLower   
150b0 20 70 55 70 70 65 72 0a 2a 2a 0a 2a 2a 20 49 66   pUpper.**.** If
150c0 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 75   either of the u
150d0 70 70 65 72 20 6f 72 20 6c 6f 77 65 72 20 62 6f  pper or lower bo
150e0 75 6e 64 20 69 73 20 6e 6f 74 20 70 72 65 73 65  und is not prese
150f0 6e 74 2c 20 74 68 65 6e 20 4e 55 4c 4c 20 69 73  nt, then NULL is
15100 20 70 61 73 73 65 64 20 69 6e 0a 2a 2a 20 70 6c   passed in.** pl
15110 61 63 65 20 6f 66 20 74 68 65 20 63 6f 72 72 65  ace of the corre
15120 73 70 6f 6e 64 69 6e 67 20 57 68 65 72 65 54 65  sponding WhereTe
15130 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61  rm..**.** The va
15140 6c 75 65 20 69 6e 20 28 70 42 75 69 6c 64 65 72  lue in (pBuilder
15150 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ->pNew->u.btree.
15160 6e 45 71 29 20 69 73 20 74 68 65 20 6e 75 6d 62  nEq) is the numb
15170 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 0a  er of the index.
15180 2a 2a 20 63 6f 6c 75 6d 6e 20 73 75 62 6a 65 63  ** column subjec
15190 74 20 74 6f 20 74 68 65 20 72 61 6e 67 65 20 63  t to the range c
151a0 6f 6e 73 74 72 61 69 6e 74 2e 20 4f 72 2c 20 65  onstraint. Or, e
151b0 71 75 69 76 61 6c 65 6e 74 6c 79 2c 20 74 68 65  quivalently, the
151c0 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 65 71   number of.** eq
151d0 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
151e0 74 73 20 6f 70 74 69 6d 69 7a 65 64 20 62 79 20  ts optimized by 
151f0 74 68 65 20 70 72 6f 70 6f 73 65 64 20 69 6e 64  the proposed ind
15200 65 78 20 73 63 61 6e 2e 20 46 6f 72 20 65 78 61  ex scan. For exa
15210 6d 70 6c 65 2c 0a 2a 2a 20 61 73 73 75 6d 69 6e  mple,.** assumin
15220 67 20 69 6e 64 65 78 20 70 20 69 73 20 6f 6e 20  g index p is on 
15230 74 31 28 61 2c 20 62 29 2c 20 61 6e 64 20 74 68  t1(a, b), and th
15240 65 20 53 51 4c 20 71 75 65 72 79 20 69 73 3a 0a  e SQL query is:.
15250 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d  **.**   ... FROM
15260 20 74 31 20 57 48 45 52 45 20 61 20 3d 20 3f 20   t1 WHERE a = ? 
15270 41 4e 44 20 62 20 3e 20 3f 20 41 4e 44 20 62 20  AND b > ? AND b 
15280 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68  < ? ....**.** th
15290 65 6e 20 6e 45 71 20 69 73 20 73 65 74 20 74 6f  en nEq is set to
152a0 20 31 20 28 61 73 20 74 68 65 20 72 61 6e 67 65   1 (as the range
152b0 20 72 65 73 74 72 69 63 74 65 64 20 63 6f 6c 75   restricted colu
152c0 6d 6e 2c 20 62 2c 20 69 73 20 74 68 65 20 73 65  mn, b, is the se
152d0 63 6f 6e 64 20 0a 2a 2a 20 6c 65 66 74 2d 6d 6f  cond .** left-mo
152e0 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  st column of the
152f0 20 69 6e 64 65 78 29 2e 20 4f 72 2c 20 69 66 20   index). Or, if 
15300 74 68 65 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a  the query is:.**
15310 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74  .**   ... FROM t
15320 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e  1 WHERE a > ? AN
15330 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a  D a < ? ....**.*
15340 2a 20 74 68 65 6e 20 6e 45 71 20 69 73 20 73 65  * then nEq is se
15350 74 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 57 68  t to 0..**.** Wh
15360 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
15370 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70 6e 4f   is called, *pnO
15380 75 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ut is set to the
15390 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 29   sqlite3LogEst()
153a0 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65   of the.** numbe
153b0 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 74  r of rows that t
153c0 68 65 20 69 6e 64 65 78 20 73 63 61 6e 20 69 73  he index scan is
153d0 20 65 78 70 65 63 74 65 64 20 74 6f 20 76 69 73   expected to vis
153e0 69 74 20 77 69 74 68 6f 75 74 20 0a 2a 2a 20 63  it without .** c
153f0 6f 6e 73 69 64 65 72 69 6e 67 20 74 68 65 20 72  onsidering the r
15400 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ange constraints
15410 2e 20 49 66 20 6e 45 71 20 69 73 20 30 2c 20 74  . If nEq is 0, t
15420 68 65 6e 20 2a 70 6e 4f 75 74 20 69 73 20 74 68  hen *pnOut is th
15430 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a 20  e number of .** 
15440 72 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 64 65  rows in the inde
15450 78 2e 20 41 73 73 75 6d 69 6e 67 20 6e 6f 20 65  x. Assuming no e
15460 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 6e  rror occurs, *pn
15470 4f 75 74 20 69 73 20 61 64 6a 75 73 74 65 64 20  Out is adjusted 
15480 28 72 65 64 75 63 65 64 29 0a 2a 2a 20 74 6f 20  (reduced).** to 
15490 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20  account for the 
154a0 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
154b0 73 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70  s pLower and pUp
154c0 70 65 72 2e 0a 2a 2a 20 0a 2a 2a 20 49 6e 20 74  per..** .** In t
154d0 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20 73 71  he absence of sq
154e0 6c 69 74 65 5f 73 74 61 74 34 20 41 4e 41 4c 59  lite_stat4 ANALY
154f0 5a 45 20 64 61 74 61 2c 20 6f 72 20 69 66 20 73  ZE data, or if s
15500 75 63 68 20 64 61 74 61 20 63 61 6e 6e 6f 74 20  uch data cannot 
15510 62 65 0a 2a 2a 20 75 73 65 64 2c 20 61 20 73 69  be.** used, a si
15520 6e 67 6c 65 20 72 61 6e 67 65 20 69 6e 65 71 75  ngle range inequ
15530 61 6c 69 74 79 20 72 65 64 75 63 65 73 20 74 68  ality reduces th
15540 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20 62  e search space b
15550 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20 34 2e  y a factor of 4.
15560 20 0a 2a 2a 20 61 6e 64 20 61 20 70 61 69 72 20   .** and a pair 
15570 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 28  of constraints (
15580 78 3e 3f 20 41 4e 44 20 78 3c 3f 29 20 72 65 64  x>? AND x<?) red
15590 75 63 65 73 20 74 68 65 20 65 78 70 65 63 74 65  uces the expecte
155a0 64 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 72  d number of.** r
155b0 6f 77 73 20 76 69 73 69 74 65 64 20 62 79 20 61  ows visited by a
155c0 20 66 61 63 74 6f 72 20 6f 66 20 36 34 2e 0a 2a   factor of 64..*
155d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
155e0 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28 0a  reRangeScanEst(.
155f0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
15600 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
15610 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74  g & code generat
15620 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
15630 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
15640 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 57  r *pBuilder,.  W
15650 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65 72  hereTerm *pLower
15660 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f 75  ,   /* Lower bou
15670 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e  nd on the range.
15680 20 65 78 3a 20 22 78 3e 31 32 33 22 20 4d 69 67   ex: "x>123" Mig
15690 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ht be NULL */.  
156a0 57 68 65 72 65 54 65 72 6d 20 2a 70 55 70 70 65  WhereTerm *pUppe
156b0 72 2c 20 20 20 2f 2a 20 55 70 70 65 72 20 62 6f  r,   /* Upper bo
156c0 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65  und on the range
156d0 2e 20 65 78 3a 20 22 78 3c 34 35 35 22 20 4d 69  . ex: "x<455" Mi
156e0 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
156f0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
15700 70 20 20 20 20 20 2f 2a 20 4d 6f 64 69 66 79 20  p     /* Modify 
15710 74 68 65 20 2e 6e 4f 75 74 20 61 6e 64 20 6d 61  the .nOut and ma
15720 79 62 65 20 2e 72 52 75 6e 20 66 69 65 6c 64 73  ybe .rRun fields
15730 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
15740 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
15750 6e 74 20 6e 4f 75 74 20 3d 20 70 4c 6f 6f 70 2d  nt nOut = pLoop-
15760 3e 6e 4f 75 74 3b 0a 20 20 4c 6f 67 45 73 74 20  >nOut;.  LogEst 
15770 6e 4e 65 77 3b 0a 0a 23 69 66 64 65 66 20 53 51  nNew;..#ifdef SQ
15780 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
15790 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 49 6e 64  3_OR_STAT4.  Ind
157a0 65 78 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75  ex *p = pLoop->u
157b0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
157c0 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70   int nEq = pLoop
157d0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 0a  ->u.btree.nEq;..
157e0 20 20 69 66 28 20 70 2d 3e 6e 53 61 6d 70 6c 65    if( p->nSample
157f0 3e 30 20 26 26 20 6e 45 71 3c 70 2d 3e 6e 53 61  >0 && nEq<p->nSa
15800 6d 70 6c 65 43 6f 6c 20 29 7b 0a 20 20 20 20 69  mpleCol ){.    i
15810 66 28 20 6e 45 71 3d 3d 70 42 75 69 6c 64 65 72  f( nEq==pBuilder
15820 2d 3e 6e 52 65 63 56 61 6c 69 64 20 29 7b 0a 20  ->nRecValid ){. 
15830 20 20 20 20 20 55 6e 70 61 63 6b 65 64 52 65 63       UnpackedRec
15840 6f 72 64 20 2a 70 52 65 63 20 3d 20 70 42 75 69  ord *pRec = pBui
15850 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20 20 20  lder->pRec;.    
15860 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 0a    tRowcnt a[2];.
15870 20 20 20 20 20 20 75 38 20 61 66 66 3b 0a 0a 20        u8 aff;.. 
15880 20 20 20 20 20 2f 2a 20 56 61 72 69 61 62 6c 65       /* Variable
15890 20 69 4c 6f 77 65 72 20 77 69 6c 6c 20 62 65 20   iLower will be 
158a0 73 65 74 20 74 6f 20 74 68 65 20 65 73 74 69 6d  set to the estim
158b0 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ate of the numbe
158c0 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 0a 20 20  r of rows in .  
158d0 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78      ** the index
158e0 20 74 68 61 74 20 61 72 65 20 6c 65 73 73 20 74   that are less t
158f0 68 61 6e 20 74 68 65 20 6c 6f 77 65 72 20 62 6f  han the lower bo
15900 75 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65  und of the range
15910 20 71 75 65 72 79 2e 20 54 68 65 0a 20 20 20 20   query. The.    
15920 20 20 2a 2a 20 6c 6f 77 65 72 20 62 6f 75 6e 64    ** lower bound
15930 20 62 65 69 6e 67 20 74 68 65 20 63 6f 6e 63 61   being the conca
15940 74 65 6e 61 74 69 6f 6e 20 6f 66 20 24 50 20 61  tenation of $P a
15950 6e 64 20 24 4c 2c 20 77 68 65 72 65 20 24 50 20  nd $L, where $P 
15960 69 73 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  is the.      ** 
15970 6b 65 79 2d 70 72 65 66 69 78 20 66 6f 72 6d 65  key-prefix forme
15980 64 20 62 79 20 74 68 65 20 6e 45 71 20 76 61 6c  d by the nEq val
15990 75 65 73 20 6d 61 74 63 68 65 64 20 61 67 61 69  ues matched agai
159a0 6e 73 74 20 74 68 65 20 6e 45 71 20 6c 65 66 74  nst the nEq left
159b0 2d 6d 6f 73 74 0a 20 20 20 20 20 20 2a 2a 20 63  -most.      ** c
159c0 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e  olumns of the in
159d0 64 65 78 2c 20 61 6e 64 20 24 4c 20 69 73 20 74  dex, and $L is t
159e0 68 65 20 76 61 6c 75 65 20 69 6e 20 70 4c 6f 77  he value in pLow
159f0 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  er..      **.   
15a00 20 20 20 2a 2a 20 4f 72 2c 20 69 66 20 70 4c 6f     ** Or, if pLo
15a10 77 65 72 20 69 73 20 4e 55 4c 4c 20 6f 72 20 24  wer is NULL or $
15a20 4c 20 63 61 6e 6e 6f 74 20 62 65 20 65 78 74 72  L cannot be extr
15a30 61 63 74 65 64 20 66 72 6f 6d 20 69 74 20 28 62  acted from it (b
15a40 65 63 61 75 73 65 20 69 74 0a 20 20 20 20 20 20  ecause it.      
15a50 2a 2a 20 69 73 20 6e 6f 74 20 61 20 73 69 6d 70  ** is not a simp
15a60 6c 65 20 76 61 72 69 61 62 6c 65 20 6f 72 20 6c  le variable or l
15a70 69 74 65 72 61 6c 20 76 61 6c 75 65 29 2c 20 74  iteral value), t
15a80 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6f  he lower bound o
15a90 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 72  f the.      ** r
15aa0 61 6e 67 65 20 69 73 20 24 50 2e 20 44 75 65 20  ange is $P. Due 
15ab0 74 6f 20 61 20 71 75 69 72 6b 20 69 6e 20 74 68  to a quirk in th
15ac0 65 20 77 61 79 20 77 68 65 72 65 4b 65 79 53 74  e way whereKeySt
15ad0 61 74 73 28 29 20 77 6f 72 6b 73 2c 20 65 76 65  ats() works, eve
15ae0 6e 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 24 4c  n.      ** if $L
15af0 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 77   is available, w
15b00 68 65 72 65 4b 65 79 53 74 61 74 73 28 29 20 69  hereKeyStats() i
15b10 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 62 6f 74  s called for bot
15b20 68 20 28 24 50 29 20 61 6e 64 20 0a 20 20 20 20  h ($P) and .    
15b30 20 20 2a 2a 20 28 24 50 3a 24 4c 29 20 61 6e 64    ** ($P:$L) and
15b40 20 74 68 65 20 6c 61 72 67 65 72 20 6f 66 20 74   the larger of t
15b50 68 65 20 74 77 6f 20 72 65 74 75 72 6e 65 64 20  he two returned 
15b60 76 61 6c 75 65 73 20 69 73 20 75 73 65 64 2e 0a  values is used..
15b70 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
15b80 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20 69 55 70  * Similarly, iUp
15b90 70 65 72 20 69 73 20 74 6f 20 62 65 20 73 65 74  per is to be set
15ba0 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65   to the estimate
15bb0 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
15bc0 66 20 72 6f 77 73 0a 20 20 20 20 20 20 2a 2a 20  f rows.      ** 
15bd0 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 75 70  less than the up
15be0 70 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65  per bound of the
15bf0 20 72 61 6e 67 65 20 71 75 65 72 79 2e 20 57 68   range query. Wh
15c00 65 72 65 20 74 68 65 20 75 70 70 65 72 20 62 6f  ere the upper bo
15c10 75 6e 64 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  und.      ** is 
15c20 65 69 74 68 65 72 20 28 24 50 29 20 6f 72 20 28  either ($P) or (
15c30 24 50 3a 24 55 29 2e 20 41 67 61 69 6e 2c 20 65  $P:$U). Again, e
15c40 76 65 6e 20 69 66 20 24 55 20 69 73 20 61 76 61  ven if $U is ava
15c50 69 6c 61 62 6c 65 2c 20 62 6f 74 68 20 76 61 6c  ilable, both val
15c60 75 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ues.      ** of 
15c70 69 55 70 70 65 72 20 61 72 65 20 72 65 71 75 65  iUpper are reque
15c80 73 74 65 64 20 6f 66 20 77 68 65 72 65 4b 65 79  sted of whereKey
15c90 53 74 61 74 73 28 29 20 61 6e 64 20 74 68 65 20  Stats() and the 
15ca0 73 6d 61 6c 6c 65 72 20 75 73 65 64 2e 0a 20 20  smaller used..  
15cb0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
15cc0 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  The number of ro
15cd0 77 73 20 62 65 74 77 65 65 6e 20 74 68 65 20 74  ws between the t
15ce0 77 6f 20 62 6f 75 6e 64 73 20 69 73 20 74 68 65  wo bounds is the
15cf0 6e 20 6a 75 73 74 20 69 55 70 70 65 72 2d 69 4c  n just iUpper-iL
15d00 6f 77 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ower..      */. 
15d10 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f       tRowcnt iLo
15d20 77 65 72 3b 20 20 20 20 20 2f 2a 20 52 6f 77 73  wer;     /* Rows
15d30 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6c   less than the l
15d40 6f 77 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 20 20  ower bound */.  
15d50 20 20 20 20 74 52 6f 77 63 6e 74 20 69 55 70 70      tRowcnt iUpp
15d60 65 72 3b 20 20 20 20 20 2f 2a 20 52 6f 77 73 20  er;     /* Rows 
15d70 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 75 70  less than the up
15d80 70 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20  per bound */.   
15d90 20 20 20 69 6e 74 20 69 4c 77 72 49 64 78 20 3d     int iLwrIdx =
15da0 20 2d 32 3b 20 20 20 2f 2a 20 61 53 61 6d 70 6c   -2;   /* aSampl
15db0 65 5b 5d 20 66 6f 72 20 74 68 65 20 6c 6f 77 65  e[] for the lowe
15dc0 72 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20  r bound */.     
15dd0 20 69 6e 74 20 69 55 70 72 49 64 78 20 3d 20 2d   int iUprIdx = -
15de0 31 3b 20 20 20 2f 2a 20 61 53 61 6d 70 6c 65 5b  1;   /* aSample[
15df0 5d 20 66 6f 72 20 74 68 65 20 75 70 70 65 72 20  ] for the upper 
15e00 62 6f 75 6e 64 20 2a 2f 0a 0a 20 20 20 20 20 20  bound */..      
15e10 69 66 28 20 70 52 65 63 20 29 7b 0a 20 20 20 20  if( pRec ){.    
15e20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52      testcase( pR
15e30 65 63 2d 3e 6e 46 69 65 6c 64 21 3d 70 42 75 69  ec->nField!=pBui
15e40 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20  lder->nRecValid 
15e50 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65 63 2d  );.        pRec-
15e60 3e 6e 46 69 65 6c 64 20 3d 20 70 42 75 69 6c 64  >nField = pBuild
15e70 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 20  er->nRecValid;. 
15e80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
15e90 20 6e 45 71 3d 3d 70 2d 3e 6e 4b 65 79 43 6f 6c   nEq==p->nKeyCol
15ea0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 66 66 20   ){.        aff 
15eb0 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  = SQLITE_AFF_INT
15ec0 45 47 45 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73  EGER;.      }els
15ed0 65 7b 0a 20 20 20 20 20 20 20 20 61 66 66 20 3d  e{.        aff =
15ee0 20 70 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c   p->pTable->aCol
15ef0 5b 70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71  [p->aiColumn[nEq
15f00 5d 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20  ]].affinity;.   
15f10 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 44 65     }.      /* De
15f20 74 65 72 6d 69 6e 65 20 69 4c 6f 77 65 72 20 61  termine iLower a
15f30 6e 64 20 69 55 70 70 65 72 20 75 73 69 6e 67 20  nd iUpper using 
15f40 28 24 50 29 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20  ($P) only. */.  
15f50 20 20 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 29      if( nEq==0 )
15f60 7b 0a 20 20 20 20 20 20 20 20 69 4c 6f 77 65 72  {.        iLower
15f70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 55   = 0;.        iU
15f80 70 70 65 72 20 3d 20 70 2d 3e 6e 52 6f 77 45 73  pper = p->nRowEs
15f90 74 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t0;.      }else{
15fa0 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 65  .        /* Note
15fb0 3a 20 74 68 69 73 20 63 61 6c 6c 20 63 6f 75 6c  : this call coul
15fc0 64 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 61  d be optimized a
15fd0 77 61 79 20 2d 20 73 69 6e 63 65 20 74 68 65 20  way - since the 
15fe0 73 61 6d 65 20 76 61 6c 75 65 73 20 6d 75 73 74  same values must
15ff0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 61 76   .        ** hav
16000 65 20 62 65 65 6e 20 72 65 71 75 65 73 74 65 64  e been requested
16010 20 77 68 65 6e 20 74 65 73 74 69 6e 67 20 6b 65   when testing ke
16020 79 20 24 50 20 69 6e 20 77 68 65 72 65 45 71 75  y $P in whereEqu
16030 61 6c 53 63 61 6e 45 73 74 28 29 2e 20 20 2a 2f  alScanEst().  */
16040 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4b 65  .        whereKe
16050 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70  yStats(pParse, p
16060 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20  , pRec, 0, a);. 
16070 20 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20         iLower = 
16080 61 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 55  a[0];.        iU
16090 70 70 65 72 20 3d 20 61 5b 30 5d 20 2b 20 61 5b  pper = a[0] + a[
160a0 31 5d 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  1];.      }..   
160b0 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 77 65     assert( pLowe
160c0 72 3d 3d 30 20 7c 7c 20 28 70 4c 6f 77 65 72 2d  r==0 || (pLower-
160d0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
160e0 5f 47 54 7c 57 4f 5f 47 45 29 29 21 3d 30 20 29  _GT|WO_GE))!=0 )
160f0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
16100 70 55 70 70 65 72 3d 3d 30 20 7c 7c 20 28 70 55  pUpper==0 || (pU
16110 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20  pper->eOperator 
16120 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 29  & (WO_LT|WO_LE))
16130 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
16140 65 72 74 28 20 70 2d 3e 61 53 6f 72 74 4f 72 64  ert( p->aSortOrd
16150 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  er!=0 );.      i
16160 66 28 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72  f( p->aSortOrder
16170 5b 6e 45 71 5d 20 29 7b 0a 20 20 20 20 20 20 20  [nEq] ){.       
16180 20 2f 2a 20 54 68 65 20 72 6f 6c 65 73 20 6f 66   /* The roles of
16190 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70   pLower and pUpp
161a0 65 72 20 61 72 65 20 73 77 61 70 70 65 64 20 66  er are swapped f
161b0 6f 72 20 61 20 44 45 53 43 20 69 6e 64 65 78 20  or a DESC index 
161c0 2a 2f 0a 20 20 20 20 20 20 20 20 53 57 41 50 28  */.        SWAP(
161d0 57 68 65 72 65 54 65 72 6d 2a 2c 20 70 4c 6f 77  WhereTerm*, pLow
161e0 65 72 2c 20 70 55 70 70 65 72 29 3b 0a 20 20 20  er, pUpper);.   
161f0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
16200 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72  f possible, impr
16210 6f 76 65 20 6f 6e 20 74 68 65 20 69 4c 6f 77 65  ove on the iLowe
16220 72 20 65 73 74 69 6d 61 74 65 20 75 73 69 6e 67  r estimate using
16230 20 28 24 50 3a 24 4c 29 2e 20 2a 2f 0a 20 20 20   ($P:$L). */.   
16240 20 20 20 69 66 28 20 70 4c 6f 77 65 72 20 29 7b     if( pLower ){
16250 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62 4f 6b  .        int bOk
16260 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16270 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
16280 76 61 6c 75 65 20 69 73 20 65 78 74 72 61 63 74  value is extract
16290 65 64 20 66 72 6f 6d 20 70 45 78 70 72 20 2a 2f  ed from pExpr */
162a0 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
162b0 45 78 70 72 20 3d 20 70 4c 6f 77 65 72 2d 3e 70  Expr = pLower->p
162c0 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
162d0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
162e0 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56  e3Stat4ProbeSetV
162f0 61 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c 20  alue(pParse, p, 
16300 26 70 52 65 63 2c 20 70 45 78 70 72 2c 20 61 66  &pRec, pExpr, af
16310 66 2c 20 6e 45 71 2c 20 26 62 4f 6b 29 3b 0a 20  f, nEq, &bOk);. 
16320 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
16330 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 4f 6b 20  QLITE_OK && bOk 
16340 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 52 6f  ){.          tRo
16350 77 63 6e 74 20 69 4e 65 77 3b 0a 20 20 20 20 20  wcnt iNew;.     
16360 20 20 20 20 20 69 4c 77 72 49 64 78 20 3d 20 77       iLwrIdx = w
16370 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61  hereKeyStats(pPa
16380 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c  rse, p, pRec, 0,
16390 20 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   a);.          i
163a0 4e 65 77 20 3d 20 61 5b 30 5d 20 2b 20 28 28 70  New = a[0] + ((p
163b0 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72  Lower->eOperator
163c0 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 4c 45 29   & (WO_GT|WO_LE)
163d0 29 20 3f 20 61 5b 31 5d 20 3a 20 30 29 3b 0a 20  ) ? a[1] : 0);. 
163e0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65           if( iNe
163f0 77 3e 69 4c 6f 77 65 72 20 29 20 69 4c 6f 77 65  w>iLower ) iLowe
16400 72 20 3d 20 69 4e 65 77 3b 0a 20 20 20 20 20 20  r = iNew;.      
16410 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20      nOut--;.    
16420 20 20 20 20 20 20 70 4c 6f 77 65 72 20 3d 20 30        pLower = 0
16430 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16440 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
16450 20 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f   possible, impro
16460 76 65 20 6f 6e 20 74 68 65 20 69 55 70 70 65 72  ve on the iUpper
16470 20 65 73 74 69 6d 61 74 65 20 75 73 69 6e 67 20   estimate using 
16480 28 24 50 3a 24 55 29 2e 20 2a 2f 0a 20 20 20 20  ($P:$U). */.    
16490 20 20 69 66 28 20 70 55 70 70 65 72 20 29 7b 0a    if( pUpper ){.
164a0 20 20 20 20 20 20 20 20 69 6e 74 20 62 4f 6b 3b          int bOk;
164b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
164c0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 76      /* True if v
164d0 61 6c 75 65 20 69 73 20 65 78 74 72 61 63 74 65  alue is extracte
164e0 64 20 66 72 6f 6d 20 70 45 78 70 72 20 2a 2f 0a  d from pExpr */.
164f0 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
16500 78 70 72 20 3d 20 70 55 70 70 65 72 2d 3e 70 45  xpr = pUpper->pE
16510 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
16520 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
16530 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56 61  3Stat4ProbeSetVa
16540 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c 20 26  lue(pParse, p, &
16550 70 52 65 63 2c 20 70 45 78 70 72 2c 20 61 66 66  pRec, pExpr, aff
16560 2c 20 6e 45 71 2c 20 26 62 4f 6b 29 3b 0a 20 20  , nEq, &bOk);.  
16570 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
16580 4c 49 54 45 5f 4f 4b 20 26 26 20 62 4f 6b 20 29  LITE_OK && bOk )
16590 7b 0a 20 20 20 20 20 20 20 20 20 20 74 52 6f 77  {.          tRow
165a0 63 6e 74 20 69 4e 65 77 3b 0a 20 20 20 20 20 20  cnt iNew;.      
165b0 20 20 20 20 69 55 70 72 49 64 78 20 3d 20 77 68      iUprIdx = wh
165c0 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61 72  ereKeyStats(pPar
165d0 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 31 2c 20  se, p, pRec, 1, 
165e0 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4e  a);.          iN
165f0 65 77 20 3d 20 61 5b 30 5d 20 2b 20 28 28 70 55  ew = a[0] + ((pU
16600 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20  pper->eOperator 
16610 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 4c 45 29 29  & (WO_GT|WO_LE))
16620 20 3f 20 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20   ? a[1] : 0);.  
16630 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77          if( iNew
16640 3c 69 55 70 70 65 72 20 29 20 69 55 70 70 65 72  <iUpper ) iUpper
16650 20 3d 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20   = iNew;.       
16660 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20     nOut--;.     
16670 20 20 20 20 20 70 55 70 70 65 72 20 3d 20 30 3b       pUpper = 0;
16680 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16690 20 7d 0a 0a 20 20 20 20 20 20 70 42 75 69 6c 64   }..      pBuild
166a0 65 72 2d 3e 70 52 65 63 20 3d 20 70 52 65 63 3b  er->pRec = pRec;
166b0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
166c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
166d0 20 20 20 20 69 66 28 20 69 55 70 70 65 72 3e 69      if( iUpper>i
166e0 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20 20  Lower ){.       
166f0 20 20 20 6e 4e 65 77 20 3d 20 73 71 6c 69 74 65     nNew = sqlite
16700 33 4c 6f 67 45 73 74 28 69 55 70 70 65 72 20 2d  3LogEst(iUpper -
16710 20 69 4c 6f 77 65 72 29 3b 0a 20 20 20 20 20 20   iLower);.      
16720 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20      /* TUNING:  
16730 49 66 20 62 6f 74 68 20 69 55 70 70 65 72 20 61  If both iUpper a
16740 6e 64 20 69 4c 6f 77 65 72 20 61 72 65 20 64 65  nd iLower are de
16750 72 69 76 65 64 20 66 72 6f 6d 20 74 68 65 20 73  rived from the s
16760 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ame.          **
16770 20 73 61 6d 70 6c 65 2c 20 74 68 65 6e 20 61 73   sample, then as
16780 73 75 6d 65 20 74 68 65 79 20 61 72 65 20 34 78  sume they are 4x
16790 20 6d 6f 72 65 20 73 65 6c 65 63 74 69 76 65 2e   more selective.
167a0 20 20 54 68 69 73 20 62 72 69 6e 67 73 0a 20 20    This brings.  
167b0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65          ** the e
167c0 73 74 69 6d 61 74 65 64 20 73 65 6c 65 63 74 69  stimated selecti
167d0 76 69 74 79 20 6d 6f 72 65 20 69 6e 20 6c 69 6e  vity more in lin
167e0 65 20 77 69 74 68 20 77 68 61 74 20 69 74 20 77  e with what it w
167f0 6f 75 6c 64 20 62 65 0a 20 20 20 20 20 20 20 20  ould be.        
16800 20 20 2a 2a 20 69 66 20 65 73 74 69 6d 61 74 65    ** if estimate
16810 64 20 77 69 74 68 6f 75 74 20 74 68 65 20 75 73  d without the us
16820 65 20 6f 66 20 53 54 41 54 33 2f 34 20 74 61 62  e of STAT3/4 tab
16830 6c 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  les. */.        
16840 20 20 69 66 28 20 69 4c 77 72 49 64 78 3d 3d 69    if( iLwrIdx==i
16850 55 70 72 49 64 78 20 29 20 6e 4e 65 77 20 2d 3d  UprIdx ) nNew -=
16860 20 32 30 3b 20 20 61 73 73 65 72 74 28 20 32 30   20;  assert( 20
16870 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
16880 34 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  4) );.        }e
16890 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  lse{.          n
168a0 4e 65 77 20 3d 20 31 30 3b 20 20 20 20 20 20 20  New = 10;       
168b0 20 61 73 73 65 72 74 28 20 31 30 3d 3d 73 71 6c   assert( 10==sql
168c0 69 74 65 33 4c 6f 67 45 73 74 28 32 29 20 29 3b  ite3LogEst(2) );
168d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
168e0 20 20 20 69 66 28 20 6e 4e 65 77 3c 6e 4f 75 74     if( nNew<nOut
168f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f   ){.          nO
16900 75 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20  ut = nNew;.     
16910 20 20 20 7d 0a 20 20 20 20 20 20 20 20 57 48 45     }.        WHE
16920 52 45 54 52 41 43 45 28 30 78 31 30 2c 20 28 22  RETRACE(0x10, ("
16930 53 54 41 54 34 20 72 61 6e 67 65 20 73 63 61 6e  STAT4 range scan
16940 3a 20 25 75 2e 2e 25 75 20 20 65 73 74 3d 25 64  : %u..%u  est=%d
16950 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
16960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16970 28 75 33 32 29 69 4c 6f 77 65 72 2c 20 28 75 33  (u32)iLower, (u3
16980 32 29 69 55 70 70 65 72 2c 20 6e 4f 75 74 29 29  2)iUpper, nOut))
16990 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
169a0 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 62  lse{.      int b
169b0 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Done = 0;.      
169c0 72 63 20 3d 20 77 68 65 72 65 52 61 6e 67 65 53  rc = whereRangeS
169d0 6b 69 70 53 63 61 6e 45 73 74 28 70 50 61 72 73  kipScanEst(pPars
169e0 65 2c 20 70 4c 6f 77 65 72 2c 20 70 55 70 70 65  e, pLower, pUppe
169f0 72 2c 20 70 4c 6f 6f 70 2c 20 26 62 44 6f 6e 65  r, pLoop, &bDone
16a00 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 44 6f  );.      if( bDo
16a10 6e 65 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  ne ) return rc;.
16a20 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a      }.  }.#else.
16a30 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
16a40 45 52 28 70 50 61 72 73 65 29 3b 0a 20 20 55 4e  ER(pParse);.  UN
16a50 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
16a60 42 75 69 6c 64 65 72 29 3b 0a 20 20 61 73 73 65  Builder);.  asse
16a70 72 74 28 20 70 4c 6f 77 65 72 20 7c 7c 20 70 55  rt( pLower || pU
16a80 70 70 65 72 20 29 3b 0a 23 65 6e 64 69 66 0a 20  pper );.#endif. 
16a90 20 61 73 73 65 72 74 28 20 70 55 70 70 65 72 3d   assert( pUpper=
16aa0 3d 30 20 7c 7c 20 28 70 55 70 70 65 72 2d 3e 77  =0 || (pUpper->w
16ab0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e  tFlags & TERM_VN
16ac0 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20 20 6e 4e 65  ULL)==0 );.  nNe
16ad0 77 20 3d 20 77 68 65 72 65 52 61 6e 67 65 41 64  w = whereRangeAd
16ae0 6a 75 73 74 28 70 4c 6f 77 65 72 2c 20 6e 4f 75  just(pLower, nOu
16af0 74 29 3b 0a 20 20 6e 4e 65 77 20 3d 20 77 68 65  t);.  nNew = whe
16b00 72 65 52 61 6e 67 65 41 64 6a 75 73 74 28 70 55  reRangeAdjust(pU
16b10 70 70 65 72 2c 20 6e 4e 65 77 29 3b 0a 0a 20 20  pper, nNew);..  
16b20 2f 2a 20 54 55 4e 49 4e 47 3a 20 49 66 20 74 68  /* TUNING: If th
16b30 65 72 65 20 69 73 20 62 6f 74 68 20 61 6e 20 75  ere is both an u
16b40 70 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 20 6c  pper and lower l
16b50 69 6d 69 74 20 61 6e 64 20 6e 65 69 74 68 65 72  imit and neither
16b60 20 6c 69 6d 69 74 0a 20 20 2a 2a 20 68 61 73 20   limit.  ** has 
16b70 61 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 2d 64  an application-d
16b80 65 66 69 6e 65 64 20 6c 69 6b 65 6c 69 68 6f 6f  efined likelihoo
16b90 64 28 29 2c 20 61 73 73 75 6d 65 20 74 68 65 20  d(), assume the 
16ba0 72 61 6e 67 65 20 69 73 0a 20 20 2a 2a 20 72 65  range is.  ** re
16bb0 64 75 63 65 64 20 62 79 20 61 6e 20 61 64 64 69  duced by an addi
16bc0 74 69 6f 6e 61 6c 20 37 35 25 2e 20 54 68 69 73  tional 75%. This
16bd0 20 6d 65 61 6e 73 20 74 68 61 74 2c 20 62 79 20   means that, by 
16be0 64 65 66 61 75 6c 74 2c 20 61 6e 20 6f 70 65 6e  default, an open
16bf0 2d 65 6e 64 65 64 0a 20 20 2a 2a 20 72 61 6e 67  -ended.  ** rang
16c00 65 20 71 75 65 72 79 20 28 65 2e 67 2e 20 63 6f  e query (e.g. co
16c10 6c 20 3e 20 3f 29 20 69 73 20 61 73 73 75 6d 65  l > ?) is assume
16c20 64 20 74 6f 20 6d 61 74 63 68 20 31 2f 34 20 6f  d to match 1/4 o
16c30 66 20 74 68 65 20 72 6f 77 73 20 69 6e 20 74 68  f the rows in th
16c40 65 0a 20 20 2a 2a 20 69 6e 64 65 78 2e 20 57 68  e.  ** index. Wh
16c50 69 6c 65 20 61 20 63 6c 6f 73 65 64 20 72 61 6e  ile a closed ran
16c60 67 65 20 28 65 2e 67 2e 20 63 6f 6c 20 42 45 54  ge (e.g. col BET
16c70 57 45 45 4e 20 3f 20 41 4e 44 20 3f 29 20 69 73  WEEN ? AND ?) is
16c80 20 65 73 74 69 6d 61 74 65 64 20 74 6f 0a 20 20   estimated to.  
16c90 2a 2a 20 6d 61 74 63 68 20 31 2f 36 34 20 6f 66  ** match 1/64 of
16ca0 20 74 68 65 20 69 6e 64 65 78 2e 20 2a 2f 20 0a   the index. */ .
16cb0 20 20 69 66 28 20 70 4c 6f 77 65 72 20 26 26 20    if( pLower && 
16cc0 70 4c 6f 77 65 72 2d 3e 74 72 75 74 68 50 72 6f  pLower->truthPro
16cd0 62 3e 30 20 26 26 20 70 55 70 70 65 72 20 26 26  b>0 && pUpper &&
16ce0 20 70 55 70 70 65 72 2d 3e 74 72 75 74 68 50 72   pUpper->truthPr
16cf0 6f 62 3e 30 20 29 7b 0a 20 20 20 20 6e 4e 65 77  ob>0 ){.    nNew
16d00 20 2d 3d 20 32 30 3b 0a 20 20 7d 0a 0a 20 20 6e   -= 20;.  }..  n
16d10 4f 75 74 20 2d 3d 20 28 70 4c 6f 77 65 72 21 3d  Out -= (pLower!=
16d20 30 29 20 2b 20 28 70 55 70 70 65 72 21 3d 30 29  0) + (pUpper!=0)
16d30 3b 0a 20 20 69 66 28 20 6e 4e 65 77 3c 31 30 20  ;.  if( nNew<10 
16d40 29 20 6e 4e 65 77 20 3d 20 31 30 3b 0a 20 20 69  ) nNew = 10;.  i
16d50 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 20 6e  f( nNew<nOut ) n
16d60 4f 75 74 20 3d 20 6e 4e 65 77 3b 0a 23 69 66 20  Out = nNew;.#if 
16d70 64 65 66 69 6e 65 64 28 57 48 45 52 45 54 52 41  defined(WHERETRA
16d80 43 45 5f 45 4e 41 42 4c 45 44 29 0a 20 20 69 66  CE_ENABLED).  if
16d90 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3e 6e 4f  ( pLoop->nOut>nO
16da0 75 74 20 29 7b 0a 20 20 20 20 57 48 45 52 45 54  ut ){.    WHERET
16db0 52 41 43 45 28 30 78 31 30 2c 28 22 52 61 6e 67  RACE(0x10,("Rang
16dc0 65 20 73 63 61 6e 20 6c 6f 77 65 72 73 20 6e 4f  e scan lowers nO
16dd0 75 74 20 66 72 6f 6d 20 25 64 20 74 6f 20 25 64  ut from %d to %d
16de0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
16df0 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e           pLoop->
16e00 6e 4f 75 74 2c 20 6e 4f 75 74 29 29 3b 0a 20 20  nOut, nOut));.  
16e10 7d 0a 23 65 6e 64 69 66 0a 20 20 70 4c 6f 6f 70  }.#endif.  pLoop
16e20 2d 3e 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73 74  ->nOut = (LogEst
16e30 29 6e 4f 75 74 3b 0a 20 20 72 65 74 75 72 6e 20  )nOut;.  return 
16e40 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  rc;.}..#ifdef SQ
16e50 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
16e60 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a  3_OR_STAT4./*.**
16e70 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75   Estimate the nu
16e80 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61  mber of rows tha
16e90 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  t will be return
16ea0 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61  ed based on.** a
16eb0 6e 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  n equality const
16ec0 72 61 69 6e 74 20 78 3d 56 41 4c 55 45 20 61 6e  raint x=VALUE an
16ed0 64 20 77 68 65 72 65 20 74 68 61 74 20 56 41 4c  d where that VAL
16ee0 55 45 20 6f 63 63 75 72 73 20 69 6e 0a 2a 2a 20  UE occurs in.** 
16ef0 74 68 65 20 68 69 73 74 6f 67 72 61 6d 20 64 61  the histogram da
16f00 74 61 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 77  ta.  This only w
16f10 6f 72 6b 73 20 77 68 65 6e 20 78 20 69 73 20 74  orks when x is t
16f20 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20  he left-most.** 
16f30 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20 69 6e 64  column of an ind
16f40 65 78 20 61 6e 64 20 73 71 6c 69 74 65 5f 73 74  ex and sqlite_st
16f50 61 74 33 20 68 69 73 74 6f 67 72 61 6d 20 64 61  at3 histogram da
16f60 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65 0a  ta is available.
16f70 2a 2a 20 66 6f 72 20 74 68 61 74 20 69 6e 64 65  ** for that inde
16f80 78 2e 20 20 57 68 65 6e 20 70 45 78 70 72 3d 3d  x.  When pExpr==
16f90 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20  NULL that means 
16fa0 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  the constraint i
16fb0 73 0a 2a 2a 20 22 78 20 49 53 20 4e 55 4c 4c 22  s.** "x IS NULL"
16fc0 20 69 6e 73 74 65 61 64 20 6f 66 20 22 78 3d 56   instead of "x=V
16fd0 41 4c 55 45 22 2e 0a 2a 2a 0a 2a 2a 20 57 72 69  ALUE"..**.** Wri
16fe0 74 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64  te the estimated
16ff0 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20   row count into 
17000 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72  *pnRow and retur
17010 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a  n SQLITE_OK. .**
17020 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61   If unable to ma
17030 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20  ke an estimate, 
17040 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63  leave *pnRow unc
17050 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72  hanged and retur
17060 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a  n.** non-zero..*
17070 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
17080 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74  e can fail if it
17090 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f   is unable to lo
170a0 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ad a collating s
170b0 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69  equence.** requi
170c0 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63  red for string c
170d0 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66  omparison, or if
170e0 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63   unable to alloc
170f0 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f  ate memory.** fo
17100 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69  r a UTF conversi
17110 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  on required for 
17120 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65  comparison.  The
17130 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64   error is stored
17140 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73  .** in the pPars
17150 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  e structure..*/.
17160 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
17170 45 71 75 61 6c 53 63 61 6e 45 73 74 28 0a 20 20  EqualScanEst(.  
17180 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
17190 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
171a0 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  & code generatin
171b0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
171c0 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
171d0 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 45 78 70  *pBuilder,.  Exp
171e0 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
171f0 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
17200 66 6f 72 20 56 41 4c 55 45 20 69 6e 20 74 68 65  for VALUE in the
17210 20 78 3d 56 41 4c 55 45 20 63 6f 6e 73 74 72 61   x=VALUE constra
17220 69 6e 74 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74  int */.  tRowcnt
17230 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a   *pnRow       /*
17240 20 57 72 69 74 65 20 74 68 65 20 72 65 76 69 73   Write the revis
17250 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20  ed row estimate 
17260 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64  here */.){.  Ind
17270 65 78 20 2a 70 20 3d 20 70 42 75 69 6c 64 65 72  ex *p = pBuilder
17280 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  ->pNew->u.btree.
17290 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45  pIndex;.  int nE
172a0 71 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  q = pBuilder->pN
172b0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b  ew->u.btree.nEq;
172c0 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
172d0 64 20 2a 70 52 65 63 20 3d 20 70 42 75 69 6c 64  d *pRec = pBuild
172e0 65 72 2d 3e 70 52 65 63 3b 0a 20 20 75 38 20 61  er->pRec;.  u8 a
172f0 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
17300 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
17310 61 66 66 69 6e 69 74 79 20 2a 2f 0a 20 20 69 6e  affinity */.  in
17320 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
17330 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 66 75          /* Subfu
17340 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f  nction return co
17350 64 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  de */.  tRowcnt 
17360 61 5b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20  a[2];           
17370 20 20 2f 2a 20 53 74 61 74 69 73 74 69 63 73 20    /* Statistics 
17380 2a 2f 0a 20 20 69 6e 74 20 62 4f 6b 3b 0a 0a 20  */.  int bOk;.. 
17390 20 61 73 73 65 72 74 28 20 6e 45 71 3e 3d 31 20   assert( nEq>=1 
173a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 45 71  );.  assert( nEq
173b0 3c 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a  <=p->nColumn );.
173c0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61    assert( p->aSa
173d0 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  mple!=0 );.  ass
173e0 65 72 74 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e  ert( p->nSample>
173f0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
17400 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
17410 69 64 3c 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20  id<nEq );..  /* 
17420 49 66 20 76 61 6c 75 65 73 20 61 72 65 20 6e 6f  If values are no
17430 74 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  t available for 
17440 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20 74 68  all fields of th
17450 65 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c  e index to the l
17460 65 66 74 0a 20 20 2a 2a 20 6f 66 20 74 68 69 73  eft.  ** of this
17470 20 6f 6e 65 2c 20 6e 6f 20 65 73 74 69 6d 61 74   one, no estimat
17480 65 20 63 61 6e 20 62 65 20 6d 61 64 65 2e 20 52  e can be made. R
17490 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54  eturn SQLITE_NOT
174a0 46 4f 55 4e 44 2e 20 2a 2f 0a 20 20 69 66 28 20  FOUND. */.  if( 
174b0 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
174c0 6c 69 64 3c 28 6e 45 71 2d 31 29 20 29 7b 0a 20  lid<(nEq-1) ){. 
174d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
174e0 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 7d 0a 0a  _NOTFOUND;.  }..
174f0 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 6e 20    /* This is an 
17500 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c  optimization onl
17510 79 2e 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73  y. The call to s
17520 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65  qlite3Stat4Probe
17530 53 65 74 56 61 6c 75 65 28 29 0a 20 20 2a 2a 20  SetValue().  ** 
17540 62 65 6c 6f 77 20 77 6f 75 6c 64 20 72 65 74 75  below would retu
17550 72 6e 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75  rn the same valu
17560 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6e 45 71  e.  */.  if( nEq
17570 3e 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a  >=p->nColumn ){.
17580 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20 31 3b 0a      *pnRow = 1;.
17590 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
175a0 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 61 66 66  E_OK;.  }..  aff
175b0 20 3d 20 70 2d 3e 70 54 61 62 6c 65 2d 3e 61 43   = p->pTable->aC
175c0 6f 6c 5b 70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  ol[p->aiColumn[n
175d0 45 71 2d 31 5d 5d 2e 61 66 66 69 6e 69 74 79 3b  Eq-1]].affinity;
175e0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53  .  rc = sqlite3S
175f0 74 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75  tat4ProbeSetValu
17600 65 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52  e(pParse, p, &pR
17610 65 63 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20  ec, pExpr, aff, 
17620 6e 45 71 2d 31 2c 20 26 62 4f 6b 29 3b 0a 20 20  nEq-1, &bOk);.  
17630 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d  pBuilder->pRec =
17640 20 70 52 65 63 3b 0a 20 20 69 66 28 20 72 63 21   pRec;.  if( rc!
17650 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
17660 75 72 6e 20 72 63 3b 0a 20 20 69 66 28 20 62 4f  urn rc;.  if( bO
17670 6b 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  k==0 ) return SQ
17680 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20  LITE_NOTFOUND;. 
17690 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56   pBuilder->nRecV
176a0 61 6c 69 64 20 3d 20 6e 45 71 3b 0a 0a 20 20 77  alid = nEq;..  w
176b0 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61  hereKeyStats(pPa
176c0 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c  rse, p, pRec, 0,
176d0 20 61 29 3b 0a 20 20 57 48 45 52 45 54 52 41 43   a);.  WHERETRAC
176e0 45 28 30 78 31 30 2c 28 22 65 71 75 61 6c 69 74  E(0x10,("equalit
176f0 79 20 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20  y scan regions: 
17700 25 64 5c 6e 22 2c 20 28 69 6e 74 29 61 5b 31 5d  %d\n", (int)a[1]
17710 29 29 3b 0a 20 20 2a 70 6e 52 6f 77 20 3d 20 61  ));.  *pnRow = a
17720 5b 31 5d 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e  [1];.  .  return
17730 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
17740 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
17750 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f  TAT3_OR_STAT4 */
17760 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
17770 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
17780 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69  STAT4./*.** Esti
17790 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mate the number 
177a0 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c  of rows that wil
177b0 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 61  l be returned ba
177c0 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 49 4e 20  sed on.** an IN 
177d0 63 6f 6e 73 74 72 61 69 6e 74 20 77 68 65 72 65  constraint where
177e0 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
177f0 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e 20 6f  side of the IN o
17800 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 61 20  perator.** is a 
17810 6c 69 73 74 20 6f 66 20 76 61 6c 75 65 73 2e 20  list of values. 
17820 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20   Example:.**.** 
17830 20 20 20 20 20 20 20 57 48 45 52 45 20 78 20 49         WHERE x I
17840 4e 20 28 31 2c 32 2c 33 2c 34 29 0a 2a 2a 0a 2a  N (1,2,3,4).**.*
17850 2a 20 57 72 69 74 65 20 74 68 65 20 65 73 74 69  * Write the esti
17860 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74 20  mated row count 
17870 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20  into *pnRow and 
17880 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
17890 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20  . .** If unable 
178a0 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d  to make an estim
178b0 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f  ate, leave *pnRo
178c0 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20  w unchanged and 
178d0 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65  return.** non-ze
178e0 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ro..**.** This r
178f0 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c 20  outine can fail 
17900 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65 20  if it is unable 
17910 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74  to load a collat
17920 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20  ing sequence.** 
17930 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 74 72  required for str
17940 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20  ing comparison, 
17950 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20  or if unable to 
17960 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a  allocate memory.
17970 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f 6e  ** for a UTF con
17980 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65 64  version required
17990 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e   for comparison.
179a0 20 20 54 68 65 20 65 72 72 6f 72 20 69 73 20 73    The error is s
179b0 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20  tored.** in the 
179c0 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
179d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
179e0 77 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28 0a  whereInScanEst(.
179f0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
17a00 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
17a10 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74  g & code generat
17a20 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
17a30 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
17a40 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 45  r *pBuilder,.  E
17a50 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
17a60 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65      /* The value
17a70 20 6c 69 73 74 20 6f 6e 20 74 68 65 20 52 48 53   list on the RHS
17a80 20 6f 66 20 22 78 20 49 4e 20 28 76 31 2c 76 32   of "x IN (v1,v2
17a90 2c 76 33 2c 2e 2e 2e 29 22 20 2a 2f 0a 20 20 74  ,v3,...)" */.  t
17aa0 52 6f 77 63 6e 74 20 2a 70 6e 52 6f 77 20 20 20  Rowcnt *pnRow   
17ab0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
17ac0 20 72 65 76 69 73 65 64 20 72 6f 77 20 65 73 74   revised row est
17ad0 69 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b  imate here */.){
17ae0 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 42  .  Index *p = pB
17af0 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e  uilder->pNew->u.
17b00 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
17b10 69 36 34 20 6e 52 6f 77 30 20 3d 20 73 71 6c 69  i64 nRow0 = sqli
17b20 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70  te3LogEstToInt(p
17b30 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d  ->aiRowLogEst[0]
17b40 29 3b 0a 20 20 69 6e 74 20 6e 52 65 63 56 61 6c  );.  int nRecVal
17b50 69 64 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e  id = pBuilder->n
17b60 52 65 63 56 61 6c 69 64 3b 0a 20 20 69 6e 74 20  RecValid;.  int 
17b70 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
17b80 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69      /* Subfuncti
17b90 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  on return code *
17ba0 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e 45 73 74  /.  tRowcnt nEst
17bb0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
17bc0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 66 6f  umber of rows fo
17bd0 72 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20  r a single term 
17be0 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e 52 6f  */.  tRowcnt nRo
17bf0 77 45 73 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  wEst = 0;    /* 
17c00 4e 65 77 20 65 73 74 69 6d 61 74 65 20 6f 66 20  New estimate of 
17c10 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
17c20 77 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  ws */.  int i;  
17c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c40 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
17c50 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  */..  assert( p-
17c60 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20  >aSample!=0 );. 
17c70 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
17c80 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 4c 69  LITE_OK && i<pLi
17c90 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
17ca0 0a 20 20 20 20 6e 45 73 74 20 3d 20 6e 52 6f 77  .    nEst = nRow
17cb0 30 3b 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72  0;.    rc = wher
17cc0 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 70 50  eEqualScanEst(pP
17cd0 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20  arse, pBuilder, 
17ce0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
17cf0 72 2c 20 26 6e 45 73 74 29 3b 0a 20 20 20 20 6e  r, &nEst);.    n
17d00 52 6f 77 45 73 74 20 2b 3d 20 6e 45 73 74 3b 0a  RowEst += nEst;.
17d10 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52      pBuilder->nR
17d20 65 63 56 61 6c 69 64 20 3d 20 6e 52 65 63 56 61  ecValid = nRecVa
17d30 6c 69 64 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  lid;.  }..  if( 
17d40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
17d50 0a 20 20 20 20 69 66 28 20 6e 52 6f 77 45 73 74  .    if( nRowEst
17d60 20 3e 20 6e 52 6f 77 30 20 29 20 6e 52 6f 77 45   > nRow0 ) nRowE
17d70 73 74 20 3d 20 6e 52 6f 77 30 3b 0a 20 20 20 20  st = nRow0;.    
17d80 2a 70 6e 52 6f 77 20 3d 20 6e 52 6f 77 45 73 74  *pnRow = nRowEst
17d90 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45  ;.    WHERETRACE
17da0 28 30 78 31 30 2c 28 22 49 4e 20 72 6f 77 20 65  (0x10,("IN row e
17db0 73 74 69 6d 61 74 65 3a 20 65 73 74 3d 25 64 5c  stimate: est=%d\
17dc0 6e 22 2c 20 6e 52 6f 77 45 73 74 29 29 3b 0a 20  n", nRowEst));. 
17dd0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 75   }.  assert( pBu
17de0 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
17df0 3d 3d 6e 52 65 63 56 61 6c 69 64 20 29 3b 0a 20  ==nRecValid );. 
17e00 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
17e10 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
17e20 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
17e30 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44  TAT4 */../*.** D
17e40 69 73 61 62 6c 65 20 61 20 74 65 72 6d 20 69 6e  isable a term in
17e50 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
17e60 65 2e 20 20 45 78 63 65 70 74 2c 20 64 6f 20 6e  e.  Except, do n
17e70 6f 74 20 64 69 73 61 62 6c 65 20 74 68 65 20 74  ot disable the t
17e80 65 72 6d 0a 2a 2a 20 69 66 20 69 74 20 63 6f 6e  erm.** if it con
17e90 74 72 6f 6c 73 20 61 20 4c 45 46 54 20 4f 55 54  trols a LEFT OUT
17ea0 45 52 20 4a 4f 49 4e 20 61 6e 64 20 69 74 20 64  ER JOIN and it d
17eb0 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65  id not originate
17ec0 20 69 6e 20 74 68 65 20 4f 4e 0a 2a 2a 20 6f 72   in the ON.** or
17ed0 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
17ee0 20 74 68 61 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a   that join..**.*
17ef0 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65 20 74  * Consider the t
17f00 65 72 6d 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 6e  erm t2.z='ok' in
17f10 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71   the following q
17f20 75 65 72 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ueries:.**.**   
17f30 28 31 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52  (1)  SELECT * FR
17f40 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20  OM t1 LEFT JOIN 
17f50 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20  t2 ON t1.a=t2.x 
17f60 57 48 45 52 45 20 74 32 2e 7a 3d 27 6f 6b 27 0a  WHERE t2.z='ok'.
17f70 2a 2a 20 20 20 28 32 29 20 20 53 45 4c 45 43 54  **   (2)  SELECT
17f80 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20   * FROM t1 LEFT 
17f90 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d  JOIN t2 ON t1.a=
17fa0 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f  t2.x AND t2.z='o
17fb0 6b 27 0a 2a 2a 20 20 20 28 33 29 20 20 53 45 4c  k'.**   (3)  SEL
17fc0 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74  ECT * FROM t1, t
17fd0 32 20 57 48 45 52 45 20 74 31 2e 61 3d 74 32 2e  2 WHERE t1.a=t2.
17fe0 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a  x AND t2.z='ok'.
17ff0 2a 2a 0a 2a 2a 20 54 68 65 20 74 32 2e 7a 3d 27  **.** The t2.z='
18000 6f 6b 27 20 69 73 20 64 69 73 61 62 6c 65 64 20  ok' is disabled 
18010 69 6e 20 74 68 65 20 69 6e 20 28 32 29 20 62 65  in the in (2) be
18020 63 61 75 73 65 20 69 74 20 6f 72 69 67 69 6e 61  cause it origina
18030 74 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e  tes.** in the ON
18040 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 74 65   clause.  The te
18050 72 6d 20 69 73 20 64 69 73 61 62 6c 65 64 20 69  rm is disabled i
18060 6e 20 28 33 29 20 62 65 63 61 75 73 65 20 69 74  n (3) because it
18070 20 69 73 20 6e 6f 74 20 70 61 72 74 0a 2a 2a 20   is not part.** 
18080 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20  of a LEFT OUTER 
18090 4a 4f 49 4e 2e 20 20 49 6e 20 28 31 29 2c 20 74  JOIN.  In (1), t
180a0 68 65 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 64  he term is not d
180b0 69 73 61 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 44  isabled..**.** D
180c0 69 73 61 62 6c 69 6e 67 20 61 20 74 65 72 6d 20  isabling a term 
180d0 63 61 75 73 65 73 20 74 68 61 74 20 74 65 72 6d  causes that term
180e0 20 74 6f 20 6e 6f 74 20 62 65 20 74 65 73 74 65   to not be teste
180f0 64 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 20 6c  d in the inner l
18100 6f 6f 70 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f  oop.** of the jo
18110 69 6e 2e 20 20 44 69 73 61 62 6c 69 6e 67 20 69  in.  Disabling i
18120 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
18130 6e 2e 20 20 57 68 65 6e 20 74 65 72 6d 73 20 61  n.  When terms a
18140 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20  re satisfied.** 
18150 62 79 20 69 6e 64 69 63 65 73 2c 20 77 65 20 64  by indices, we d
18160 69 73 61 62 6c 65 20 74 68 65 6d 20 74 6f 20 70  isable them to p
18170 72 65 76 65 6e 74 20 72 65 64 75 6e 64 61 6e 74  revent redundant
18180 20 74 65 73 74 73 20 69 6e 20 74 68 65 20 69 6e   tests in the in
18190 6e 65 72 0a 2a 2a 20 6c 6f 6f 70 2e 20 20 57 65  ner.** loop.  We
181a0 20 77 6f 75 6c 64 20 67 65 74 20 74 68 65 20 63   would get the c
181b0 6f 72 72 65 63 74 20 72 65 73 75 6c 74 73 20 69  orrect results i
181c0 66 20 6e 6f 74 68 69 6e 67 20 77 65 72 65 20 65  f nothing were e
181d0 76 65 72 20 64 69 73 61 62 6c 65 64 2c 0a 2a 2a  ver disabled,.**
181e0 20 62 75 74 20 6a 6f 69 6e 73 20 6d 69 67 68 74   but joins might
181f0 20 72 75 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c   run a little sl
18200 6f 77 65 72 2e 20 20 54 68 65 20 74 72 69 63 6b  ower.  The trick
18210 20 69 73 20 74 6f 20 64 69 73 61 62 6c 65 20 61   is to disable a
18220 73 20 6d 75 63 68 0a 2a 2a 20 61 73 20 77 65 20  s much.** as we 
18230 63 61 6e 20 77 69 74 68 6f 75 74 20 64 69 73 61  can without disa
18240 62 6c 69 6e 67 20 74 6f 6f 20 6d 75 63 68 2e 20  bling too much. 
18250 20 49 66 20 77 65 20 64 69 73 61 62 6c 65 64 20   If we disabled 
18260 69 6e 20 28 31 29 2c 20 77 65 27 64 20 67 65 74  in (1), we'd get
18270 0a 2a 2a 20 74 68 65 20 77 72 6f 6e 67 20 61 6e  .** the wrong an
18280 73 77 65 72 2e 20 20 53 65 65 20 74 69 63 6b 65  swer.  See ticke
18290 74 20 23 38 31 33 2e 0a 2a 2a 0a 2a 2a 20 49 66  t #813..**.** If
182a0 20 61 6c 6c 20 74 68 65 20 63 68 69 6c 64 72 65   all the childre
182b0 6e 20 6f 66 20 61 20 74 65 72 6d 20 61 72 65 20  n of a term are 
182c0 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74  disabled, then t
182d0 68 61 74 20 74 65 72 6d 20 69 73 20 61 6c 73 6f  hat term is also
182e0 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  .** automaticall
182f0 79 20 64 69 73 61 62 6c 65 64 2e 20 20 49 6e 20  y disabled.  In 
18300 74 68 69 73 20 77 61 79 2c 20 74 65 72 6d 73 20  this way, terms 
18310 67 65 74 20 64 69 73 61 62 6c 65 64 20 69 66 20  get disabled if 
18320 64 65 72 69 76 65 64 0a 2a 2a 20 76 69 72 74 75  derived.** virtu
18330 61 6c 20 74 65 72 6d 73 20 61 72 65 20 74 65 73  al terms are tes
18340 74 65 64 20 66 69 72 73 74 2e 20 20 46 6f 72 20  ted first.  For 
18350 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20  example:.**.**  
18360 20 20 20 20 78 20 47 4c 4f 42 20 27 61 62 63 2a      x GLOB 'abc*
18370 27 20 41 4e 44 20 78 3e 3d 27 61 62 63 27 20 41  ' AND x>='abc' A
18380 4e 44 20 78 3c 27 61 63 64 27 0a 2a 2a 20 20 20  ND x<'acd'.**   
18390 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f     \___________/
183a0 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 2f 20 20 20       \______/   
183b0 20 20 5c 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20    \_____/.**    
183c0 20 20 20 20 20 70 61 72 65 6e 74 20 20 20 20 20       parent     
183d0 20 20 20 20 20 63 68 69 6c 64 31 20 20 20 20 20       child1     
183e0 20 20 63 68 69 6c 64 32 0a 2a 2a 0a 2a 2a 20 4f    child2.**.** O
183f0 6e 6c 79 20 74 68 65 20 70 61 72 65 6e 74 20 74  nly the parent t
18400 65 72 6d 20 77 61 73 20 69 6e 20 74 68 65 20 6f  erm was in the o
18410 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20 63 6c  riginal WHERE cl
18420 61 75 73 65 2e 20 20 54 68 65 20 63 68 69 6c 64  ause.  The child
18430 31 0a 2a 2a 20 61 6e 64 20 63 68 69 6c 64 32 20  1.** and child2 
18440 74 65 72 6d 73 20 77 65 72 65 20 61 64 64 65 64  terms were added
18450 20 62 79 20 74 68 65 20 4c 49 4b 45 20 6f 70 74   by the LIKE opt
18460 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 66 20 62  imization.  If b
18470 6f 74 68 20 6f 66 0a 2a 2a 20 74 68 65 20 76 69  oth of.** the vi
18480 72 74 75 61 6c 20 63 68 69 6c 64 20 74 65 72 6d  rtual child term
18490 73 20 61 72 65 20 76 61 6c 69 64 2c 20 74 68 65  s are valid, the
184a0 6e 20 74 65 73 74 69 6e 67 20 6f 66 20 74 68 65  n testing of the
184b0 20 70 61 72 65 6e 74 20 63 61 6e 20 62 65 20 0a   parent can be .
184c0 2a 2a 20 73 6b 69 70 70 65 64 2e 0a 2a 2a 0a 2a  ** skipped..**.*
184d0 2a 20 55 73 75 61 6c 6c 79 20 74 68 65 20 70 61  * Usually the pa
184e0 72 65 6e 74 20 74 65 72 6d 20 69 73 20 6d 61 72  rent term is mar
184f0 6b 65 64 20 61 73 20 54 45 52 4d 5f 43 4f 44 45  ked as TERM_CODE
18500 44 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 70  D.  But if the p
18510 61 72 65 6e 74 0a 2a 2a 20 74 65 72 6d 20 77 61  arent.** term wa
18520 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 54 45 52  s originally TER
18530 4d 5f 4c 49 4b 45 2c 20 74 68 65 6e 20 74 68 65  M_LIKE, then the
18540 20 70 61 72 65 6e 74 20 67 65 74 73 20 54 45 52   parent gets TER
18550 4d 5f 4c 49 4b 45 43 4f 4e 44 20 69 6e 73 74 65  M_LIKECOND inste
18560 61 64 2e 0a 2a 2a 20 54 68 65 20 54 45 52 4d 5f  ad..** The TERM_
18570 4c 49 4b 45 43 4f 4e 44 20 6d 61 72 6b 69 6e 67  LIKECOND marking
18580 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
18590 74 68 65 20 74 65 72 6d 20 73 68 6f 75 6c 64 20  the term should 
185a0 62 65 20 63 6f 64 65 64 20 69 6e 73 69 64 65 0a  be coded inside.
185b0 2a 2a 20 61 20 63 6f 6e 64 69 74 69 6f 6e 61 6c  ** a conditional
185c0 20 73 75 63 68 20 74 68 61 74 20 69 73 20 6f 6e   such that is on
185d0 6c 79 20 65 76 61 6c 75 61 74 65 64 20 6f 6e 20  ly evaluated on 
185e0 74 68 65 20 73 65 63 6f 6e 64 20 70 61 73 73 20  the second pass 
185f0 6f 66 20 61 0a 2a 2a 20 4c 49 4b 45 2d 6f 70 74  of a.** LIKE-opt
18600 69 6d 69 7a 61 74 69 6f 6e 20 6c 6f 6f 70 2c 20  imization loop, 
18610 77 68 65 6e 20 73 63 61 6e 6e 69 6e 67 20 42 4c  when scanning BL
18620 4f 42 73 20 69 6e 73 74 65 61 64 20 6f 66 20 73  OBs instead of s
18630 74 72 69 6e 67 73 2e 0a 2a 2f 0a 73 74 61 74 69  trings..*/.stati
18640 63 20 76 6f 69 64 20 64 69 73 61 62 6c 65 54 65  c void disableTe
18650 72 6d 28 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  rm(WhereLevel *p
18660 4c 65 76 65 6c 2c 20 57 68 65 72 65 54 65 72 6d  Level, WhereTerm
18670 20 2a 70 54 65 72 6d 29 7b 0a 20 20 69 6e 74 20   *pTerm){.  int 
18680 6e 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 77 68 69  nLoop = 0;.  whi
18690 6c 65 28 20 70 54 65 72 6d 0a 20 20 20 20 20 20  le( pTerm.      
186a0 26 26 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61  && (pTerm->wtFla
186b0 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29  gs & TERM_CODED)
186c0 3d 3d 30 0a 20 20 20 20 20 20 26 26 20 28 70 4c  ==0.      && (pL
186d0 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 3d  evel->iLeftJoin=
186e0 3d 30 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f  =0 || ExprHasPro
186f0 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78  perty(pTerm->pEx
18700 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
18710 29 0a 20 20 20 20 20 20 26 26 20 28 70 4c 65 76  ).      && (pLev
18720 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 20 26 20 70  el->notReady & p
18730 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 29  Term->prereqAll)
18740 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 69 66 28  ==0.  ){.    if(
18750 20 6e 4c 6f 6f 70 20 26 26 20 28 70 54 65 72 6d   nLoop && (pTerm
18760 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
18770 5f 4c 49 4b 45 29 21 3d 30 20 29 7b 0a 20 20 20  _LIKE)!=0 ){.   
18780 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67     pTerm->wtFlag
18790 73 20 7c 3d 20 54 45 52 4d 5f 4c 49 4b 45 43 4f  s |= TERM_LIKECO
187a0 4e 44 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ND;.    }else{. 
187b0 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c       pTerm->wtFl
187c0 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45  ags |= TERM_CODE
187d0 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  D;.    }.    if(
187e0 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 3c   pTerm->iParent<
187f0 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70  0 ) break;.    p
18800 54 65 72 6d 20 3d 20 26 70 54 65 72 6d 2d 3e 70  Term = &pTerm->p
18810 57 43 2d 3e 61 5b 70 54 65 72 6d 2d 3e 69 50 61  WC->a[pTerm->iPa
18820 72 65 6e 74 5d 3b 0a 20 20 20 20 70 54 65 72 6d  rent];.    pTerm
18830 2d 3e 6e 43 68 69 6c 64 2d 2d 3b 0a 20 20 20 20  ->nChild--;.    
18840 69 66 28 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c  if( pTerm->nChil
18850 64 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  d!=0 ) break;.  
18860 20 20 6e 4c 6f 6f 70 2b 2b 3b 0a 20 20 7d 0a 7d    nLoop++;.  }.}
18870 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20  ../*.** Code an 
18880 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 63 6f  OP_Affinity opco
18890 64 65 20 74 6f 20 61 70 70 6c 79 20 74 68 65 20  de to apply the 
188a0 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20  column affinity 
188b0 73 74 72 69 6e 67 20 7a 41 66 66 0a 2a 2a 20 74  string zAff.** t
188c0 6f 20 74 68 65 20 6e 20 72 65 67 69 73 74 65 72  o the n register
188d0 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 62 61  s starting at ba
188e0 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 41 73 20 61 6e  se. .**.** As an
188f0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 53   optimization, S
18900 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 65  QLITE_AFF_NONE e
18910 6e 74 72 69 65 73 20 28 77 68 69 63 68 20 61 72  ntries (which ar
18920 65 20 6e 6f 2d 6f 70 73 29 20 61 74 20 74 68 65  e no-ops) at the
18930 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e  .** beginning an
18940 64 20 65 6e 64 20 6f 66 20 7a 41 66 66 20 61 72  d end of zAff ar
18950 65 20 69 67 6e 6f 72 65 64 2e 20 20 49 66 20 61  e ignored.  If a
18960 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 20 7a 41  ll entries in zA
18970 66 66 20 61 72 65 0a 2a 2a 20 53 51 4c 49 54 45  ff are.** SQLITE
18980 5f 41 46 46 5f 4e 4f 4e 45 2c 20 74 68 65 6e 20  _AFF_NONE, then 
18990 6e 6f 20 63 6f 64 65 20 67 65 74 73 20 67 65 6e  no code gets gen
189a0 65 72 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  erated..**.** Th
189b0 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73  is routine makes
189c0 20 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66   its own copy of
189d0 20 7a 41 66 66 20 73 6f 20 74 68 61 74 20 74 68   zAff so that th
189e0 65 20 63 61 6c 6c 65 72 20 69 73 20 66 72 65 65  e caller is free
189f0 0a 2a 2a 20 74 6f 20 6d 6f 64 69 66 79 20 7a 41  .** to modify zA
18a00 66 66 20 61 66 74 65 72 20 74 68 69 73 20 72 6f  ff after this ro
18a10 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2e 0a 2a  utine returns..*
18a20 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
18a30 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28  deApplyAffinity(
18a40 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
18a50 6e 74 20 62 61 73 65 2c 20 69 6e 74 20 6e 2c 20  nt base, int n, 
18a60 63 68 61 72 20 2a 7a 41 66 66 29 7b 0a 20 20 56  char *zAff){.  V
18a70 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
18a80 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20 7a 41  >pVdbe;.  if( zA
18a90 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ff==0 ){.    ass
18aa0 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d  ert( pParse->db-
18ab0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
18ac0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
18ad0 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
18ae0 29 3b 0a 0a 20 20 2f 2a 20 41 64 6a 75 73 74 20  );..  /* Adjust 
18af0 62 61 73 65 20 61 6e 64 20 6e 20 74 6f 20 73 6b  base and n to sk
18b00 69 70 20 6f 76 65 72 20 53 51 4c 49 54 45 5f 41  ip over SQLITE_A
18b10 46 46 5f 4e 4f 4e 45 20 65 6e 74 72 69 65 73 20  FF_NONE entries 
18b20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
18b30 0a 20 20 2a 2a 20 61 6e 64 20 65 6e 64 20 6f 66  .  ** and end of
18b40 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73 74   the affinity st
18b50 72 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 77 68 69  ring..  */.  whi
18b60 6c 65 28 20 6e 3e 30 20 26 26 20 7a 41 66 66 5b  le( n>0 && zAff[
18b70 30 5d 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  0]==SQLITE_AFF_N
18b80 4f 4e 45 20 29 7b 0a 20 20 20 20 6e 2d 2d 3b 0a  ONE ){.    n--;.
18b90 20 20 20 20 62 61 73 65 2b 2b 3b 0a 20 20 20 20      base++;.    
18ba0 7a 41 66 66 2b 2b 3b 0a 20 20 7d 0a 20 20 77 68  zAff++;.  }.  wh
18bb0 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a 41 66 66  ile( n>1 && zAff
18bc0 5b 6e 2d 31 5d 3d 3d 53 51 4c 49 54 45 5f 41 46  [n-1]==SQLITE_AF
18bd0 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 6e 2d  F_NONE ){.    n-
18be0 2d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 64  -;.  }..  /* Cod
18bf0 65 20 74 68 65 20 4f 50 5f 41 66 66 69 6e 69 74  e the OP_Affinit
18c00 79 20 6f 70 63 6f 64 65 20 69 66 20 74 68 65 72  y opcode if ther
18c10 65 20 69 73 20 61 6e 79 74 68 69 6e 67 20 6c 65  e is anything le
18c20 66 74 20 74 6f 20 64 6f 2e 20 2a 2f 0a 20 20 69  ft to do. */.  i
18c30 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 73 71  f( n>0 ){.    sq
18c40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
18c50 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20  v, OP_Affinity, 
18c60 62 61 73 65 2c 20 6e 29 3b 0a 20 20 20 20 73 71  base, n);.    sq
18c70 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
18c80 34 28 76 2c 20 2d 31 2c 20 7a 41 66 66 2c 20 6e  4(v, -1, zAff, n
18c90 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
18ca0 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
18cb0 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 62 61  hange(pParse, ba
18cc0 73 65 2c 20 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  se, n);.  }.}...
18cd0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
18ce0 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  ode for a single
18cf0 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20 6f   equality term o
18d00 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
18d10 73 65 2e 20 20 41 6e 20 65 71 75 61 6c 69 74 79  se.  An equality
18d20 0a 2a 2a 20 74 65 72 6d 20 63 61 6e 20 62 65 20  .** term can be 
18d30 65 69 74 68 65 72 20 58 3d 65 78 70 72 20 6f 72  either X=expr or
18d40 20 58 20 49 4e 20 28 2e 2e 2e 29 2e 20 20 20 70   X IN (...).   p
18d50 54 65 72 6d 20 69 73 20 74 68 65 20 74 65 72 6d  Term is the term
18d60 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 64 65 64   to be .** coded
18d70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 75 72 72  ..**.** The curr
18d80 65 6e 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ent value for th
18d90 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20  e constraint is 
18da0 6c 65 66 74 20 69 6e 20 72 65 67 69 73 74 65 72  left in register
18db0 20 69 52 65 67 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72   iReg..**.** For
18dc0 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66   a constraint of
18dd0 20 74 68 65 20 66 6f 72 6d 20 58 3d 65 78 70 72   the form X=expr
18de0 2c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  , the expression
18df0 20 69 73 20 65 76 61 6c 75 61 74 65 64 20 61 6e   is evaluated an
18e00 64 20 69 74 73 0a 2a 2a 20 72 65 73 75 6c 74 20  d its.** result 
18e10 69 73 20 6c 65 66 74 20 6f 6e 20 74 68 65 20 73  is left on the s
18e20 74 61 63 6b 2e 20 20 46 6f 72 20 63 6f 6e 73 74  tack.  For const
18e30 72 61 69 6e 74 73 20 6f 66 20 74 68 65 20 66 6f  raints of the fo
18e40 72 6d 20 58 20 49 4e 20 28 2e 2e 2e 29 0a 2a 2a  rm X IN (...).**
18e50 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   this routine se
18e60 74 73 20 75 70 20 61 20 6c 6f 6f 70 20 74 68 61  ts up a loop tha
18e70 74 20 77 69 6c 6c 20 69 74 65 72 61 74 65 20 6f  t will iterate o
18e80 76 65 72 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f  ver all values o
18e90 66 20 58 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  f X..*/.static i
18ea0 6e 74 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54  nt codeEqualityT
18eb0 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50  erm(.  Parse *pP
18ec0 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68  arse,      /* Th
18ed0 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
18ee0 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  t */.  WhereTerm
18ef0 20 2a 70 54 65 72 6d 2c 20 20 20 2f 2a 20 54 68   *pTerm,   /* Th
18f00 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  e term of the WH
18f10 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65  ERE clause to be
18f20 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72   coded */.  Wher
18f30 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20  eLevel *pLevel, 
18f40 2f 2a 20 54 68 65 20 6c 65 76 65 6c 20 6f 66 20  /* The level of 
18f50 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
18f60 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f  we are working o
18f70 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 45 71 2c 20  n */.  int iEq, 
18f80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
18f90 64 65 78 20 6f 66 20 74 68 65 20 65 71 75 61 6c  dex of the equal
18fa0 69 74 79 20 74 65 72 6d 20 77 69 74 68 69 6e 20  ity term within 
18fb0 74 68 69 73 20 6c 65 76 65 6c 20 2a 2f 0a 20 20  this level */.  
18fc0 69 6e 74 20 62 52 65 76 2c 20 20 20 20 20 20 20  int bRev,       
18fd0 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
18fe0 72 65 76 65 72 73 65 2d 6f 72 64 65 72 20 49 4e  reverse-order IN
18ff0 20 6f 70 65 72 61 74 69 6f 6e 73 20 2a 2f 0a 20   operations */. 
19000 20 69 6e 74 20 69 54 61 72 67 65 74 20 20 20 20   int iTarget    
19010 20 20 20 20 20 2f 2a 20 41 74 74 65 6d 70 74 20       /* Attempt 
19020 74 6f 20 6c 65 61 76 65 20 72 65 73 75 6c 74 73  to leave results
19030 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65   in this registe
19040 72 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a  r */.){.  Expr *
19050 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pX = pTerm->pExp
19060 72 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  r;.  Vdbe *v = p
19070 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
19080 69 6e 74 20 69 52 65 67 3b 20 20 20 20 20 20 20  int iReg;       
19090 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
190a0 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72  gister holding r
190b0 65 73 75 6c 74 73 20 2a 2f 0a 0a 20 20 61 73 73  esults */..  ass
190c0 65 72 74 28 20 69 54 61 72 67 65 74 3e 30 20 29  ert( iTarget>0 )
190d0 3b 0a 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d  ;.  if( pX->op==
190e0 54 4b 5f 45 51 20 7c 7c 20 70 58 2d 3e 6f 70 3d  TK_EQ || pX->op=
190f0 3d 54 4b 5f 49 53 20 29 7b 0a 20 20 20 20 69 52  =TK_IS ){.    iR
19100 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
19110 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
19120 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 69  e, pX->pRight, i
19130 54 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65  Target);.  }else
19140 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f   if( pX->op==TK_
19150 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 52  ISNULL ){.    iR
19160 65 67 20 3d 20 69 54 61 72 67 65 74 3b 0a 20 20  eg = iTarget;.  
19170 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19180 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
19190 30 2c 20 69 52 65 67 29 3b 0a 23 69 66 6e 64 65  0, iReg);.#ifnde
191a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
191b0 42 51 55 45 52 59 0a 20 20 7d 65 6c 73 65 7b 0a  BQUERY.  }else{.
191c0 20 20 20 20 69 6e 74 20 65 54 79 70 65 3b 0a 20      int eType;. 
191d0 20 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 20     int iTab;.   
191e0 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a   struct InLoop *
191f0 70 49 6e 3b 0a 20 20 20 20 57 68 65 72 65 4c 6f  pIn;.    WhereLo
19200 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20 70 4c 65 76  op *pLoop = pLev
19210 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 0a 20 20 20  el->pWLoop;..   
19220 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
19230 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
19240 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 0a 20 20  TUALTABLE)==0.  
19250 20 20 20 20 26 26 20 70 4c 6f 6f 70 2d 3e 75 2e      && pLoop->u.
19260 62 74 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 0a  btree.pIndex!=0.
19270 20 20 20 20 20 20 26 26 20 70 4c 6f 6f 70 2d 3e        && pLoop->
19280 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e  u.btree.pIndex->
19290 61 53 6f 72 74 4f 72 64 65 72 5b 69 45 71 5d 0a  aSortOrder[iEq].
192a0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 74 65 73      ){.      tes
192b0 74 63 61 73 65 28 20 69 45 71 3d 3d 30 20 29 3b  tcase( iEq==0 );
192c0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
192d0 20 62 52 65 76 20 29 3b 0a 20 20 20 20 20 20 62   bRev );.      b
192e0 52 65 76 20 3d 20 21 62 52 65 76 3b 0a 20 20 20  Rev = !bRev;.   
192f0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
19300 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a  X->op==TK_IN );.
19310 20 20 20 20 69 52 65 67 20 3d 20 69 54 61 72 67      iReg = iTarg
19320 65 74 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20  et;.    eType = 
19330 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64  sqlite3FindInInd
19340 65 78 28 70 50 61 72 73 65 2c 20 70 58 2c 20 49  ex(pParse, pX, I
19350 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 2c 20 30 29  N_INDEX_LOOP, 0)
19360 3b 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d  ;.    if( eType=
19370 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f  =IN_INDEX_INDEX_
19380 44 45 53 43 20 29 7b 0a 20 20 20 20 20 20 74 65  DESC ){.      te
19390 73 74 63 61 73 65 28 20 62 52 65 76 20 29 3b 0a  stcase( bRev );.
193a0 20 20 20 20 20 20 62 52 65 76 20 3d 20 21 62 52        bRev = !bR
193b0 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 54  ev;.    }.    iT
193c0 61 62 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b  ab = pX->iTable;
193d0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
193e0 41 64 64 4f 70 32 28 76 2c 20 62 52 65 76 20 3f  AddOp2(v, bRev ?
193f0 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f 52 65   OP_Last : OP_Re
19400 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a  wind, iTab, 0);.
19410 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
19420 49 66 28 76 2c 20 62 52 65 76 29 3b 0a 20 20 20  If(v, bRev);.   
19430 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
19440 76 2c 20 21 62 52 65 76 29 3b 0a 20 20 20 20 61  v, !bRev);.    a
19450 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77  ssert( (pLoop->w
19460 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d  sFlags & WHERE_M
19470 55 4c 54 49 5f 4f 52 29 3d 3d 30 20 29 3b 0a 20  ULTI_OR)==0 );. 
19480 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67     pLoop->wsFlag
19490 73 20 7c 3d 20 57 48 45 52 45 5f 49 4e 5f 41 42  s |= WHERE_IN_AB
194a0 4c 45 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76  LE;.    if( pLev
194b0 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3d 3d 30 20  el->u.in.nIn==0 
194c0 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  ){.      pLevel-
194d0 3e 61 64 64 72 4e 78 74 20 3d 20 73 71 6c 69 74  >addrNxt = sqlit
194e0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
194f0 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  v);.    }.    pL
19500 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2b 2b  evel->u.in.nIn++
19510 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e  ;.    pLevel->u.
19520 69 6e 2e 61 49 6e 4c 6f 6f 70 20 3d 0a 20 20 20  in.aInLoop =.   
19530 20 20 20 20 73 71 6c 69 74 65 33 44 62 52 65 61      sqlite3DbRea
19540 6c 6c 6f 63 4f 72 46 72 65 65 28 70 50 61 72 73  llocOrFree(pPars
19550 65 2d 3e 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 75  e->db, pLevel->u
19560 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 2c 0a 20 20 20  .in.aInLoop,.   
19570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19580 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
19590 66 28 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61  f(pLevel->u.in.a
195a0 49 6e 4c 6f 6f 70 5b 30 5d 29 2a 70 4c 65 76 65  InLoop[0])*pLeve
195b0 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 29 3b 0a 20 20  l->u.in.nIn);.  
195c0 20 20 70 49 6e 20 3d 20 70 4c 65 76 65 6c 2d 3e    pIn = pLevel->
195d0 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 3b 0a 20 20  u.in.aInLoop;.  
195e0 20 20 69 66 28 20 70 49 6e 20 29 7b 0a 20 20 20    if( pIn ){.   
195f0 20 20 20 70 49 6e 20 2b 3d 20 70 4c 65 76 65 6c     pIn += pLevel
19600 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 2d 20 31 3b 0a  ->u.in.nIn - 1;.
19610 20 20 20 20 20 20 70 49 6e 2d 3e 69 43 75 72 20        pIn->iCur 
19620 3d 20 69 54 61 62 3b 0a 20 20 20 20 20 20 69 66  = iTab;.      if
19630 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45  ( eType==IN_INDE
19640 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20  X_ROWID ){.     
19650 20 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f     pIn->addrInTo
19660 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
19670 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69  ddOp2(v, OP_Rowi
19680 64 2c 20 69 54 61 62 2c 20 69 52 65 67 29 3b 0a  d, iTab, iReg);.
19690 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
196a0 20 20 20 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e       pIn->addrIn
196b0 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
196c0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
196d0 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 30 2c 20 69  lumn, iTab, 0, i
196e0 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Reg);.      }.  
196f0 20 20 20 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f      pIn->eEndLoo
19700 70 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f  pOp = bRev ? OP_
19710 50 72 65 76 49 66 4f 70 65 6e 20 3a 20 4f 50 5f  PrevIfOpen : OP_
19720 4e 65 78 74 49 66 4f 70 65 6e 3b 0a 20 20 20 20  NextIfOpen;.    
19730 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19740 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op1(v, OP_IsNull
19750 2c 20 69 52 65 67 29 3b 20 56 64 62 65 43 6f 76  , iReg); VdbeCov
19760 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 65  erage(v);.    }e
19770 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  lse{.      pLeve
19780 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 3d 20 30 3b  l->u.in.nIn = 0;
19790 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
197a0 7d 0a 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28  }.  disableTerm(
197b0 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a  pLevel, pTerm);.
197c0 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d    return iReg;.}
197d0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
197e0 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
197f0 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 3d 3d 20  evaluate all == 
19800 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e  and IN constrain
19810 74 73 20 66 6f 72 20 61 6e 0a 2a 2a 20 69 6e 64  ts for an.** ind
19820 65 78 20 73 63 61 6e 2e 0a 2a 2a 0a 2a 2a 20 46  ex scan..**.** F
19830 6f 72 20 65 78 61 6d 70 6c 65 2c 20 63 6f 6e 73  or example, cons
19840 69 64 65 72 20 74 61 62 6c 65 20 74 31 28 61 2c  ider table t1(a,
19850 62 2c 63 2c 64 2c 65 2c 66 29 20 77 69 74 68 20  b,c,d,e,f) with 
19860 69 6e 64 65 78 20 69 31 28 61 2c 62 2c 63 29 2e  index i1(a,b,c).
19870 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 20  .** Suppose the 
19880 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20  WHERE clause is 
19890 74 68 69 73 3a 20 20 61 3d 3d 35 20 41 4e 44 20  this:  a==5 AND 
198a0 62 20 49 4e 20 28 31 2c 32 2c 33 29 20 41 4e 44  b IN (1,2,3) AND
198b0 20 63 3e 35 20 41 4e 44 20 63 3c 31 30 0a 2a 2a   c>5 AND c<10.**
198c0 20 54 68 65 20 69 6e 64 65 78 20 68 61 73 20 61   The index has a
198d0 73 20 6d 61 6e 79 20 61 73 20 74 68 72 65 65 20  s many as three 
198e0 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
198f0 69 6e 74 73 2c 20 62 75 74 20 69 6e 20 74 68 69  ints, but in thi
19900 73 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 74 68  s.** example, th
19910 65 20 74 68 69 72 64 20 22 63 22 20 76 61 6c 75  e third "c" valu
19920 65 20 69 73 20 61 6e 20 69 6e 65 71 75 61 6c 69  e is an inequali
19930 74 79 2e 20 20 53 6f 20 6f 6e 6c 79 20 74 77 6f  ty.  So only two
19940 20 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73   .** constraints
19950 20 61 72 65 20 63 6f 64 65 64 2e 20 20 54 68 69   are coded.  Thi
19960 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 67  s routine will g
19970 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
19980 65 76 61 6c 75 61 74 65 0a 2a 2a 20 61 3d 3d 35  evaluate.** a==5
19990 20 61 6e 64 20 62 20 49 4e 20 28 31 2c 32 2c 33   and b IN (1,2,3
199a0 29 2e 20 20 54 68 65 20 63 75 72 72 65 6e 74 20  ).  The current 
199b0 76 61 6c 75 65 73 20 66 6f 72 20 61 20 61 6e 64  values for a and
199c0 20 62 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65   b will be store
199d0 64 0a 2a 2a 20 69 6e 20 63 6f 6e 73 65 63 75 74  d.** in consecut
199e0 69 76 65 20 72 65 67 69 73 74 65 72 73 20 61 6e  ive registers an
199f0 64 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  d the index of t
19a00 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65  he first registe
19a10 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  r is returned..*
19a20 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d  *.** In the exam
19a30 70 6c 65 20 61 62 6f 76 65 20 6e 45 71 3d 3d 32  ple above nEq==2
19a40 2e 20 20 42 75 74 20 74 68 69 73 20 73 75 62 72  .  But this subr
19a50 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 66 6f 72  outine works for
19a60 20 61 6e 79 20 76 61 6c 75 65 0a 2a 2a 20 6f 66   any value.** of
19a70 20 6e 45 71 20 69 6e 63 6c 75 64 69 6e 67 20 30   nEq including 0
19a80 2e 20 20 49 66 20 6e 45 71 3d 3d 30 2c 20 74 68  .  If nEq==0, th
19a90 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65  is routine is ne
19aa0 61 72 6c 79 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  arly a no-op..**
19ab0 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20   The only thing 
19ac0 69 74 20 64 6f 65 73 20 69 73 20 61 6c 6c 6f 63  it does is alloc
19ad0 61 74 65 20 74 68 65 20 70 4c 65 76 65 6c 2d 3e  ate the pLevel->
19ae0 69 4d 65 6d 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  iMem memory cell
19af0 20 61 6e 64 0a 2a 2a 20 63 6f 6d 70 75 74 65 20   and.** compute 
19b00 74 68 65 20 61 66 66 69 6e 69 74 79 20 73 74 72  the affinity str
19b10 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ing..**.** The n
19b20 45 78 74 72 61 52 65 67 20 70 61 72 61 6d 65 74  ExtraReg paramet
19b30 65 72 20 69 73 20 30 20 6f 72 20 31 2e 20 20 49  er is 0 or 1.  I
19b40 74 20 69 73 20 30 20 69 66 20 61 6c 6c 20 57 48  t is 0 if all WH
19b50 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74  ERE clause const
19b60 72 61 69 6e 74 73 0a 2a 2a 20 61 72 65 20 3d 3d  raints.** are ==
19b70 20 6f 72 20 49 4e 20 61 6e 64 20 61 72 65 20 63   or IN and are c
19b80 6f 76 65 72 65 64 20 62 79 20 74 68 65 20 6e 45  overed by the nE
19b90 71 2e 20 20 6e 45 78 74 72 61 52 65 67 20 69 73  q.  nExtraReg is
19ba0 20 31 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a   1 if there is.*
19bb0 2a 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20  * an inequality 
19bc0 63 6f 6e 73 74 72 61 69 6e 74 20 28 73 75 63 68  constraint (such
19bd0 20 61 73 20 74 68 65 20 22 63 3e 3d 35 20 41 4e   as the "c>=5 AN
19be0 44 20 63 3c 31 30 22 20 69 6e 20 74 68 65 20 65  D c<10" in the e
19bf0 78 61 6d 70 6c 65 29 20 74 68 61 74 0a 2a 2a 20  xample) that.** 
19c00 6f 63 63 75 72 73 20 61 66 74 65 72 20 74 68 65  occurs after the
19c10 20 6e 45 71 20 71 75 61 6c 69 74 79 20 63 6f 6e   nEq quality con
19c20 73 74 72 61 69 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20  straints..**.** 
19c30 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c  This routine all
19c40 6f 63 61 74 65 73 20 61 20 72 61 6e 67 65 20 6f  ocates a range o
19c50 66 20 6e 45 71 2b 6e 45 78 74 72 61 52 65 67 20  f nEq+nExtraReg 
19c60 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 6e 64  memory cells and
19c70 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20   returns.** the 
19c80 69 6e 64 65 78 20 6f 66 20 74 68 65 20 66 69 72  index of the fir
19c90 73 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69  st memory cell i
19ca0 6e 20 74 68 61 74 20 72 61 6e 67 65 2e 20 54 68  n that range. Th
19cb0 65 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 63  e code that.** c
19cc0 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
19cd0 65 20 77 69 6c 6c 20 75 73 65 20 74 68 61 74 20  e will use that 
19ce0 6d 65 6d 6f 72 79 20 72 61 6e 67 65 20 74 6f 20  memory range to 
19cf0 73 74 6f 72 65 20 6b 65 79 73 20 66 6f 72 0a 2a  store keys for.*
19d00 2a 20 73 74 61 72 74 20 61 6e 64 20 74 65 72 6d  * start and term
19d10 69 6e 61 74 69 6f 6e 20 63 6f 6e 64 69 74 69 6f  ination conditio
19d20 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a  ns of the loop..
19d30 2a 2a 20 6b 65 79 20 76 61 6c 75 65 20 6f 66 20  ** key value of 
19d40 74 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20 6f 6e  the loop.  If on
19d50 65 20 6f 72 20 6d 6f 72 65 20 49 4e 20 6f 70 65  e or more IN ope
19d60 72 61 74 6f 72 73 20 61 70 70 65 61 72 2c 20 74  rators appear, t
19d70 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  hen.** this rout
19d80 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e  ine allocates an
19d90 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 45 71 20   additional nEq 
19da0 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72  memory cells for
19db0 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75 73 65   internal.** use
19dc0 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72  ..**.** Before r
19dd0 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 41 66 66  eturning, *pzAff
19de0 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
19df0 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
19e00 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 63 6f 70  taining a.** cop
19e10 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  y of the column 
19e20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20  affinity string 
19e30 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6c 6c  of the index all
19e40 6f 63 61 74 65 64 20 75 73 69 6e 67 0a 2a 2a 20  ocated using.** 
19e50 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28  sqlite3DbMalloc(
19e60 29 2e 20 45 78 63 65 70 74 2c 20 65 6e 74 72 69  ). Except, entri
19e70 65 73 20 69 6e 20 74 68 65 20 63 6f 70 79 20 6f  es in the copy o
19e80 66 20 74 68 65 20 73 74 72 69 6e 67 20 61 73 73  f the string ass
19e90 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20  ociated.** with 
19ea0 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
19eb0 69 6e 74 73 20 74 68 61 74 20 75 73 65 20 4e 4f  ints that use NO
19ec0 4e 45 20 61 66 66 69 6e 69 74 79 20 61 72 65 20  NE affinity are 
19ed0 73 65 74 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45  set to.** SQLITE
19ee0 5f 41 46 46 5f 4e 4f 4e 45 2e 20 54 68 69 73 20  _AFF_NONE. This 
19ef0 69 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  is to deal with 
19f00 53 51 4c 20 73 75 63 68 20 61 73 20 74 68 65 20  SQL such as the 
19f10 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
19f20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
19f30 74 31 28 61 20 54 45 58 54 20 50 52 49 4d 41 52  t1(a TEXT PRIMAR
19f40 59 20 4b 45 59 2c 20 62 29 3b 0a 2a 2a 20 20 20  Y KEY, b);.**   
19f50 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
19f60 74 31 20 41 53 20 74 32 2c 20 74 31 20 57 48 45  t1 AS t2, t1 WHE
19f70 52 45 20 74 31 2e 61 20 3d 20 74 32 2e 62 3b 0a  RE t1.a = t2.b;.
19f80 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78 61  **.** In the exa
19f90 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74 68 65 20  mple above, the 
19fa0 69 6e 64 65 78 20 6f 6e 20 74 31 28 61 29 20 68  index on t1(a) h
19fb0 61 73 20 54 45 58 54 20 61 66 66 69 6e 69 74 79  as TEXT affinity
19fc0 2e 20 42 75 74 20 73 69 6e 63 65 0a 2a 2a 20 74  . But since.** t
19fd0 68 65 20 72 69 67 68 74 20 68 61 6e 64 20 73 69  he right hand si
19fe0 64 65 20 6f 66 20 74 68 65 20 65 71 75 61 6c 69  de of the equali
19ff0 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 74  ty constraint (t
1a000 32 2e 62 29 20 68 61 73 20 4e 4f 4e 45 20 61 66  2.b) has NONE af
1a010 66 69 6e 69 74 79 2c 0a 2a 2a 20 6e 6f 20 63 6f  finity,.** no co
1a020 6e 76 65 72 73 69 6f 6e 20 73 68 6f 75 6c 64 20  nversion should 
1a030 62 65 20 61 74 74 65 6d 70 74 65 64 20 62 65 66  be attempted bef
1a040 6f 72 65 20 75 73 69 6e 67 20 61 20 74 32 2e 62  ore using a t2.b
1a050 20 76 61 6c 75 65 20 61 73 20 70 61 72 74 20 6f   value as part o
1a060 66 0a 2a 2a 20 61 20 6b 65 79 20 74 6f 20 73 65  f.** a key to se
1a070 61 72 63 68 20 74 68 65 20 69 6e 64 65 78 2e 20  arch the index. 
1a080 48 65 6e 63 65 20 74 68 65 20 66 69 72 73 74 20  Hence the first 
1a090 62 79 74 65 20 69 6e 20 74 68 65 20 72 65 74 75  byte in the retu
1a0a0 72 6e 65 64 20 61 66 66 69 6e 69 74 79 0a 2a 2a  rned affinity.**
1a0b0 20 73 74 72 69 6e 67 20 69 6e 20 74 68 69 73 20   string in this 
1a0c0 65 78 61 6d 70 6c 65 20 77 6f 75 6c 64 20 62 65  example would be
1a0d0 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 41   set to SQLITE_A
1a0e0 46 46 5f 4e 4f 4e 45 2e 0a 2a 2f 0a 73 74 61 74  FF_NONE..*/.stat
1a0f0 69 63 20 69 6e 74 20 63 6f 64 65 41 6c 6c 45 71  ic int codeAllEq
1a100 75 61 6c 69 74 79 54 65 72 6d 73 28 0a 20 20 50  ualityTerms(.  P
1a110 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1a120 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
1a130 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
1a140 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c  reLevel *pLevel,
1a150 20 20 20 2f 2a 20 57 68 69 63 68 20 6e 65 73 74     /* Which nest
1a160 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 46  ed loop of the F
1a170 52 4f 4d 20 77 65 20 61 72 65 20 63 6f 64 69 6e  ROM we are codin
1a180 67 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c  g */.  int bRev,
1a190 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a1a0 52 65 76 65 72 73 65 20 74 68 65 20 6f 72 64 65  Reverse the orde
1a1b0 72 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72  r of IN operator
1a1c0 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  s */.  int nExtr
1a1d0 61 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  aReg,        /* 
1a1e0 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20  Number of extra 
1a1f0 72 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c  registers to all
1a200 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20  ocate */.  char 
1a210 2a 2a 70 7a 41 66 66 20 20 20 20 20 20 20 20 20  **pzAff         
1a220 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 74 6f 20   /* OUT: Set to 
1a230 70 6f 69 6e 74 20 74 6f 20 61 66 66 69 6e 69 74  point to affinit
1a240 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20  y string */.){. 
1a250 20 75 31 36 20 6e 45 71 3b 20 20 20 20 20 20 20   u16 nEq;       
1a260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a270 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
1a280 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61  == or IN constra
1a290 69 6e 74 73 20 74 6f 20 63 6f 64 65 20 2a 2f 0a  ints to code */.
1a2a0 20 20 75 31 36 20 6e 53 6b 69 70 3b 20 20 20 20    u16 nSkip;    
1a2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2c0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 66  /* Number of lef
1a2d0 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73 20 74  t-most columns t
1a2e0 6f 20 73 6b 69 70 20 2a 2f 0a 20 20 56 64 62 65  o skip */.  Vdbe
1a2f0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
1a300 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  dbe;      /* The
1a310 20 76 6d 20 75 6e 64 65 72 20 63 6f 6e 73 74 72   vm under constr
1a320 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65  uction */.  Inde
1a330 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
1a340 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1a350 20 69 6e 64 65 78 20 62 65 69 6e 67 20 75 73 65   index being use
1a360 64 20 66 6f 72 20 74 68 69 73 20 6c 6f 6f 70 20  d for this loop 
1a370 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
1a380 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
1a390 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 63     /* A single c
1a3a0 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 20 2a  onstraint term *
1a3b0 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
1a3c0 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
1a3d0 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f    /* The WhereLo
1a3e0 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  op object */.  i
1a3f0 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  nt j;           
1a400 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a410 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
1a420 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20    int regBase;  
1a430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a440 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74 65 72  /* Base register
1a450 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67 3b 20   */.  int nReg; 
1a460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a470 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1a480 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c   registers to al
1a490 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68 61 72  locate */.  char
1a4a0 20 2a 7a 41 66 66 3b 20 20 20 20 20 20 20 20 20   *zAff;         
1a4b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66            /* Aff
1a4c0 69 6e 69 74 79 20 73 74 72 69 6e 67 20 74 6f 20  inity string to 
1a4d0 72 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 2f 2a 20  return */..  /* 
1a4e0 54 68 69 73 20 6d 6f 64 75 6c 65 20 69 73 20 6f  This module is o
1a4f0 6e 6c 79 20 63 61 6c 6c 65 64 20 6f 6e 20 71 75  nly called on qu
1a500 65 72 79 20 70 6c 61 6e 73 20 74 68 61 74 20 75  ery plans that u
1a510 73 65 20 61 6e 20 69 6e 64 65 78 2e 20 2a 2f 0a  se an index. */.
1a520 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c    pLoop = pLevel
1a530 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 61 73 73 65  ->pWLoop;.  asse
1a540 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  rt( (pLoop->wsFl
1a550 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
1a560 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a  UALTABLE)==0 );.
1a570 20 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75    nEq = pLoop->u
1a580 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 6e 53  .btree.nEq;.  nS
1a590 6b 69 70 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 53 6b  kip = pLoop->nSk
1a5a0 69 70 3b 0a 20 20 70 49 64 78 20 3d 20 70 4c 6f  ip;.  pIdx = pLo
1a5b0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
1a5c0 65 78 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49  ex;.  assert( pI
1a5d0 64 78 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 46  dx!=0 );..  /* F
1a5e0 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
1a5f0 6e 79 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  ny memory cells 
1a600 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 68 65  we will need the
1a610 6e 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 6d 2e  n allocate them.
1a620 0a 20 20 2a 2f 0a 20 20 72 65 67 42 61 73 65 20  .  */.  regBase 
1a630 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b  = pParse->nMem +
1a640 20 31 3b 0a 20 20 6e 52 65 67 20 3d 20 70 4c 6f   1;.  nReg = pLo
1a650 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  op->u.btree.nEq 
1a660 2b 20 6e 45 78 74 72 61 52 65 67 3b 0a 20 20 70  + nExtraReg;.  p
1a670 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
1a680 52 65 67 3b 0a 0a 20 20 7a 41 66 66 20 3d 20 73  Reg;..  zAff = s
1a690 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 70  qlite3DbStrDup(p
1a6a0 50 61 72 73 65 2d 3e 64 62 2c 20 73 71 6c 69 74  Parse->db, sqlit
1a6b0 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53  e3IndexAffinityS
1a6c0 74 72 28 76 2c 20 70 49 64 78 29 29 3b 0a 20 20  tr(v, pIdx));.  
1a6d0 69 66 28 20 21 7a 41 66 66 20 29 7b 0a 20 20 20  if( !zAff ){.   
1a6e0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
1a6f0 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
1a700 20 7d 0a 0a 20 20 69 66 28 20 6e 53 6b 69 70 20   }..  if( nSkip 
1a710 29 7b 0a 20 20 20 20 69 6e 74 20 69 49 64 78 43  ){.    int iIdxC
1a720 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ur = pLevel->iId
1a730 78 43 75 72 3b 0a 20 20 20 20 73 71 6c 69 74 65  xCur;.    sqlite
1a740 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 28  3VdbeAddOp1(v, (
1a750 62 52 65 76 3f 4f 50 5f 4c 61 73 74 3a 4f 50 5f  bRev?OP_Last:OP_
1a760 52 65 77 69 6e 64 29 2c 20 69 49 64 78 43 75 72  Rewind), iIdxCur
1a770 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
1a780 61 67 65 49 66 28 76 2c 20 62 52 65 76 3d 3d 30  ageIf(v, bRev==0
1a790 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
1a7a0 61 67 65 49 66 28 76 2c 20 62 52 65 76 21 3d 30  ageIf(v, bRev!=0
1a7b0 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
1a7c0 6e 74 28 28 76 2c 20 22 62 65 67 69 6e 20 73 6b  nt((v, "begin sk
1a7d0 69 70 2d 73 63 61 6e 20 6f 6e 20 25 73 22 2c 20  ip-scan on %s", 
1a7e0 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pIdx->zName));. 
1a7f0 20 20 20 6a 20 3d 20 73 71 6c 69 74 65 33 56 64     j = sqlite3Vd
1a800 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47  beAddOp0(v, OP_G
1a810 6f 74 6f 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c  oto);.    pLevel
1a820 2d 3e 61 64 64 72 53 6b 69 70 20 3d 20 73 71 6c  ->addrSkip = sql
1a830 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
1a840 74 28 76 2c 20 28 62 52 65 76 3f 4f 50 5f 53 65  t(v, (bRev?OP_Se
1a850 65 6b 4c 54 3a 4f 50 5f 53 65 65 6b 47 54 29 2c  ekLT:OP_SeekGT),
1a860 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a870 20 20 20 20 20 20 20 20 20 20 20 20 20 69 49 64               iId
1a880 78 43 75 72 2c 20 30 2c 20 72 65 67 42 61 73 65  xCur, 0, regBase
1a890 2c 20 6e 53 6b 69 70 29 3b 0a 20 20 20 20 56 64  , nSkip);.    Vd
1a8a0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1a8b0 62 52 65 76 3d 3d 30 29 3b 0a 20 20 20 20 56 64  bRev==0);.    Vd
1a8c0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1a8d0 62 52 65 76 21 3d 30 29 3b 0a 20 20 20 20 73 71  bRev!=0);.    sq
1a8e0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
1a8f0 65 28 76 2c 20 6a 29 3b 0a 20 20 20 20 66 6f 72  e(v, j);.    for
1a900 28 6a 3d 30 3b 20 6a 3c 6e 53 6b 69 70 3b 20 6a  (j=0; j<nSkip; j
1a910 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
1a920 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
1a930 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43  OP_Column, iIdxC
1a940 75 72 2c 20 6a 2c 20 72 65 67 42 61 73 65 2b 6a  ur, j, regBase+j
1a950 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1a960 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
1a970 6a 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 56  j]>=0 );.      V
1a980 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
1a990 25 73 22 2c 20 70 49 64 78 2d 3e 70 54 61 62 6c  %s", pIdx->pTabl
1a9a0 65 2d 3e 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69  e->aCol[pIdx->ai
1a9b0 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65  Column[j]].zName
1a9c0 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20 20  ));.    }.  }   
1a9d0 20 0a 0a 20 20 2f 2a 20 45 76 61 6c 75 61 74 65   ..  /* Evaluate
1a9e0 20 74 68 65 20 65 71 75 61 6c 69 74 79 20 63 6f   the equality co
1a9f0 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 20  nstraints.  */. 
1aa00 20 61 73 73 65 72 74 28 20 7a 41 66 66 3d 3d 30   assert( zAff==0
1aa10 20 7c 7c 20 28 69 6e 74 29 73 74 72 6c 65 6e 28   || (int)strlen(
1aa20 7a 41 66 66 29 3e 3d 6e 45 71 20 29 3b 0a 20 20  zAff)>=nEq );.  
1aa30 66 6f 72 28 6a 3d 6e 53 6b 69 70 3b 20 6a 3c 6e  for(j=nSkip; j<n
1aa40 45 71 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 6e  Eq; j++){.    in
1aa50 74 20 72 31 3b 0a 20 20 20 20 70 54 65 72 6d 20  t r1;.    pTerm 
1aa60 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  = pLoop->aLTerm[
1aa70 6a 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  j];.    assert( 
1aa80 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20  pTerm!=0 );.    
1aa90 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
1aaa0 20 74 65 73 74 63 61 73 65 20 69 73 20 74 72 75   testcase is tru
1aab0 65 20 66 6f 72 20 69 6e 64 69 63 65 73 20 77 69  e for indices wi
1aac0 74 68 20 72 65 64 75 6e 64 61 6e 74 20 63 6f 6c  th redundant col
1aad0 75 6d 6e 73 2e 20 0a 20 20 20 20 2a 2a 20 45 78  umns. .    ** Ex
1aae0 3a 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69  : CREATE INDEX i
1aaf0 31 20 4f 4e 20 74 31 28 61 2c 62 2c 61 29 3b 20  1 ON t1(a,b,a); 
1ab00 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
1ab10 20 57 48 45 52 45 20 61 3d 30 20 41 4e 44 20 62   WHERE a=0 AND b
1ab20 3d 30 3b 20 2a 2f 0a 20 20 20 20 74 65 73 74 63  =0; */.    testc
1ab30 61 73 65 28 20 28 70 54 65 72 6d 2d 3e 77 74 46  ase( (pTerm->wtF
1ab40 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45  lags & TERM_CODE
1ab50 44 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73  D)!=0 );.    tes
1ab60 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74  tcase( pTerm->wt
1ab70 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
1ab80 54 55 41 4c 20 29 3b 0a 20 20 20 20 72 31 20 3d  TUAL );.    r1 =
1ab90 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72   codeEqualityTer
1aba0 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c  m(pParse, pTerm,
1abb0 20 70 4c 65 76 65 6c 2c 20 6a 2c 20 62 52 65 76   pLevel, j, bRev
1abc0 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20  , regBase+j);.  
1abd0 20 20 69 66 28 20 72 31 21 3d 72 65 67 42 61 73    if( r1!=regBas
1abe0 65 2b 6a 20 29 7b 0a 20 20 20 20 20 20 69 66 28  e+j ){.      if(
1abf0 20 6e 52 65 67 3d 3d 31 20 29 7b 0a 20 20 20 20   nReg==1 ){.    
1ac00 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
1ac10 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
1ac20 2c 20 72 65 67 42 61 73 65 29 3b 0a 20 20 20 20  , regBase);.    
1ac30 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 72 31      regBase = r1
1ac40 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1ac50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1ac60 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
1ac70 43 6f 70 79 2c 20 72 31 2c 20 72 65 67 42 61 73  Copy, r1, regBas
1ac80 65 2b 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  e+j);.      }.  
1ac90 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65    }.    testcase
1aca0 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
1acb0 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  or & WO_ISNULL )
1acc0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1acd0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
1ace0 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20   & WO_IN );.    
1acf0 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
1ad00 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55  rator & (WO_ISNU
1ad10 4c 4c 7c 57 4f 5f 49 4e 29 29 3d 3d 30 20 29 7b  LL|WO_IN))==0 ){
1ad20 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69  .      Expr *pRi
1ad30 67 68 74 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  ght = pTerm->pEx
1ad40 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
1ad50 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 77 74    if( (pTerm->wt
1ad60 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 49 53 29  Flags & TERM_IS)
1ad70 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33 45 78  ==0 && sqlite3Ex
1ad80 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 52 69 67  prCanBeNull(pRig
1ad90 68 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ht) ){.        s
1ada0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1adb0 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72  (v, OP_IsNull, r
1adc0 65 67 42 61 73 65 2b 6a 2c 20 70 4c 65 76 65 6c  egBase+j, pLevel
1add0 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20  ->addrBrk);.    
1ade0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1adf0 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (v);.      }.   
1ae00 20 20 20 69 66 28 20 7a 41 66 66 20 29 7b 0a 20     if( zAff ){. 
1ae10 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
1ae20 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
1ae30 79 28 70 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a  y(pRight, zAff[j
1ae40 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ])==SQLITE_AFF_N
1ae50 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ONE ){.         
1ae60 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54   zAff[j] = SQLIT
1ae70 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
1ae80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1ae90 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65  ( sqlite3ExprNee
1aea0 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e  dsNoAffinityChan
1aeb0 67 65 28 70 52 69 67 68 74 2c 20 7a 41 66 66 5b  ge(pRight, zAff[
1aec0 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  j]) ){.         
1aed0 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54   zAff[j] = SQLIT
1aee0 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
1aef0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1af00 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 7a 41 66 66    }.  }.  *pzAff
1af10 20 3d 20 7a 41 66 66 3b 0a 20 20 72 65 74 75 72   = zAff;.  retur
1af20 6e 20 72 65 67 42 61 73 65 3b 0a 7d 0a 0a 23 69  n regBase;.}..#i
1af30 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1af40 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20  T_EXPLAIN./*.** 
1af50 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1af60 61 20 68 65 6c 70 65 72 20 66 6f 72 20 65 78 70  a helper for exp
1af70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67 65 28 29  lainIndexRange()
1af80 20 62 65 6c 6f 77 0a 2a 2a 0a 2a 2a 20 70 53 74   below.**.** pSt
1af90 72 20 68 6f 6c 64 73 20 74 68 65 20 74 65 78 74  r holds the text
1afa0 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
1afb0 6e 20 74 68 61 74 20 77 65 20 61 72 65 20 62 75  n that we are bu
1afc0 69 6c 64 69 6e 67 20 75 70 20 6f 6e 65 20 74 65  ilding up one te
1afd0 72 6d 0a 2a 2a 20 61 74 20 61 20 74 69 6d 65 2e  rm.** at a time.
1afe0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61    This routine a
1aff0 64 64 73 20 61 20 6e 65 77 20 74 65 72 6d 20 74  dds a new term t
1b000 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
1b010 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20   expression..** 
1b020 54 65 72 6d 73 20 61 72 65 20 73 65 70 61 72 61  Terms are separa
1b030 74 65 64 20 62 79 20 41 4e 44 20 73 6f 20 61 64  ted by AND so ad
1b040 64 20 74 68 65 20 22 41 4e 44 22 20 74 65 78 74  d the "AND" text
1b050 20 66 6f 72 20 73 65 63 6f 6e 64 20 61 6e 64 20   for second and 
1b060 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 74 65  subsequent.** te
1b070 72 6d 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61  rms only..*/.sta
1b080 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e  tic void explain
1b090 41 70 70 65 6e 64 54 65 72 6d 28 0a 20 20 53 74  AppendTerm(.  St
1b0a0 72 41 63 63 75 6d 20 2a 70 53 74 72 2c 20 20 20  rAccum *pStr,   
1b0b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1b0c0 20 74 65 78 74 20 65 78 70 72 65 73 73 69 6f 6e   text expression
1b0d0 20 62 65 69 6e 67 20 62 75 69 6c 74 20 2a 2f 0a   being built */.
1b0e0 20 20 69 6e 74 20 69 54 65 72 6d 2c 20 20 20 20    int iTerm,    
1b0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b100 20 49 6e 64 65 78 20 6f 66 20 74 68 69 73 20 74   Index of this t
1b110 65 72 6d 2e 20 20 46 69 72 73 74 20 69 73 20 7a  erm.  First is z
1b120 65 72 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ero */.  const c
1b130 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 2c 20 20 20  har *zColumn,   
1b140 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1b150 74 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  the column */.  
1b160 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 20  const char *zOp 
1b170 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1b180 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61  ame of the opera
1b190 74 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  tor */.){.  if( 
1b1a0 69 54 65 72 6d 20 29 20 73 71 6c 69 74 65 33 53  iTerm ) sqlite3S
1b1b0 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53  trAccumAppend(pS
1b1c0 74 72 2c 20 22 20 41 4e 44 20 22 2c 20 35 29 3b  tr, " AND ", 5);
1b1d0 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
1b1e0 75 6d 41 70 70 65 6e 64 41 6c 6c 28 70 53 74 72  umAppendAll(pStr
1b1f0 2c 20 7a 43 6f 6c 75 6d 6e 29 3b 0a 20 20 73 71  , zColumn);.  sq
1b200 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
1b210 65 6e 64 28 70 53 74 72 2c 20 7a 4f 70 2c 20 31  end(pStr, zOp, 1
1b220 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41  );.  sqlite3StrA
1b230 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c  ccumAppend(pStr,
1b240 20 22 3f 22 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a   "?", 1);.}../*.
1b250 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 4c 65 76  ** Argument pLev
1b260 65 6c 20 64 65 73 63 72 69 62 65 73 20 61 20 73  el describes a s
1b270 74 72 61 74 65 67 79 20 66 6f 72 20 73 63 61 6e  trategy for scan
1b280 6e 69 6e 67 20 74 61 62 6c 65 20 70 54 61 62 2e  ning table pTab.
1b290 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   This .** functi
1b2a0 6f 6e 20 61 70 70 65 6e 64 73 20 74 65 78 74 20  on appends text 
1b2b0 74 6f 20 70 53 74 72 20 74 68 61 74 20 64 65 73  to pStr that des
1b2c0 63 72 69 62 65 73 20 74 68 65 20 73 75 62 73 65  cribes the subse
1b2d0 74 20 6f 66 20 74 61 62 6c 65 0a 2a 2a 20 72 6f  t of table.** ro
1b2e0 77 73 20 73 63 61 6e 6e 65 64 20 62 79 20 74 68  ws scanned by th
1b2f0 65 20 73 74 72 61 74 65 67 79 20 69 6e 20 74 68  e strategy in th
1b300 65 20 66 6f 72 6d 20 6f 66 20 61 6e 20 53 51 4c  e form of an SQL
1b310 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
1b320 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
1b330 69 66 20 74 68 65 20 71 75 65 72 79 3a 0a 2a 2a  if the query:.**
1b340 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46  .**   SELECT * F
1b350 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 31  ROM t1 WHERE a=1
1b360 20 41 4e 44 20 62 3e 32 3b 0a 2a 2a 0a 2a 2a 20   AND b>2;.**.** 
1b370 69 73 20 72 75 6e 20 61 6e 64 20 74 68 65 72 65  is run and there
1b380 20 69 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20   is an index on 
1b390 28 61 2c 20 62 29 2c 20 74 68 65 6e 20 74 68 69  (a, b), then thi
1b3a0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
1b3b0 6e 73 20 61 0a 2a 2a 20 73 74 72 69 6e 67 20 73  ns a.** string s
1b3c0 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a  imilar to:.**.**
1b3d0 20 20 20 22 61 3d 3f 20 41 4e 44 20 62 3e 3f 22     "a=? AND b>?"
1b3e0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1b3f0 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67  explainIndexRang
1b400 65 28 53 74 72 41 63 63 75 6d 20 2a 70 53 74 72  e(StrAccum *pStr
1b410 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f  , WhereLoop *pLo
1b420 6f 70 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29  op, Table *pTab)
1b430 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  {.  Index *pInde
1b440 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  x = pLoop->u.btr
1b450 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 75 31 36  ee.pIndex;.  u16
1b460 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e   nEq = pLoop->u.
1b470 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 75 31 36  btree.nEq;.  u16
1b480 20 6e 53 6b 69 70 20 3d 20 70 4c 6f 6f 70 2d 3e   nSkip = pLoop->
1b490 6e 53 6b 69 70 3b 0a 20 20 69 6e 74 20 69 2c 20  nSkip;.  int i, 
1b4a0 6a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f  j;.  Column *aCo
1b4b0 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 3b 0a  l = pTab->aCol;.
1b4c0 20 20 69 31 36 20 2a 61 69 43 6f 6c 75 6d 6e 20    i16 *aiColumn 
1b4d0 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  = pIndex->aiColu
1b4e0 6d 6e 3b 0a 0a 20 20 69 66 28 20 6e 45 71 3d 3d  mn;..  if( nEq==
1b4f0 30 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46  0 && (pLoop->wsF
1b500 6c 61 67 73 26 28 57 48 45 52 45 5f 42 54 4d 5f  lags&(WHERE_BTM_
1b510 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f  LIMIT|WHERE_TOP_
1b520 4c 49 4d 49 54 29 29 3d 3d 30 20 29 20 72 65 74  LIMIT))==0 ) ret
1b530 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 74  urn;.  sqlite3St
1b540 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74  rAccumAppend(pSt
1b550 72 2c 20 22 20 28 22 2c 20 32 29 3b 0a 20 20 66  r, " (", 2);.  f
1b560 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 71 3b 20 69  or(i=0; i<nEq; i
1b570 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ++){.    char *z
1b580 20 3d 20 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3c   = aiColumn[i] <
1b590 20 30 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 61   0 ? "rowid" : a
1b5a0 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d  Col[aiColumn[i]]
1b5b0 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20  .zName;.    if( 
1b5c0 69 3e 3d 6e 53 6b 69 70 20 29 7b 0a 20 20 20 20  i>=nSkip ){.    
1b5d0 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54    explainAppendT
1b5e0 65 72 6d 28 70 53 74 72 2c 20 69 2c 20 7a 2c 20  erm(pStr, i, z, 
1b5f0 22 3d 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  "=");.    }else{
1b600 0a 20 20 20 20 20 20 69 66 28 20 69 20 29 20 73  .      if( i ) s
1b610 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
1b620 70 65 6e 64 28 70 53 74 72 2c 20 22 20 41 4e 44  pend(pStr, " AND
1b630 20 22 2c 20 35 29 3b 0a 20 20 20 20 20 20 73 71   ", 5);.      sq
1b640 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70 53 74  lite3XPrintf(pSt
1b650 72 2c 20 30 2c 20 22 41 4e 59 28 25 73 29 22 2c  r, 0, "ANY(%s)",
1b660 20 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   z);.    }.  }..
1b670 20 20 6a 20 3d 20 69 3b 0a 20 20 69 66 28 20 70    j = i;.  if( p
1b680 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57 48  Loop->wsFlags&WH
1b690 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b  ERE_BTM_LIMIT ){
1b6a0 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61  .    char *z = a
1b6b0 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3c 20 30 20 3f  iColumn[j] < 0 ?
1b6c0 20 22 72 6f 77 69 64 22 20 3a 20 61 43 6f 6c 5b   "rowid" : aCol[
1b6d0 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61  aiColumn[j]].zNa
1b6e0 6d 65 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 41  me;.    explainA
1b6f0 70 70 65 6e 64 54 65 72 6d 28 70 53 74 72 2c 20  ppendTerm(pStr, 
1b700 69 2b 2b 2c 20 7a 2c 20 22 3e 22 29 3b 0a 20 20  i++, z, ">");.  
1b710 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77  }.  if( pLoop->w
1b720 73 46 6c 61 67 73 26 57 48 45 52 45 5f 54 4f 50  sFlags&WHERE_TOP
1b730 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 63 68  _LIMIT ){.    ch
1b740 61 72 20 2a 7a 20 3d 20 61 69 43 6f 6c 75 6d 6e  ar *z = aiColumn
1b750 5b 6a 5d 20 3c 20 30 20 3f 20 22 72 6f 77 69 64  [j] < 0 ? "rowid
1b760 22 20 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d  " : aCol[aiColum
1b770 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  n[j]].zName;.   
1b780 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65   explainAppendTe
1b790 72 6d 28 70 53 74 72 2c 20 69 2c 20 7a 2c 20 22  rm(pStr, i, z, "
1b7a0 3c 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  <");.  }.  sqlit
1b7b0 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
1b7c0 28 70 53 74 72 2c 20 22 29 22 2c 20 31 29 3b 0a  (pStr, ")", 1);.
1b7d0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1b7e0 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
1b7f0 70 20 75 6e 6c 65 73 73 20 63 75 72 72 65 6e 74  p unless current
1b800 6c 79 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e  ly processing an
1b810 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
1b820 4c 41 4e 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2c 20  LAN.** command, 
1b830 6f 72 20 69 66 20 65 69 74 68 65 72 20 53 51 4c  or if either SQL
1b840 49 54 45 5f 44 45 42 55 47 20 6f 72 20 53 51 4c  ITE_DEBUG or SQL
1b850 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f  ITE_ENABLE_STMT_
1b860 53 43 41 4e 53 54 41 54 55 53 20 77 61 73 0a 2a  SCANSTATUS was.*
1b870 2a 20 64 65 66 69 6e 65 64 20 61 74 20 63 6f 6d  * defined at com
1b880 70 69 6c 65 2d 74 69 6d 65 2e 20 49 66 20 69 74  pile-time. If it
1b890 20 69 73 20 6e 6f 74 20 61 20 6e 6f 2d 6f 70 2c   is not a no-op,
1b8a0 20 61 20 73 69 6e 67 6c 65 20 4f 50 5f 45 78 70   a single OP_Exp
1b8b0 6c 61 69 6e 20 6f 70 63 6f 64 65 20 0a 2a 2a 20  lain opcode .** 
1b8c0 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
1b8d0 6f 75 74 70 75 74 20 74 6f 20 64 65 73 63 72 69  output to descri
1b8e0 62 65 20 74 68 65 20 74 61 62 6c 65 20 73 63 61  be the table sca
1b8f0 6e 20 73 74 72 61 74 65 67 79 20 69 6e 20 70 4c  n strategy in pL
1b900 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  evel..**.** If a
1b910 6e 20 4f 50 5f 45 78 70 6c 61 69 6e 20 6f 70 63  n OP_Explain opc
1b920 6f 64 65 20 69 73 20 61 64 64 65 64 20 74 6f 20  ode is added to 
1b930 74 68 65 20 56 4d 2c 20 69 74 73 20 61 64 64 72  the VM, its addr
1b940 65 73 73 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ess is returned.
1b950 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
1b960 66 20 6e 6f 20 4f 50 5f 45 78 70 6c 61 69 6e 20  f no OP_Explain 
1b970 69 73 20 63 6f 64 65 64 2c 20 7a 65 72 6f 20 69  is coded, zero i
1b980 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
1b990 74 61 74 69 63 20 69 6e 74 20 65 78 70 6c 61 69  tatic int explai
1b9a0 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 50 61 72 73  nOneScan(.  Pars
1b9b0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
1b9c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1b9d0 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
1b9e0 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
1b9f0 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ist,            
1ba00 20 20 2f 2a 20 54 61 62 6c 65 20 6c 69 73 74 20    /* Table list 
1ba10 74 68 69 73 20 6c 6f 6f 70 20 72 65 66 65 72 73  this loop refers
1ba20 20 74 6f 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65   to */.  WhereLe
1ba30 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20 20  vel *pLevel,    
1ba40 20 20 20 20 20 20 20 20 20 2f 2a 20 53 63 61 6e           /* Scan
1ba50 20 74 6f 20 77 72 69 74 65 20 4f 50 5f 45 78 70   to write OP_Exp
1ba60 6c 61 69 6e 20 6f 70 63 6f 64 65 20 66 6f 72 20  lain opcode for 
1ba70 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c  */.  int iLevel,
1ba80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba90 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f       /* Value fo
1baa0 72 20 22 6c 65 76 65 6c 22 20 63 6f 6c 75 6d 6e  r "level" column
1bab0 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20   of output */.  
1bac0 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20  int iFrom,      
1bad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bae0 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 66 72  /* Value for "fr
1baf0 6f 6d 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75  om" column of ou
1bb00 74 70 75 74 20 2a 2f 0a 20 20 75 31 36 20 77 63  tput */.  u16 wc
1bb10 74 72 6c 46 6c 61 67 73 20 20 20 20 20 20 20 20  trlFlags        
1bb20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
1bb30 67 73 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c  gs passed to sql
1bb40 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
1bb50 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 65 74   */.){.  int ret
1bb60 20 3d 20 30 3b 0a 23 69 66 20 21 64 65 66 69 6e   = 0;.#if !defin
1bb70 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
1bb80 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
1bb90 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f  ITE_ENABLE_STMT_
1bba0 53 43 41 4e 53 54 41 54 55 53 29 0a 20 20 69 66  SCANSTATUS).  if
1bbb0 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
1bbc0 6e 3d 3d 32 20 29 0a 23 65 6e 64 69 66 0a 20 20  n==2 ).#endif.  
1bbd0 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  {.    struct Src
1bbe0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1bbf0 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
1bc00 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a  pLevel->iFrom];.
1bc10 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50      Vdbe *v = pP
1bc20 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20  arse->pVdbe;    
1bc30 20 20 2f 2a 20 56 4d 20 62 65 69 6e 67 20 63 6f    /* VM being co
1bc40 6e 73 74 72 75 63 74 65 64 20 2a 2f 0a 20 20 20  nstructed */.   
1bc50 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1bc60 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 2f  Parse->db;     /
1bc70 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
1bc80 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64  e */.    int iId
1bc90 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65   = pParse->iSele
1bca0 63 74 49 64 3b 20 20 2f 2a 20 53 65 6c 65 63 74  ctId;  /* Select
1bcb0 20 69 64 20 28 6c 65 66 74 2d 6d 6f 73 74 20 6f   id (left-most o
1bcc0 75 74 70 75 74 20 63 6f 6c 75 6d 6e 29 20 2a 2f  utput column) */
1bcd0 0a 20 20 20 20 69 6e 74 20 69 73 53 65 61 72 63  .    int isSearc
1bce0 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
1bcf0 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
1bd00 20 53 45 41 52 43 48 2e 20 46 61 6c 73 65 20 66   SEARCH. False f
1bd10 6f 72 20 53 43 41 4e 2e 20 2a 2f 0a 20 20 20 20  or SCAN. */.    
1bd20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
1bd30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1bd40 20 54 68 65 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67   The controlling
1bd50 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
1bd60 74 20 2a 2f 0a 20 20 20 20 75 33 32 20 66 6c 61  t */.    u32 fla
1bd70 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
1bd80 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
1bd90 74 68 61 74 20 64 65 73 63 72 69 62 65 20 74 68  that describe th
1bda0 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 63  is loop */.    c
1bdb0 68 61 72 20 2a 7a 4d 73 67 3b 20 20 20 20 20 20  har *zMsg;      
1bdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bdd0 54 65 78 74 20 74 6f 20 61 64 64 20 74 6f 20 45  Text to add to E
1bde0 51 50 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20  QP output */.   
1bdf0 20 53 74 72 41 63 63 75 6d 20 73 74 72 3b 20 20   StrAccum str;  
1be00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1be10 2a 20 45 51 50 20 6f 75 74 70 75 74 20 73 74 72  * EQP output str
1be20 69 6e 67 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  ing */.    char 
1be30 7a 42 75 66 5b 31 30 30 5d 3b 20 20 20 20 20 20  zBuf[100];      
1be40 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
1be50 69 61 6c 20 73 70 61 63 65 20 66 6f 72 20 45 51  ial space for EQ
1be60 50 20 6f 75 74 70 75 74 20 73 74 72 69 6e 67 20  P output string 
1be70 2a 2f 0a 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20  */..    pLoop = 
1be80 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a  pLevel->pWLoop;.
1be90 20 20 20 20 66 6c 61 67 73 20 3d 20 70 4c 6f 6f      flags = pLoo
1bea0 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20  p->wsFlags;.    
1beb0 69 66 28 20 28 66 6c 61 67 73 26 57 48 45 52 45  if( (flags&WHERE
1bec0 5f 4d 55 4c 54 49 5f 4f 52 29 20 7c 7c 20 28 77  _MULTI_OR) || (w
1bed0 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f  ctrlFlags&WHERE_
1bee0 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20 29  ONETABLE_ONLY) )
1bef0 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 20 20   return 0;..    
1bf00 69 73 53 65 61 72 63 68 20 3d 20 28 66 6c 61 67  isSearch = (flag
1bf10 73 26 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d  s&(WHERE_BTM_LIM
1bf20 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d  IT|WHERE_TOP_LIM
1bf30 49 54 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20  IT))!=0.        
1bf40 20 20 20 20 7c 7c 20 28 28 66 6c 61 67 73 26 57      || ((flags&W
1bf50 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
1bf60 45 29 3d 3d 30 20 26 26 20 28 70 4c 6f 6f 70 2d  E)==0 && (pLoop-
1bf70 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3e 30 29 29  >u.btree.nEq>0))
1bf80 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
1bf90 28 77 63 74 72 6c 46 6c 61 67 73 26 28 57 48 45  (wctrlFlags&(WHE
1bfa0 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 7c 57  RE_ORDERBY_MIN|W
1bfb0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58  HERE_ORDERBY_MAX
1bfc0 29 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  ));..    sqlite3
1bfd0 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26 73 74  StrAccumInit(&st
1bfe0 72 2c 20 64 62 2c 20 7a 42 75 66 2c 20 73 69 7a  r, db, zBuf, siz
1bff0 65 6f 66 28 7a 42 75 66 29 2c 20 53 51 4c 49 54  eof(zBuf), SQLIT
1c000 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 29 3b 0a 20  E_MAX_LENGTH);. 
1c010 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63     sqlite3StrAcc
1c020 75 6d 41 70 70 65 6e 64 41 6c 6c 28 26 73 74 72  umAppendAll(&str
1c030 2c 20 69 73 53 65 61 72 63 68 20 3f 20 22 53 45  , isSearch ? "SE
1c040 41 52 43 48 22 20 3a 20 22 53 43 41 4e 22 29 3b  ARCH" : "SCAN");
1c050 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  .    if( pItem->
1c060 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
1c070 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28   sqlite3XPrintf(
1c080 26 73 74 72 2c 20 30 2c 20 22 20 53 55 42 51 55  &str, 0, " SUBQU
1c090 45 52 59 20 25 64 22 2c 20 70 49 74 65 6d 2d 3e  ERY %d", pItem->
1c0a0 69 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  iSelectId);.    
1c0b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
1c0c0 69 74 65 33 58 50 72 69 6e 74 66 28 26 73 74 72  ite3XPrintf(&str
1c0d0 2c 20 30 2c 20 22 20 54 41 42 4c 45 20 25 73 22  , 0, " TABLE %s"
1c0e0 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  , pItem->zName);
1c0f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
1c100 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b  pItem->zAlias ){
1c110 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50  .      sqlite3XP
1c120 72 69 6e 74 66 28 26 73 74 72 2c 20 30 2c 20 22  rintf(&str, 0, "
1c130 20 41 53 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e   AS %s", pItem->
1c140 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 7d 0a 20  zAlias);.    }. 
1c150 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20     if( (flags & 
1c160 28 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52 45  (WHERE_IPK|WHERE
1c170 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 29 3d  _VIRTUALTABLE))=
1c180 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  =0 ){.      cons
1c190 74 20 63 68 61 72 20 2a 7a 46 6d 74 20 3d 20 30  t char *zFmt = 0
1c1a0 3b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  ;.      Index *p
1c1b0 49 64 78 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  Idx;..      asse
1c1c0 72 74 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  rt( pLoop->u.btr
1c1d0 65 65 2e 70 49 6e 64 65 78 21 3d 30 20 29 3b 0a  ee.pIndex!=0 );.
1c1e0 20 20 20 20 20 20 70 49 64 78 20 3d 20 70 4c 6f        pIdx = pLo
1c1f0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
1c200 65 78 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ex;.      assert
1c210 28 20 21 28 66 6c 61 67 73 26 57 48 45 52 45 5f  ( !(flags&WHERE_
1c220 41 55 54 4f 5f 49 4e 44 45 58 29 20 7c 7c 20 28  AUTO_INDEX) || (
1c230 66 6c 61 67 73 26 57 48 45 52 45 5f 49 44 58 5f  flags&WHERE_IDX_
1c240 4f 4e 4c 59 29 20 29 3b 0a 20 20 20 20 20 20 69  ONLY) );.      i
1c250 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 49 74  f( !HasRowid(pIt
1c260 65 6d 2d 3e 70 54 61 62 29 20 26 26 20 49 73 50  em->pTab) && IsP
1c270 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
1c280 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Idx) ){.        
1c290 69 66 28 20 69 73 53 65 61 72 63 68 20 29 7b 0a  if( isSearch ){.
1c2a0 20 20 20 20 20 20 20 20 20 20 7a 46 6d 74 20 3d            zFmt =
1c2b0 20 22 50 52 49 4d 41 52 59 20 4b 45 59 22 3b 0a   "PRIMARY KEY";.
1c2c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1c2d0 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20  }else if( flags 
1c2e0 26 20 57 48 45 52 45 5f 50 41 52 54 49 41 4c 49  & WHERE_PARTIALI
1c2f0 44 58 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 46  DX ){.        zF
1c300 6d 74 20 3d 20 22 41 55 54 4f 4d 41 54 49 43 20  mt = "AUTOMATIC 
1c310 50 41 52 54 49 41 4c 20 43 4f 56 45 52 49 4e 47  PARTIAL COVERING
1c320 20 49 4e 44 45 58 22 3b 0a 20 20 20 20 20 20 7d   INDEX";.      }
1c330 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
1c340 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
1c350 58 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 46 6d  X ){.        zFm
1c360 74 20 3d 20 22 41 55 54 4f 4d 41 54 49 43 20 43  t = "AUTOMATIC C
1c370 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 22 3b 0a  OVERING INDEX";.
1c380 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1c390 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  flags & WHERE_ID
1c3a0 58 5f 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20  X_ONLY ){.      
1c3b0 20 20 7a 46 6d 74 20 3d 20 22 43 4f 56 45 52 49    zFmt = "COVERI
1c3c0 4e 47 20 49 4e 44 45 58 20 25 73 22 3b 0a 20 20  NG INDEX %s";.  
1c3d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c3e0 20 20 20 7a 46 6d 74 20 3d 20 22 49 4e 44 45 58     zFmt = "INDEX
1c3f0 20 25 73 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20   %s";.      }.  
1c400 20 20 20 20 69 66 28 20 7a 46 6d 74 20 29 7b 0a      if( zFmt ){.
1c410 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
1c420 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 73  trAccumAppend(&s
1c430 74 72 2c 20 22 20 55 53 49 4e 47 20 22 2c 20 37  tr, " USING ", 7
1c440 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1c450 65 33 58 50 72 69 6e 74 66 28 26 73 74 72 2c 20  e3XPrintf(&str, 
1c460 30 2c 20 7a 46 6d 74 2c 20 70 49 64 78 2d 3e 7a  0, zFmt, pIdx->z
1c470 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 65  Name);.        e
1c480 78 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67 65  xplainIndexRange
1c490 28 26 73 74 72 2c 20 70 4c 6f 6f 70 2c 20 70 49  (&str, pLoop, pI
1c4a0 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20  tem->pTab);.    
1c4b0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
1c4c0 28 20 28 66 6c 61 67 73 20 26 20 57 48 45 52 45  ( (flags & WHERE
1c4d0 5f 49 50 4b 29 21 3d 30 20 26 26 20 28 66 6c 61  _IPK)!=0 && (fla
1c4e0 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4e 53 54  gs & WHERE_CONST
1c4f0 52 41 49 4e 54 29 21 3d 30 20 29 7b 0a 20 20 20  RAINT)!=0 ){.   
1c500 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1c510 52 61 6e 67 65 3b 0a 20 20 20 20 20 20 69 66 28  Range;.      if(
1c520 20 66 6c 61 67 73 26 28 57 48 45 52 45 5f 43 4f   flags&(WHERE_CO
1c530 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 43 4f  LUMN_EQ|WHERE_CO
1c540 4c 55 4d 4e 5f 49 4e 29 20 29 7b 0a 20 20 20 20  LUMN_IN) ){.    
1c550 20 20 20 20 7a 52 61 6e 67 65 20 3d 20 22 28 72      zRange = "(r
1c560 6f 77 69 64 3d 3f 29 22 3b 0a 20 20 20 20 20 20  owid=?)";.      
1c570 7d 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73  }else if( (flags
1c580 26 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49  &WHERE_BOTH_LIMI
1c590 54 29 3d 3d 57 48 45 52 45 5f 42 4f 54 48 5f 4c  T)==WHERE_BOTH_L
1c5a0 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 20 20  IMIT ){.        
1c5b0 7a 52 61 6e 67 65 20 3d 20 22 28 72 6f 77 69 64  zRange = "(rowid
1c5c0 3e 3f 20 41 4e 44 20 72 6f 77 69 64 3c 3f 29 22  >? AND rowid<?)"
1c5d0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1c5e0 28 20 66 6c 61 67 73 26 57 48 45 52 45 5f 42 54  ( flags&WHERE_BT
1c5f0 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20  M_LIMIT ){.     
1c600 20 20 20 7a 52 61 6e 67 65 20 3d 20 22 28 72 6f     zRange = "(ro
1c610 77 69 64 3e 3f 29 22 3b 0a 20 20 20 20 20 20 7d  wid>?)";.      }
1c620 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
1c630 73 65 72 74 28 20 66 6c 61 67 73 26 57 48 45 52  sert( flags&WHER
1c640 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3b 0a 20 20  E_TOP_LIMIT);.  
1c650 20 20 20 20 20 20 7a 52 61 6e 67 65 20 3d 20 22        zRange = "
1c660 28 72 6f 77 69 64 3c 3f 29 22 3b 0a 20 20 20 20  (rowid<?)";.    
1c670 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1c680 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 41  3StrAccumAppendA
1c690 6c 6c 28 26 73 74 72 2c 20 22 20 55 53 49 4e 47  ll(&str, " USING
1c6a0 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
1c6b0 20 4b 45 59 20 22 29 3b 0a 20 20 20 20 20 20 73   KEY ");.      s
1c6c0 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
1c6d0 70 65 6e 64 41 6c 6c 28 26 73 74 72 2c 20 7a 52  pendAll(&str, zR
1c6e0 61 6e 67 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66  ange);.    }.#if
1c6f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1c700 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
1c710 20 20 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67    else if( (flag
1c720 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
1c730 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20  LTABLE)!=0 ){.  
1c740 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
1c750 74 66 28 26 73 74 72 2c 20 30 2c 20 22 20 56 49  tf(&str, 0, " VI
1c760 52 54 55 41 4c 20 54 41 42 4c 45 20 49 4e 44 45  RTUAL TABLE INDE
1c770 58 20 25 64 3a 25 73 22 2c 0a 20 20 20 20 20 20  X %d:%s",.      
1c780 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f              pLoo
1c790 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d  p->u.vtab.idxNum
1c7a0 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e  , pLoop->u.vtab.
1c7b0 69 64 78 53 74 72 29 3b 0a 20 20 20 20 7d 0a 23  idxStr);.    }.#
1c7c0 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
1c7d0 49 54 45 5f 45 58 50 4c 41 49 4e 5f 45 53 54 49  ITE_EXPLAIN_ESTI
1c7e0 4d 41 54 45 44 5f 52 4f 57 53 0a 20 20 20 20 69  MATED_ROWS.    i
1c7f0 66 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3e 3d  f( pLoop->nOut>=
1c800 31 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  10 ){.      sqli
1c810 74 65 33 58 50 72 69 6e 74 66 28 26 73 74 72 2c  te3XPrintf(&str,
1c820 20 30 2c 20 22 20 28 7e 25 6c 6c 75 20 72 6f 77   0, " (~%llu row
1c830 73 29 22 2c 20 73 71 6c 69 74 65 33 4c 6f 67 45  s)", sqlite3LogE
1c840 73 74 54 6f 49 6e 74 28 70 4c 6f 6f 70 2d 3e 6e  stToInt(pLoop->n
1c850 4f 75 74 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Out));.    }else
1c860 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
1c870 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 73  trAccumAppend(&s
1c880 74 72 2c 20 22 20 28 7e 31 20 72 6f 77 29 22 2c  tr, " (~1 row)",
1c890 20 39 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69   9);.    }.#endi
1c8a0 66 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c  f.    zMsg = sql
1c8b0 69 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69  ite3StrAccumFini
1c8c0 73 68 28 26 73 74 72 29 3b 0a 20 20 20 20 72 65  sh(&str);.    re
1c8d0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
1c8e0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c  ddOp4(v, OP_Expl
1c8f0 61 69 6e 2c 20 69 49 64 2c 20 69 4c 65 76 65 6c  ain, iId, iLevel
1c900 2c 20 69 46 72 6f 6d 2c 20 7a 4d 73 67 2c 50 34  , iFrom, zMsg,P4
1c910 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 20  _DYNAMIC);.  }. 
1c920 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 23   return ret;.}.#
1c930 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 65 78  else.# define ex
1c940 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 75 2c 76  plainOneScan(u,v
1c950 2c 77 2c 78 2c 79 2c 7a 29 20 30 0a 23 65 6e 64  ,w,x,y,z) 0.#end
1c960 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1c970 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69  T_EXPLAIN */..#i
1c980 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1c990 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54  LE_STMT_SCANSTAT
1c9a0 55 53 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75  US./*.** Configu
1c9b0 72 65 20 74 68 65 20 56 4d 20 70 61 73 73 65 64  re the VM passed
1c9c0 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
1c9d0 67 75 6d 65 6e 74 20 77 69 74 68 20 61 6e 0a 2a  gument with an.*
1c9e0 2a 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  * sqlite3_stmt_s
1c9f0 63 61 6e 73 74 61 74 75 73 28 29 20 65 6e 74 72  canstatus() entr
1ca00 79 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  y corresponding 
1ca10 74 6f 20 74 68 65 20 73 63 61 6e 20 75 73 65 64  to the scan used
1ca20 20 74 6f 20 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e   to .** implemen
1ca30 74 20 6c 65 76 65 6c 20 70 4c 76 6c 2e 20 41 72  t level pLvl. Ar
1ca40 67 75 6d 65 6e 74 20 70 53 72 63 6c 69 73 74 20  gument pSrclist 
1ca50 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
1ca60 74 68 65 20 46 52 4f 4d 20 0a 2a 2a 20 63 6c 61  the FROM .** cla
1ca70 75 73 65 20 74 68 61 74 20 74 68 65 20 73 63 61  use that the sca
1ca80 6e 20 72 65 61 64 73 20 64 61 74 61 20 66 72 6f  n reads data fro
1ca90 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75  m..**.** If argu
1caa0 6d 65 6e 74 20 61 64 64 72 45 78 70 6c 61 69 6e  ment addrExplain
1cab0 20 69 73 20 6e 6f 74 20 30 2c 20 69 74 20 6d 75   is not 0, it mu
1cac0 73 74 20 62 65 20 74 68 65 20 61 64 64 72 65 73  st be the addres
1cad0 73 20 6f 66 20 61 6e 20 0a 2a 2a 20 4f 50 5f 45  s of an .** OP_E
1cae0 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69  xplain instructi
1caf0 6f 6e 20 74 68 61 74 20 64 65 73 63 72 69 62 65  on that describe
1cb00 73 20 74 68 65 20 73 61 6d 65 20 6c 6f 6f 70 2e  s the same loop.
1cb10 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1cb20 61 64 64 53 63 61 6e 53 74 61 74 75 73 28 0a 20  addScanStatus(. 
1cb30 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20   Vdbe *v,       
1cb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb50 20 2f 2a 20 56 64 62 65 20 74 6f 20 61 64 64 20   /* Vdbe to add 
1cb60 73 63 61 6e 73 74 61 74 75 73 20 65 6e 74 72 79  scanstatus entry
1cb70 20 74 6f 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74   to */.  SrcList
1cb80 20 2a 70 53 72 63 6c 69 73 74 2c 20 20 20 20 20   *pSrclist,     
1cb90 20 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d           /* FROM
1cba0 20 63 6c 61 75 73 65 20 70 4c 76 6c 20 72 65 61   clause pLvl rea
1cbb0 64 73 20 64 61 74 61 20 66 72 6f 6d 20 2a 2f 0a  ds data from */.
1cbc0 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
1cbd0 76 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  vl,             
1cbe0 20 20 2f 2a 20 4c 65 76 65 6c 20 74 6f 20 61 64    /* Level to ad
1cbf0 64 20 73 63 61 6e 73 74 61 74 75 73 28 29 20 65  d scanstatus() e
1cc00 6e 74 72 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e  ntry for */.  in
1cc10 74 20 61 64 64 72 45 78 70 6c 61 69 6e 20 20 20  t addrExplain   
1cc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1cc30 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 45   Address of OP_E
1cc40 78 70 6c 61 69 6e 20 28 6f 72 20 30 29 20 2a 2f  xplain (or 0) */
1cc50 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
1cc60 20 2a 7a 4f 62 6a 20 3d 20 30 3b 0a 20 20 57 68   *zObj = 0;.  Wh
1cc70 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d  ereLoop *pLoop =
1cc80 20 70 4c 76 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20   pLvl->pWLoop;. 
1cc90 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
1cca0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
1ccb0 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 20 26  TUALTABLE)==0  &
1ccc0 26 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  &  pLoop->u.btre
1ccd0 65 2e 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20  e.pIndex!=0 ){. 
1cce0 20 20 20 7a 4f 62 6a 20 3d 20 70 4c 6f 6f 70 2d     zObj = pLoop-
1ccf0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d  >u.btree.pIndex-
1cd00 3e 7a 4e 61 6d 65 3b 0a 20 20 7d 65 6c 73 65 7b  >zName;.  }else{
1cd10 0a 20 20 20 20 7a 4f 62 6a 20 3d 20 70 53 72 63  .    zObj = pSrc
1cd20 6c 69 73 74 2d 3e 61 5b 70 4c 76 6c 2d 3e 69 46  list->a[pLvl->iF
1cd30 72 6f 6d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a  rom].zName;.  }.
1cd40 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 63 61    sqlite3VdbeSca
1cd50 6e 53 74 61 74 75 73 28 0a 20 20 20 20 20 20 76  nStatus(.      v
1cd60 2c 20 61 64 64 72 45 78 70 6c 61 69 6e 2c 20 70  , addrExplain, p
1cd70 4c 76 6c 2d 3e 61 64 64 72 42 6f 64 79 2c 20 70  Lvl->addrBody, p
1cd80 4c 76 6c 2d 3e 61 64 64 72 56 69 73 69 74 2c 20  Lvl->addrVisit, 
1cd90 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 2c 20 7a 4f 62  pLoop->nOut, zOb
1cda0 6a 0a 20 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  j.  );.}.#else.#
1cdb0 20 64 65 66 69 6e 65 20 61 64 64 53 63 61 6e 53   define addScanS
1cdc0 74 61 74 75 73 28 61 2c 20 62 2c 20 63 2c 20 64  tatus(a, b, c, d
1cdd0 29 20 28 28 76 6f 69 64 29 64 29 0a 23 65 6e 64  ) ((void)d).#end
1cde0 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  if../*.** If the
1cdf0 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63   most recently c
1ce00 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e  oded instruction
1ce10 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 72   is a constant r
1ce20 61 6e 67 65 20 63 6f 6e 74 72 61 69 6e 74 0a 2a  ange contraint.*
1ce30 2a 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65  * that originate
1ce40 64 20 66 72 6f 6d 20 74 68 65 20 4c 49 4b 45 20  d from the LIKE 
1ce50 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 68  optimization, th
1ce60 65 6e 20 63 68 61 6e 67 65 20 74 68 65 20 50 33  en change the P3
1ce70 20 74 6f 20 62 65 0a 2a 2a 20 70 4c 6f 6f 70 2d   to be.** pLoop-
1ce80 3e 69 4c 69 6b 65 52 65 70 43 6e 74 72 20 61 6e  >iLikeRepCntr an
1ce90 64 20 73 65 74 20 50 35 2e 0a 2a 2a 0a 2a 2a 20  d set P5..**.** 
1cea0 54 68 65 20 4c 49 4b 45 20 6f 70 74 69 6d 69 7a  The LIKE optimiz
1ceb0 61 74 69 6f 6e 20 74 72 79 73 20 74 6f 20 65 76  ation trys to ev
1cec0 61 6c 75 61 74 65 20 22 78 20 4c 49 4b 45 20 27  aluate "x LIKE '
1ced0 61 62 63 25 27 22 20 61 73 20 61 20 72 61 6e 67  abc%'" as a rang
1cee0 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 3a  e.** expression:
1cef0 20 22 78 3e 3d 27 41 42 43 27 20 41 4e 44 20 78   "x>='ABC' AND x
1cf00 3c 27 61 62 64 27 22 2e 20 20 42 75 74 20 74 68  <'abd'".  But th
1cf10 69 73 20 72 65 71 75 69 72 65 73 20 74 68 61 74  is requires that
1cf20 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 73 63   the range.** sc
1cf30 61 6e 20 6c 6f 6f 70 20 72 75 6e 20 74 77 69 63  an loop run twic
1cf40 65 2c 20 6f 6e 63 65 20 66 6f 72 20 73 74 72 69  e, once for stri
1cf50 6e 67 73 20 61 6e 64 20 61 20 73 65 63 6f 6e 64  ngs and a second
1cf60 20 74 69 6d 65 20 66 6f 72 20 42 4c 4f 42 73 2e   time for BLOBs.
1cf70 0a 2a 2a 20 54 68 65 20 4f 50 5f 53 74 72 69 6e  .** The OP_Strin
1cf80 67 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68 65  g opcodes on the
1cf90 20 73 65 63 6f 6e 64 20 70 61 73 73 20 63 6f 6e   second pass con
1cfa0 76 65 72 74 20 74 68 65 20 75 70 70 65 72 20 61  vert the upper a
1cfb0 6e 64 20 6c 6f 77 65 72 0a 2a 2a 20 62 6f 75 6e  nd lower.** boun
1cfc0 64 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 6e 74  d string contant
1cfd0 73 20 74 6f 20 62 6c 6f 62 73 2e 20 20 54 68 69  s to blobs.  Thi
1cfe0 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20  s routine makes 
1cff0 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 63 68  the necessary ch
1d000 61 6e 67 65 73 0a 2a 2a 20 74 6f 20 74 68 65 20  anges.** to the 
1d010 4f 50 5f 53 74 72 69 6e 67 20 6f 70 63 6f 64 65  OP_String opcode
1d020 73 20 66 6f 72 20 74 68 61 74 20 74 6f 20 68 61  s for that to ha
1d030 70 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ppen..*/.static 
1d040 76 6f 69 64 20 77 68 65 72 65 4c 69 6b 65 4f 70  void whereLikeOp
1d050 74 69 6d 69 7a 61 74 69 6f 6e 53 74 72 69 6e 67  timizationString
1d060 46 69 78 75 70 28 0a 20 20 56 64 62 65 20 2a 76  Fixup(.  Vdbe *v
1d070 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1d080 20 2f 2a 20 70 72 65 70 61 72 65 64 20 73 74 61   /* prepared sta
1d090 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e  tement under con
1d0a0 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 57  struction */.  W
1d0b0 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
1d0c0 6c 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f  l,     /* The lo
1d0d0 6f 70 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  op that contains
1d0e0 20 74 68 65 20 4c 49 4b 45 20 6f 70 65 72 61 74   the LIKE operat
1d0f0 6f 72 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  or */.  WhereTer
1d100 6d 20 2a 70 54 65 72 6d 20 20 20 20 20 20 20 20  m *pTerm        
1d110 2f 2a 20 54 68 65 20 75 70 70 65 72 20 6f 72 20  /* The upper or 
1d120 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6a 75 73 74  lower bound just
1d130 20 63 6f 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 69   coded */.){.  i
1d140 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  f( pTerm->wtFlag
1d150 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54  s & TERM_LIKEOPT
1d160 20 29 7b 0a 20 20 20 20 56 64 62 65 4f 70 20 2a   ){.    VdbeOp *
1d170 70 4f 70 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pOp;.    assert(
1d180 20 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65   pLevel->iLikeRe
1d190 70 43 6e 74 72 3e 30 20 29 3b 0a 20 20 20 20 70  pCntr>0 );.    p
1d1a0 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Op = sqlite3Vdbe
1d1b0 47 65 74 4f 70 28 76 2c 20 2d 31 29 3b 0a 20 20  GetOp(v, -1);.  
1d1c0 20 20 61 73 73 65 72 74 28 20 70 4f 70 21 3d 30    assert( pOp!=0
1d1d0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1d1e0 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
1d1f0 53 74 72 69 6e 67 38 20 0a 20 20 20 20 20 20 20  String8 .       
1d200 20 20 20 20 20 7c 7c 20 70 54 65 72 6d 2d 3e 70       || pTerm->p
1d210 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72  WC->pWInfo->pPar
1d220 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
1d230 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 4f 70 2d  iled );.    pOp-
1d240 3e 70 33 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 4c  >p3 = pLevel->iL
1d250 69 6b 65 52 65 70 43 6e 74 72 3b 0a 20 20 20 20  ikeRepCntr;.    
1d260 70 4f 70 2d 3e 70 35 20 3d 20 31 3b 0a 20 20 7d  pOp->p5 = 1;.  }
1d270 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
1d280 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
1d290 73 74 61 72 74 20 6f 66 20 74 68 65 20 69 4c 65  start of the iLe
1d2a0 76 65 6c 2d 74 68 20 6c 6f 6f 70 20 69 6e 20 74  vel-th loop in t
1d2b0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a  he WHERE clause.
1d2c0 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** implementatio
1d2d0 6e 20 64 65 73 63 72 69 62 65 64 20 62 79 20 70  n described by p
1d2e0 57 49 6e 66 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  WInfo..*/.static
1d2f0 20 42 69 74 6d 61 73 6b 20 63 6f 64 65 4f 6e 65   Bitmask codeOne
1d300 4c 6f 6f 70 53 74 61 72 74 28 0a 20 20 57 68 65  LoopStart(.  Whe
1d310 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20  reInfo *pWInfo, 
1d320 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 69 6e    /* Complete in
1d330 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
1d340 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
1d350 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c   */.  int iLevel
1d360 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68  ,          /* Wh
1d370 69 63 68 20 6c 65 76 65 6c 20 6f 66 20 70 57 49  ich level of pWI
1d380 6e 66 6f 2d 3e 61 5b 5d 20 73 68 6f 75 6c 64 20  nfo->a[] should 
1d390 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 42 69  be coded */.  Bi
1d3a0 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 20 20  tmask notReady  
1d3b0 20 20 20 2f 2a 20 57 68 69 63 68 20 74 61 62 6c     /* Which tabl
1d3c0 65 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  es are currently
1d3d0 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 29 7b   available */.){
1d3e0 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b 20 20 20 20  .  int j, k;    
1d3f0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
1d400 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
1d410 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20  t iCur;         
1d420 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63     /* The VDBE c
1d430 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 74 61  ursor for the ta
1d440 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ble */.  int add
1d450 72 4e 78 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  rNxt;         /*
1d460 20 57 68 65 72 65 20 74 6f 20 6a 75 6d 70 20 74   Where to jump t
1d470 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20  o continue with 
1d480 74 68 65 20 6e 65 78 74 20 49 4e 20 63 61 73 65  the next IN case
1d490 20 2a 2f 0a 20 20 69 6e 74 20 6f 6d 69 74 54 61   */.  int omitTa
1d4a0 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20 54 72  ble;       /* Tr
1d4b0 75 65 20 69 66 20 77 65 20 75 73 65 20 74 68 65  ue if we use the
1d4c0 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f 0a 20   index only */. 
1d4d0 20 69 6e 74 20 62 52 65 76 3b 20 20 20 20 20 20   int bRev;      
1d4e0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1d4f0 20 77 65 20 6e 65 65 64 20 74 6f 20 73 63 61 6e   we need to scan
1d500 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65   in reverse orde
1d510 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65  r */.  WhereLeve
1d520 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 2f 2a 20 54  l *pLevel;  /* T
1d530 68 65 20 77 68 65 72 65 20 6c 65 76 65 6c 20 74  he where level t
1d540 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
1d550 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
1d560 3b 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72  ;    /* The Wher
1d570 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 62 65 69  eLoop object bei
1d580 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68  ng coded */.  Wh
1d590 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20  ereClause *pWC; 
1d5a0 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74     /* Decomposit
1d5b0 69 6f 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72  ion of the entir
1d5c0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
1d5d0 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
1d5e0 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
1d5f0 20 20 20 20 2f 2a 20 41 20 57 48 45 52 45 20 63      /* A WHERE c
1d600 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20  lause term */.  
1d610 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20  Parse *pParse;  
1d620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d630 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
1d640 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  xt */.  sqlite3 
1d650 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
1d660 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
1d670 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
1d680 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
1d690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6a0 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61      /* The prepa
1d6b0 72 65 64 20 73 74 6d 74 20 75 6e 64 65 72 20 63  red stmt under c
1d6c0 6f 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a 2f 0a  onstructions */.
1d6d0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1d6e0 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b  _item *pTabItem;
1d6f0 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
1d700 20 74 65 72 6d 20 62 65 69 6e 67 20 63 6f 64 65   term being code
1d710 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 42  d */.  int addrB
1d720 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rk;             
1d730 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
1d740 65 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74  ere to break out
1d750 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a   of the loop */.
1d760 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 3b 20    int addrCont; 
1d770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d780 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
1d790 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20  o continue with 
1d7a0 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20  next cycle */.  
1d7b0 69 6e 74 20 69 52 6f 77 69 64 52 65 67 20 3d 20  int iRowidReg = 
1d7c0 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77  0;        /* Row
1d7d0 69 64 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  id is stored in 
1d7e0 74 68 69 73 20 72 65 67 69 73 74 65 72 2c 20 69  this register, i
1d7f0 66 20 6e 6f 74 20 7a 65 72 6f 20 2a 2f 0a 20 20  f not zero */.  
1d800 69 6e 74 20 69 52 65 6c 65 61 73 65 52 65 67 20  int iReleaseReg 
1d810 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 54 65 6d  = 0;      /* Tem
1d820 70 20 72 65 67 69 73 74 65 72 20 74 6f 20 66 72  p register to fr
1d830 65 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ee before return
1d840 69 6e 67 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65  ing */..  pParse
1d850 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
1d860 65 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  e;.  v = pParse-
1d870 3e 70 56 64 62 65 3b 0a 20 20 70 57 43 20 3d 20  >pVdbe;.  pWC = 
1d880 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20  &pWInfo->sWC;.  
1d890 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1d8a0 0a 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49  .  pLevel = &pWI
1d8b0 6e 66 6f 2d 3e 61 5b 69 4c 65 76 65 6c 5d 3b 0a  nfo->a[iLevel];.
1d8c0 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c    pLoop = pLevel
1d8d0 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 70 54 61 62  ->pWLoop;.  pTab
1d8e0 49 74 65 6d 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  Item = &pWInfo->
1d8f0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
1d900 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 69 43  el->iFrom];.  iC
1d910 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69  ur = pTabItem->i
1d920 43 75 72 73 6f 72 3b 0a 20 20 70 4c 65 76 65 6c  Cursor;.  pLevel
1d930 2d 3e 6e 6f 74 52 65 61 64 79 20 3d 20 6e 6f 74  ->notReady = not
1d940 52 65 61 64 79 20 26 20 7e 67 65 74 4d 61 73 6b  Ready & ~getMask
1d950 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53  (&pWInfo->sMaskS
1d960 65 74 2c 20 69 43 75 72 29 3b 0a 20 20 62 52 65  et, iCur);.  bRe
1d970 76 20 3d 20 28 70 57 49 6e 66 6f 2d 3e 72 65 76  v = (pWInfo->rev
1d980 4d 61 73 6b 3e 3e 69 4c 65 76 65 6c 29 26 31 3b  Mask>>iLevel)&1;
1d990 0a 20 20 6f 6d 69 74 54 61 62 6c 65 20 3d 20 28  .  omitTable = (
1d9a0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
1d9b0 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
1d9c0 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20  !=0 .           
1d9d0 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  && (pWInfo->wctr
1d9e0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 46  lFlags & WHERE_F
1d9f0 4f 52 43 45 5f 54 41 42 4c 45 29 3d 3d 30 3b 0a  ORCE_TABLE)==0;.
1da00 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d    VdbeModuleComm
1da10 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20 57  ent((v, "Begin W
1da20 48 45 52 45 2d 6c 6f 6f 70 25 64 3a 20 25 73 22  HERE-loop%d: %s"
1da30 2c 69 4c 65 76 65 6c 2c 70 54 61 62 49 74 65 6d  ,iLevel,pTabItem
1da40 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ->pTab->zName));
1da50 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 6c 61  ..  /* Create la
1da60 62 65 6c 73 20 66 6f 72 20 74 68 65 20 22 62 72  bels for the "br
1da70 65 61 6b 22 20 61 6e 64 20 22 63 6f 6e 74 69 6e  eak" and "contin
1da80 75 65 22 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  ue" instructions
1da90 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 63 75  .  ** for the cu
1daa0 72 72 65 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d  rrent loop.  Jum
1dab0 70 20 74 6f 20 61 64 64 72 42 72 6b 20 74 6f 20  p to addrBrk to 
1dac0 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 61 20 6c  break out of a l
1dad0 6f 6f 70 2e 0a 20 20 2a 2a 20 4a 75 6d 70 20 74  oop..  ** Jump t
1dae0 6f 20 63 6f 6e 74 20 74 6f 20 67 6f 20 69 6d 6d  o cont to go imm
1daf0 65 64 69 61 74 65 6c 79 20 74 6f 20 74 68 65 20  ediately to the 
1db00 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  next iteration o
1db10 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 6f 70 2e  f the.  ** loop.
1db20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20  .  **.  ** When 
1db30 74 68 65 72 65 20 69 73 20 61 6e 20 49 4e 20 6f  there is an IN o
1db40 70 65 72 61 74 6f 72 2c 20 77 65 20 61 6c 73 6f  perator, we also
1db50 20 68 61 76 65 20 61 20 22 61 64 64 72 4e 78 74   have a "addrNxt
1db60 22 20 6c 61 62 65 6c 20 74 68 61 74 0a 20 20 2a  " label that.  *
1db70 2a 20 6d 65 61 6e 73 20 74 6f 20 63 6f 6e 74 69  * means to conti
1db80 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e 65 78  nue with the nex
1db90 74 20 49 4e 20 76 61 6c 75 65 20 63 6f 6d 62 69  t IN value combi
1dba0 6e 61 74 69 6f 6e 2e 20 20 57 68 65 6e 0a 20 20  nation.  When.  
1dbb0 2a 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  ** there are no 
1dbc0 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 69 6e 20  IN operators in 
1dbd0 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c  the constraints,
1dbe0 20 74 68 65 20 22 61 64 64 72 4e 78 74 22 20 6c   the "addrNxt" l
1dbf0 61 62 65 6c 0a 20 20 2a 2a 20 69 73 20 74 68 65  abel.  ** is the
1dc00 20 73 61 6d 65 20 61 73 20 22 61 64 64 72 42 72   same as "addrBr
1dc10 6b 22 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72 42  k"..  */.  addrB
1dc20 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64  rk = pLevel->add
1dc30 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61  rBrk = pLevel->a
1dc40 64 64 72 4e 78 74 20 3d 20 73 71 6c 69 74 65 33  ddrNxt = sqlite3
1dc50 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
1dc60 3b 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d 20 70  ;.  addrCont = p
1dc70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 20  Level->addrCont 
1dc80 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
1dc90 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a  eLabel(v);..  /*
1dca0 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
1dcb0 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20 61  right table of a
1dcc0 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
1dcd0 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 0a 20  , allocate and. 
1dce0 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 61   ** initialize a
1dcf0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61   memory cell tha
1dd00 74 20 72 65 63 6f 72 64 73 20 69 66 20 74 68 69  t records if thi
1dd10 73 20 74 61 62 6c 65 20 6d 61 74 63 68 65 73 20  s table matches 
1dd20 61 6e 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20  any.  ** row of 
1dd30 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20 6f  the left table o
1dd40 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f  f the join..  */
1dd50 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69  .  if( pLevel->i
1dd60 46 72 6f 6d 3e 30 20 26 26 20 28 70 54 61 62 49  From>0 && (pTabI
1dd70 74 65 6d 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20  tem[0].jointype 
1dd80 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b  & JT_LEFT)!=0 ){
1dd90 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 65  .    pLevel->iLe
1dda0 66 74 4a 6f 69 6e 20 3d 20 2b 2b 70 50 61 72 73  ftJoin = ++pPars
1ddb0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c  e->nMem;.    sql
1ddc0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1ddd0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
1dde0 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
1ddf0 69 6e 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  in);.    VdbeCom
1de00 6d 65 6e 74 28 28 76 2c 20 22 69 6e 69 74 20 4c  ment((v, "init L
1de10 45 46 54 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74 63  EFT JOIN no-matc
1de20 68 20 66 6c 61 67 22 29 29 3b 0a 20 20 7d 0a 0a  h flag"));.  }..
1de30 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73    /* Special cas
1de40 65 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75  e of a FROM clau
1de50 73 65 20 73 75 62 71 75 65 72 79 20 69 6d 70 6c  se subquery impl
1de60 65 6d 65 6e 74 65 64 20 61 73 20 61 20 63 6f 2d  emented as a co-
1de70 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 66 28  routine */.  if(
1de80 20 70 54 61 62 49 74 65 6d 2d 3e 76 69 61 43 6f   pTabItem->viaCo
1de90 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 69  routine ){.    i
1dea0 6e 74 20 72 65 67 59 69 65 6c 64 20 3d 20 70 54  nt regYield = pT
1deb0 61 62 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72  abItem->regRetur
1dec0 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  n;.    sqlite3Vd
1ded0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
1dee0 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  nitCoroutine, re
1def0 67 59 69 65 6c 64 2c 20 30 2c 20 70 54 61 62 49  gYield, 0, pTabI
1df00 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
1df10 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  );.    pLevel->p
1df20 32 20 3d 20 20 73 71 6c 69 74 65 33 56 64 62 65  2 =  sqlite3Vdbe
1df30 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
1df40 6c 64 2c 20 72 65 67 59 69 65 6c 64 2c 20 61 64  ld, regYield, ad
1df50 64 72 42 72 6b 29 3b 0a 20 20 20 20 56 64 62 65  drBrk);.    Vdbe
1df60 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1df70 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1df80 20 22 6e 65 78 74 20 72 6f 77 20 6f 66 20 5c 22   "next row of \"
1df90 25 73 5c 22 22 2c 20 70 54 61 62 49 74 65 6d 2d  %s\"", pTabItem-
1dfa0 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
1dfb0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
1dfc0 20 4f 50 5f 47 6f 74 6f 3b 0a 20 20 7d 65 6c 73   OP_Goto;.  }els
1dfd0 65 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e..#ifndef SQLIT
1dfe0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
1dff0 42 4c 45 0a 20 20 69 66 28 20 20 28 70 4c 6f 6f  BLE.  if(  (pLoo
1e000 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
1e010 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
1e020 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61  !=0 ){.    /* Ca
1e030 73 65 20 31 3a 20 20 54 68 65 20 74 61 62 6c 65  se 1:  The table
1e040 20 69 73 20 61 20 76 69 72 74 75 61 6c 2d 74 61   is a virtual-ta
1e050 62 6c 65 2e 20 20 55 73 65 20 74 68 65 20 56 46  ble.  Use the VF
1e060 69 6c 74 65 72 20 61 6e 64 20 56 4e 65 78 74 0a  ilter and VNext.
1e070 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1e080 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
1e090 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ta..    */.    i
1e0a0 6e 74 20 69 52 65 67 3b 20 20 20 2f 2a 20 50 33  nt iReg;   /* P3
1e0b0 20 56 61 6c 75 65 20 66 6f 72 20 4f 50 5f 56 46   Value for OP_VF
1e0c0 69 6c 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  ilter */.    int
1e0d0 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 3b 0a 20   addrNotFound;. 
1e0e0 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69     int nConstrai
1e0f0 6e 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65  nt = pLoop->nLTe
1e100 72 6d 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  rm;..    sqlite3
1e110 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
1e120 61 72 73 65 29 3b 0a 20 20 20 20 69 52 65 67 20  arse);.    iReg 
1e130 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
1e140 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43  Range(pParse, nC
1e150 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20  onstraint+2);.  
1e160 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 20 3d    addrNotFound =
1e170 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b   pLevel->addrBrk
1e180 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
1e190 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a 2b  <nConstraint; j+
1e1a0 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54  +){.      int iT
1e1b0 61 72 67 65 74 20 3d 20 69 52 65 67 2b 6a 2b 32  arget = iReg+j+2
1e1c0 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
1e1d0 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  pLoop->aLTerm[j]
1e1e0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
1e1f0 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  m==0 ) continue;
1e200 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
1e210 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
1e220 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 63  _IN ){.        c
1e230 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28  odeEqualityTerm(
1e240 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70  pParse, pTerm, p
1e250 4c 65 76 65 6c 2c 20 6a 2c 20 62 52 65 76 2c 20  Level, j, bRev, 
1e260 69 54 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20  iTarget);.      
1e270 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 20 3d    addrNotFound =
1e280 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74   pLevel->addrNxt
1e290 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1e2a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1e2b0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
1e2c0 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
1e2d0 67 68 74 2c 20 69 54 61 72 67 65 74 29 3b 0a 20  ght, iTarget);. 
1e2e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1e2f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1e300 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
1e310 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e  , pLoop->u.vtab.
1e320 69 64 78 4e 75 6d 2c 20 69 52 65 67 29 3b 0a 20  idxNum, iReg);. 
1e330 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1e340 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
1e350 65 72 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2c  er, nConstraint,
1e360 20 69 52 65 67 2b 31 29 3b 0a 20 20 20 20 73 71   iReg+1);.    sq
1e370 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1e380 76 2c 20 4f 50 5f 56 46 69 6c 74 65 72 2c 20 69  v, OP_VFilter, i
1e390 43 75 72 2c 20 61 64 64 72 4e 6f 74 46 6f 75 6e  Cur, addrNotFoun
1e3a0 64 2c 20 69 52 65 67 2c 0a 20 20 20 20 20 20 20  d, iReg,.       
1e3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1e3c0 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  Loop->u.vtab.idx
1e3d0 53 74 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Str,.           
1e3e0 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70             pLoop
1e3f0 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
1e400 65 20 3f 20 50 34 5f 4d 50 52 49 4e 54 46 20 3a  e ? P4_MPRINTF :
1e410 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P4_STATIC);.   
1e420 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1e430 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76  ;.    pLoop->u.v
1e440 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30  tab.needFree = 0
1e450 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
1e460 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 20 26 26 20  <nConstraint && 
1e470 6a 3c 31 36 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  j<16; j++){.    
1e480 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 75 2e    if( (pLoop->u.
1e490 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 3e 3e 6a  vtab.omitMask>>j
1e4a0 29 26 31 20 29 7b 0a 20 20 20 20 20 20 20 20 64  )&1 ){.        d
1e4b0 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
1e4c0 6c 2c 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d  l, pLoop->aLTerm
1e4d0 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [j]);.      }.  
1e4e0 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e    }.    pLevel->
1e4f0 6f 70 20 3d 20 4f 50 5f 56 4e 65 78 74 3b 0a 20  op = OP_VNext;. 
1e500 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
1e510 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c  iCur;.    pLevel
1e520 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ->p2 = sqlite3Vd
1e530 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
1e540 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  ;.    sqlite3Rel
1e550 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
1e560 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 43 6f 6e  arse, iReg, nCon
1e570 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20  straint+2);.    
1e580 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1e590 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 7d  Pop(pParse);.  }
1e5a0 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53  else.#endif /* S
1e5b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
1e5c0 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20 20 69 66  ALTABLE */..  if
1e5d0 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
1e5e0 73 20 26 20 57 48 45 52 45 5f 49 50 4b 29 21 3d  s & WHERE_IPK)!=
1e5f0 30 0a 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e  0.   && (pLoop->
1e600 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  wsFlags & (WHERE
1e610 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52 45  _COLUMN_IN|WHERE
1e620 5f 43 4f 4c 55 4d 4e 5f 45 51 29 29 21 3d 30 0a  _COLUMN_EQ))!=0.
1e630 20 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65    ){.    /* Case
1e640 20 32 3a 20 20 57 65 20 63 61 6e 20 64 69 72 65   2:  We can dire
1e650 63 74 6c 79 20 72 65 66 65 72 65 6e 63 65 20 61  ctly reference a
1e660 20 73 69 6e 67 6c 65 20 72 6f 77 20 75 73 69 6e   single row usin
1e670 67 20 61 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20  g an.    **     
1e680 20 20 20 20 20 65 71 75 61 6c 69 74 79 20 63 6f       equality co
1e690 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74  mparison against
1e6a0 20 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64   the ROWID field
1e6b0 2e 20 20 4f 72 0a 20 20 20 20 2a 2a 20 20 20 20  .  Or.    **    
1e6c0 20 20 20 20 20 20 77 65 20 72 65 66 65 72 65 6e        we referen
1e6d0 63 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73  ce multiple rows
1e6e0 20 75 73 69 6e 67 20 61 20 22 72 6f 77 69 64 20   using a "rowid 
1e6f0 49 4e 20 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a  IN (...)".    **
1e700 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72            constr
1e710 75 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  uct..    */.    
1e720 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 75  assert( pLoop->u
1e730 2e 62 74 72 65 65 2e 6e 45 71 3d 3d 31 20 29 3b  .btree.nEq==1 );
1e740 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f  .    pTerm = pLo
1e750 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 3b 0a 20  op->aLTerm[0];. 
1e760 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
1e770 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
1e780 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 21  t( pTerm->pExpr!
1e790 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
1e7a0 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29  ( omitTable==0 )
1e7b0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1e7c0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
1e7d0 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
1e7e0 0a 20 20 20 20 69 52 65 6c 65 61 73 65 52 65 67  .    iReleaseReg
1e7f0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1e800 6d 3b 0a 20 20 20 20 69 52 6f 77 69 64 52 65 67  m;.    iRowidReg
1e810 20 3d 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54   = codeEqualityT
1e820 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72  erm(pParse, pTer
1e830 6d 2c 20 70 4c 65 76 65 6c 2c 20 30 2c 20 62 52  m, pLevel, 0, bR
1e840 65 76 2c 20 69 52 65 6c 65 61 73 65 52 65 67 29  ev, iReleaseReg)
1e850 3b 0a 20 20 20 20 69 66 28 20 69 52 6f 77 69 64  ;.    if( iRowid
1e860 52 65 67 21 3d 69 52 65 6c 65 61 73 65 52 65 67  Reg!=iReleaseReg
1e870 20 29 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73   ) sqlite3Releas
1e880 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
1e890 20 69 52 65 6c 65 61 73 65 52 65 67 29 3b 0a 20   iReleaseReg);. 
1e8a0 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65     addrNxt = pLe
1e8b0 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20 20  vel->addrNxt;.  
1e8c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1e8d0 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  Op2(v, OP_MustBe
1e8e0 49 6e 74 2c 20 69 52 6f 77 69 64 52 65 67 2c 20  Int, iRowidReg, 
1e8f0 61 64 64 72 4e 78 74 29 3b 20 56 64 62 65 43 6f  addrNxt); VdbeCo
1e900 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
1e910 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1e920 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73  (v, OP_NotExists
1e930 2c 20 69 43 75 72 2c 20 61 64 64 72 4e 78 74 2c  , iCur, addrNxt,
1e940 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20   iRowidReg);.   
1e950 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1e960 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
1e970 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
1e980 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69 52 6f  ange(pParse, iRo
1e990 77 69 64 52 65 67 2c 20 31 29 3b 0a 20 20 20 20  widReg, 1);.    
1e9a0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1e9b0 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43  Store(pParse, iC
1e9c0 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65  ur, -1, iRowidRe
1e9d0 67 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  g);.    VdbeComm
1e9e0 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a  ent((v, "pk"));.
1e9f0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
1ea00 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 7d 65 6c 73   OP_Noop;.  }els
1ea10 65 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73  e if( (pLoop->ws
1ea20 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 50  Flags & WHERE_IP
1ea30 4b 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 26  K)!=0.         &
1ea40 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  & (pLoop->wsFlag
1ea50 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
1ea60 5f 52 41 4e 47 45 29 21 3d 30 0a 20 20 29 7b 0a  _RANGE)!=0.  ){.
1ea70 20 20 20 20 2f 2a 20 43 61 73 65 20 33 3a 20 20      /* Case 3:  
1ea80 57 65 20 68 61 76 65 20 61 6e 20 69 6e 65 71 75  We have an inequ
1ea90 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e  ality comparison
1eaa0 20 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f 57   against the ROW
1eab0 49 44 20 66 69 65 6c 64 2e 0a 20 20 20 20 2a 2f  ID field..    */
1eac0 0a 20 20 20 20 69 6e 74 20 74 65 73 74 4f 70 20  .    int testOp 
1ead0 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 69  = OP_Noop;.    i
1eae0 6e 74 20 73 74 61 72 74 3b 0a 20 20 20 20 69 6e  nt start;.    in
1eaf0 74 20 6d 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20  t memEndValue = 
1eb00 30 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  0;.    WhereTerm
1eb10 20 2a 70 53 74 61 72 74 2c 20 2a 70 45 6e 64 3b   *pStart, *pEnd;
1eb20 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d  ..    assert( om
1eb30 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20  itTable==0 );.  
1eb40 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 70 53 74    j = 0;.    pSt
1eb50 61 72 74 20 3d 20 70 45 6e 64 20 3d 20 30 3b 0a  art = pEnd = 0;.
1eb60 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
1eb70 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42  sFlags & WHERE_B
1eb80 54 4d 5f 4c 49 4d 49 54 20 29 20 70 53 74 61 72  TM_LIMIT ) pStar
1eb90 74 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  t = pLoop->aLTer
1eba0 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 69 66 28 20  m[j++];.    if( 
1ebb0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
1ebc0 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54   WHERE_TOP_LIMIT
1ebd0 20 29 20 70 45 6e 64 20 3d 20 70 4c 6f 6f 70 2d   ) pEnd = pLoop-
1ebe0 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20  >aLTerm[j++];.  
1ebf0 20 20 61 73 73 65 72 74 28 20 70 53 74 61 72 74    assert( pStart
1ec00 21 3d 30 20 7c 7c 20 70 45 6e 64 21 3d 30 20 29  !=0 || pEnd!=0 )
1ec10 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76 20 29  ;.    if( bRev )
1ec20 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  {.      pTerm = 
1ec30 70 53 74 61 72 74 3b 0a 20 20 20 20 20 20 70 53  pStart;.      pS
1ec40 74 61 72 74 20 3d 20 70 45 6e 64 3b 0a 20 20 20  tart = pEnd;.   
1ec50 20 20 20 70 45 6e 64 20 3d 20 70 54 65 72 6d 3b     pEnd = pTerm;
1ec60 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1ec70 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 45  Start ){.      E
1ec80 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20  xpr *pX;        
1ec90 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
1eca0 65 73 73 69 6f 6e 20 74 68 61 74 20 64 65 66 69  ession that defi
1ecb0 6e 65 73 20 74 68 65 20 73 74 61 72 74 20 62 6f  nes the start bo
1ecc0 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  und */.      int
1ecd0 20 72 31 2c 20 72 54 65 6d 70 3b 20 20 20 20 20   r1, rTemp;     
1ece0 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20     /* Registers 
1ecf0 66 6f 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  for holding the 
1ed00 73 74 61 72 74 20 62 6f 75 6e 64 61 72 79 20 2a  start boundary *
1ed10 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  /..      /* The 
1ed20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73 74 61  following consta
1ed30 6e 74 20 6d 61 70 73 20 54 4b 5f 78 78 20 63 6f  nt maps TK_xx co
1ed40 64 65 73 20 69 6e 74 6f 20 63 6f 72 72 65 73 70  des into corresp
1ed50 6f 6e 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a  onding .      **
1ed60 20 73 65 65 6b 20 6f 70 63 6f 64 65 73 2e 20 20   seek opcodes.  
1ed70 49 74 20 64 65 70 65 6e 64 73 20 6f 6e 20 61 20  It depends on a 
1ed80 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72  particular order
1ed90 69 6e 67 20 6f 66 20 54 4b 5f 78 78 0a 20 20 20  ing of TK_xx.   
1eda0 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73     */.      cons
1edb0 74 20 75 38 20 61 4d 6f 76 65 4f 70 5b 5d 20 3d  t u8 aMoveOp[] =
1edc0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a   {.           /*
1edd0 20 54 4b 5f 47 54 20 2a 2f 20 20 4f 50 5f 53 65   TK_GT */  OP_Se
1ede0 65 6b 47 54 2c 0a 20 20 20 20 20 20 20 20 20 20  ekGT,.          
1edf0 20 2f 2a 20 54 4b 5f 4c 45 20 2a 2f 20 20 4f 50   /* TK_LE */  OP
1ee00 5f 53 65 65 6b 4c 45 2c 0a 20 20 20 20 20 20 20  _SeekLE,.       
1ee10 20 20 20 20 2f 2a 20 54 4b 5f 4c 54 20 2a 2f 20      /* TK_LT */ 
1ee20 20 4f 50 5f 53 65 65 6b 4c 54 2c 0a 20 20 20 20   OP_SeekLT,.    
1ee30 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47 45 20         /* TK_GE 
1ee40 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 45 0a 20 20  */  OP_SeekGE.  
1ee50 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 61 73 73      };.      ass
1ee60 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 54 4b 5f 47  ert( TK_LE==TK_G
1ee70 54 2b 31 20 29 3b 20 20 20 20 20 20 2f 2a 20 4d  T+1 );      /* M
1ee80 61 6b 65 20 73 75 72 65 20 74 68 65 20 6f 72 64  ake sure the ord
1ee90 65 72 69 6e 67 2e 2e 20 2a 2f 0a 20 20 20 20 20  ering.. */.     
1eea0 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d   assert( TK_LT==
1eeb0 54 4b 5f 47 54 2b 32 20 29 3b 20 20 20 20 20 20  TK_GT+2 );      
1eec0 2f 2a 20 20 2e 2e 2e 20 6f 66 20 74 68 65 20 54  /*  ... of the T
1eed0 4b 5f 78 78 20 76 61 6c 75 65 73 2e 2e 2e 20 2a  K_xx values... *
1eee0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
1eef0 54 4b 5f 47 45 3d 3d 54 4b 5f 47 54 2b 33 20 29  TK_GE==TK_GT+3 )
1ef00 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 69  ;      /*  ... i
1ef10 73 20 63 6f 72 72 65 63 63 74 2e 20 2a 2f 0a 0a  s correcct. */..
1ef20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
1ef30 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26  Start->wtFlags &
1ef40 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20   TERM_VNULL)==0 
1ef50 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1ef60 65 28 20 70 53 74 61 72 74 2d 3e 77 74 46 6c 61  e( pStart->wtFla
1ef70 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
1ef80 4c 20 29 3b 0a 20 20 20 20 20 20 70 58 20 3d 20  L );.      pX = 
1ef90 70 53 74 61 72 74 2d 3e 70 45 78 70 72 3b 0a 20  pStart->pExpr;. 
1efa0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58 21       assert( pX!
1efb0 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
1efc0 63 61 73 65 28 20 70 53 74 61 72 74 2d 3e 6c 65  case( pStart->le
1efd0 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72 20 29  ftCursor!=iCur )
1efe0 3b 20 2f 2a 20 74 72 61 6e 73 69 74 69 76 65 20  ; /* transitive 
1eff0 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20  constraints */. 
1f000 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1f010 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1f020 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74  arse, pX->pRight
1f030 2c 20 26 72 54 65 6d 70 29 3b 0a 20 20 20 20 20  , &rTemp);.     
1f040 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1f050 70 33 28 76 2c 20 61 4d 6f 76 65 4f 70 5b 70 58  p3(v, aMoveOp[pX
1f060 2d 3e 6f 70 2d 54 4b 5f 47 54 5d 2c 20 69 43 75  ->op-TK_GT], iCu
1f070 72 2c 20 61 64 64 72 42 72 6b 2c 20 72 31 29 3b  r, addrBrk, r1);
1f080 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
1f090 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20  nt((v, "pk"));. 
1f0a0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1f0b0 65 49 66 28 76 2c 20 70 58 2d 3e 6f 70 3d 3d 54  eIf(v, pX->op==T
1f0c0 4b 5f 47 54 29 3b 0a 20 20 20 20 20 20 56 64 62  K_GT);.      Vdb
1f0d0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70  eCoverageIf(v, p
1f0e0 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 29 3b 0a 20  X->op==TK_LE);. 
1f0f0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1f100 65 49 66 28 76 2c 20 70 58 2d 3e 6f 70 3d 3d 54  eIf(v, pX->op==T
1f110 4b 5f 4c 54 29 3b 0a 20 20 20 20 20 20 56 64 62  K_LT);.      Vdb
1f120 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70  eCoverageIf(v, p
1f130 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 29 3b 0a 20  X->op==TK_GE);. 
1f140 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1f150 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
1f160 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20  nge(pParse, r1, 
1f170 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
1f180 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
1f190 70 50 61 72 73 65 2c 20 72 54 65 6d 70 29 3b 0a  pParse, rTemp);.
1f1a0 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72        disableTer
1f1b0 6d 28 70 4c 65 76 65 6c 2c 20 70 53 74 61 72 74  m(pLevel, pStart
1f1c0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1f1d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1f1e0 64 64 4f 70 32 28 76 2c 20 62 52 65 76 20 3f 20  ddOp2(v, bRev ? 
1f1f0 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f 52 65 77  OP_Last : OP_Rew
1f200 69 6e 64 2c 20 69 43 75 72 2c 20 61 64 64 72 42  ind, iCur, addrB
1f210 72 6b 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  rk);.      VdbeC
1f220 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62 52 65  overageIf(v, bRe
1f230 76 3d 3d 30 29 3b 0a 20 20 20 20 20 20 56 64 62  v==0);.      Vdb
1f240 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62  eCoverageIf(v, b
1f250 52 65 76 21 3d 30 29 3b 0a 20 20 20 20 7d 0a 20  Rev!=0);.    }. 
1f260 20 20 20 69 66 28 20 70 45 6e 64 20 29 7b 0a 20     if( pEnd ){. 
1f270 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a 20       Expr *pX;. 
1f280 20 20 20 20 20 70 58 20 3d 20 70 45 6e 64 2d 3e       pX = pEnd->
1f290 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
1f2a0 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20  ert( pX!=0 );.  
1f2b0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 45 6e      assert( (pEn
1f2c0 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  d->wtFlags & TER
1f2d0 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20  M_VNULL)==0 );. 
1f2e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1f2f0 45 6e 64 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21  End->leftCursor!
1f300 3d 69 43 75 72 20 29 3b 20 2f 2a 20 54 72 61 6e  =iCur ); /* Tran
1f310 73 69 74 69 76 65 20 63 6f 6e 73 74 72 61 69 6e  sitive constrain
1f320 74 73 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74  ts */.      test
1f330 63 61 73 65 28 20 70 45 6e 64 2d 3e 77 74 46 6c  case( pEnd->wtFl
1f340 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
1f350 41 4c 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 45  AL );.      memE
1f360 6e 64 56 61 6c 75 65 20 3d 20 2b 2b 70 50 61 72  ndValue = ++pPar
1f370 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
1f380 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
1f390 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67  pParse, pX->pRig
1f3a0 68 74 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65 29  ht, memEndValue)
1f3b0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e  ;.      if( pX->
1f3c0 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58 2d  op==TK_LT || pX-
1f3d0 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a 20 20  >op==TK_GT ){.  
1f3e0 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62        testOp = b
1f3f0 52 65 76 20 3f 20 4f 50 5f 4c 65 20 3a 20 4f 50  Rev ? OP_Le : OP
1f400 5f 47 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  _Ge;.      }else
1f410 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f 70  {.        testOp
1f420 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 74 20   = bRev ? OP_Lt 
1f430 3a 20 4f 50 5f 47 74 3b 0a 20 20 20 20 20 20 7d  : OP_Gt;.      }
1f440 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65  .      disableTe
1f450 72 6d 28 70 4c 65 76 65 6c 2c 20 70 45 6e 64 29  rm(pLevel, pEnd)
1f460 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 72  ;.    }.    star
1f470 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
1f480 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
1f490 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
1f4a0 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a  bRev ? OP_Prev :
1f4b0 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 70 4c   OP_Next;.    pL
1f4c0 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b  evel->p1 = iCur;
1f4d0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20  .    pLevel->p2 
1f4e0 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 61 73 73  = start;.    ass
1f4f0 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 35 3d  ert( pLevel->p5=
1f500 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 74 65  =0 );.    if( te
1f510 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b  stOp!=OP_Noop ){
1f520 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52 65 67  .      iRowidReg
1f530 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1f540 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  m;.      sqlite3
1f550 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1f560 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c 20 69 52  _Rowid, iCur, iR
1f570 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20  owidReg);.      
1f580 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1f590 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43  Store(pParse, iC
1f5a0 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65  ur, -1, iRowidRe
1f5b0 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
1f5c0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 74  3VdbeAddOp3(v, t
1f5d0 65 73 74 4f 70 2c 20 6d 65 6d 45 6e 64 56 61 6c  estOp, memEndVal
1f5e0 75 65 2c 20 61 64 64 72 42 72 6b 2c 20 69 52 6f  ue, addrBrk, iRo
1f5f0 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 56  widReg);.      V
1f600 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1f610 20 74 65 73 74 4f 70 3d 3d 4f 50 5f 4c 65 29 3b   testOp==OP_Le);
1f620 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
1f630 61 67 65 49 66 28 76 2c 20 74 65 73 74 4f 70 3d  ageIf(v, testOp=
1f640 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 56  =OP_Lt);.      V
1f650 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1f660 20 74 65 73 74 4f 70 3d 3d 4f 50 5f 47 65 29 3b   testOp==OP_Ge);
1f670 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
1f680 61 67 65 49 66 28 76 2c 20 74 65 73 74 4f 70 3d  ageIf(v, testOp=
1f690 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 73  =OP_Gt);.      s
1f6a0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1f6b0 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 41 46 46  P5(v, SQLITE_AFF
1f6c0 5f 4e 55 4d 45 52 49 43 20 7c 20 53 51 4c 49 54  _NUMERIC | SQLIT
1f6d0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
1f6e0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
1f6f0 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
1f700 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20  & WHERE_INDEXED 
1f710 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 34  ){.    /* Case 4
1f720 3a 20 41 20 73 63 61 6e 20 75 73 69 6e 67 20 61  : A scan using a
1f730 6e 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 0a  n index..    **.
1f740 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54      **         T
1f750 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1f760 6d 61 79 20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f  may contain zero
1f770 20 6f 72 20 6d 6f 72 65 20 65 71 75 61 6c 69 74   or more equalit
1f780 79 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  y .    **       
1f790 20 20 74 65 72 6d 73 20 28 22 3d 3d 22 20 6f 72    terms ("==" or
1f7a0 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 29   "IN" operators)
1f7b0 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74   that refer to t
1f7c0 68 65 20 4e 0a 20 20 20 20 2a 2a 20 20 20 20 20  he N.    **     
1f7d0 20 20 20 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f      left-most co
1f7e0 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64  lumns of the ind
1f7f0 65 78 2e 20 49 74 20 6d 61 79 20 61 6c 73 6f 20  ex. It may also 
1f800 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a 2a 20 20  contain.    **  
1f810 20 20 20 20 20 20 20 69 6e 65 71 75 61 6c 69 74         inequalit
1f820 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 28 3e  y constraints (>
1f830 2c 20 3c 2c 20 3e 3d 20 6f 72 20 3c 3d 29 20 6f  , <, >= or <=) o
1f840 6e 20 74 68 65 20 69 6e 64 65 78 65 64 0a 20 20  n the indexed.  
1f850 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c    **         col
1f860 75 6d 6e 20 74 68 61 74 20 69 6d 6d 65 64 69 61  umn that immedia
1f870 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 20 74 68 65  tely follows the
1f880 20 4e 20 65 71 75 61 6c 69 74 69 65 73 2e 20 4f   N equalities. O
1f890 6e 6c 79 20 0a 20 20 20 20 2a 2a 20 20 20 20 20  nly .    **     
1f8a0 20 20 20 20 74 68 65 20 72 69 67 68 74 2d 6d 6f      the right-mo
1f8b0 73 74 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65  st column can be
1f8c0 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 2d   an inequality -
1f8d0 20 74 68 65 20 72 65 73 74 20 6d 75 73 74 0a 20   the rest must. 
1f8e0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 75 73     **         us
1f8f0 65 20 74 68 65 20 22 3d 3d 22 20 61 6e 64 20 22  e the "==" and "
1f900 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 2e 20 46  IN" operators. F
1f910 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  or example, if t
1f920 68 65 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  he .    **      
1f930 20 20 20 69 6e 64 65 78 20 69 73 20 6f 6e 20 28     index is on (
1f940 78 2c 79 2c 7a 29 2c 20 74 68 65 6e 20 74 68 65  x,y,z), then the
1f950 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6c 61 75 73   following claus
1f960 65 73 20 61 72 65 20 61 6c 6c 20 0a 20 20 20 20  es are all .    
1f970 2a 2a 20 20 20 20 20 20 20 20 20 6f 70 74 69 6d  **         optim
1f980 69 7a 65 64 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  ized:.    **.   
1f990 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78   **            x
1f9a0 3d 35 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  =5.    **       
1f9b0 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3d 31       x=5 AND y=1
1f9c0 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  0.    **        
1f9d0 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3c 31 30      x=5 AND y<10
1f9e0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1f9f0 20 20 20 78 3d 35 20 41 4e 44 20 79 3e 35 20 41     x=5 AND y>5 A
1fa00 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20 20  ND y<10.    **  
1fa10 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e            x=5 AN
1fa20 44 20 79 3d 35 20 41 4e 44 20 7a 3c 3d 31 30 0a  D y=5 AND z<=10.
1fa30 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1fa40 20 20 20 20 20 20 54 68 65 20 7a 3c 31 30 20 74        The z<10 t
1fa50 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  erm of the follo
1fa60 77 69 6e 67 20 63 61 6e 6e 6f 74 20 62 65 20 75  wing cannot be u
1fa70 73 65 64 2c 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a  sed, only.    **
1fa80 20 20 20 20 20 20 20 20 20 74 68 65 20 78 3d 35           the x=5
1fa90 20 74 65 72 6d 3a 0a 20 20 20 20 2a 2a 0a 20 20   term:.    **.  
1faa0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
1fab0 78 3d 35 20 41 4e 44 20 7a 3c 31 30 0a 20 20 20  x=5 AND z<10.   
1fac0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
1fad0 20 20 20 4e 20 6d 61 79 20 62 65 20 7a 65 72 6f     N may be zero
1fae0 20 69 66 20 74 68 65 72 65 20 61 72 65 20 69 6e   if there are in
1faf0 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
1fb00 69 6e 74 73 2e 0a 20 20 20 20 2a 2a 20 20 20 20  ints..    **    
1fb10 20 20 20 20 20 49 66 20 74 68 65 72 65 20 61 72       If there ar
1fb20 65 20 6e 6f 20 69 6e 65 71 75 61 6c 69 74 79 20  e no inequality 
1fb30 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68 65  constraints, the
1fb40 6e 20 4e 20 69 73 20 61 74 0a 20 20 20 20 2a 2a  n N is at.    **
1fb50 20 20 20 20 20 20 20 20 20 6c 65 61 73 74 20 6f           least o
1fb60 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ne..    **.    *
1fb70 2a 20 20 20 20 20 20 20 20 20 54 68 69 73 20 63  *         This c
1fb80 61 73 65 20 69 73 20 61 6c 73 6f 20 75 73 65 64  ase is also used
1fb90 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20   when there are 
1fba0 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a  no WHERE clause.
1fbb0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63      **         c
1fbc0 6f 6e 73 74 72 61 69 6e 74 73 20 62 75 74 20 61  onstraints but a
1fbd0 6e 20 69 6e 64 65 78 20 69 73 20 73 65 6c 65 63  n index is selec
1fbe0 74 65 64 20 61 6e 79 77 61 79 2c 20 69 6e 20 6f  ted anyway, in o
1fbf0 72 64 65 72 0a 20 20 20 20 2a 2a 20 20 20 20 20  rder.    **     
1fc00 20 20 20 20 74 6f 20 66 6f 72 63 65 20 74 68 65      to force the
1fc10 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20 74 6f   output order to
1fc20 20 63 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e 20 4f   conform to an O
1fc30 52 44 45 52 20 42 59 2e 0a 20 20 20 20 2a 2f 20  RDER BY..    */ 
1fc40 20 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e   .    static con
1fc50 73 74 20 75 38 20 61 53 74 61 72 74 4f 70 5b 5d  st u8 aStartOp[]
1fc60 20 3d 20 7b 0a 20 20 20 20 20 20 30 2c 0a 20 20   = {.      0,.  
1fc70 20 20 20 20 30 2c 0a 20 20 20 20 20 20 4f 50 5f      0,.      OP_
1fc80 52 65 77 69 6e 64 2c 20 20 20 20 20 20 20 20 20  Rewind,         
1fc90 20 20 2f 2a 20 32 3a 20 28 21 73 74 61 72 74 5f    /* 2: (!start_
1fca0 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73  constraints && s
1fcb0 74 61 72 74 45 71 20 26 26 20 20 21 62 52 65 76  tartEq &&  !bRev
1fcc0 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 4c 61  ) */.      OP_La
1fcd0 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
1fce0 2f 2a 20 33 3a 20 28 21 73 74 61 72 74 5f 63 6f  /* 3: (!start_co
1fcf0 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73 74 61  nstraints && sta
1fd00 72 74 45 71 20 26 26 20 20 20 62 52 65 76 29 20  rtEq &&   bRev) 
1fd10 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b  */.      OP_Seek
1fd20 47 54 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  GT,           /*
1fd30 20 34 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74   4: (start_const
1fd40 72 61 69 6e 74 73 20 20 26 26 20 21 73 74 61 72  raints  && !star
1fd50 74 45 71 20 26 26 20 21 62 52 65 76 29 20 2a 2f  tEq && !bRev) */
1fd60 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c 54  .      OP_SeekLT
1fd70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 35  ,           /* 5
1fd80 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61  : (start_constra
1fd90 69 6e 74 73 20 20 26 26 20 21 73 74 61 72 74 45  ints  && !startE
1fda0 71 20 26 26 20 20 62 52 65 76 29 20 2a 2f 0a 20  q &&  bRev) */. 
1fdb0 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 45 2c 20       OP_SeekGE, 
1fdc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 36 3a 20            /* 6: 
1fdd0 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  (start_constrain
1fde0 74 73 20 20 26 26 20 20 73 74 61 72 74 45 71 20  ts  &&  startEq 
1fdf0 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20  && !bRev) */.   
1fe00 20 20 20 4f 50 5f 53 65 65 6b 4c 45 20 20 20 20     OP_SeekLE    
1fe10 20 20 20 20 20 20 20 20 2f 2a 20 37 3a 20 28 73          /* 7: (s
1fe20 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
1fe30 20 20 26 26 20 20 73 74 61 72 74 45 71 20 26 26    &&  startEq &&
1fe40 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d    bRev) */.    }
1fe50 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  ;.    static con
1fe60 73 74 20 75 38 20 61 45 6e 64 4f 70 5b 5d 20 3d  st u8 aEndOp[] =
1fe70 20 7b 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 47   {.      OP_IdxG
1fe80 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  E,            /*
1fe90 20 30 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61   0: (end_constra
1fea0 69 6e 74 73 20 26 26 20 21 62 52 65 76 20 26 26  ints && !bRev &&
1feb0 20 21 65 6e 64 45 71 29 20 2a 2f 0a 20 20 20 20   !endEq) */.    
1fec0 20 20 4f 50 5f 49 64 78 47 54 2c 20 20 20 20 20    OP_IdxGT,     
1fed0 20 20 20 20 20 20 20 2f 2a 20 31 3a 20 28 65 6e         /* 1: (en
1fee0 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26  d_constraints &&
1fef0 20 21 62 52 65 76 20 26 26 20 20 65 6e 64 45 71   !bRev &&  endEq
1ff00 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64  ) */.      OP_Id
1ff10 78 4c 45 2c 20 20 20 20 20 20 20 20 20 20 20 20  xLE,            
1ff20 2f 2a 20 32 3a 20 28 65 6e 64 5f 63 6f 6e 73 74  /* 2: (end_const
1ff30 72 61 69 6e 74 73 20 26 26 20 20 62 52 65 76 20  raints &&  bRev 
1ff40 26 26 20 21 65 6e 64 45 71 29 20 2a 2f 0a 20 20  && !endEq) */.  
1ff50 20 20 20 20 4f 50 5f 49 64 78 4c 54 2c 20 20 20      OP_IdxLT,   
1ff60 20 20 20 20 20 20 20 20 20 2f 2a 20 33 3a 20 28           /* 3: (
1ff70 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  end_constraints 
1ff80 26 26 20 20 62 52 65 76 20 26 26 20 20 65 6e 64  &&  bRev &&  end
1ff90 45 71 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20  Eq) */.    };.  
1ffa0 20 20 75 31 36 20 6e 45 71 20 3d 20 70 4c 6f 6f    u16 nEq = pLoo
1ffb0 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 20  p->u.btree.nEq; 
1ffc0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1ffd0 20 3d 3d 20 6f 72 20 49 4e 20 74 65 72 6d 73 20   == or IN terms 
1ffe0 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 42 61  */.    int regBa
1fff0 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
20000 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67 69      /* Base regi
20010 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f 6e  ster holding con
20020 73 74 72 61 69 6e 74 20 76 61 6c 75 65 73 20 2a  straint values *
20030 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  /.    WhereTerm 
20040 2a 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20 30  *pRangeStart = 0
20050 3b 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79  ;  /* Inequality
20060 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 72   constraint at r
20070 61 6e 67 65 20 73 74 61 72 74 20 2a 2f 0a 20 20  ange start */.  
20080 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52 61    WhereTerm *pRa
20090 6e 67 65 45 6e 64 20 3d 20 30 3b 20 20 20 20 2f  ngeEnd = 0;    /
200a0 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  * Inequality con
200b0 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67 65  straint at range
200c0 20 65 6e 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20   end */.    int 
200d0 73 74 61 72 74 45 71 3b 20 20 20 20 20 20 20 20  startEq;        
200e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
200f0 20 69 66 20 72 61 6e 67 65 20 73 74 61 72 74 20   if range start 
20100 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c  uses ==, >= or <
20110 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 6e 64  = */.    int end
20120 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Eq;             
20130 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
20140 20 72 61 6e 67 65 20 65 6e 64 20 75 73 65 73 20   range end uses 
20150 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a  ==, >= or <= */.
20160 20 20 20 20 69 6e 74 20 73 74 61 72 74 5f 63 6f      int start_co
20170 6e 73 74 72 61 69 6e 74 73 3b 20 20 20 20 20 20  nstraints;      
20180 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 72 61 6e   /* Start of ran
20190 67 65 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65  ge is constraine
201a0 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f  d */.    int nCo
201b0 6e 73 74 72 61 69 6e 74 3b 20 20 20 20 20 20 20  nstraint;       
201c0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
201d0 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65  of constraint te
201e0 72 6d 73 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78  rms */.    Index
201f0 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
20200 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
20210 6e 64 65 78 20 77 65 20 77 69 6c 6c 20 62 65 20  ndex we will be 
20220 75 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74  using */.    int
20230 20 69 49 64 78 43 75 72 3b 20 20 20 20 20 20 20   iIdxCur;       
20240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
20250 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72   VDBE cursor for
20260 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20   the index */.  
20270 20 20 69 6e 74 20 6e 45 78 74 72 61 52 65 67 20    int nExtraReg 
20280 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
20290 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72  * Number of extr
202a0 61 20 72 65 67 69 73 74 65 72 73 20 6e 65 65 64  a registers need
202b0 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 70  ed */.    int op
202c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
202d0 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 74 72 75         /* Instru
202e0 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a  ction opcode */.
202f0 20 20 20 20 63 68 61 72 20 2a 7a 53 74 61 72 74      char *zStart
20300 41 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Aff;            
20310 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 66 6f 72   /* Affinity for
20320 20 73 74 61 72 74 20 6f 66 20 72 61 6e 67 65 20   start of range 
20330 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20  constraint */.  
20340 20 20 63 68 61 72 20 63 45 6e 64 41 66 66 20 3d    char cEndAff =
20350 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
20360 2a 20 41 66 66 69 6e 69 74 79 20 66 6f 72 20 65  * Affinity for e
20370 6e 64 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73  nd of range cons
20380 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 75 38  traint */.    u8
20390 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 20 3d   bSeekPastNull =
203a0 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72   0;        /* Tr
203b0 75 65 20 74 6f 20 73 65 65 6b 20 70 61 73 74 20  ue to seek past 
203c0 69 6e 69 74 69 61 6c 20 6e 75 6c 6c 73 20 2a 2f  initial nulls */
203d0 0a 20 20 20 20 75 38 20 62 53 74 6f 70 41 74 4e  .    u8 bStopAtN
203e0 75 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ull = 0;        
203f0 20 20 2f 2a 20 41 64 64 20 63 6f 6e 64 69 74 69    /* Add conditi
20400 6f 6e 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20  on to terminate 
20410 61 74 20 4e 55 4c 4c 73 20 2a 2f 0a 0a 20 20 20  at NULLs */..   
20420 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75   pIdx = pLoop->u
20430 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
20440 20 20 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65     iIdxCur = pLe
20450 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20  vel->iIdxCur;.  
20460 20 20 61 73 73 65 72 74 28 20 6e 45 71 3e 3d 70    assert( nEq>=p
20470 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 20 29 3b 0a 0a  Loop->nSkip );..
20480 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 6c      /* If this l
20490 6f 6f 70 20 73 61 74 69 73 66 69 65 73 20 61 20  oop satisfies a 
204a0 73 6f 72 74 20 6f 72 64 65 72 20 28 70 4f 72 64  sort order (pOrd
204b0 65 72 42 79 29 20 72 65 71 75 65 73 74 20 74 68  erBy) request th
204c0 61 74 20 0a 20 20 20 20 2a 2a 20 77 61 73 20 70  at .    ** was p
204d0 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
204e0 6e 63 74 69 6f 6e 20 74 6f 20 69 6d 70 6c 65 6d  nction to implem
204f0 65 6e 74 20 61 20 22 53 45 4c 45 43 54 20 6d 69  ent a "SELECT mi
20500 6e 28 78 29 20 2e 2e 2e 22 20 0a 20 20 20 20 2a  n(x) ..." .    *
20510 2a 20 71 75 65 72 79 2c 20 74 68 65 6e 20 74 68  * query, then th
20520 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 6e  e caller will on
20530 6c 79 20 61 6c 6c 6f 77 20 74 68 65 20 6c 6f 6f  ly allow the loo
20540 70 20 74 6f 20 72 75 6e 20 66 6f 72 0a 20 20 20  p to run for.   
20550 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 69 74 65   ** a single ite
20560 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61  ration. This mea
20570 6e 73 20 74 68 61 74 20 74 68 65 20 66 69 72 73  ns that the firs
20580 74 20 72 6f 77 20 72 65 74 75 72 6e 65 64 0a 20  t row returned. 
20590 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 6e 6f 74     ** should not
205a0 20 68 61 76 65 20 61 20 4e 55 4c 4c 20 76 61 6c   have a NULL val
205b0 75 65 20 73 74 6f 72 65 64 20 69 6e 20 27 78 27  ue stored in 'x'
205c0 2e 20 49 66 20 63 6f 6c 75 6d 6e 20 27 78 27 20  . If column 'x' 
205d0 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69  is.    ** the fi
205e0 72 73 74 20 6f 6e 65 20 61 66 74 65 72 20 74 68  rst one after th
205f0 65 20 6e 45 71 20 65 71 75 61 6c 69 74 79 20 63  e nEq equality c
20600 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 74 68  onstraints in th
20610 65 20 69 6e 64 65 78 2c 0a 20 20 20 20 2a 2a 20  e index,.    ** 
20620 74 68 69 73 20 72 65 71 75 69 72 65 73 20 73 6f  this requires so
20630 6d 65 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c  me special handl
20640 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ing..    */.    
20650 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
20660 70 4f 72 64 65 72 42 79 3d 3d 30 0a 20 20 20 20  pOrderBy==0.    
20670 20 20 20 20 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e       || pWInfo->
20680 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d  pOrderBy->nExpr=
20690 3d 31 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  =1.         || (
206a0 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
206b0 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42 59  gs&WHERE_ORDERBY
206c0 5f 4d 49 4e 29 3d 3d 30 20 29 3b 0a 20 20 20 20  _MIN)==0 );.    
206d0 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74  if( (pWInfo->wct
206e0 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52  rlFlags&WHERE_OR
206f0 44 45 52 42 59 5f 4d 49 4e 29 21 3d 30 0a 20 20  DERBY_MIN)!=0.  
20700 20 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e 6e 4f     && pWInfo->nO
20710 42 53 61 74 3e 30 0a 20 20 20 20 20 26 26 20 28  BSat>0.     && (
20720 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 6e 45  pIdx->nKeyCol>nE
20730 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  q).    ){.      
20740 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 6e  assert( pLoop->n
20750 53 6b 69 70 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Skip==0 );.     
20760 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 20 3d   bSeekPastNull =
20770 20 31 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61   1;.      nExtra
20780 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a  Reg = 1;.    }..
20790 20 20 20 20 2f 2a 20 46 69 6e 64 20 61 6e 79 20      /* Find any 
207a0 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
207b0 72 61 69 6e 74 20 74 65 72 6d 73 20 66 6f 72 20  raint terms for 
207c0 74 68 65 20 73 74 61 72 74 20 61 6e 64 20 65 6e  the start and en
207d0 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  d .    ** of the
207e0 20 72 61 6e 67 65 2e 20 0a 20 20 20 20 2a 2f 0a   range. .    */.
207f0 20 20 20 20 6a 20 3d 20 6e 45 71 3b 0a 20 20 20      j = nEq;.   
20800 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
20810 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
20820 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 70  LIMIT ){.      p
20830 52 61 6e 67 65 53 74 61 72 74 20 3d 20 70 4c 6f  RangeStart = pLo
20840 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b  op->aLTerm[j++];
20850 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65 67  .      nExtraReg
20860 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 4c   = 1;.      /* L
20870 69 6b 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ike optimization
20880 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
20890 74 73 20 61 6c 77 61 79 73 20 6f 63 63 75 72 20  ts always occur 
208a0 69 6e 20 70 61 69 72 73 20 2a 2f 0a 20 20 20 20  in pairs */.    
208b0 20 20 61 73 73 65 72 74 28 20 28 70 52 61 6e 67    assert( (pRang
208c0 65 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20  eStart->wtFlags 
208d0 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 29 3d  & TERM_LIKEOPT)=
208e0 3d 30 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  =0 || .         
208f0 20 20 20 20 20 28 70 4c 6f 6f 70 2d 3e 77 73 46       (pLoop->wsF
20900 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50  lags & WHERE_TOP
20910 5f 4c 49 4d 49 54 29 21 3d 30 20 29 3b 0a 20 20  _LIMIT)!=0 );.  
20920 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f    }.    if( pLoo
20930 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
20940 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a  RE_TOP_LIMIT ){.
20950 20 20 20 20 20 20 70 52 61 6e 67 65 45 6e 64 20        pRangeEnd 
20960 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  = pLoop->aLTerm[
20970 6a 2b 2b 5d 3b 0a 20 20 20 20 20 20 6e 45 78 74  j++];.      nExt
20980 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 20  raReg = 1;.     
20990 20 69 66 28 20 28 70 52 61 6e 67 65 45 6e 64 2d   if( (pRangeEnd-
209a0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
209b0 4c 49 4b 45 4f 50 54 29 21 3d 30 20 29 7b 0a 20  LIKEOPT)!=0 ){. 
209c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
209d0 52 61 6e 67 65 53 74 61 72 74 21 3d 30 20 29 3b  RangeStart!=0 );
209e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209f0 20 20 20 20 20 2f 2a 20 4c 49 4b 45 20 6f 70 74       /* LIKE opt
20a00 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
20a10 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
20a20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 77 74 46  pRangeStart->wtF
20a30 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45  lags & TERM_LIKE
20a40 4f 50 54 20 29 3b 20 20 20 2f 2a 20 6f 63 63 75  OPT );   /* occu
20a50 72 20 69 6e 20 70 61 69 72 73 20 2a 2f 0a 20 20  r in pairs */.  
20a60 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c        pLevel->iL
20a70 69 6b 65 52 65 70 43 6e 74 72 20 3d 20 2b 2b 70  ikeRepCntr = ++p
20a80 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
20a90 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 62       testcase( b
20aa0 52 65 76 20 29 3b 0a 20 20 20 20 20 20 20 20 74  Rev );.        t
20ab0 65 73 74 63 61 73 65 28 20 70 49 64 78 2d 3e 61  estcase( pIdx->a
20ac0 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d 3d 3d  SortOrder[nEq]==
20ad0 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 20 29  SQLITE_SO_DESC )
20ae0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
20af0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
20b00 50 5f 49 6e 74 65 67 65 72 2c 0a 20 20 20 20 20  P_Integer,.     
20b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b20 20 20 20 20 20 62 52 65 76 20 5e 20 28 70 49 64       bRev ^ (pId
20b30 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45  x->aSortOrder[nE
20b40 71 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 44 45  q]==SQLITE_SO_DE
20b50 53 43 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  SC),.           
20b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
20b70 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65 70 43  Level->iLikeRepC
20b80 6e 74 72 29 3b 0a 20 20 20 20 20 20 20 20 56 64  ntr);.        Vd
20b90 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c  beComment((v, "L
20ba0 49 4b 45 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72  IKE loop counter
20bb0 22 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65  "));.        pLe
20bc0 76 65 6c 2d 3e 61 64 64 72 4c 69 6b 65 52 65 70  vel->addrLikeRep
20bd0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
20be0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
20bf0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
20c00 70 52 61 6e 67 65 53 74 61 72 74 3d 3d 30 0a 20  pRangeStart==0. 
20c10 20 20 20 20 20 20 26 26 20 28 6a 20 3d 20 70 49        && (j = pI
20c20 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71  dx->aiColumn[nEq
20c30 5d 29 3e 3d 30 20 0a 20 20 20 20 20 20 20 26 26  ])>=0 .       &&
20c40 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61   pIdx->pTable->a
20c50 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d  Col[j].notNull==
20c60 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  0.      ){.     
20c70 20 20 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c     bSeekPastNull
20c80 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
20c90 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
20ca0 70 52 61 6e 67 65 45 6e 64 3d 3d 30 20 7c 7c 20  pRangeEnd==0 || 
20cb0 28 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c  (pRangeEnd->wtFl
20cc0 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
20cd0 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  )==0 );..    /* 
20ce0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
20cf0 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 63 6f   evaluate all co
20d00 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20 75  nstraint terms u
20d10 73 69 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a 20 20  sing == or IN.  
20d20 20 20 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74    ** and store t
20d30 68 65 20 76 61 6c 75 65 73 20 6f 66 20 74 68 6f  he values of tho
20d40 73 65 20 74 65 72 6d 73 20 69 6e 20 61 6e 20 61  se terms in an a
20d50 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
20d60 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e  s.    ** startin
20d70 67 20 61 74 20 72 65 67 42 61 73 65 2e 0a 20 20  g at regBase..  
20d80 20 20 2a 2f 0a 20 20 20 20 72 65 67 42 61 73 65    */.    regBase
20d90 20 3d 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69   = codeAllEquali
20da0 74 79 54 65 72 6d 73 28 70 50 61 72 73 65 2c 70  tyTerms(pParse,p
20db0 4c 65 76 65 6c 2c 62 52 65 76 2c 6e 45 78 74 72  Level,bRev,nExtr
20dc0 61 52 65 67 2c 26 7a 53 74 61 72 74 41 66 66 29  aReg,&zStartAff)
20dd0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 53  ;.    assert( zS
20de0 74 61 72 74 41 66 66 3d 3d 30 20 7c 7c 20 73 71  tartAff==0 || sq
20df0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 53  lite3Strlen30(zS
20e00 74 61 72 74 41 66 66 29 3e 3d 6e 45 71 20 29 3b  tartAff)>=nEq );
20e10 0a 20 20 20 20 69 66 28 20 7a 53 74 61 72 74 41  .    if( zStartA
20e20 66 66 20 29 20 63 45 6e 64 41 66 66 20 3d 20 7a  ff ) cEndAff = z
20e30 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 3b 0a 20  StartAff[nEq];. 
20e40 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65     addrNxt = pLe
20e50 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 0a 20  vel->addrNxt;.. 
20e60 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20     /* If we are 
20e70 64 6f 69 6e 67 20 61 20 72 65 76 65 72 73 65 20  doing a reverse 
20e80 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e 20 61 6e  order scan on an
20e90 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78   ascending index
20ea0 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 66 6f  , or.    ** a fo
20eb0 72 77 61 72 64 20 6f 72 64 65 72 20 73 63 61 6e  rward order scan
20ec0 20 6f 6e 20 61 20 64 65 73 63 65 6e 64 69 6e 67   on a descending
20ed0 20 69 6e 64 65 78 2c 20 69 6e 74 65 72 63 68 61   index, intercha
20ee0 6e 67 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  nge the .    ** 
20ef0 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20 74 65  start and end te
20f00 72 6d 73 20 28 70 52 61 6e 67 65 53 74 61 72 74  rms (pRangeStart
20f10 20 61 6e 64 20 70 52 61 6e 67 65 45 6e 64 29 2e   and pRangeEnd).
20f20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
20f30 28 6e 45 71 3c 70 49 64 78 2d 3e 6e 4b 65 79 43  (nEq<pIdx->nKeyC
20f40 6f 6c 20 26 26 20 62 52 65 76 3d 3d 28 70 49 64  ol && bRev==(pId
20f50 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45  x->aSortOrder[nE
20f60 71 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53  q]==SQLITE_SO_AS
20f70 43 29 29 0a 20 20 20 20 20 7c 7c 20 28 62 52 65  C)).     || (bRe
20f80 76 20 26 26 20 70 49 64 78 2d 3e 6e 4b 65 79 43  v && pIdx->nKeyC
20f90 6f 6c 3d 3d 6e 45 71 29 0a 20 20 20 20 29 7b 0a  ol==nEq).    ){.
20fa0 20 20 20 20 20 20 53 57 41 50 28 57 68 65 72 65        SWAP(Where
20fb0 54 65 72 6d 20 2a 2c 20 70 52 61 6e 67 65 45 6e  Term *, pRangeEn
20fc0 64 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b  d, pRangeStart);
20fd0 0a 20 20 20 20 20 20 53 57 41 50 28 75 38 2c 20  .      SWAP(u8, 
20fe0 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 2c 20 62  bSeekPastNull, b
20ff0 53 74 6f 70 41 74 4e 75 6c 6c 29 3b 0a 20 20 20  StopAtNull);.   
21000 20 7d 0a 0a 20 20 20 20 74 65 73 74 63 61 73 65   }..    testcase
21010 28 20 70 52 61 6e 67 65 53 74 61 72 74 20 26 26  ( pRangeStart &&
21020 20 28 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65   (pRangeStart->e
21030 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45  Operator & WO_LE
21040 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74  )!=0 );.    test
21050 63 61 73 65 28 20 70 52 61 6e 67 65 53 74 61 72  case( pRangeStar
21060 74 20 26 26 20 28 70 52 61 6e 67 65 53 74 61 72  t && (pRangeStar
21070 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  t->eOperator & W
21080 4f 5f 47 45 29 21 3d 30 20 29 3b 0a 20 20 20 20  O_GE)!=0 );.    
21090 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65  testcase( pRange
210a0 45 6e 64 20 26 26 20 28 70 52 61 6e 67 65 45 6e  End && (pRangeEn
210b0 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  d->eOperator & W
210c0 4f 5f 4c 45 29 21 3d 30 20 29 3b 0a 20 20 20 20  O_LE)!=0 );.    
210d0 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65  testcase( pRange
210e0 45 6e 64 20 26 26 20 28 70 52 61 6e 67 65 45 6e  End && (pRangeEn
210f0 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  d->eOperator & W
21100 4f 5f 47 45 29 21 3d 30 20 29 3b 0a 20 20 20 20  O_GE)!=0 );.    
21110 73 74 61 72 74 45 71 20 3d 20 21 70 52 61 6e 67  startEq = !pRang
21120 65 53 74 61 72 74 20 7c 7c 20 70 52 61 6e 67 65  eStart || pRange
21130 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72  Start->eOperator
21140 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29   & (WO_LE|WO_GE)
21150 3b 0a 20 20 20 20 65 6e 64 45 71 20 3d 20 20 20  ;.    endEq =   
21160 21 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20 70 52  !pRangeEnd || pR
21170 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74  angeEnd->eOperat
21180 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47  or & (WO_LE|WO_G
21190 45 29 3b 0a 20 20 20 20 73 74 61 72 74 5f 63 6f  E);.    start_co
211a0 6e 73 74 72 61 69 6e 74 73 20 3d 20 70 52 61 6e  nstraints = pRan
211b0 67 65 53 74 61 72 74 20 7c 7c 20 6e 45 71 3e 30  geStart || nEq>0
211c0 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20 74  ;..    /* Seek t
211d0 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20  he index cursor 
211e0 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
211f0 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20  the range. */.  
21200 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20    nConstraint = 
21210 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70 52 61  nEq;.    if( pRa
21220 6e 67 65 53 74 61 72 74 20 29 7b 0a 20 20 20 20  ngeStart ){.    
21230 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d    Expr *pRight =
21240 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 70 45   pRangeStart->pE
21250 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
21260 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
21270 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  de(pParse, pRigh
21280 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b  t, regBase+nEq);
21290 0a 20 20 20 20 20 20 77 68 65 72 65 4c 69 6b 65  .      whereLike
212a0 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 53 74 72 69  OptimizationStri
212b0 6e 67 46 69 78 75 70 28 76 2c 20 70 4c 65 76 65  ngFixup(v, pLeve
212c0 6c 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b  l, pRangeStart);
212d0 0a 20 20 20 20 20 20 69 66 28 20 28 70 52 61 6e  .      if( (pRan
212e0 67 65 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73  geStart->wtFlags
212f0 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d   & TERM_VNULL)==
21300 30 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69  0.       && sqli
21310 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c  te3ExprCanBeNull
21320 28 70 52 69 67 68 74 29 0a 20 20 20 20 20 20 29  (pRight).      )
21330 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
21340 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
21350 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 42 61 73  P_IsNull, regBas
21360 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74 29 3b  e+nEq, addrNxt);
21370 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
21380 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
21390 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 53 74 61  }.      if( zSta
213a0 72 74 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20  rtAff ){.       
213b0 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70   if( sqlite3Comp
213c0 61 72 65 41 66 66 69 6e 69 74 79 28 70 52 69 67  areAffinity(pRig
213d0 68 74 2c 20 7a 53 74 61 72 74 41 66 66 5b 6e 45  ht, zStartAff[nE
213e0 71 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  q])==SQLITE_AFF_
213f0 4e 4f 4e 45 29 7b 0a 20 20 20 20 20 20 20 20 20  NONE){.         
21400 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 63 6f   /* Since the co
21410 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 6f 20 62  mparison is to b
21420 65 20 70 65 72 66 6f 72 6d 65 64 20 77 69 74 68  e performed with
21430 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a   no conversions.
21440 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70            ** app
21450 6c 69 65 64 20 74 6f 20 74 68 65 20 6f 70 65 72  lied to the oper
21460 61 6e 64 73 2c 20 73 65 74 20 74 68 65 20 61 66  ands, set the af
21470 66 69 6e 69 74 79 20 74 6f 20 61 70 70 6c 79 20  finity to apply 
21480 74 6f 20 70 52 69 67 68 74 20 74 6f 20 0a 20 20  to pRight to .  
21490 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54          ** SQLIT
214a0 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a  E_AFF_NONE.  */.
214b0 20 20 20 20 20 20 20 20 20 20 7a 53 74 61 72 74            zStart
214c0 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54  Aff[nEq] = SQLIT
214d0 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
214e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
214f0 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65  ( sqlite3ExprNee
21500 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e  dsNoAffinityChan
21510 67 65 28 70 52 69 67 68 74 2c 20 7a 53 74 61 72  ge(pRight, zStar
21520 74 41 66 66 5b 6e 45 71 5d 29 20 29 7b 0a 20 20  tAff[nEq]) ){.  
21530 20 20 20 20 20 20 20 20 7a 53 74 61 72 74 41 66          zStartAf
21540 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f  f[nEq] = SQLITE_
21550 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  AFF_NONE;.      
21560 20 20 7d 0a 20 20 20 20 20 20 7d 20 20 0a 20 20    }.      }  .  
21570 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b      nConstraint+
21580 2b 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  +;.      testcas
21590 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e  e( pRangeStart->
215a0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
215b0 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 7d 65  IRTUAL );.    }e
215c0 6c 73 65 20 69 66 28 20 62 53 65 65 6b 50 61 73  lse if( bSeekPas
215d0 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73  tNull ){.      s
215e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
215f0 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
21600 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20  regBase+nEq);.  
21610 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b      nConstraint+
21620 2b 3b 0a 20 20 20 20 20 20 73 74 61 72 74 45 71  +;.      startEq
21630 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 61 72   = 0;.      star
21640 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20  t_constraints = 
21650 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f 64  1;.    }.    cod
21660 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70  eApplyAffinity(p
21670 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20  Parse, regBase, 
21680 6e 43 6f 6e 73 74 72 61 69 6e 74 20 2d 20 62 53  nConstraint - bS
21690 65 65 6b 50 61 73 74 4e 75 6c 6c 2c 20 7a 53 74  eekPastNull, zSt
216a0 61 72 74 41 66 66 29 3b 0a 20 20 20 20 6f 70 20  artAff);.    op 
216b0 3d 20 61 53 74 61 72 74 4f 70 5b 28 73 74 61 72  = aStartOp[(star
216c0 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3c 3c 32  t_constraints<<2
216d0 29 20 2b 20 28 73 74 61 72 74 45 71 3c 3c 31 29  ) + (startEq<<1)
216e0 20 2b 20 62 52 65 76 5d 3b 0a 20 20 20 20 61 73   + bRev];.    as
216f0 73 65 72 74 28 20 6f 70 21 3d 30 20 29 3b 0a 20  sert( op!=0 );. 
21700 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
21710 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69  dOp4Int(v, op, i
21720 49 64 78 43 75 72 2c 20 61 64 64 72 4e 78 74 2c  IdxCur, addrNxt,
21730 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74   regBase, nConst
21740 72 61 69 6e 74 29 3b 0a 20 20 20 20 56 64 62 65  raint);.    Vdbe
21750 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
21760 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
21770 76 2c 20 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64  v, op==OP_Rewind
21780 29 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f 70  );  testcase( op
21790 3d 3d 4f 50 5f 52 65 77 69 6e 64 20 29 3b 0a 20  ==OP_Rewind );. 
217a0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
217b0 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4c 61 73 74  f(v, op==OP_Last
217c0 29 3b 20 20 20 20 74 65 73 74 63 61 73 65 28 20  );    testcase( 
217d0 6f 70 3d 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a 20  op==OP_Last );. 
217e0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
217f0 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b  f(v, op==OP_Seek
21800 47 54 29 3b 20 20 74 65 73 74 63 61 73 65 28 20  GT);  testcase( 
21810 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 54 20 29 3b  op==OP_SeekGT );
21820 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
21830 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65  eIf(v, op==OP_Se
21840 65 6b 47 45 29 3b 20 20 74 65 73 74 63 61 73 65  ekGE);  testcase
21850 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 45 20  ( op==OP_SeekGE 
21860 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
21870 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
21880 53 65 65 6b 4c 45 29 3b 20 20 74 65 73 74 63 61  SeekLE);  testca
21890 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c  se( op==OP_SeekL
218a0 45 20 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  E );.    VdbeCov
218b0 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
218c0 50 5f 53 65 65 6b 4c 54 29 3b 20 20 74 65 73 74  P_SeekLT);  test
218d0 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65  case( op==OP_See
218e0 6b 4c 54 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c  kLT );..    /* L
218f0 6f 61 64 20 74 68 65 20 76 61 6c 75 65 20 66 6f  oad the value fo
21900 72 20 74 68 65 20 69 6e 65 71 75 61 6c 69 74 79  r the inequality
21910 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 74   constraint at t
21920 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20  he end of the.  
21930 20 20 2a 2a 20 72 61 6e 67 65 20 28 69 66 20 61    ** range (if a
21940 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ny)..    */.    
21950 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45  nConstraint = nE
21960 71 3b 0a 20 20 20 20 69 66 28 20 70 52 61 6e 67  q;.    if( pRang
21970 65 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 45 78  eEnd ){.      Ex
21980 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 52 61  pr *pRight = pRa
21990 6e 67 65 45 6e 64 2d 3e 70 45 78 70 72 2d 3e 70  ngeEnd->pExpr->p
219a0 52 69 67 68 74 3b 0a 20 20 20 20 20 20 73 71 6c  Right;.      sql
219b0 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d  ite3ExprCacheRem
219c0 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 42  ove(pParse, regB
219d0 61 73 65 2b 6e 45 71 2c 20 31 29 3b 0a 20 20 20  ase+nEq, 1);.   
219e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
219f0 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  de(pParse, pRigh
21a00 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b  t, regBase+nEq);
21a10 0a 20 20 20 20 20 20 77 68 65 72 65 4c 69 6b 65  .      whereLike
21a20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 53 74 72 69  OptimizationStri
21a30 6e 67 46 69 78 75 70 28 76 2c 20 70 4c 65 76 65  ngFixup(v, pLeve
21a40 6c 2c 20 70 52 61 6e 67 65 45 6e 64 29 3b 0a 20  l, pRangeEnd);. 
21a50 20 20 20 20 20 69 66 28 20 28 70 52 61 6e 67 65       if( (pRange
21a60 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  End->wtFlags & T
21a70 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 0a 20 20  ERM_VNULL)==0.  
21a80 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 45       && sqlite3E
21a90 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 52 69  xprCanBeNull(pRi
21aa0 67 68 74 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  ght).      ){.  
21ab0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21ac0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73  eAddOp2(v, OP_Is
21ad0 4e 75 6c 6c 2c 20 72 65 67 42 61 73 65 2b 6e 45  Null, regBase+nE
21ae0 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20  q, addrNxt);.   
21af0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
21b00 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  e(v);.      }.  
21b10 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43      if( sqlite3C
21b20 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
21b30 52 69 67 68 74 2c 20 63 45 6e 64 41 66 66 29 21  Right, cEndAff)!
21b40 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45  =SQLITE_AFF_NONE
21b50 0a 20 20 20 20 20 20 20 26 26 20 21 73 71 6c 69  .       && !sqli
21b60 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66  te3ExprNeedsNoAf
21b70 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 52 69  finityChange(pRi
21b80 67 68 74 2c 20 63 45 6e 64 41 66 66 29 0a 20 20  ght, cEndAff).  
21b90 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 63      ){.        c
21ba0 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79  odeApplyAffinity
21bb0 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
21bc0 2b 6e 45 71 2c 20 31 2c 20 26 63 45 6e 64 41 66  +nEq, 1, &cEndAf
21bd0 66 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  f);.      }.    
21be0 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b    nConstraint++;
21bf0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
21c00 20 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c   pRangeEnd->wtFl
21c10 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
21c20 41 4c 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  AL );.    }else 
21c30 69 66 28 20 62 53 74 6f 70 41 74 4e 75 6c 6c 20  if( bStopAtNull 
21c40 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
21c50 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
21c60 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 42 61 73  _Null, 0, regBas
21c70 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 65 6e  e+nEq);.      en
21c80 64 45 71 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e  dEq = 0;.      n
21c90 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20  Constraint++;.  
21ca0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
21cb0 62 46 72 65 65 28 64 62 2c 20 7a 53 74 61 72 74  bFree(db, zStart
21cc0 41 66 66 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 6f  Aff);..    /* To
21cd0 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 62 6f  p of the loop bo
21ce0 64 79 20 2a 2f 0a 20 20 20 20 70 4c 65 76 65 6c  dy */.    pLevel
21cf0 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ->p2 = sqlite3Vd
21d00 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
21d10 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
21d20 69 66 20 74 68 65 20 69 6e 64 65 78 20 63 75 72  if the index cur
21d30 73 6f 72 20 69 73 20 70 61 73 74 20 74 68 65 20  sor is past the 
21d40 65 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65  end of the range
21d50 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 43 6f  . */.    if( nCo
21d60 6e 73 74 72 61 69 6e 74 20 29 7b 0a 20 20 20 20  nstraint ){.    
21d70 20 20 6f 70 20 3d 20 61 45 6e 64 4f 70 5b 62 52    op = aEndOp[bR
21d80 65 76 2a 32 20 2b 20 65 6e 64 45 71 5d 3b 0a 20  ev*2 + endEq];. 
21d90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
21da0 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c  AddOp4Int(v, op,
21db0 20 69 49 64 78 43 75 72 2c 20 61 64 64 72 4e 78   iIdxCur, addrNx
21dc0 74 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e  t, regBase, nCon
21dd0 73 74 72 61 69 6e 74 29 3b 0a 20 20 20 20 20 20  straint);.      
21de0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
21df0 5f 49 64 78 47 54 20 29 3b 20 20 56 64 62 65 43  _IdxGT );  VdbeC
21e00 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
21e10 3d 4f 50 5f 49 64 78 47 54 20 29 3b 0a 20 20 20  =OP_IdxGT );.   
21e20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
21e30 3d 4f 50 5f 49 64 78 47 45 20 29 3b 20 20 56 64  =OP_IdxGE );  Vd
21e40 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
21e50 6f 70 3d 3d 4f 50 5f 49 64 78 47 45 20 29 3b 0a  op==OP_IdxGE );.
21e60 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
21e70 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54 20 29 3b 20  op==OP_IdxLT ); 
21e80 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
21e90 76 2c 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54 20  v, op==OP_IdxLT 
21ea0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
21eb0 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 45 20  e( op==OP_IdxLE 
21ec0 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  );  VdbeCoverage
21ed0 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 49 64 78  If(v, op==OP_Idx
21ee0 4c 45 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  LE );.    }..   
21ef0 20 2f 2a 20 53 65 65 6b 20 74 68 65 20 74 61 62   /* Seek the tab
21f00 6c 65 20 63 75 72 73 6f 72 2c 20 69 66 20 72 65  le cursor, if re
21f10 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 64 69  quired */.    di
21f20 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
21f30 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a  , pRangeStart);.
21f40 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
21f50 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 45 6e  pLevel, pRangeEn
21f60 64 29 3b 0a 20 20 20 20 69 66 28 20 6f 6d 69 74  d);.    if( omit
21f70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 2f  Table ){.      /
21f80 2a 20 70 49 64 78 20 69 73 20 61 20 63 6f 76 65  * pIdx is a cove
21f90 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 4e 6f 20  ring index.  No 
21fa0 6e 65 65 64 20 74 6f 20 61 63 63 65 73 73 20 74  need to access t
21fb0 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 20 2a  he main table. *
21fc0 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  /.    }else if( 
21fd0 48 61 73 52 6f 77 69 64 28 70 49 64 78 2d 3e 70  HasRowid(pIdx->p
21fe0 54 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 20 20  Table) ){.      
21ff0 69 52 6f 77 69 64 52 65 67 20 3d 20 2b 2b 70 50  iRowidReg = ++pP
22000 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
22010 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
22020 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77  Op2(v, OP_IdxRow
22030 69 64 2c 20 69 49 64 78 43 75 72 2c 20 69 52 6f  id, iIdxCur, iRo
22040 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73  widReg);.      s
22050 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53  qlite3ExprCacheS
22060 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43 75  tore(pParse, iCu
22070 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67  r, -1, iRowidReg
22080 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
22090 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
220a0 5f 53 65 65 6b 2c 20 69 43 75 72 2c 20 69 52 6f  _Seek, iCur, iRo
220b0 77 69 64 52 65 67 29 3b 20 20 2f 2a 20 44 65 66  widReg);  /* Def
220c0 65 72 72 65 64 20 73 65 65 6b 20 2a 2f 0a 20 20  erred seek */.  
220d0 20 20 7d 65 6c 73 65 20 69 66 28 20 69 43 75 72    }else if( iCur
220e0 21 3d 69 49 64 78 43 75 72 20 29 7b 0a 20 20 20  !=iIdxCur ){.   
220f0 20 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20     Index *pPk = 
22100 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
22110 79 49 6e 64 65 78 28 70 49 64 78 2d 3e 70 54 61  yIndex(pIdx->pTa
22120 62 6c 65 29 3b 0a 20 20 20 20 20 20 69 52 6f 77  ble);.      iRow
22130 69 64 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47  idReg = sqlite3G
22140 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
22150 73 65 2c 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c  se, pPk->nKeyCol
22160 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  );.      for(j=0
22170 3b 20 6a 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c  ; j<pPk->nKeyCol
22180 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
22190 6b 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  k = sqlite3Colum
221a0 6e 4f 66 49 6e 64 65 78 28 70 49 64 78 2c 20 70  nOfIndex(pIdx, p
221b0 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 29  Pk->aiColumn[j])
221c0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
221d0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
221e0 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75  P_Column, iIdxCu
221f0 72 2c 20 6b 2c 20 69 52 6f 77 69 64 52 65 67 2b  r, k, iRowidReg+
22200 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  j);.      }.    
22210 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
22220 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74  Op4Int(v, OP_Not
22230 46 6f 75 6e 64 2c 20 69 43 75 72 2c 20 61 64 64  Found, iCur, add
22240 72 43 6f 6e 74 2c 0a 20 20 20 20 20 20 20 20 20  rCont,.         
22250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22260 20 20 69 52 6f 77 69 64 52 65 67 2c 20 70 50 6b    iRowidReg, pPk
22270 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56 64 62 65  ->nKeyCol); Vdbe
22280 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
22290 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72   }..    /* Recor
222a0 64 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f  d the instructio
222b0 6e 20 75 73 65 64 20 74 6f 20 74 65 72 6d 69 6e  n used to termin
222c0 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 44 69  ate the loop. Di
222d0 73 61 62 6c 65 20 0a 20 20 20 20 2a 2a 20 57 48  sable .    ** WH
222e0 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
222f0 20 6d 61 64 65 20 72 65 64 75 6e 64 61 6e 74 20   made redundant 
22300 62 79 20 74 68 65 20 69 6e 64 65 78 20 72 61 6e  by the index ran
22310 67 65 20 73 63 61 6e 2e 0a 20 20 20 20 2a 2f 0a  ge scan..    */.
22320 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
22330 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  sFlags & WHERE_O
22340 4e 45 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 70  NEROW ){.      p
22350 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e  Level->op = OP_N
22360 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  oop;.    }else i
22370 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20  f( bRev ){.     
22380 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
22390 5f 50 72 65 76 3b 0a 20 20 20 20 7d 65 6c 73 65  _Prev;.    }else
223a0 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
223b0 6f 70 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20  op = OP_Next;.  
223c0 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e    }.    pLevel->
223d0 70 31 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20  p1 = iIdxCur;.  
223e0 20 20 70 4c 65 76 65 6c 2d 3e 70 33 20 3d 20 28    pLevel->p3 = (
223f0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57  pLoop->wsFlags&W
22400 48 45 52 45 5f 55 4e 51 5f 57 41 4e 54 45 44 29  HERE_UNQ_WANTED)
22410 21 3d 30 20 3f 20 31 3a 30 3b 0a 20 20 20 20 69  !=0 ? 1:0;.    i
22420 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
22430 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4e 53 54  gs & WHERE_CONST
22440 52 41 49 4e 54 29 3d 3d 30 20 29 7b 0a 20 20 20  RAINT)==0 ){.   
22450 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20     pLevel->p5 = 
22460 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
22470 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 3b  S_FULLSCAN_STEP;
22480 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
22490 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c    assert( pLevel
224a0 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  ->p5==0 );.    }
224b0 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65  .  }else..#ifnde
224c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52  f SQLITE_OMIT_OR
224d0 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20  _OPTIMIZATION.  
224e0 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
224f0 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49  gs & WHERE_MULTI
22500 5f 4f 52 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61  _OR ){.    /* Ca
22510 73 65 20 35 3a 20 20 54 77 6f 20 6f 72 20 6d 6f  se 5:  Two or mo
22520 72 65 20 73 65 70 61 72 61 74 65 6c 79 20 69 6e  re separately in
22530 64 65 78 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e  dexed terms conn
22540 65 63 74 65 64 20 62 79 20 4f 52 0a 20 20 20 20  ected by OR.    
22550 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c  **.    ** Exampl
22560 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e:.    **.    **
22570 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
22580 74 31 28 61 2c 62 2c 63 2c 64 29 3b 0a 20 20 20  t1(a,b,c,d);.   
22590 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44   **   CREATE IND
225a0 45 58 20 69 31 20 4f 4e 20 74 31 28 61 29 3b 0a  EX i1 ON t1(a);.
225b0 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20      **   CREATE 
225c0 49 4e 44 45 58 20 69 32 20 4f 4e 20 74 31 28 62  INDEX i2 ON t1(b
225d0 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41  );.    **   CREA
225e0 54 45 20 49 4e 44 45 58 20 69 33 20 4f 4e 20 74  TE INDEX i3 ON t
225f0 31 28 63 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  1(c);.    **.   
22600 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46   **   SELECT * F
22610 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 35  ROM t1 WHERE a=5
22620 20 4f 52 20 62 3d 37 20 4f 52 20 28 63 3d 31 31   OR b=7 OR (c=11
22630 20 41 4e 44 20 64 3d 31 33 29 0a 20 20 20 20 2a   AND d=13).    *
22640 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 65 20  *.    ** In the 
22650 65 78 61 6d 70 6c 65 2c 20 74 68 65 72 65 20 61  example, there a
22660 72 65 20 74 68 72 65 65 20 69 6e 64 65 78 65 64  re three indexed
22670 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64   terms connected
22680 20 62 79 20 4f 52 2e 0a 20 20 20 20 2a 2a 20 54   by OR..    ** T
22690 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f  he top of the lo
226a0 6f 70 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68  op looks like th
226b0 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  is:.    **.    *
226c0 2a 20 20 20 20 20 20 20 20 20 20 4e 75 6c 6c 20  *          Null 
226d0 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
226e0 20 20 20 20 20 20 20 23 20 5a 65 72 6f 20 74 68         # Zero th
226f0 65 20 72 6f 77 73 65 74 20 69 6e 20 72 65 67 20  e rowset in reg 
22700 31 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  1.    **.    ** 
22710 54 68 65 6e 2c 20 66 6f 72 20 65 61 63 68 20 69  Then, for each i
22720 6e 64 65 78 65 64 20 74 65 72 6d 2c 20 74 68 65  ndexed term, the
22730 20 66 6f 6c 6c 6f 77 69 6e 67 2e 20 54 68 65 20   following. The 
22740 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20  arguments to.   
22750 20 2a 2a 20 52 6f 77 53 65 74 54 65 73 74 20 61   ** RowSetTest a
22760 72 65 20 73 75 63 68 20 74 68 61 74 20 74 68 65  re such that the
22770 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 63 75   rowid of the cu
22780 72 72 65 6e 74 20 72 6f 77 20 69 73 20 69 6e 73  rrent row is ins
22790 65 72 74 65 64 0a 20 20 20 20 2a 2a 20 69 6e 74  erted.    ** int
227a0 6f 20 74 68 65 20 52 6f 77 53 65 74 2e 20 49 66  o the RowSet. If
227b0 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 70   it is already p
227c0 72 65 73 65 6e 74 2c 20 63 6f 6e 74 72 6f 6c 20  resent, control 
227d0 73 6b 69 70 73 20 74 68 65 0a 20 20 20 20 2a 2a  skips the.    **
227e0 20 47 6f 73 75 62 20 6f 70 63 6f 64 65 20 61 6e   Gosub opcode an
227f0 64 20 6a 75 6d 70 73 20 73 74 72 61 69 67 68 74  d jumps straight
22800 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e   to the code gen
22810 65 72 61 74 65 64 20 62 79 20 57 68 65 72 65 45  erated by WhereE
22820 6e 64 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  nd()..    **.   
22830 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c 69 74   **        sqlit
22840 65 33 57 68 65 72 65 42 65 67 69 6e 28 3c 74 65  e3WhereBegin(<te
22850 72 6d 3e 29 0a 20 20 20 20 2a 2a 20 20 20 20 20  rm>).    **     
22860 20 20 20 20 20 52 6f 77 53 65 74 54 65 73 74 20       RowSetTest 
22870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22880 20 23 20 49 6e 73 65 72 74 20 72 6f 77 69 64 20   # Insert rowid 
22890 69 6e 74 6f 20 72 6f 77 73 65 74 0a 20 20 20 20  into rowset.    
228a0 2a 2a 20 20 20 20 20 20 20 20 20 20 47 6f 73 75  **          Gosu
228b0 62 20 20 20 20 20 20 32 20 41 0a 20 20 20 20 2a  b      2 A.    *
228c0 2a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  *        sqlite3
228d0 57 68 65 72 65 45 6e 64 28 29 0a 20 20 20 20 2a  WhereEnd().    *
228e0 2a 0a 20 20 20 20 2a 2a 20 46 6f 6c 6c 6f 77 69  *.    ** Followi
228f0 6e 67 20 74 68 65 20 61 62 6f 76 65 2c 20 63 6f  ng the above, co
22900 64 65 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20  de to terminate 
22910 74 68 65 20 6c 6f 6f 70 2e 20 4c 61 62 65 6c 20  the loop. Label 
22920 41 2c 20 74 68 65 20 74 61 72 67 65 74 0a 20 20  A, the target.  
22930 20 20 2a 2a 20 6f 66 20 74 68 65 20 47 6f 73 75    ** of the Gosu
22940 62 20 61 62 6f 76 65 2c 20 6a 75 6d 70 73 20 74  b above, jumps t
22950 6f 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f  o the instructio
22960 6e 20 72 69 67 68 74 20 61 66 74 65 72 20 74 68  n right after th
22970 65 20 47 6f 74 6f 2e 0a 20 20 20 20 2a 2a 0a 20  e Goto..    **. 
22980 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 4e     **          N
22990 75 6c 6c 20 20 20 20 20 20 20 31 20 20 20 20 20  ull       1     
229a0 20 20 20 20 20 20 20 20 20 20 20 23 20 5a 65 72             # Zer
229b0 6f 20 74 68 65 20 72 6f 77 73 65 74 20 69 6e 20  o the rowset in 
229c0 72 65 67 20 31 0a 20 20 20 20 2a 2a 20 20 20 20  reg 1.    **    
229d0 20 20 20 20 20 20 47 6f 74 6f 20 20 20 20 20 20        Goto      
229e0 20 42 20 20 20 20 20 20 20 20 20 20 20 20 20 20   B              
229f0 20 20 23 20 54 68 65 20 6c 6f 6f 70 20 69 73 20    # The loop is 
22a00 66 69 6e 69 73 68 65 64 2e 0a 20 20 20 20 2a 2a  finished..    **
22a10 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 41 3a  .    **       A:
22a20 20 3c 6c 6f 6f 70 20 62 6f 64 79 3e 20 20 20 20   <loop body>    
22a30 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 52               # R
22a40 65 74 75 72 6e 20 64 61 74 61 2c 20 77 68 61 74  eturn data, what
22a50 65 76 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ever..    **.   
22a60 20 2a 2a 20 20 20 20 20 20 20 20 20 20 52 65 74   **          Ret
22a70 75 72 6e 20 20 20 20 20 32 20 20 20 20 20 20 20  urn     2       
22a80 20 20 20 20 20 20 20 20 20 23 20 4a 75 6d 70 20           # Jump 
22a90 62 61 63 6b 20 74 6f 20 74 68 65 20 47 6f 73 75  back to the Gosu
22aa0 62 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  b.    **.    ** 
22ab0 20 20 20 20 20 20 42 3a 20 3c 61 66 74 65 72 20        B: <after 
22ac0 74 68 65 20 6c 6f 6f 70 3e 0a 20 20 20 20 2a 2a  the loop>.    **
22ad0 0a 20 20 20 20 2a 2a 20 41 64 64 65 64 20 32 30  .    ** Added 20
22ae0 31 34 2d 30 35 2d 32 36 3a 20 49 66 20 74 68 65  14-05-26: If the
22af0 20 74 61 62 6c 65 20 69 73 20 61 20 57 49 54 48   table is a WITH
22b00 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2c  OUT ROWID table,
22b10 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 75 73 65   then.    ** use
22b20 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e   an ephemeral in
22b30 64 65 78 20 69 6e 73 74 65 61 64 20 6f 66 20 61  dex instead of a
22b40 20 52 6f 77 53 65 74 20 74 6f 20 72 65 63 6f 72   RowSet to recor
22b50 64 20 74 68 65 20 70 72 69 6d 61 72 79 0a 20 20  d the primary.  
22b60 20 20 2a 2a 20 6b 65 79 73 20 6f 66 20 74 68 65    ** keys of the
22b70 20 72 6f 77 73 20 77 65 20 68 61 76 65 20 61 6c   rows we have al
22b80 72 65 61 64 79 20 73 65 65 6e 2e 0a 20 20 20 20  ready seen..    
22b90 2a 2a 0a 20 20 20 20 2a 2f 0a 20 20 20 20 57 68  **.    */.    Wh
22ba0 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 57 63  ereClause *pOrWc
22bb0 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 2d 63  ;    /* The OR-c
22bc0 6c 61 75 73 65 20 62 72 6f 6b 65 6e 20 6f 75 74  lause broken out
22bd0 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a   into subterms *
22be0 2f 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70  /.    SrcList *p
22bf0 4f 72 54 61 62 3b 20 20 20 20 20 20 20 2f 2a 20  OrTab;       /* 
22c00 53 68 6f 72 74 65 6e 65 64 20 74 61 62 6c 65 20  Shortened table 
22c10 6c 69 73 74 20 6f 72 20 4f 52 2d 63 6c 61 75 73  list or OR-claus
22c20 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a  e generation */.
22c30 20 20 20 20 49 6e 64 65 78 20 2a 70 43 6f 76 20      Index *pCov 
22c40 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
22c50 20 2f 2a 20 50 6f 74 65 6e 74 69 61 6c 20 63 6f   /* Potential co
22c60 76 65 72 69 6e 67 20 69 6e 64 65 78 20 28 6f 72  vering index (or
22c70 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 20 20 69 6e   NULL) */.    in
22c80 74 20 69 43 6f 76 43 75 72 20 3d 20 70 50 61 72  t iCovCur = pPar
22c90 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 2f 2a 20  se->nTab++;  /* 
22ca0 43 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20  Cursor used for 
22cb0 69 6e 64 65 78 20 73 63 61 6e 73 20 28 69 66 20  index scans (if 
22cc0 61 6e 79 29 20 2a 2f 0a 0a 20 20 20 20 69 6e 74  any) */..    int
22cd0 20 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70   regReturn = ++p
22ce0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20 20  Parse->nMem;    
22cf0 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
22d00 65 72 20 75 73 65 64 20 77 69 74 68 20 4f 50 5f  er used with OP_
22d10 47 6f 73 75 62 20 2a 2f 0a 20 20 20 20 69 6e 74  Gosub */.    int
22d20 20 72 65 67 52 6f 77 73 65 74 20 3d 20 30 3b 20   regRowset = 0; 
22d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d40 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
22d50 65 72 20 66 6f 72 20 52 6f 77 53 65 74 20 6f 62  er for RowSet ob
22d60 6a 65 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ject */.    int 
22d70 72 65 67 52 6f 77 69 64 20 3d 20 30 3b 20 20 20  regRowid = 0;   
22d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d90 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
22da0 72 20 68 6f 6c 64 69 6e 67 20 72 6f 77 69 64 20  r holding rowid 
22db0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4c 6f 6f 70  */.    int iLoop
22dc0 42 6f 64 79 20 3d 20 73 71 6c 69 74 65 33 56 64  Body = sqlite3Vd
22dd0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20  beMakeLabel(v); 
22de0 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6c 6f 6f   /* Start of loo
22df0 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20 69 6e  p body */.    in
22e00 74 20 69 52 65 74 49 6e 69 74 3b 20 20 20 20 20  t iRetInit;     
22e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
22e30 73 73 20 6f 66 20 72 65 67 52 65 74 75 72 6e 20  ss of regReturn 
22e40 69 6e 69 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  init */.    int 
22e50 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d 20  untestedTerms = 
22e60 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
22e70 2a 20 53 6f 6d 65 20 74 65 72 6d 73 20 6e 6f 74  * Some terms not
22e80 20 63 6f 6d 70 6c 65 74 65 6c 79 20 74 65 73 74   completely test
22e90 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69  ed */.    int ii
22ea0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22ec0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
22ed0 20 20 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61      u16 wctrlFla
22ee0 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
22ef0 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
22f00 66 6f 72 20 73 75 62 2d 57 48 45 52 45 20 63 6c  for sub-WHERE cl
22f10 61 75 73 65 20 2a 2f 0a 20 20 20 20 45 78 70 72  ause */.    Expr
22f20 20 2a 70 41 6e 64 45 78 70 72 20 3d 20 30 3b 20   *pAndExpr = 0; 
22f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22f40 2a 20 41 6e 20 22 2e 2e 20 41 4e 44 20 28 2e 2e  * An ".. AND (..
22f50 2e 29 22 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  .)" expression *
22f60 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  /.    Table *pTa
22f70 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  b = pTabItem->pT
22f80 61 62 3b 0a 20 20 20 0a 20 20 20 20 70 54 65 72  ab;.   .    pTer
22f90 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  m = pLoop->aLTer
22fa0 6d 5b 30 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  m[0];.    assert
22fb0 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20  ( pTerm!=0 );.  
22fc0 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
22fd0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
22fe0 4f 52 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  OR );.    assert
22ff0 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  ( (pTerm->wtFlag
23000 73 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 29  s & TERM_ORINFO)
23010 21 3d 30 20 29 3b 0a 20 20 20 20 70 4f 72 57 63  !=0 );.    pOrWc
23020 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72   = &pTerm->u.pOr
23030 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 70 4c  Info->wc;.    pL
23040 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 52 65  evel->op = OP_Re
23050 74 75 72 6e 3b 0a 20 20 20 20 70 4c 65 76 65 6c  turn;.    pLevel
23060 2d 3e 70 31 20 3d 20 72 65 67 52 65 74 75 72 6e  ->p1 = regReturn
23070 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 70  ;..    /* Set up
23080 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69   a new SrcList i
23090 6e 20 70 4f 72 54 61 62 20 63 6f 6e 74 61 69 6e  n pOrTab contain
230a0 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20 62 65  ing the table be
230b0 69 6e 67 20 73 63 61 6e 6e 65 64 0a 20 20 20 20  ing scanned.    
230c0 2a 2a 20 62 79 20 74 68 69 73 20 6c 6f 6f 70 20  ** by this loop 
230d0 69 6e 20 74 68 65 20 61 5b 30 5d 20 73 6c 6f 74  in the a[0] slot
230e0 20 61 6e 64 20 61 6c 6c 20 6e 6f 74 52 65 61 64   and all notRead
230f0 79 20 74 61 62 6c 65 73 20 69 6e 20 61 5b 31 2e  y tables in a[1.
23100 2e 5d 20 73 6c 6f 74 73 2e 0a 20 20 20 20 2a 2a  .] slots..    **
23110 20 54 68 69 73 20 62 65 63 6f 6d 65 73 20 74 68   This becomes th
23120 65 20 53 72 63 4c 69 73 74 20 69 6e 20 74 68 65  e SrcList in the
23130 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 20   recursive call 
23140 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
23150 65 67 69 6e 28 29 2e 0a 20 20 20 20 2a 2f 0a 20  egin()..    */. 
23160 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e     if( pWInfo->n
23170 4c 65 76 65 6c 3e 31 20 29 7b 0a 20 20 20 20 20  Level>1 ){.     
23180 20 69 6e 74 20 6e 4e 6f 74 52 65 61 64 79 3b 20   int nNotReady; 
23190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231a0 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
231b0 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 73   notReady tables
231c0 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74   */.      struct
231d0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 6f   SrcList_item *o
231e0 72 69 67 53 72 63 3b 20 20 20 20 20 2f 2a 20 4f  rigSrc;     /* O
231f0 72 69 67 69 6e 61 6c 20 6c 69 73 74 20 6f 66 20  riginal list of 
23200 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20  tables */.      
23210 6e 4e 6f 74 52 65 61 64 79 20 3d 20 70 57 49 6e  nNotReady = pWIn
23220 66 6f 2d 3e 6e 4c 65 76 65 6c 20 2d 20 69 4c 65  fo->nLevel - iLe
23230 76 65 6c 20 2d 20 31 3b 0a 20 20 20 20 20 20 70  vel - 1;.      p
23240 4f 72 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53  OrTab = sqlite3S
23250 74 61 63 6b 41 6c 6c 6f 63 52 61 77 28 64 62 2c  tackAllocRaw(db,
23260 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23270 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
23280 65 6f 66 28 2a 70 4f 72 54 61 62 29 2b 20 6e 4e  eof(*pOrTab)+ nN
23290 6f 74 52 65 61 64 79 2a 73 69 7a 65 6f 66 28 70  otReady*sizeof(p
232a0 4f 72 54 61 62 2d 3e 61 5b 30 5d 29 29 3b 0a 20  OrTab->a[0]));. 
232b0 20 20 20 20 20 69 66 28 20 70 4f 72 54 61 62 3d       if( pOrTab=
232c0 3d 30 20 29 20 72 65 74 75 72 6e 20 6e 6f 74 52  =0 ) return notR
232d0 65 61 64 79 3b 0a 20 20 20 20 20 20 70 4f 72 54  eady;.      pOrT
232e0 61 62 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 28 75 38  ab->nAlloc = (u8
232f0 29 28 6e 4e 6f 74 52 65 61 64 79 20 2b 20 31 29  )(nNotReady + 1)
23300 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 2d 3e  ;.      pOrTab->
23310 6e 53 72 63 20 3d 20 70 4f 72 54 61 62 2d 3e 6e  nSrc = pOrTab->n
23320 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 6d 65 6d  Alloc;.      mem
23330 63 70 79 28 70 4f 72 54 61 62 2d 3e 61 2c 20 70  cpy(pOrTab->a, p
23340 54 61 62 49 74 65 6d 2c 20 73 69 7a 65 6f 66 28  TabItem, sizeof(
23350 2a 70 54 61 62 49 74 65 6d 29 29 3b 0a 20 20 20  *pTabItem));.   
23360 20 20 20 6f 72 69 67 53 72 63 20 3d 20 70 57 49     origSrc = pWI
23370 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
23380 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b  ;.      for(k=1;
23390 20 6b 3c 3d 6e 4e 6f 74 52 65 61 64 79 3b 20 6b   k<=nNotReady; k
233a0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ++){.        mem
233b0 63 70 79 28 26 70 4f 72 54 61 62 2d 3e 61 5b 6b  cpy(&pOrTab->a[k
233c0 5d 2c 20 26 6f 72 69 67 53 72 63 5b 70 4c 65 76  ], &origSrc[pLev
233d0 65 6c 5b 6b 5d 2e 69 46 72 6f 6d 5d 2c 20 73 69  el[k].iFrom], si
233e0 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e 61 5b 6b  zeof(pOrTab->a[k
233f0 5d 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ]));.      }.   
23400 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4f   }else{.      pO
23410 72 54 61 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  rTab = pWInfo->p
23420 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 7d 0a 0a  TabList;.    }..
23430 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
23440 65 20 74 68 65 20 72 6f 77 73 65 74 20 72 65 67  e the rowset reg
23450 69 73 74 65 72 20 74 6f 20 63 6f 6e 74 61 69 6e  ister to contain
23460 20 4e 55 4c 4c 2e 20 41 6e 20 53 51 4c 20 4e 55   NULL. An SQL NU
23470 4c 4c 20 69 73 20 0a 20 20 20 20 2a 2a 20 65 71  LL is .    ** eq
23480 75 69 76 61 6c 65 6e 74 20 74 6f 20 61 6e 20 65  uivalent to an e
23490 6d 70 74 79 20 72 6f 77 73 65 74 2e 20 20 4f 72  mpty rowset.  Or
234a0 2c 20 63 72 65 61 74 65 20 61 6e 20 65 70 68 65  , create an ephe
234b0 6d 65 72 61 6c 20 69 6e 64 65 78 0a 20 20 20 20  meral index.    
234c0 2a 2a 20 63 61 70 61 62 6c 65 20 6f 66 20 68 6f  ** capable of ho
234d0 6c 64 69 6e 67 20 70 72 69 6d 61 72 79 20 6b 65  lding primary ke
234e0 79 73 20 69 6e 20 74 68 65 20 63 61 73 65 20 6f  ys in the case o
234f0 66 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49  f a WITHOUT ROWI
23500 44 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  D..    **.    **
23510 20 41 6c 73 6f 20 69 6e 69 74 69 61 6c 69 7a 65   Also initialize
23520 20 72 65 67 52 65 74 75 72 6e 20 74 6f 20 63 6f   regReturn to co
23530 6e 74 61 69 6e 20 74 68 65 20 61 64 64 72 65 73  ntain the addres
23540 73 20 6f 66 20 74 68 65 20 69 6e 73 74 72 75 63  s of the instruc
23550 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 69 6d 6d  tion .    ** imm
23560 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69  ediately followi
23570 6e 67 20 74 68 65 20 4f 50 5f 52 65 74 75 72 6e  ng the OP_Return
23580 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f   at the bottom o
23590 66 20 74 68 65 20 6c 6f 6f 70 2e 20 54 68 69 73  f the loop. This
235a0 0a 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69  .    ** is requi
235b0 72 65 64 20 69 6e 20 61 20 66 65 77 20 6f 62 73  red in a few obs
235c0 63 75 72 65 20 4c 45 46 54 20 4a 4f 49 4e 20 63  cure LEFT JOIN c
235d0 61 73 65 73 20 77 68 65 72 65 20 63 6f 6e 74 72  ases where contr
235e0 6f 6c 20 6a 75 6d 70 73 0a 20 20 20 20 2a 2a 20  ol jumps.    ** 
235f0 6f 76 65 72 20 74 68 65 20 74 6f 70 20 6f 66 20  over the top of 
23600 74 68 65 20 6c 6f 6f 70 20 69 6e 74 6f 20 74 68  the loop into th
23610 65 20 62 6f 64 79 20 6f 66 20 69 74 2e 20 49 6e  e body of it. In
23620 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 0a   this case the .
23630 20 20 20 20 2a 2a 20 63 6f 72 72 65 63 74 20 72      ** correct r
23640 65 73 70 6f 6e 73 65 20 66 6f 72 20 74 68 65 20  esponse for the 
23650 65 6e 64 2d 6f 66 2d 6c 6f 6f 70 20 63 6f 64 65  end-of-loop code
23660 20 28 74 68 65 20 4f 50 5f 52 65 74 75 72 6e 29   (the OP_Return)
23670 20 69 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 66   is to .    ** f
23680 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74  all through to t
23690 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  he next instruct
236a0 69 6f 6e 2c 20 6a 75 73 74 20 61 73 20 61 6e 20  ion, just as an 
236b0 4f 50 5f 4e 65 78 74 20 64 6f 65 73 20 69 66 0a  OP_Next does if.
236c0 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e      ** called on
236d0 20 61 6e 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   an uninitialize
236e0 64 20 63 75 72 73 6f 72 2e 0a 20 20 20 20 2a 2f  d cursor..    */
236f0 0a 20 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f  .    if( (pWInfo
23700 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
23710 48 45 52 45 5f 44 55 50 4c 49 43 41 54 45 53 5f  HERE_DUPLICATES_
23720 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  OK)==0 ){.      
23730 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61  if( HasRowid(pTa
23740 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  b) ){.        re
23750 67 52 6f 77 73 65 74 20 3d 20 2b 2b 70 50 61 72  gRowset = ++pPar
23760 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
23770 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
23780 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
23790 30 2c 20 72 65 67 52 6f 77 73 65 74 29 3b 0a 20  0, regRowset);. 
237a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
237b0 20 20 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d      Index *pPk =
237c0 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b   sqlite3PrimaryK
237d0 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20  eyIndex(pTab);. 
237e0 20 20 20 20 20 20 20 72 65 67 52 6f 77 73 65 74         regRowset
237f0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
23800 2b 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  +;.        sqlit
23810 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
23820 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
23830 2c 20 72 65 67 52 6f 77 73 65 74 2c 20 70 50 6b  , regRowset, pPk
23840 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20 20 20  ->nKeyCol);.    
23850 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
23860 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72  etP4KeyInfo(pPar
23870 73 65 2c 20 70 50 6b 29 3b 0a 20 20 20 20 20 20  se, pPk);.      
23880 7d 0a 20 20 20 20 20 20 72 65 67 52 6f 77 69 64  }.      regRowid
23890 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
238a0 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 52 65  m;.    }.    iRe
238b0 74 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33 56  tInit = sqlite3V
238c0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
238d0 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 52  Integer, 0, regR
238e0 65 74 75 72 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20  eturn);..    /* 
238f0 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  If the original 
23900 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20  WHERE clause is 
23910 7a 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20  z of the form:  
23920 28 78 31 20 4f 52 20 78 32 20 4f 52 20 2e 2e 2e  (x1 OR x2 OR ...
23930 29 20 41 4e 44 20 79 0a 20 20 20 20 2a 2a 20 54  ) AND y.    ** T
23940 68 65 6e 20 66 6f 72 20 65 76 65 72 79 20 74 65  hen for every te
23950 72 6d 20 78 4e 2c 20 65 76 61 6c 75 61 74 65 20  rm xN, evaluate 
23960 61 73 20 74 68 65 20 73 75 62 65 78 70 72 65 73  as the subexpres
23970 73 69 6f 6e 3a 20 78 4e 20 41 4e 44 20 7a 0a 20  sion: xN AND z. 
23980 20 20 20 2a 2a 20 54 68 61 74 20 77 61 79 2c 20     ** That way, 
23990 74 65 72 6d 73 20 69 6e 20 79 20 74 68 61 74 20  terms in y that 
239a0 61 72 65 20 66 61 63 74 6f 72 65 64 20 69 6e 74  are factored int
239b0 6f 20 74 68 65 20 64 69 73 6a 75 6e 63 74 69 6f  o the disjunctio
239c0 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65  n will.    ** be
239d0 20 70 69 63 6b 65 64 20 75 70 20 62 79 20 74 68   picked up by th
239e0 65 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c  e recursive call
239f0 73 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  s to sqlite3Wher
23a00 65 42 65 67 69 6e 28 29 20 62 65 6c 6f 77 2e 0a  eBegin() below..
23a10 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 63      **.    ** Ac
23a20 74 75 61 6c 6c 79 2c 20 65 61 63 68 20 73 75 62  tually, each sub
23a30 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
23a40 6e 76 65 72 74 65 64 20 74 6f 20 22 78 4e 20 41  nverted to "xN A
23a50 4e 44 20 77 22 20 77 68 65 72 65 20 77 20 69 73  ND w" where w is
23a60 0a 20 20 20 20 2a 2a 20 74 68 65 20 22 69 6e 74  .    ** the "int
23a70 65 72 65 73 74 69 6e 67 22 20 74 65 72 6d 73 20  eresting" terms 
23a80 6f 66 20 7a 20 2d 20 74 65 72 6d 73 20 74 68 61  of z - terms tha
23a90 74 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e  t did not origin
23aa0 61 74 65 20 69 6e 20 74 68 65 0a 20 20 20 20 2a  ate in the.    *
23ab0 2a 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  * ON or USING cl
23ac0 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a  ause of a LEFT J
23ad0 4f 49 4e 2c 20 61 6e 64 20 74 65 72 6d 73 20 74  OIN, and terms t
23ae0 68 61 74 20 61 72 65 20 75 73 61 62 6c 65 20 61  hat are usable a
23af0 73 20 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 65  s .    ** indice
23b00 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s..    **.    **
23b10 20 54 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   This optimizati
23b20 6f 6e 20 61 6c 73 6f 20 6f 6e 6c 79 20 61 70 70  on also only app
23b30 6c 69 65 73 20 69 66 20 74 68 65 20 28 78 31 20  lies if the (x1 
23b40 4f 52 20 78 32 20 4f 52 20 2e 2e 2e 29 20 74 65  OR x2 OR ...) te
23b50 72 6d 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  rm.    ** is not
23b60 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
23b70 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61  e ON clause of a
23b80 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 20 20 20 20   LEFT JOIN..    
23b90 2a 2a 20 53 65 65 20 74 69 63 6b 65 74 20 68 74  ** See ticket ht
23ba0 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e  tp://www.sqlite.
23bb0 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 66 32 33  org/src/info/f23
23bc0 36 39 33 30 34 65 34 0a 20 20 20 20 2a 2f 0a 20  69304e4.    */. 
23bd0 20 20 20 69 66 28 20 70 57 43 2d 3e 6e 54 65 72     if( pWC->nTer
23be0 6d 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  m>1 ){.      int
23bf0 20 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 66 6f   iTerm;.      fo
23c00 72 28 69 54 65 72 6d 3d 30 3b 20 69 54 65 72 6d  r(iTerm=0; iTerm
23c10 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 54 65  <pWC->nTerm; iTe
23c20 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45  rm++){.        E
23c30 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 57 43  xpr *pExpr = pWC
23c40 2d 3e 61 5b 69 54 65 72 6d 5d 2e 70 45 78 70 72  ->a[iTerm].pExpr
23c50 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 26 70  ;.        if( &p
23c60 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 20 3d 3d 20  WC->a[iTerm] == 
23c70 70 54 65 72 6d 20 29 20 63 6f 6e 74 69 6e 75 65  pTerm ) continue
23c80 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 45 78  ;.        if( Ex
23c90 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
23ca0 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
23cb0 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
23cc0 20 20 20 20 20 20 69 66 28 20 28 70 57 43 2d 3e        if( (pWC->
23cd0 61 5b 69 54 65 72 6d 5d 2e 77 74 46 6c 61 67 73  a[iTerm].wtFlags
23ce0 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 29   & TERM_VIRTUAL)
23cf0 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
23d00 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57 43          if( (pWC
23d10 2d 3e 61 5b 69 54 65 72 6d 5d 2e 65 4f 70 65 72  ->a[iTerm].eOper
23d20 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 29 3d 3d  ator & WO_ALL)==
23d30 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
23d40 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
23d50 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 77 74  pWC->a[iTerm].wt
23d60 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 49  Flags & TERM_ORI
23d70 4e 46 4f 20 29 3b 0a 20 20 20 20 20 20 20 20 70  NFO );.        p
23d80 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
23d90 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c  prDup(db, pExpr,
23da0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 41 6e   0);.        pAn
23db0 64 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  dExpr = sqlite3E
23dc0 78 70 72 41 6e 64 28 64 62 2c 20 70 41 6e 64 45  xprAnd(db, pAndE
23dd0 78 70 72 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  xpr, pExpr);.   
23de0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
23df0 41 6e 64 45 78 70 72 20 29 7b 0a 20 20 20 20 20  AndExpr ){.     
23e00 20 20 20 70 41 6e 64 45 78 70 72 20 3d 20 73 71     pAndExpr = sq
23e10 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
23e20 65 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c 20 70 41  e, TK_AND, 0, pA
23e30 6e 64 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20  ndExpr, 0);.    
23e40 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
23e50 2a 20 52 75 6e 20 61 20 73 65 70 61 72 61 74 65  * Run a separate
23e60 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 66 6f   WHERE clause fo
23e70 72 20 65 61 63 68 20 74 65 72 6d 20 6f 66 20 74  r each term of t
23e80 68 65 20 4f 52 20 63 6c 61 75 73 65 2e 20 20 41  he OR clause.  A
23e90 66 74 65 72 0a 20 20 20 20 2a 2a 20 65 6c 69 6d  fter.    ** elim
23ea0 69 6e 61 74 69 6e 67 20 64 75 70 6c 69 63 61 74  inating duplicat
23eb0 65 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 57 48  es from other WH
23ec0 45 52 45 20 63 6c 61 75 73 65 73 2c 20 74 68 65  ERE clauses, the
23ed0 20 61 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68   action for each
23ee0 0a 20 20 20 20 2a 2a 20 73 75 62 2d 57 48 45 52  .    ** sub-WHER
23ef0 45 20 63 6c 61 75 73 65 20 69 73 20 74 6f 20 74  E clause is to t
23f00 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 6d 61 69  o invoke the mai
23f10 6e 20 6c 6f 6f 70 20 62 6f 64 79 20 61 73 20 61  n loop body as a
23f20 20 73 75 62 72 6f 75 74 69 6e 65 2e 0a 20 20 20   subroutine..   
23f30 20 2a 2f 0a 20 20 20 20 77 63 74 72 6c 46 6c 61   */.    wctrlFla
23f40 67 73 20 3d 20 20 57 48 45 52 45 5f 4f 4d 49 54  gs =  WHERE_OMIT
23f50 5f 4f 50 45 4e 5f 43 4c 4f 53 45 0a 20 20 20 20  _OPEN_CLOSE.    
23f60 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 57 48              | WH
23f70 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 0a  ERE_FORCE_TABLE.
23f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f90 7c 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  | WHERE_ONETABLE
23fa0 5f 4f 4e 4c 59 0a 20 20 20 20 20 20 20 20 20 20  _ONLY.          
23fb0 20 20 20 20 20 20 7c 20 57 48 45 52 45 5f 4e 4f        | WHERE_NO
23fc0 5f 41 55 54 4f 49 4e 44 45 58 3b 0a 20 20 20 20  _AUTOINDEX;.    
23fd0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 72  for(ii=0; ii<pOr
23fe0 57 63 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29  Wc->nTerm; ii++)
23ff0 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  {.      WhereTer
24000 6d 20 2a 70 4f 72 54 65 72 6d 20 3d 20 26 70 4f  m *pOrTerm = &pO
24010 72 57 63 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20  rWc->a[ii];.    
24020 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c    if( pOrTerm->l
24030 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20  eftCursor==iCur 
24040 7c 7c 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70  || (pOrTerm->eOp
24050 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4e 44 29  erator & WO_AND)
24060 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 57  !=0 ){.        W
24070 68 65 72 65 49 6e 66 6f 20 2a 70 53 75 62 57 49  hereInfo *pSubWI
24080 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f  nfo;           /
24090 2a 20 49 6e 66 6f 20 66 6f 72 20 73 69 6e 67 6c  * Info for singl
240a0 65 20 4f 52 2d 74 65 72 6d 20 73 63 61 6e 20 2a  e OR-term scan *
240b0 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  /.        Expr *
240c0 70 4f 72 45 78 70 72 20 3d 20 70 4f 72 54 65 72  pOrExpr = pOrTer
240d0 6d 2d 3e 70 45 78 70 72 3b 20 2f 2a 20 43 75 72  m->pExpr; /* Cur
240e0 72 65 6e 74 20 4f 52 20 63 6c 61 75 73 65 20 74  rent OR clause t
240f0 65 72 6d 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  erm */.        i
24100 6e 74 20 6a 31 20 3d 20 30 3b 20 20 20 20 20 20  nt j1 = 0;      
24110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24120 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6a 75 6d  * Address of jum
24130 70 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  p operation */. 
24140 20 20 20 20 20 20 20 69 66 28 20 70 41 6e 64 45         if( pAndE
24150 78 70 72 20 26 26 20 21 45 78 70 72 48 61 73 50  xpr && !ExprHasP
24160 72 6f 70 65 72 74 79 28 70 4f 72 45 78 70 72 2c  roperty(pOrExpr,
24170 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b   EP_FromJoin) ){
24180 0a 20 20 20 20 20 20 20 20 20 20 70 41 6e 64 45  .          pAndE
24190 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70 4f 72  xpr->pLeft = pOr
241a0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
241b0 70 4f 72 45 78 70 72 20 3d 20 70 41 6e 64 45 78  pOrExpr = pAndEx
241c0 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  pr;.        }.  
241d0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68        /* Loop th
241e0 72 6f 75 67 68 20 74 61 62 6c 65 20 65 6e 74 72  rough table entr
241f0 69 65 73 20 74 68 61 74 20 6d 61 74 63 68 20 74  ies that match t
24200 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a  erm pOrTerm. */.
24210 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41          WHERETRA
24220 43 45 28 30 78 66 66 66 66 2c 20 28 22 53 75 62  CE(0xffff, ("Sub
24230 70 6c 61 6e 20 66 6f 72 20 4f 52 2d 63 6c 61 75  plan for OR-clau
24240 73 65 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  se:\n"));.      
24250 20 20 70 53 75 62 57 49 6e 66 6f 20 3d 20 73 71    pSubWInfo = sq
24260 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
24270 70 50 61 72 73 65 2c 20 70 4f 72 54 61 62 2c 20  pParse, pOrTab, 
24280 70 4f 72 45 78 70 72 2c 20 30 2c 20 30 2c 0a 20  pOrExpr, 0, 0,. 
24290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
242a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
242b0 20 20 20 20 20 77 63 74 72 6c 46 6c 61 67 73 2c       wctrlFlags,
242c0 20 69 43 6f 76 43 75 72 29 3b 0a 20 20 20 20 20   iCovCur);.     
242d0 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62 57     assert( pSubW
242e0 49 6e 66 6f 20 7c 7c 20 70 50 61 72 73 65 2d 3e  Info || pParse->
242f0 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  nErr || db->mall
24300 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
24310 20 20 20 20 69 66 28 20 70 53 75 62 57 49 6e 66      if( pSubWInf
24320 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 57  o ){.          W
24330 68 65 72 65 4c 6f 6f 70 20 2a 70 53 75 62 4c 6f  hereLoop *pSubLo
24340 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  op;.          in
24350 74 20 61 64 64 72 45 78 70 6c 61 69 6e 20 3d 20  t addrExplain = 
24360 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a  explainOneScan(.
24370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
24380 61 72 73 65 2c 20 70 4f 72 54 61 62 2c 20 26 70  arse, pOrTab, &p
24390 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20  SubWInfo->a[0], 
243a0 69 4c 65 76 65 6c 2c 20 70 4c 65 76 65 6c 2d 3e  iLevel, pLevel->
243b0 69 46 72 6f 6d 2c 20 30 0a 20 20 20 20 20 20 20  iFrom, 0.       
243c0 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20     );.          
243d0 61 64 64 53 63 61 6e 53 74 61 74 75 73 28 76 2c  addScanStatus(v,
243e0 20 70 4f 72 54 61 62 2c 20 26 70 53 75 62 57 49   pOrTab, &pSubWI
243f0 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 61 64 64 72 45  nfo->a[0], addrE
24400 78 70 6c 61 69 6e 29 3b 0a 0a 20 20 20 20 20 20  xplain);..      
24410 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
24420 68 65 20 73 75 62 2d 57 48 45 52 45 20 63 6c 61  he sub-WHERE cla
24430 75 73 65 20 62 6f 64 79 2e 20 20 46 69 72 73 74  use body.  First
24440 20 73 6b 69 70 20 6f 76 65 72 0a 20 20 20 20 20   skip over.     
24450 20 20 20 20 20 2a 2a 20 64 75 70 6c 69 63 61 74       ** duplicat
24460 65 20 72 6f 77 73 20 66 72 6f 6d 20 70 72 69 6f  e rows from prio
24470 72 20 73 75 62 2d 57 48 45 52 45 20 63 6c 61 75  r sub-WHERE clau
24480 73 65 73 2c 20 61 6e 64 20 72 65 63 6f 72 64 20  ses, and record 
24490 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
244a0 20 72 6f 77 69 64 20 28 6f 72 20 50 52 49 4d 41   rowid (or PRIMA
244b0 52 59 20 4b 45 59 29 20 66 6f 72 20 74 68 65 20  RY KEY) for the 
244c0 63 75 72 72 65 6e 74 20 72 6f 77 20 73 6f 20 74  current row so t
244d0 68 61 74 20 74 68 65 20 73 61 6d 65 0a 20 20 20  hat the same.   
244e0 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 20 77 69         ** row wi
244f0 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 20 69 6e  ll be skipped in
24500 20 73 75 62 73 65 71 75 65 6e 74 20 73 75 62 2d   subsequent sub-
24510 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e 0a 20  WHERE clauses.. 
24520 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
24530 20 20 20 20 20 20 69 66 28 20 28 70 57 49 6e 66        if( (pWInf
24540 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
24550 57 48 45 52 45 5f 44 55 50 4c 49 43 41 54 45 53  WHERE_DUPLICATES
24560 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  _OK)==0 ){.     
24570 20 20 20 20 20 20 20 69 6e 74 20 72 3b 0a 20 20         int r;.  
24580 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 53            int iS
24590 65 74 20 3d 20 28 28 69 69 3d 3d 70 4f 72 57 63  et = ((ii==pOrWc
245a0 2d 3e 6e 54 65 72 6d 2d 31 29 3f 2d 31 3a 69 69  ->nTerm-1)?-1:ii
245b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
245c0 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62  f( HasRowid(pTab
245d0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
245e0 20 20 20 72 20 3d 20 73 71 6c 69 74 65 33 45 78     r = sqlite3Ex
245f0 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28  prCodeGetColumn(
24600 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 2d 31  pParse, pTab, -1
24610 2c 20 69 43 75 72 2c 20 72 65 67 52 6f 77 69 64  , iCur, regRowid
24620 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
24630 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33      j1 = sqlite3
24640 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
24650 20 4f 50 5f 52 6f 77 53 65 74 54 65 73 74 2c 20   OP_RowSetTest, 
24660 72 65 67 52 6f 77 73 65 74 2c 20 30 2c 20 72 2c  regRowset, 0, r,
24670 69 53 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20  iSet);.         
24680 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
24690 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
246a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
246b0 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 50         Index *pP
246c0 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61  k = sqlite3Prima
246d0 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29  ryKeyIndex(pTab)
246e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
246f0 69 6e 74 20 6e 50 6b 20 3d 20 70 50 6b 2d 3e 6e  int nPk = pPk->n
24700 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  KeyCol;.        
24710 20 20 20 20 20 20 69 6e 74 20 69 50 6b 3b 0a 0a        int iPk;..
24720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24730 20 52 65 61 64 20 74 68 65 20 50 4b 20 69 6e 74   Read the PK int
24740 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20 74 65  o an array of te
24750 6d 70 20 72 65 67 69 73 74 65 72 73 2e 20 2a 2f  mp registers. */
24760 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
24770 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
24780 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
24790 50 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Pk);.           
247a0 20 20 20 66 6f 72 28 69 50 6b 3d 30 3b 20 69 50     for(iPk=0; iP
247b0 6b 3c 6e 50 6b 3b 20 69 50 6b 2b 2b 29 7b 0a 20  k<nPk; iPk++){. 
247c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
247d0 6e 74 20 69 43 6f 6c 20 3d 20 70 50 6b 2d 3e 61  nt iCol = pPk->a
247e0 69 43 6f 6c 75 6d 6e 5b 69 50 6b 5d 3b 0a 20 20  iColumn[iPk];.  
247f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
24800 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
24810 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70  Column(pParse, p
24820 54 61 62 2c 20 69 43 6f 6c 2c 20 69 43 75 72 2c  Tab, iCol, iCur,
24830 20 72 2b 69 50 6b 2c 20 30 29 3b 0a 20 20 20 20   r+iPk, 0);.    
24840 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
24850 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
24860 65 63 6b 20 69 66 20 74 68 65 20 74 65 6d 70 20  eck if the temp 
24870 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 63 6f  table already co
24880 6e 74 61 69 6e 73 20 74 68 69 73 20 6b 65 79 2e  ntains this key.
24890 20 49 66 20 73 6f 2c 0a 20 20 20 20 20 20 20 20   If so,.        
248a0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 6f 77        ** the row
248b0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
248c0 6e 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68  n included in th
248d0 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64  e result set and
248e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
248f0 2a 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64  * can be ignored
24900 20 28 62 79 20 6a 75 6d 70 69 6e 67 20 70 61 73   (by jumping pas
24910 74 20 74 68 65 20 47 6f 73 75 62 20 62 65 6c 6f  t the Gosub belo
24920 77 29 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20  w). Otherwise,. 
24930 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
24940 69 6e 73 65 72 74 20 74 68 65 20 6b 65 79 20 69  insert the key i
24950 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74 61 62  nto the temp tab
24960 6c 65 20 61 6e 64 20 70 72 6f 63 65 65 64 20 77  le and proceed w
24970 69 74 68 20 70 72 6f 63 65 73 73 69 6e 67 0a 20  ith processing. 
24980 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
24990 74 68 65 20 72 6f 77 2e 0a 20 20 20 20 20 20 20  the row..       
249a0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
249b0 20 20 20 20 20 20 20 20 2a 2a 20 55 73 65 20 73          ** Use s
249c0 6f 6d 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  ome of the same 
249d0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 61 73  optimizations as
249e0 20 4f 50 5f 52 6f 77 53 65 74 54 65 73 74 3a 20   OP_RowSetTest: 
249f0 49 66 20 69 53 65 74 0a 20 20 20 20 20 20 20 20  If iSet.        
24a00 20 20 20 20 20 20 2a 2a 20 69 73 20 7a 65 72 6f        ** is zero
24a10 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  , assume that th
24a20 65 20 6b 65 79 20 63 61 6e 6e 6f 74 20 61 6c 72  e key cannot alr
24a30 65 61 64 79 20 62 65 20 70 72 65 73 65 6e 74 20  eady be present 
24a40 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  in.             
24a50 20 2a 2a 20 74 68 65 20 74 65 6d 70 20 74 61 62   ** the temp tab
24a60 6c 65 2e 20 41 6e 64 20 69 66 20 69 53 65 74 20  le. And if iSet 
24a70 69 73 20 2d 31 2c 20 61 73 73 75 6d 65 20 74 68  is -1, assume th
24a80 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 0a  at there is no .
24a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
24aa0 20 6e 65 65 64 20 74 6f 20 69 6e 73 65 72 74 20   need to insert 
24ab0 74 68 65 20 6b 65 79 20 69 6e 74 6f 20 74 68 65  the key into the
24ac0 20 74 65 6d 70 20 74 61 62 6c 65 2c 20 61 73 20   temp table, as 
24ad0 69 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 0a 20  it will never . 
24ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
24af0 62 65 20 74 65 73 74 65 64 20 66 6f 72 2e 20 20  be tested for.  
24b00 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  */ .            
24b10 20 20 69 66 28 20 69 53 65 74 20 29 7b 0a 20 20    if( iSet ){.  
24b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 31                j1
24b30 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
24b40 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f  dOp4Int(v, OP_Fo
24b50 75 6e 64 2c 20 72 65 67 52 6f 77 73 65 74 2c 20  und, regRowset, 
24b60 30 2c 20 72 2c 20 6e 50 6b 29 3b 0a 20 20 20 20  0, r, nPk);.    
24b70 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65              Vdbe
24b80 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
24b90 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
24ba0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
24bb0 53 65 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  Set>=0 ){.      
24bc0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
24bd0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
24be0 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 2c  P_MakeRecord, r,
24bf0 20 6e 50 6b 2c 20 72 65 67 52 6f 77 69 64 29 3b   nPk, regRowid);
24c00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24c10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
24c20 70 33 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p3(v, OP_IdxInse
24c30 72 74 2c 20 72 65 67 52 6f 77 73 65 74 2c 20 72  rt, regRowset, r
24c40 65 67 52 6f 77 69 64 2c 20 30 29 3b 0a 20 20 20  egRowid, 0);.   
24c50 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
24c60 20 69 53 65 74 20 29 20 73 71 6c 69 74 65 33 56   iSet ) sqlite3V
24c70 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
24c80 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53  PFLAG_USESEEKRES
24c90 55 4c 54 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ULT);.          
24ca0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
24cb0 20 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20       /* Release 
24cc0 74 68 65 20 61 72 72 61 79 20 6f 66 20 74 65 6d  the array of tem
24cd0 70 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20  p registers */. 
24ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
24cf0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
24d00 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 2c 20  ange(pParse, r, 
24d10 6e 50 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nPk);.          
24d20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
24d30 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  .          /* In
24d40 76 6f 6b 65 20 74 68 65 20 6d 61 69 6e 20 6c 6f  voke the main lo
24d50 6f 70 20 62 6f 64 79 20 61 73 20 61 20 73 75 62  op body as a sub
24d60 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20  routine */.     
24d70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
24d80 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
24d90 75 62 2c 20 72 65 67 52 65 74 75 72 6e 2c 20 69  ub, regReturn, i
24da0 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20 20  LoopBody);..    
24db0 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
24dc0 72 65 20 28 73 6b 69 70 70 69 6e 67 20 74 68 65  re (skipping the
24dd0 20 6d 61 69 6e 20 6c 6f 6f 70 20 62 6f 64 79 20   main loop body 
24de0 73 75 62 72 6f 75 74 69 6e 65 29 20 69 66 20 74  subroutine) if t
24df0 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
24e00 63 75 72 72 65 6e 74 20 73 75 62 2d 57 48 45 52  current sub-WHER
24e10 45 20 72 6f 77 20 69 73 20 61 20 64 75 70 6c 69  E row is a dupli
24e20 63 61 74 65 20 66 72 6f 6d 20 70 72 69 6f 72 20  cate from prior 
24e30 73 75 62 2d 57 48 45 52 45 73 2e 20 2a 2f 0a 20  sub-WHEREs. */. 
24e40 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 31 20           if( j1 
24e50 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  ) sqlite3VdbeJum
24e60 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 0a 20  pHere(v, j1);.. 
24e70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
24e80 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73  pSubWInfo->untes
24e90 74 65 64 54 65 72 6d 73 20 66 6c 61 67 20 6d 65  tedTerms flag me
24ea0 61 6e 73 20 74 68 61 74 20 74 68 69 73 20 4f 52  ans that this OR
24eb0 20 74 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20   term.          
24ec0 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 6f 6e 65  ** contained one
24ed0 20 6f 72 20 6d 6f 72 65 20 41 4e 44 20 74 65 72   or more AND ter
24ee0 6d 20 66 72 6f 6d 20 61 20 6e 6f 74 52 65 61 64  m from a notRead
24ef0 79 20 74 61 62 6c 65 2e 20 20 54 68 65 0a 20 20  y table.  The.  
24f00 20 20 20 20 20 20 20 20 2a 2a 20 74 65 72 6d 73          ** terms
24f10 20 66 72 6f 6d 20 74 68 65 20 6e 6f 74 52 65 61   from the notRea
24f20 64 79 20 74 61 62 6c 65 20 63 6f 75 6c 64 20 6e  dy table could n
24f30 6f 74 20 62 65 20 74 65 73 74 65 64 20 61 6e 64  ot be tested and
24f40 20 77 69 6c 6c 0a 20 20 20 20 20 20 20 20 20 20   will.          
24f50 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 74 65  ** need to be te
24f60 73 74 65 64 20 6c 61 74 65 72 2e 0a 20 20 20 20  sted later..    
24f70 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
24f80 20 20 20 69 66 28 20 70 53 75 62 57 49 6e 66 6f     if( pSubWInfo
24f90 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20  ->untestedTerms 
24fa0 29 20 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20  ) untestedTerms 
24fb0 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  = 1;..          
24fc0 2f 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65  /* If all of the
24fd0 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65   OR-connected te
24fe0 72 6d 73 20 61 72 65 20 6f 70 74 69 6d 69 7a 65  rms are optimize
24ff0 64 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65  d using the same
25000 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  .          ** in
25010 64 65 78 2c 20 61 6e 64 20 74 68 65 20 69 6e 64  dex, and the ind
25020 65 78 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69  ex is opened usi
25030 6e 67 20 74 68 65 20 73 61 6d 65 20 63 75 72 73  ng the same curs
25040 6f 72 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20  or number.      
25050 20 20 20 20 2a 2a 20 62 79 20 65 61 63 68 20 63      ** by each c
25060 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68  all to sqlite3Wh
25070 65 72 65 42 65 67 69 6e 28 29 20 6d 61 64 65 20  ereBegin() made 
25080 62 79 20 74 68 69 73 20 6c 6f 6f 70 2c 20 69 74  by this loop, it
25090 20 6d 61 79 0a 20 20 20 20 20 20 20 20 20 20 2a   may.          *
250a0 2a 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f  * be possible to
250b0 20 75 73 65 20 74 68 61 74 20 69 6e 64 65 78 20   use that index 
250c0 61 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  as a covering in
250d0 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  dex..          *
250e0 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49  *.          ** I
250f0 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  f the call to sq
25100 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
25110 29 20 61 62 6f 76 65 20 72 65 73 75 6c 74 65 64  ) above resulted
25120 20 69 6e 20 61 20 73 63 61 6e 20 74 68 61 74 0a   in a scan that.
25130 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65            ** use
25140 73 20 61 6e 20 69 6e 64 65 78 2c 20 61 6e 64 20  s an index, and 
25150 74 68 69 73 20 69 73 20 65 69 74 68 65 72 20 74  this is either t
25160 68 65 20 66 69 72 73 74 20 4f 52 2d 63 6f 6e 6e  he first OR-conn
25170 65 63 74 65 64 20 74 65 72 6d 0a 20 20 20 20 20  ected term.     
25180 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65       ** processe
25190 64 20 6f 72 20 74 68 65 20 69 6e 64 65 78 20 69  d or the index i
251a0 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  s the same as th
251b0 61 74 20 75 73 65 64 20 62 79 20 61 6c 6c 20 70  at used by all p
251c0 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20  revious.        
251d0 20 20 2a 2a 20 74 65 72 6d 73 2c 20 73 65 74 20    ** terms, set 
251e0 70 43 6f 76 20 74 6f 20 74 68 65 20 63 61 6e 64  pCov to the cand
251f0 69 64 61 74 65 20 63 6f 76 65 72 69 6e 67 20 69  idate covering i
25200 6e 64 65 78 2e 20 4f 74 68 65 72 77 69 73 65 2c  ndex. Otherwise,
25210 20 73 65 74 20 0a 20 20 20 20 20 20 20 20 20 20   set .          
25220 2a 2a 20 70 43 6f 76 20 74 6f 20 4e 55 4c 4c 20  ** pCov to NULL 
25230 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
25240 20 6e 6f 20 63 61 6e 64 69 64 61 74 65 20 63 6f   no candidate co
25250 76 65 72 69 6e 67 20 69 6e 64 65 78 20 77 69 6c  vering index wil
25260 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  l .          ** 
25270 62 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a 20 20  be available..  
25280 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
25290 20 20 20 20 20 70 53 75 62 4c 6f 6f 70 20 3d 20       pSubLoop = 
252a0 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e  pSubWInfo->a[0].
252b0 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20  pWLoop;.        
252c0 20 20 61 73 73 65 72 74 28 20 28 70 53 75 62 4c    assert( (pSubL
252d0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
252e0 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
252f0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
25300 20 69 66 28 20 28 70 53 75 62 4c 6f 6f 70 2d 3e   if( (pSubLoop->
25310 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
25320 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20  INDEXED)!=0.    
25330 20 20 20 20 20 20 20 26 26 20 28 69 69 3d 3d 30         && (ii==0
25340 20 7c 7c 20 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e   || pSubLoop->u.
25350 62 74 72 65 65 2e 70 49 6e 64 65 78 3d 3d 70 43  btree.pIndex==pC
25360 6f 76 29 0a 20 20 20 20 20 20 20 20 20 20 20 26  ov).           &
25370 26 20 28 48 61 73 52 6f 77 69 64 28 70 54 61 62  & (HasRowid(pTab
25380 29 20 7c 7c 20 21 49 73 50 72 69 6d 61 72 79 4b  ) || !IsPrimaryK
25390 65 79 49 6e 64 65 78 28 70 53 75 62 4c 6f 6f 70  eyIndex(pSubLoop
253a0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
253b0 29 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a  )).          ){.
253c0 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
253d0 72 74 28 20 70 53 75 62 57 49 6e 66 6f 2d 3e 61  rt( pSubWInfo->a
253e0 5b 30 5d 2e 69 49 64 78 43 75 72 3d 3d 69 43 6f  [0].iIdxCur==iCo
253f0 76 43 75 72 20 29 3b 0a 20 20 20 20 20 20 20 20  vCur );.        
25400 20 20 20 20 70 43 6f 76 20 3d 20 70 53 75 62 4c      pCov = pSubL
25410 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
25420 64 65 78 3b 0a 20 20 20 20 20 20 20 20 20 20 20  dex;.           
25430 20 77 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57   wctrlFlags |= W
25440 48 45 52 45 5f 52 45 4f 50 45 4e 5f 49 44 58 3b  HERE_REOPEN_IDX;
25450 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
25460 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  {.            pC
25470 6f 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ov = 0;.        
25480 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f    }..          /
25490 2a 20 46 69 6e 69 73 68 20 74 68 65 20 6c 6f 6f  * Finish the loo
254a0 70 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20  p through table 
254b0 65 6e 74 72 69 65 73 20 74 68 61 74 20 6d 61 74  entries that mat
254c0 63 68 20 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e  ch term pOrTerm.
254d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71   */.          sq
254e0 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 53  lite3WhereEnd(pS
254f0 75 62 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  ubWInfo);.      
25500 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
25510 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e  }.    pLevel->u.
25520 70 43 6f 76 69 64 78 20 3d 20 70 43 6f 76 3b 0a  pCovidx = pCov;.
25530 20 20 20 20 69 66 28 20 70 43 6f 76 20 29 20 70      if( pCov ) p
25540 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d  Level->iIdxCur =
25550 20 69 43 6f 76 43 75 72 3b 0a 20 20 20 20 69 66   iCovCur;.    if
25560 28 20 70 41 6e 64 45 78 70 72 20 29 7b 0a 20 20  ( pAndExpr ){.  
25570 20 20 20 20 70 41 6e 64 45 78 70 72 2d 3e 70 4c      pAndExpr->pL
25580 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  eft = 0;.      s
25590 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
255a0 28 64 62 2c 20 70 41 6e 64 45 78 70 72 29 3b 0a  (db, pAndExpr);.
255b0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
255c0 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c  3VdbeChangeP1(v,
255d0 20 69 52 65 74 49 6e 69 74 2c 20 73 71 6c 69 74   iRetInit, sqlit
255e0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
255f0 72 28 76 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  r(v));.    sqlit
25600 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
25610 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76  OP_Goto, 0, pLev
25620 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20  el->addrBrk);.  
25630 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
25640 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 4c 6f  olveLabel(v, iLo
25650 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20 20 69 66  opBody);..    if
25660 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  ( pWInfo->nLevel
25670 3e 31 20 29 20 73 71 6c 69 74 65 33 53 74 61 63  >1 ) sqlite3Stac
25680 6b 46 72 65 65 28 64 62 2c 20 70 4f 72 54 61 62  kFree(db, pOrTab
25690 29 3b 0a 20 20 20 20 69 66 28 20 21 75 6e 74 65  );.    if( !unte
256a0 73 74 65 64 54 65 72 6d 73 20 29 20 64 69 73 61  stedTerms ) disa
256b0 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
256c0 70 54 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 0a  pTerm);.  }else.
256d0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
256e0 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
256f0 41 54 49 4f 4e 20 2a 2f 0a 0a 20 20 7b 0a 20 20  ATION */..  {.  
25700 20 20 2f 2a 20 43 61 73 65 20 36 3a 20 20 54 68    /* Case 6:  Th
25710 65 72 65 20 69 73 20 6e 6f 20 75 73 61 62 6c 65  ere is no usable
25720 20 69 6e 64 65 78 2e 20 20 57 65 20 6d 75 73 74   index.  We must
25730 20 64 6f 20 61 20 63 6f 6d 70 6c 65 74 65 0a 20   do a complete. 
25740 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 73     **          s
25750 63 61 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72  can of the entir
25760 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a  e table..    */.
25770 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
25780 20 75 38 20 61 53 74 65 70 5b 5d 20 3d 20 7b 20   u8 aStep[] = { 
25790 4f 50 5f 4e 65 78 74 2c 20 4f 50 5f 50 72 65 76  OP_Next, OP_Prev
257a0 20 7d 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63   };.    static c
257b0 6f 6e 73 74 20 75 38 20 61 53 74 61 72 74 5b 5d  onst u8 aStart[]
257c0 20 3d 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20   = { OP_Rewind, 
257d0 4f 50 5f 4c 61 73 74 20 7d 3b 0a 20 20 20 20 61  OP_Last };.    a
257e0 73 73 65 72 74 28 20 62 52 65 76 3d 3d 30 20 7c  ssert( bRev==0 |
257f0 7c 20 62 52 65 76 3d 3d 31 20 29 3b 0a 20 20 20  | bRev==1 );.   
25800 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 69   if( pTabItem->i
25810 73 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20  sRecursive ){.  
25820 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 6d 61      /* Tables ma
25830 72 6b 65 64 20 69 73 52 65 63 75 72 73 69 76 65  rked isRecursive
25840 20 68 61 76 65 20 6f 6e 6c 79 20 61 20 73 69 6e   have only a sin
25850 67 6c 65 20 72 6f 77 20 74 68 61 74 20 69 73 20  gle row that is 
25860 73 74 6f 72 65 64 20 69 6e 0a 20 20 20 20 20 20  stored in.      
25870 2a 2a 20 61 20 70 73 65 75 64 6f 2d 63 75 72 73  ** a pseudo-curs
25880 6f 72 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20  or.  No need to 
25890 52 65 77 69 6e 64 20 6f 72 20 4e 65 78 74 20 73  Rewind or Next s
258a0 75 63 68 20 63 75 72 73 6f 72 73 2e 20 2a 2f 0a  uch cursors. */.
258b0 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70        pLevel->op
258c0 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20   = OP_Noop;.    
258d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65  }else{.      pLe
258e0 76 65 6c 2d 3e 6f 70 20 3d 20 61 53 74 65 70 5b  vel->op = aStep[
258f0 62 52 65 76 5d 3b 0a 20 20 20 20 20 20 70 4c 65  bRev];.      pLe
25900 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a  vel->p1 = iCur;.
25910 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32        pLevel->p2
25920 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64   = 1 + sqlite3Vd
25930 62 65 41 64 64 4f 70 32 28 76 2c 20 61 53 74 61  beAddOp2(v, aSta
25940 72 74 5b 62 52 65 76 5d 2c 20 69 43 75 72 2c 20  rt[bRev], iCur, 
25950 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 20 20  addrBrk);.      
25960 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
25970 2c 20 62 52 65 76 3d 3d 30 29 3b 0a 20 20 20 20  , bRev==0);.    
25980 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
25990 28 76 2c 20 62 52 65 76 21 3d 30 29 3b 0a 20 20  (v, bRev!=0);.  
259a0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d      pLevel->p5 =
259b0 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
259c0 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50  US_FULLSCAN_STEP
259d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66  ;.    }.  }..#if
259e0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
259f0 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55  E_STMT_SCANSTATU
25a00 53 0a 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  S.  pLevel->addr
25a10 56 69 73 69 74 20 3d 20 73 71 6c 69 74 65 33 56  Visit = sqlite3V
25a20 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
25a30 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
25a40 49 6e 73 65 72 74 20 63 6f 64 65 20 74 6f 20 74  Insert code to t
25a50 65 73 74 20 65 76 65 72 79 20 73 75 62 65 78 70  est every subexp
25a60 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 61 6e  ression that can
25a70 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 20   be completely. 
25a80 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20 75 73 69   ** computed usi
25a90 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ng the current s
25aa0 65 74 20 6f 66 20 74 61 62 6c 65 73 2e 0a 20 20  et of tables..  
25ab0 2a 2f 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  */.  for(pTerm=p
25ac0 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54  WC->a, j=pWC->nT
25ad0 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70  erm; j>0; j--, p
25ae0 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70  Term++){.    Exp
25af0 72 20 2a 70 45 3b 0a 20 20 20 20 69 6e 74 20 73  r *pE;.    int s
25b00 6b 69 70 4c 69 6b 65 41 64 64 72 20 3d 20 30 3b  kipLikeAddr = 0;
25b10 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
25b20 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
25b30 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a  TERM_VIRTUAL );.
25b40 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
25b50 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
25b60 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20  ERM_CODED );.   
25b70 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c   if( pTerm->wtFl
25b80 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54  ags & (TERM_VIRT
25b90 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20  UAL|TERM_CODED) 
25ba0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
25bb0 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  if( (pTerm->prer
25bc0 65 71 41 6c 6c 20 26 20 70 4c 65 76 65 6c 2d 3e  eqAll & pLevel->
25bd0 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b 0a  notReady)!=0 ){.
25be0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
25bf0 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64  pWInfo->untested
25c00 54 65 72 6d 73 3d 3d 30 0a 20 20 20 20 20 20 20  Terms==0.       
25c10 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49 6e          && (pWIn
25c20 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
25c30 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f   WHERE_ONETABLE_
25c40 4f 4e 4c 59 29 21 3d 30 20 29 3b 0a 20 20 20 20  ONLY)!=0 );.    
25c50 20 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74    pWInfo->untest
25c60 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a 20 20 20  edTerms = 1;.   
25c70 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
25c80 20 7d 0a 20 20 20 20 70 45 20 3d 20 70 54 65 72   }.    pE = pTer
25c90 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 61 73  m->pExpr;.    as
25ca0 73 65 72 74 28 20 70 45 21 3d 30 20 29 3b 0a 20  sert( pE!=0 );. 
25cb0 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69     if( pLevel->i
25cc0 4c 65 66 74 4a 6f 69 6e 20 26 26 20 21 45 78 70  LeftJoin && !Exp
25cd0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c  rHasProperty(pE,
25ce0 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b   EP_FromJoin) ){
25cf0 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
25d00 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
25d10 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
25d20 54 45 52 4d 5f 4c 49 4b 45 43 4f 4e 44 20 29 7b  TERM_LIKECOND ){
25d30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
25d40 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65 70 43  Level->iLikeRepC
25d50 6e 74 72 3e 30 20 29 3b 0a 20 20 20 20 20 20 73  ntr>0 );.      s
25d60 6b 69 70 4c 69 6b 65 41 64 64 72 20 3d 20 73 71  kipLikeAddr = sq
25d70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
25d80 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 70 4c 65  v, OP_IfNot, pLe
25d90 76 65 6c 2d 3e 69 4c 69 6b 65 52 65 70 43 6e 74  vel->iLikeRepCnt
25da0 72 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  r);.      VdbeCo
25db0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d  verage(v);.    }
25dc0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
25dd0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
25de0 70 45 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51  pE, addrCont, SQ
25df0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
25e00 3b 0a 20 20 20 20 69 66 28 20 73 6b 69 70 4c 69  ;.    if( skipLi
25e10 6b 65 41 64 64 72 20 29 20 73 71 6c 69 74 65 33  keAddr ) sqlite3
25e20 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
25e30 73 6b 69 70 4c 69 6b 65 41 64 64 72 29 3b 0a 20  skipLikeAddr);. 
25e40 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67     pTerm->wtFlag
25e50 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b  s |= TERM_CODED;
25e60 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 73 65 72  .  }..  /* Inser
25e70 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20 66  t code to test f
25e80 6f 72 20 69 6d 70 6c 69 65 64 20 63 6f 6e 73 74  or implied const
25e90 72 61 69 6e 74 73 20 62 61 73 65 64 20 6f 6e 20  raints based on 
25ea0 74 72 61 6e 73 69 74 69 76 69 74 79 0a 20 20 2a  transitivity.  *
25eb0 2a 20 6f 66 20 74 68 65 20 22 3d 3d 22 20 6f 70  * of the "==" op
25ec0 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a  erator..  **.  *
25ed0 2a 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74 68  * Example: If th
25ee0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  e WHERE clause c
25ef0 6f 6e 74 61 69 6e 73 20 22 74 31 2e 61 3d 74 32  ontains "t1.a=t2
25f00 2e 62 22 20 61 6e 64 20 22 74 32 2e 62 3d 31 32  .b" and "t2.b=12
25f10 33 22 0a 20 20 2a 2a 20 61 6e 64 20 77 65 20 61  3".  ** and we a
25f20 72 65 20 63 6f 64 69 6e 67 20 74 68 65 20 74 31  re coding the t1
25f30 20 6c 6f 6f 70 20 61 6e 64 20 74 68 65 20 74 32   loop and the t2
25f40 20 6c 6f 6f 70 20 68 61 73 20 6e 6f 74 20 79 65   loop has not ye
25f50 74 20 63 6f 64 65 64 2c 0a 20 20 2a 2a 20 74 68  t coded,.  ** th
25f60 65 6e 20 77 65 20 63 61 6e 6e 6f 74 20 75 73 65  en we cannot use
25f70 20 74 68 65 20 22 74 31 2e 61 3d 74 32 2e 62 22   the "t1.a=t2.b"
25f80 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 62 75 74   constraint, but
25f90 20 77 65 20 63 61 6e 20 63 6f 64 65 0a 20 20 2a   we can code.  *
25fa0 2a 20 74 68 65 20 69 6d 70 6c 69 65 64 20 22 74  * the implied "t
25fb0 31 2e 61 3d 31 32 33 22 20 63 6f 6e 73 74 72 61  1.a=123" constra
25fc0 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  int..  */.  for(
25fd0 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d  pTerm=pWC->a, j=
25fe0 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b  pWC->nTerm; j>0;
25ff0 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   j--, pTerm++){.
26000 20 20 20 20 45 78 70 72 20 2a 70 45 2c 20 2a 70      Expr *pE, *p
26010 45 41 6c 74 3b 0a 20 20 20 20 57 68 65 72 65 54  EAlt;.    WhereT
26020 65 72 6d 20 2a 70 41 6c 74 3b 0a 20 20 20 20 69  erm *pAlt;.    i
26030 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  f( pTerm->wtFlag
26040 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41  s & (TERM_VIRTUA
26050 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20  L|TERM_CODED) ) 
26060 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
26070 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
26080 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f  tor & (WO_EQ|WO_
26090 49 53 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  IS))==0 ) contin
260a0 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65  ue;.    if( (pTe
260b0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
260c0 57 4f 5f 45 51 55 49 56 29 3d 3d 30 20 29 20 63  WO_EQUIV)==0 ) c
260d0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
260e0 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
260f0 6f 72 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69  or!=iCur ) conti
26100 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  nue;.    if( pLe
26110 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29  vel->iLeftJoin )
26120 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70   continue;.    p
26130 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  E = pTerm->pExpr
26140 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
26150 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
26160 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  E, EP_FromJoin) 
26170 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
26180 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
26190 68 74 20 26 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74  ht & pLevel->not
261a0 52 65 61 64 79 29 21 3d 30 20 29 3b 0a 20 20 20  Ready)!=0 );.   
261b0 20 70 41 6c 74 20 3d 20 66 69 6e 64 54 65 72 6d   pAlt = findTerm
261c0 28 70 57 43 2c 20 69 43 75 72 2c 20 70 54 65 72  (pWC, iCur, pTer
261d0 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 2c  m->u.leftColumn,
261e0 20 6e 6f 74 52 65 61 64 79 2c 0a 20 20 20 20 20   notReady,.     
261f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
26200 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53  O_EQ|WO_IN|WO_IS
26210 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 41  , 0);.    if( pA
26220 6c 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  lt==0 ) continue
26230 3b 0a 20 20 20 20 69 66 28 20 70 41 6c 74 2d 3e  ;.    if( pAlt->
26240 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f  wtFlags & (TERM_
26250 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75  CODED) ) continu
26260 65 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  e;.    testcase(
26270 20 70 41 6c 74 2d 3e 65 4f 70 65 72 61 74 6f 72   pAlt->eOperator
26280 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20   & WO_EQ );.    
26290 74 65 73 74 63 61 73 65 28 20 70 41 6c 74 2d 3e  testcase( pAlt->
262a0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
262b0 53 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  S );.    testcas
262c0 65 28 20 70 41 6c 74 2d 3e 65 4f 70 65 72 61 74  e( pAlt->eOperat
262d0 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20  or & WO_IN );.  
262e0 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d    VdbeModuleComm
262f0 65 6e 74 28 28 76 2c 20 22 62 65 67 69 6e 20 74  ent((v, "begin t
26300 72 61 6e 73 69 74 69 76 65 20 63 6f 6e 73 74 72  ransitive constr
26310 61 69 6e 74 22 29 29 3b 0a 20 20 20 20 70 45 41  aint"));.    pEA
26320 6c 74 20 3d 20 73 71 6c 69 74 65 33 53 74 61 63  lt = sqlite3Stac
26330 6b 41 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  kAllocRaw(db, si
26340 7a 65 6f 66 28 2a 70 45 41 6c 74 29 29 3b 0a 20  zeof(*pEAlt));. 
26350 20 20 20 69 66 28 20 70 45 41 6c 74 20 29 7b 0a     if( pEAlt ){.
26360 20 20 20 20 20 20 2a 70 45 41 6c 74 20 3d 20 2a        *pEAlt = *
26370 70 41 6c 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20  pAlt->pExpr;.   
26380 20 20 20 70 45 41 6c 74 2d 3e 70 4c 65 66 74 20     pEAlt->pLeft 
26390 3d 20 70 45 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  = pE->pLeft;.   
263a0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
263b0 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
263c0 41 6c 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53  Alt, addrCont, S
263d0 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
263e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
263f0 53 74 61 63 6b 46 72 65 65 28 64 62 2c 20 70 45  StackFree(db, pE
26400 41 6c 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Alt);.    }.  }.
26410 0a 20 20 2f 2a 20 46 6f 72 20 61 20 4c 45 46 54  .  /* For a LEFT
26420 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 67 65 6e   OUTER JOIN, gen
26430 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
26440 77 69 6c 6c 20 72 65 63 6f 72 64 20 74 68 65 20  will record the 
26450 66 61 63 74 20 74 68 61 74 0a 20 20 2a 2a 20 61  fact that.  ** a
26460 74 20 6c 65 61 73 74 20 6f 6e 65 20 72 6f 77 20  t least one row 
26470 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62  of the right tab
26480 6c 65 20 68 61 73 20 6d 61 74 63 68 65 64 20 74  le has matched t
26490 68 65 20 6c 65 66 74 20 74 61 62 6c 65 2e 20 20  he left table.  
264a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76  .  */.  if( pLev
264b0 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b  el->iLeftJoin ){
264c0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64  .    pLevel->add
264d0 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33  rFirst = sqlite3
264e0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
264f0 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
26500 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
26510 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 4c 65 76  Integer, 1, pLev
26520 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a  el->iLeftJoin);.
26530 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
26540 28 76 2c 20 22 72 65 63 6f 72 64 20 4c 45 46 54  (v, "record LEFT
26550 20 4a 4f 49 4e 20 68 69 74 22 29 29 3b 0a 20 20   JOIN hit"));.  
26560 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
26570 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
26580 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  .    for(pTerm=p
26590 57 43 2d 3e 61 2c 20 6a 3d 30 3b 20 6a 3c 70 57  WC->a, j=0; j<pW
265a0 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70  C->nTerm; j++, p
265b0 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 74  Term++){.      t
265c0 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
265d0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
265e0 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20  IRTUAL );.      
265f0 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
26600 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
26610 43 4f 44 45 44 20 29 3b 0a 20 20 20 20 20 20 69  CODED );.      i
26620 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  f( pTerm->wtFlag
26630 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41  s & (TERM_VIRTUA
26640 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20  L|TERM_CODED) ) 
26650 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
26660 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  if( (pTerm->prer
26670 65 71 41 6c 6c 20 26 20 70 4c 65 76 65 6c 2d 3e  eqAll & pLevel->
26680 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b 0a  notReady)!=0 ){.
26690 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
266a0 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64  pWInfo->untested
266b0 54 65 72 6d 73 20 29 3b 0a 20 20 20 20 20 20 20  Terms );.       
266c0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
266d0 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
266e0 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b   pTerm->pExpr );
266f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
26700 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
26710 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  , pTerm->pExpr, 
26720 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45  addrCont, SQLITE
26730 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
26740 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
26750 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44  gs |= TERM_CODED
26760 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
26770 65 74 75 72 6e 20 70 4c 65 76 65 6c 2d 3e 6e 6f  eturn pLevel->no
26780 74 52 65 61 64 79 3b 0a 7d 0a 0a 23 69 66 64 65  tReady;.}..#ifde
26790 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
267a0 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  BLED./*.** Print
267b0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
267c0 61 20 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65  a WhereTerm obje
267d0 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ct.*/.static voi
267e0 64 20 77 68 65 72 65 54 65 72 6d 50 72 69 6e 74  d whereTermPrint
267f0 28 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72  (WhereTerm *pTer
26800 6d 2c 20 69 6e 74 20 69 54 65 72 6d 29 7b 0a 20  m, int iTerm){. 
26810 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 7b   if( pTerm==0 ){
26820 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
26830 67 50 72 69 6e 74 66 28 22 54 45 52 4d 2d 25 2d  gPrintf("TERM-%-
26840 33 64 20 4e 55 4c 4c 5c 6e 22 2c 20 69 54 65 72  3d NULL\n", iTer
26850 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  m);.  }else{.   
26860 20 63 68 61 72 20 7a 54 79 70 65 5b 34 5d 3b 0a   char zType[4];.
26870 20 20 20 20 6d 65 6d 63 70 79 28 7a 54 79 70 65      memcpy(zType
26880 2c 20 22 2e 2e 2e 22 2c 20 34 29 3b 0a 20 20 20  , "...", 4);.   
26890 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c   if( pTerm->wtFl
268a0 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
268b0 41 4c 20 29 20 7a 54 79 70 65 5b 30 5d 20 3d 20  AL ) zType[0] = 
268c0 27 56 27 3b 0a 20 20 20 20 69 66 28 20 70 54 65  'V';.    if( pTe
268d0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
268e0 57 4f 5f 45 51 55 49 56 20 20 29 20 7a 54 79 70  WO_EQUIV  ) zTyp
268f0 65 5b 31 5d 20 3d 20 27 45 27 3b 0a 20 20 20 20  e[1] = 'E';.    
26900 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
26910 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  rty(pTerm->pExpr
26920 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
26930 20 7a 54 79 70 65 5b 32 5d 20 3d 20 27 4c 27 3b   zType[2] = 'L';
26940 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
26950 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  gPrintf(.       
26960 22 54 45 52 4d 2d 25 2d 33 64 20 25 70 20 25 73  "TERM-%-3d %p %s
26970 20 63 75 72 73 6f 72 3d 25 2d 33 64 20 70 72 6f   cursor=%-3d pro
26980 62 3d 25 2d 33 64 20 6f 70 3d 30 78 25 30 33 78  b=%-3d op=0x%03x
26990 20 77 74 46 6c 61 67 73 3d 30 78 25 30 34 78 5c   wtFlags=0x%04x\
269a0 6e 22 2c 0a 20 20 20 20 20 20 20 69 54 65 72 6d  n",.       iTerm
269b0 2c 20 70 54 65 72 6d 2c 20 7a 54 79 70 65 2c 20  , pTerm, zType, 
269c0 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
269d0 72 2c 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50  r, pTerm->truthP
269e0 72 6f 62 2c 0a 20 20 20 20 20 20 20 70 54 65 72  rob,.       pTer
269f0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 2c 20 70 54  m->eOperator, pT
26a00 65 72 6d 2d 3e 77 74 46 6c 61 67 73 29 3b 0a 20  erm->wtFlags);. 
26a10 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
26a20 65 77 45 78 70 72 28 30 2c 20 70 54 65 72 6d 2d  ewExpr(0, pTerm-
26a30 3e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d 0a  >pExpr, 0);.  }.
26a40 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
26a50 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
26a60 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  LED./*.** Print 
26a70 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  a WhereLoop obje
26a80 63 74 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67  ct for debugging
26a90 20 70 75 72 70 6f 73 65 73 0a 2a 2f 0a 73 74 61   purposes.*/.sta
26aa0 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f  tic void whereLo
26ab0 6f 70 50 72 69 6e 74 28 57 68 65 72 65 4c 6f 6f  opPrint(WhereLoo
26ac0 70 20 2a 70 2c 20 57 68 65 72 65 43 6c 61 75 73  p *p, WhereClaus
26ad0 65 20 2a 70 57 43 29 7b 0a 20 20 57 68 65 72 65  e *pWC){.  Where
26ae0 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70  Info *pWInfo = p
26af0 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69 6e  WC->pWInfo;.  in
26b00 74 20 6e 62 20 3d 20 31 2b 28 70 57 49 6e 66 6f  t nb = 1+(pWInfo
26b10 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ->pTabList->nSrc
26b20 2b 37 29 2f 38 3b 0a 20 20 73 74 72 75 63 74 20  +7)/8;.  struct 
26b30 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
26b40 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  tem = pWInfo->pT
26b50 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 2d 3e 69  abList->a + p->i
26b60 54 61 62 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  Tab;.  Table *pT
26b70 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62  ab = pItem->pTab
26b80 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
26b90 50 72 69 6e 74 66 28 22 25 63 25 32 64 2e 25 30  Printf("%c%2d.%0
26ba0 2a 6c 6c 78 2e 25 30 2a 6c 6c 78 22 2c 20 70 2d  *llx.%0*llx", p-
26bb0 3e 63 49 64 2c 0a 20 20 20 20 20 20 20 20 20 20  >cId,.          
26bc0 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 54             p->iT
26bd0 61 62 2c 20 6e 62 2c 20 70 2d 3e 6d 61 73 6b 53  ab, nb, p->maskS
26be0 65 6c 66 2c 20 6e 62 2c 20 70 2d 3e 70 72 65 72  elf, nb, p->prer
26bf0 65 71 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  eq);.  sqlite3De
26c00 62 75 67 50 72 69 6e 74 66 28 22 20 25 31 32 73  bugPrintf(" %12s
26c10 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
26c20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 7a          pItem->z
26c30 41 6c 69 61 73 20 3f 20 70 49 74 65 6d 2d 3e 7a  Alias ? pItem->z
26c40 41 6c 69 61 73 20 3a 20 70 54 61 62 2d 3e 7a 4e  Alias : pTab->zN
26c50 61 6d 65 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e  ame);.  if( (p->
26c60 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
26c70 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30  VIRTUALTABLE)==0
26c80 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
26c90 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69  ar *zName;.    i
26ca0 66 28 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  f( p->u.btree.pI
26cb0 6e 64 65 78 20 26 26 20 28 7a 4e 61 6d 65 20 3d  ndex && (zName =
26cc0 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
26cd0 65 78 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  ex->zName)!=0 ){
26ce0 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63  .      if( strnc
26cf0 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  mp(zName, "sqlit
26d00 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c 20 31  e_autoindex_", 1
26d10 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  7)==0 ){.       
26d20 20 69 6e 74 20 69 20 3d 20 73 71 6c 69 74 65 33   int i = sqlite3
26d30 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 20  Strlen30(zName) 
26d40 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 77 68 69  - 1;.        whi
26d50 6c 65 28 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27 5f  le( zName[i]!='_
26d60 27 20 29 20 69 2d 2d 3b 0a 20 20 20 20 20 20 20  ' ) i--;.       
26d70 20 7a 4e 61 6d 65 20 2b 3d 20 69 3b 0a 20 20 20   zName += i;.   
26d80 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
26d90 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2e  e3DebugPrintf(".
26da0 25 2d 31 36 73 20 25 32 64 22 2c 20 7a 4e 61 6d  %-16s %2d", zNam
26db0 65 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  e, p->u.btree.nE
26dc0 71 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  q);.    }else{. 
26dd0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
26de0 67 50 72 69 6e 74 66 28 22 25 32 30 73 22 2c 22  gPrintf("%20s","
26df0 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ");.    }.  }els
26e00 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a  e{.    char *z;.
26e10 20 20 20 20 69 66 28 20 70 2d 3e 75 2e 76 74 61      if( p->u.vta
26e20 62 2e 69 64 78 53 74 72 20 29 7b 0a 20 20 20 20  b.idxStr ){.    
26e30 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
26e40 72 69 6e 74 66 28 22 28 25 64 2c 5c 22 25 73 5c  rintf("(%d,\"%s\
26e50 22 2c 25 78 29 22 2c 0a 20 20 20 20 20 20 20 20  ",%x)",.        
26e60 20 20 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61          p->u.vta
26e70 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76  b.idxNum, p->u.v
26e80 74 61 62 2e 69 64 78 53 74 72 2c 20 70 2d 3e 75  tab.idxStr, p->u
26e90 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b  .vtab.omitMask);
26ea0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
26eb0 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
26ec0 72 69 6e 74 66 28 22 28 25 64 2c 25 78 29 22 2c  rintf("(%d,%x)",
26ed0 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75   p->u.vtab.idxNu
26ee0 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69  m, p->u.vtab.omi
26ef0 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20  tMask);.    }.  
26f00 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
26f10 69 6e 74 66 28 22 20 25 2d 31 39 73 22 2c 20 7a  intf(" %-19s", z
26f20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
26f30 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 20 20 69 66  ree(z);.  }.  if
26f40 28 20 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  ( p->wsFlags & W
26f50 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 20 29 7b  HERE_SKIPSCAN ){
26f60 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
26f70 67 50 72 69 6e 74 66 28 22 20 66 20 25 30 35 78  gPrintf(" f %05x
26f80 20 25 64 2d 25 64 22 2c 20 70 2d 3e 77 73 46 6c   %d-%d", p->wsFl
26f90 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d 2c 70  ags, p->nLTerm,p
26fa0 2d 3e 6e 53 6b 69 70 29 3b 0a 20 20 7d 65 6c 73  ->nSkip);.  }els
26fb0 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  e{.    sqlite3De
26fc0 62 75 67 50 72 69 6e 74 66 28 22 20 66 20 25 30  bugPrintf(" f %0
26fd0 35 78 20 4e 20 25 64 22 2c 20 70 2d 3e 77 73 46  5x N %d", p->wsF
26fe0 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d 29  lags, p->nLTerm)
26ff0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
27000 65 62 75 67 50 72 69 6e 74 66 28 22 20 63 6f 73  ebugPrintf(" cos
27010 74 20 25 64 2c 25 64 2c 25 64 5c 6e 22 2c 20 70  t %d,%d,%d\n", p
27020 2d 3e 72 53 65 74 75 70 2c 20 70 2d 3e 72 52 75  ->rSetup, p->rRu
27030 6e 2c 20 70 2d 3e 6e 4f 75 74 29 3b 0a 20 20 69  n, p->nOut);.  i
27040 66 28 20 70 2d 3e 6e 4c 54 65 72 6d 20 26 26 20  f( p->nLTerm && 
27050 28 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61  (sqlite3WhereTra
27060 63 65 20 26 20 30 78 31 30 30 29 21 3d 30 20 29  ce & 0x100)!=0 )
27070 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
27080 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
27090 4c 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  LTerm; i++){.   
270a0 20 20 20 77 68 65 72 65 54 65 72 6d 50 72 69 6e     whereTermPrin
270b0 74 28 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2c 20  t(p->aLTerm[i], 
270c0 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  i);.    }.  }.}.
270d0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f  #endif../*.** Co
270e0 6e 76 65 72 74 20 62 75 6c 6b 20 6d 65 6d 6f 72  nvert bulk memor
270f0 79 20 69 6e 74 6f 20 61 20 76 61 6c 69 64 20 57  y into a valid W
27100 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 63 61  hereLoop that ca
27110 6e 20 62 65 20 70 61 73 73 65 64 0a 2a 2a 20 74  n be passed.** t
27120 6f 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72  o whereLoopClear
27130 20 68 61 72 6d 6c 65 73 73 6c 79 2e 0a 2a 2f 0a   harmlessly..*/.
27140 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
27150 65 4c 6f 6f 70 49 6e 69 74 28 57 68 65 72 65 4c  eLoopInit(WhereL
27160 6f 6f 70 20 2a 70 29 7b 0a 20 20 70 2d 3e 61 4c  oop *p){.  p->aL
27170 54 65 72 6d 20 3d 20 70 2d 3e 61 4c 54 65 72 6d  Term = p->aLTerm
27180 53 70 61 63 65 3b 0a 20 20 70 2d 3e 6e 4c 54 65  Space;.  p->nLTe
27190 72 6d 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 4c 53  rm = 0;.  p->nLS
271a0 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65 28  lot = ArraySize(
271b0 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 29 3b  p->aLTermSpace);
271c0 0a 20 20 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20  .  p->wsFlags = 
271d0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  0;.}../*.** Clea
271e0 72 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e  r the WhereLoop.
271f0 75 20 75 6e 69 6f 6e 2e 20 20 4c 65 61 76 65 20  u union.  Leave 
27200 57 68 65 72 65 4c 6f 6f 70 2e 70 4c 54 65 72 6d  WhereLoop.pLTerm
27210 20 69 6e 74 61 63 74 2e 0a 2a 2f 0a 73 74 61 74   intact..*/.stat
27220 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f  ic void whereLoo
27230 70 43 6c 65 61 72 55 6e 69 6f 6e 28 73 71 6c 69  pClearUnion(sqli
27240 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f  te3 *db, WhereLo
27250 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  op *p){.  if( p-
27260 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  >wsFlags & (WHER
27270 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 7c 57  E_VIRTUALTABLE|W
27280 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
27290 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e   ){.    if( (p->
272a0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
272b0 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30  VIRTUALTABLE)!=0
272c0 20 26 26 20 70 2d 3e 75 2e 76 74 61 62 2e 6e 65   && p->u.vtab.ne
272d0 65 64 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20  edFree ){.      
272e0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
272f0 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a  u.vtab.idxStr);.
27300 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e        p->u.vtab.
27310 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20  needFree = 0;.  
27320 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64      p->u.vtab.id
27330 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 7d 65  xStr = 0;.    }e
27340 6c 73 65 20 69 66 28 20 28 70 2d 3e 77 73 46 6c  lse if( (p->wsFl
27350 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f  ags & WHERE_AUTO
27360 5f 49 4e 44 45 58 29 21 3d 30 20 26 26 20 70 2d  _INDEX)!=0 && p-
27370 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 21  >u.btree.pIndex!
27380 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
27390 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
273a0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d  >u.btree.pIndex-
273b0 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 20 20 20  >zColAff);.     
273c0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
273d0 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  b, p->u.btree.pI
273e0 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ndex);.      p->
273f0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d  u.btree.pIndex =
27400 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
27410 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74  ./*.** Deallocat
27420 65 20 69 6e 74 65 72 6e 61 6c 20 6d 65 6d 6f 72  e internal memor
27430 79 20 75 73 65 64 20 62 79 20 61 20 57 68 65 72  y used by a Wher
27440 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a  eLoop object.*/.
27450 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
27460 65 4c 6f 6f 70 43 6c 65 61 72 28 73 71 6c 69 74  eLoopClear(sqlit
27470 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f  e3 *db, WhereLoo
27480 70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  p *p){.  if( p->
27490 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72  aLTerm!=p->aLTer
274a0 6d 53 70 61 63 65 20 29 20 73 71 6c 69 74 65 33  mSpace ) sqlite3
274b0 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c  DbFree(db, p->aL
274c0 54 65 72 6d 29 3b 0a 20 20 77 68 65 72 65 4c 6f  Term);.  whereLo
274d0 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c  opClearUnion(db,
274e0 20 70 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70   p);.  whereLoop
274f0 49 6e 69 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Init(p);.}../*.*
27500 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 6d  * Increase the m
27510 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
27520 20 66 6f 72 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65   for pLoop->aLTe
27530 72 6d 5b 5d 20 74 6f 20 62 65 20 61 74 20 6c 65  rm[] to be at le
27540 61 73 74 20 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ast n..*/.static
27550 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 52 65   int whereLoopRe
27560 73 69 7a 65 28 73 71 6c 69 74 65 33 20 2a 64 62  size(sqlite3 *db
27570 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20  , WhereLoop *p, 
27580 69 6e 74 20 6e 29 7b 0a 20 20 57 68 65 72 65 54  int n){.  WhereT
27590 65 72 6d 20 2a 2a 70 61 4e 65 77 3b 0a 20 20 69  erm **paNew;.  i
275a0 66 28 20 70 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 20  f( p->nLSlot>=n 
275b0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
275c0 4f 4b 3b 0a 20 20 6e 20 3d 20 28 6e 2b 37 29 26  OK;.  n = (n+7)&
275d0 7e 37 3b 0a 20 20 70 61 4e 65 77 20 3d 20 73 71  ~7;.  paNew = sq
275e0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
275f0 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61  (db, sizeof(p->a
27600 4c 54 65 72 6d 5b 30 5d 29 2a 6e 29 3b 0a 20 20  LTerm[0])*n);.  
27610 69 66 28 20 70 61 4e 65 77 3d 3d 30 20 29 20 72  if( paNew==0 ) r
27620 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
27630 45 4d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 61 4e  EM;.  memcpy(paN
27640 65 77 2c 20 70 2d 3e 61 4c 54 65 72 6d 2c 20 73  ew, p->aLTerm, s
27650 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b  izeof(p->aLTerm[
27660 30 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f 74 29 3b 0a  0])*p->nLSlot);.
27670 20 20 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21    if( p->aLTerm!
27680 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 20  =p->aLTermSpace 
27690 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  ) sqlite3DbFree(
276a0 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a  db, p->aLTerm);.
276b0 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70 61    p->aLTerm = pa
276c0 4e 65 77 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74  New;.  p->nLSlot
276d0 20 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e 20 53   = n;.  return S
276e0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
276f0 2a 2a 20 54 72 61 6e 73 66 65 72 20 63 6f 6e 74  ** Transfer cont
27700 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 73 65 63  ent from the sec
27710 6f 6e 64 20 70 4c 6f 6f 70 20 69 6e 74 6f 20 74  ond pLoop into t
27720 68 65 20 66 69 72 73 74 2e 0a 2a 2f 0a 73 74 61  he first..*/.sta
27730 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
27740 70 58 66 65 72 28 73 71 6c 69 74 65 33 20 2a 64  pXfer(sqlite3 *d
27750 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54  b, WhereLoop *pT
27760 6f 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 46  o, WhereLoop *pF
27770 72 6f 6d 29 7b 0a 20 20 77 68 65 72 65 4c 6f 6f  rom){.  whereLoo
27780 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c 20  pClearUnion(db, 
27790 70 54 6f 29 3b 0a 20 20 69 66 28 20 77 68 65 72  pTo);.  if( wher
277a0 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20  eLoopResize(db, 
277b0 70 54 6f 2c 20 70 46 72 6f 6d 2d 3e 6e 4c 54 65  pTo, pFrom->nLTe
277c0 72 6d 29 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  rm) ){.    memse
277d0 74 28 26 70 54 6f 2d 3e 75 2c 20 30 2c 20 73 69  t(&pTo->u, 0, si
277e0 7a 65 6f 66 28 70 54 6f 2d 3e 75 29 29 3b 0a 20  zeof(pTo->u));. 
277f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
27800 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65  _NOMEM;.  }.  me
27810 6d 63 70 79 28 70 54 6f 2c 20 70 46 72 6f 6d 2c  mcpy(pTo, pFrom,
27820 20 57 48 45 52 45 5f 4c 4f 4f 50 5f 58 46 45 52   WHERE_LOOP_XFER
27830 5f 53 5a 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70  _SZ);.  memcpy(p
27840 54 6f 2d 3e 61 4c 54 65 72 6d 2c 20 70 46 72 6f  To->aLTerm, pFro
27850 6d 2d 3e 61 4c 54 65 72 6d 2c 20 70 54 6f 2d 3e  m->aLTerm, pTo->
27860 6e 4c 54 65 72 6d 2a 73 69 7a 65 6f 66 28 70 54  nLTerm*sizeof(pT
27870 6f 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 29 3b 0a  o->aLTerm[0]));.
27880 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 77 73 46    if( pFrom->wsF
27890 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
278a0 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20  TUALTABLE ){.   
278b0 20 70 46 72 6f 6d 2d 3e 75 2e 76 74 61 62 2e 6e   pFrom->u.vtab.n
278c0 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d  eedFree = 0;.  }
278d0 65 6c 73 65 20 69 66 28 20 28 70 46 72 6f 6d 2d  else if( (pFrom-
278e0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
278f0 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20  _AUTO_INDEX)!=0 
27900 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75 2e  ){.    pFrom->u.
27910 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30  btree.pIndex = 0
27920 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
27930 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
27940 2a 2a 20 44 65 6c 65 74 65 20 61 20 57 68 65 72  ** Delete a Wher
27950 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a  eLoop object.*/.
27960 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
27970 65 4c 6f 6f 70 44 65 6c 65 74 65 28 73 71 6c 69  eLoopDelete(sqli
27980 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f  te3 *db, WhereLo
27990 6f 70 20 2a 70 29 7b 0a 20 20 77 68 65 72 65 4c  op *p){.  whereL
279a0 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70 29 3b  oopClear(db, p);
279b0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
279c0 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (db, p);.}../*.*
279d0 2a 20 46 72 65 65 20 61 20 57 68 65 72 65 49 6e  * Free a WhereIn
279e0 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a  fo structure.*/.
279f0 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
27a00 65 49 6e 66 6f 46 72 65 65 28 73 71 6c 69 74 65  eInfoFree(sqlite
27a10 33 20 2a 64 62 2c 20 57 68 65 72 65 49 6e 66 6f  3 *db, WhereInfo
27a20 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 69 66 28   *pWInfo){.  if(
27a30 20 41 4c 57 41 59 53 28 70 57 49 6e 66 6f 29 20   ALWAYS(pWInfo) 
27a40 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
27a50 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 49    for(i=0; i<pWI
27a60 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b  nfo->nLevel; i++
27a70 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 4c 65  ){.      WhereLe
27a80 76 65 6c 20 2a 70 4c 65 76 65 6c 20 3d 20 26 70  vel *pLevel = &p
27a90 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20  WInfo->a[i];.   
27aa0 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70     if( pLevel->p
27ab0 57 4c 6f 6f 70 20 26 26 20 28 70 4c 65 76 65 6c  WLoop && (pLevel
27ac0 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ->pWLoop->wsFlag
27ad0 73 20 26 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c  s & WHERE_IN_ABL
27ae0 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  E) ){.        sq
27af0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
27b00 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e  pLevel->u.in.aIn
27b10 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Loop);.      }. 
27b20 20 20 20 7d 0a 20 20 20 20 77 68 65 72 65 43 6c     }.    whereCl
27b30 61 75 73 65 43 6c 65 61 72 28 26 70 57 49 6e 66  auseClear(&pWInf
27b40 6f 2d 3e 73 57 43 29 3b 0a 20 20 20 20 77 68 69  o->sWC);.    whi
27b50 6c 65 28 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f  le( pWInfo->pLoo
27b60 70 73 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72  ps ){.      Wher
27b70 65 4c 6f 6f 70 20 2a 70 20 3d 20 70 57 49 6e 66  eLoop *p = pWInf
27b80 6f 2d 3e 70 4c 6f 6f 70 73 3b 0a 20 20 20 20 20  o->pLoops;.     
27b90 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20   pWInfo->pLoops 
27ba0 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a  = p->pNextLoop;.
27bb0 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 44        whereLoopD
27bc0 65 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a 20 20  elete(db, p);.  
27bd0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
27be0 62 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f  bFree(db, pWInfo
27bf0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
27c00 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 61  Return TRUE if a
27c10 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
27c20 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a  ing are true:.**
27c30 0a 2a 2a 20 20 20 28 31 29 20 20 58 20 68 61 73  .**   (1)  X has
27c40 20 74 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77   the same or low
27c50 65 72 20 63 6f 73 74 20 74 68 61 74 20 59 0a 2a  er cost that Y.*
27c60 2a 20 20 20 28 32 29 20 20 58 20 69 73 20 61 20  *   (2)  X is a 
27c70 70 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66  proper subset of
27c80 20 59 0a 2a 2a 20 20 20 28 33 29 20 20 58 20 73   Y.**   (3)  X s
27c90 6b 69 70 73 20 61 74 20 6c 65 61 73 74 20 61 73  kips at least as
27ca0 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 61 73   many columns as
27cb0 20 59 0a 2a 2a 0a 2a 2a 20 42 79 20 22 70 72 6f   Y.**.** By "pro
27cc0 70 65 72 20 73 75 62 73 65 74 22 20 77 65 20 6d  per subset" we m
27cd0 65 61 6e 20 74 68 61 74 20 58 20 75 73 65 73 20  ean that X uses 
27ce0 66 65 77 65 72 20 57 48 45 52 45 20 63 6c 61 75  fewer WHERE clau
27cf0 73 65 20 74 65 72 6d 73 0a 2a 2a 20 74 68 61 6e  se terms.** than
27d00 20 59 20 61 6e 64 20 74 68 61 74 20 65 76 65 72   Y and that ever
27d10 79 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  y WHERE clause t
27d20 65 72 6d 20 75 73 65 64 20 62 79 20 58 20 69 73  erm used by X is
27d30 20 61 6c 73 6f 20 75 73 65 64 0a 2a 2a 20 62 79   also used.** by
27d40 20 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20 69   Y..**.** If X i
27d50 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65  s a proper subse
27d60 74 20 6f 66 20 59 20 74 68 65 6e 20 59 20 69 73  t of Y then Y is
27d70 20 61 20 62 65 74 74 65 72 20 63 68 6f 69 63 65   a better choice
27d80 20 61 6e 64 20 6f 75 67 68 74 0a 2a 2a 20 74 6f   and ought.** to
27d90 20 68 61 76 65 20 61 20 6c 6f 77 65 72 20 63 6f   have a lower co
27da0 73 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  st.  This routin
27db0 65 20 72 65 74 75 72 6e 73 20 54 52 55 45 20 77  e returns TRUE w
27dc0 68 65 6e 20 74 68 61 74 20 63 6f 73 74 20 0a 2a  hen that cost .*
27dd0 2a 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20 69  * relationship i
27de0 73 20 69 6e 76 65 72 74 65 64 20 61 6e 64 20 6e  s inverted and n
27df0 65 65 64 73 20 74 6f 20 62 65 20 61 64 6a 75 73  eeds to be adjus
27e00 74 65 64 2e 20 20 54 68 65 20 74 68 69 72 64 20  ted.  The third 
27e10 72 75 6c 65 0a 2a 2a 20 77 61 73 20 61 64 64 65  rule.** was adde
27e20 64 20 62 65 63 61 75 73 65 20 69 66 20 58 20 75  d because if X u
27e30 73 65 73 20 73 6b 69 70 2d 73 63 61 6e 20 6c 65  ses skip-scan le
27e40 73 73 20 74 68 61 6e 20 59 20 69 74 20 73 74 69  ss than Y it sti
27e50 6c 6c 20 6d 69 67 68 74 0a 2a 2a 20 64 65 73 65  ll might.** dese
27e60 72 76 65 20 61 20 6c 6f 77 65 72 20 63 6f 73 74  rve a lower cost
27e70 20 65 76 65 6e 20 69 66 20 69 74 20 69 73 20 61   even if it is a
27e80 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f   proper subset o
27e90 66 20 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  f Y..*/.static i
27ea0 6e 74 20 77 68 65 72 65 4c 6f 6f 70 43 68 65 61  nt whereLoopChea
27eb0 70 65 72 50 72 6f 70 65 72 53 75 62 73 65 74 28  perProperSubset(
27ec0 0a 20 20 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f  .  const WhereLo
27ed0 6f 70 20 2a 70 58 2c 20 20 20 20 20 20 20 2f 2a  op *pX,       /*
27ee0 20 46 69 72 73 74 20 57 68 65 72 65 4c 6f 6f 70   First WhereLoop
27ef0 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20   to compare */. 
27f00 20 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70   const WhereLoop
27f10 20 2a 70 59 20 20 20 20 20 20 20 20 2f 2a 20 43   *pY        /* C
27f20 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 74  ompare against t
27f30 68 69 73 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f  his WhereLoop */
27f40 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  .){.  int i, j;.
27f50 20 20 69 66 28 20 70 58 2d 3e 6e 4c 54 65 72 6d    if( pX->nLTerm
27f60 2d 70 58 2d 3e 6e 53 6b 69 70 20 3e 3d 20 70 59  -pX->nSkip >= pY
27f70 2d 3e 6e 4c 54 65 72 6d 2d 70 59 2d 3e 6e 53 6b  ->nLTerm-pY->nSk
27f80 69 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ip ){.    return
27f90 20 30 3b 20 2f 2a 20 58 20 69 73 20 6e 6f 74 20   0; /* X is not 
27fa0 61 20 73 75 62 73 65 74 20 6f 66 20 59 20 2a 2f  a subset of Y */
27fb0 0a 20 20 7d 0a 20 20 69 66 28 20 70 59 2d 3e 6e  .  }.  if( pY->n
27fc0 53 6b 69 70 20 3e 20 70 58 2d 3e 6e 53 6b 69 70  Skip > pX->nSkip
27fd0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
27fe0 66 28 20 70 58 2d 3e 72 52 75 6e 20 3e 3d 20 70  f( pX->rRun >= p
27ff0 59 2d 3e 72 52 75 6e 20 29 7b 0a 20 20 20 20 69  Y->rRun ){.    i
28000 66 28 20 70 58 2d 3e 72 52 75 6e 20 3e 20 70 59  f( pX->rRun > pY
28010 2d 3e 72 52 75 6e 20 29 20 72 65 74 75 72 6e 20  ->rRun ) return 
28020 30 3b 20 20 20 20 2f 2a 20 58 20 63 6f 73 74 73  0;    /* X costs
28030 20 6d 6f 72 65 20 74 68 61 6e 20 59 20 2a 2f 0a   more than Y */.
28040 20 20 20 20 69 66 28 20 70 58 2d 3e 6e 4f 75 74      if( pX->nOut
28050 20 3e 20 70 59 2d 3e 6e 4f 75 74 20 29 20 72 65   > pY->nOut ) re
28060 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 58 20  turn 0;    /* X 
28070 63 6f 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20  costs more than 
28080 59 20 2a 2f 0a 20 20 7d 0a 20 20 66 6f 72 28 69  Y */.  }.  for(i
28090 3d 70 58 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 69  =pX->nLTerm-1; i
280a0 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69  >=0; i--){.    i
280b0 66 28 20 70 58 2d 3e 61 4c 54 65 72 6d 5b 69 5d  f( pX->aLTerm[i]
280c0 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
280d0 20 20 20 20 66 6f 72 28 6a 3d 70 59 2d 3e 6e 4c      for(j=pY->nL
280e0 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d  Term-1; j>=0; j-
280f0 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 59  -){.      if( pY
28100 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3d 3d 70 58 2d  ->aLTerm[j]==pX-
28110 3e 61 4c 54 65 72 6d 5b 69 5d 20 29 20 62 72 65  >aLTerm[i] ) bre
28120 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
28130 28 20 6a 3c 30 20 29 20 72 65 74 75 72 6e 20 30  ( j<0 ) return 0
28140 3b 20 20 2f 2a 20 58 20 6e 6f 74 20 61 20 73 75  ;  /* X not a su
28150 62 73 65 74 20 6f 66 20 59 20 73 69 6e 63 65 20  bset of Y since 
28160 74 65 72 6d 20 58 5b 69 5d 20 6e 6f 74 20 75 73  term X[i] not us
28170 65 64 20 62 79 20 59 20 2a 2f 0a 20 20 7d 0a 20  ed by Y */.  }. 
28180 20 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 41   return 1;  /* A
28190 6c 6c 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 65  ll conditions me
281a0 65 74 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  et */.}../*.** T
281b0 72 79 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65  ry to adjust the
281c0 20 63 6f 73 74 20 6f 66 20 57 68 65 72 65 4c 6f   cost of WhereLo
281d0 6f 70 20 70 54 65 6d 70 6c 61 74 65 20 75 70 77  op pTemplate upw
281e0 61 72 64 73 20 6f 72 20 64 6f 77 6e 77 61 72 64  ards or downward
281f0 73 20 73 6f 0a 2a 2a 20 74 68 61 74 3a 0a 2a 2a  s so.** that:.**
28200 0a 2a 2a 20 20 20 28 31 29 20 70 54 65 6d 70 6c  .**   (1) pTempl
28210 61 74 65 20 63 6f 73 74 73 20 6c 65 73 73 20 74  ate costs less t
28220 68 61 6e 20 61 6e 79 20 6f 74 68 65 72 20 57 68  han any other Wh
28230 65 72 65 4c 6f 6f 70 73 20 74 68 61 74 20 61 72  ereLoops that ar
28240 65 20 61 20 70 72 6f 70 65 72 0a 2a 2a 20 20 20  e a proper.**   
28250 20 20 20 20 73 75 62 73 65 74 20 6f 66 20 70 54      subset of pT
28260 65 6d 70 6c 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20  emplate.**.**   
28270 28 32 29 20 70 54 65 6d 70 6c 61 74 65 20 63 6f  (2) pTemplate co
28280 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e  sts more than an
28290 79 20 6f 74 68 65 72 20 57 68 65 72 65 4c 6f 6f  y other WhereLoo
282a0 70 73 20 66 6f 72 20 77 68 69 63 68 20 70 54 65  ps for which pTe
282b0 6d 70 6c 61 74 65 0a 2a 2a 20 20 20 20 20 20 20  mplate.**       
282c0 69 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73  is a proper subs
282d0 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 73 61 79  et..**.** To say
282e0 20 22 57 68 65 72 65 4c 6f 6f 70 20 58 20 69 73   "WhereLoop X is
282f0 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74   a proper subset
28300 20 6f 66 20 59 22 20 6d 65 61 6e 73 20 74 68 61   of Y" means tha
28310 74 20 58 20 75 73 65 73 20 66 65 77 65 72 0a 2a  t X uses fewer.*
28320 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  * WHERE clause t
28330 65 72 6d 73 20 74 68 61 6e 20 59 20 61 6e 64 20  erms than Y and 
28340 74 68 61 74 20 65 76 65 72 79 20 57 48 45 52 45  that every WHERE
28350 20 63 6c 61 75 73 65 20 74 65 72 6d 20 75 73 65   clause term use
28360 64 20 62 79 20 58 20 69 73 0a 2a 2a 20 61 6c 73  d by X is.** als
28370 6f 20 75 73 65 64 20 62 79 20 59 2e 0a 2a 2f 0a  o used by Y..*/.
28380 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
28390 65 4c 6f 6f 70 41 64 6a 75 73 74 43 6f 73 74 28  eLoopAdjustCost(
283a0 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20  const WhereLoop 
283b0 2a 70 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  *p, WhereLoop *p
283c0 54 65 6d 70 6c 61 74 65 29 7b 0a 20 20 69 66 28  Template){.  if(
283d0 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46   (pTemplate->wsF
283e0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
283f0 45 58 45 44 29 3d 3d 30 20 29 20 72 65 74 75 72  EXED)==0 ) retur
28400 6e 3b 0a 20 20 66 6f 72 28 3b 20 70 3b 20 70 3d  n;.  for(; p; p=
28410 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20  p->pNextLoop){. 
28420 20 20 20 69 66 28 20 70 2d 3e 69 54 61 62 21 3d     if( p->iTab!=
28430 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20  pTemplate->iTab 
28440 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
28450 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
28460 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
28470 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
28480 20 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f      if( whereLoo
28490 70 43 68 65 61 70 65 72 50 72 6f 70 65 72 53 75  pCheaperProperSu
284a0 62 73 65 74 28 70 2c 20 70 54 65 6d 70 6c 61 74  bset(p, pTemplat
284b0 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  e) ){.      /* A
284c0 64 6a 75 73 74 20 70 54 65 6d 70 6c 61 74 65 20  djust pTemplate 
284d0 63 6f 73 74 20 64 6f 77 6e 77 61 72 64 20 73 6f  cost downward so
284e0 20 74 68 61 74 20 69 74 20 69 73 20 63 68 65 61   that it is chea
284f0 70 65 72 20 74 68 61 6e 20 69 74 73 20 0a 20 20  per than its .  
28500 20 20 20 20 2a 2a 20 73 75 62 73 65 74 20 70 2e      ** subset p.
28510 20 2a 2f 0a 20 20 20 20 20 20 57 48 45 52 45 54   */.      WHERET
28520 52 41 43 45 28 30 78 38 30 2c 28 22 73 75 62 73  RACE(0x80,("subs
28530 65 74 20 63 6f 73 74 20 61 64 6a 75 73 74 6d 65  et cost adjustme
28540 6e 74 20 25 64 2c 25 64 20 74 6f 20 25 64 2c 25  nt %d,%d to %d,%
28550 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
28560 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 65               pTe
28570 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c 20 70 54  mplate->rRun, pT
28580 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 2c 20 70  emplate->nOut, p
28590 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 2d  ->rRun, p->nOut-
285a0 31 29 29 3b 0a 20 20 20 20 20 20 70 54 65 6d 70  1));.      pTemp
285b0 6c 61 74 65 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e  late->rRun = p->
285c0 72 52 75 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d  rRun;.      pTem
285d0 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d  plate->nOut = p-
285e0 3e 6e 4f 75 74 20 2d 20 31 3b 0a 20 20 20 20 7d  >nOut - 1;.    }
285f0 65 6c 73 65 20 69 66 28 20 77 68 65 72 65 4c 6f  else if( whereLo
28600 6f 70 43 68 65 61 70 65 72 50 72 6f 70 65 72 53  opCheaperProperS
28610 75 62 73 65 74 28 70 54 65 6d 70 6c 61 74 65 2c  ubset(pTemplate,
28620 20 70 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20   p) ){.      /* 
28630 41 64 6a 75 73 74 20 70 54 65 6d 70 6c 61 74 65  Adjust pTemplate
28640 20 63 6f 73 74 20 75 70 77 61 72 64 20 73 6f 20   cost upward so 
28650 74 68 61 74 20 69 74 20 69 73 20 63 6f 73 74 6c  that it is costl
28660 69 65 72 20 74 68 61 6e 20 70 20 73 69 6e 63 65  ier than p since
28670 0a 20 20 20 20 20 20 2a 2a 20 70 54 65 6d 70 6c  .      ** pTempl
28680 61 74 65 20 69 73 20 61 20 70 72 6f 70 65 72 20  ate is a proper 
28690 73 75 62 73 65 74 20 6f 66 20 70 20 2a 2f 0a 20  subset of p */. 
286a0 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
286b0 30 78 38 30 2c 28 22 73 75 62 73 65 74 20 63 6f  0x80,("subset co
286c0 73 74 20 61 64 6a 75 73 74 6d 65 6e 74 20 25 64  st adjustment %d
286d0 2c 25 64 20 74 6f 20 25 64 2c 25 64 5c 6e 22 2c  ,%d to %d,%d\n",
286e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
286f0 20 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74          pTemplat
28700 65 2d 3e 72 52 75 6e 2c 20 70 54 65 6d 70 6c 61  e->rRun, pTempla
28710 74 65 2d 3e 6e 4f 75 74 2c 20 70 2d 3e 72 52 75  te->nOut, p->rRu
28720 6e 2c 20 70 2d 3e 6e 4f 75 74 2b 31 29 29 3b 0a  n, p->nOut+1));.
28730 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d        pTemplate-
28740 3e 72 52 75 6e 20 3d 20 70 2d 3e 72 52 75 6e 3b  >rRun = p->rRun;
28750 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65  .      pTemplate
28760 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f 75 74  ->nOut = p->nOut
28770 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   + 1;.    }.  }.
28780 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20  }../*.** Search 
28790 74 68 65 20 6c 69 73 74 20 6f 66 20 57 68 65 72  the list of Wher
287a0 65 4c 6f 6f 70 73 20 69 6e 20 2a 70 70 50 72 65  eLoops in *ppPre
287b0 76 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 6e  v looking for on
287c0 65 20 74 68 61 74 20 63 61 6e 20 62 65 0a 2a 2a  e that can be.**
287d0 20 73 75 70 70 6c 61 6e 74 65 64 20 62 79 20 70   supplanted by p
287e0 54 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  Template..**.** 
287f0 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74  Return NULL if t
28800 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6c 69 73  he WhereLoop lis
28810 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 65 6e  t contains an en
28820 74 72 79 20 74 68 61 74 20 63 61 6e 20 73 75 70  try that can sup
28830 70 6c 61 6e 74 0a 2a 2a 20 70 54 65 6d 70 6c 61  plant.** pTempla
28840 74 65 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72  te, in other wor
28850 64 73 20 69 66 20 70 54 65 6d 70 6c 61 74 65 20  ds if pTemplate 
28860 64 6f 65 73 20 6e 6f 74 20 62 65 6c 6f 6e 67 20  does not belong 
28870 6f 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2a 0a  on the list..**.
28880 2a 2a 20 49 66 20 70 58 20 69 73 20 61 20 57 68  ** If pX is a Wh
28890 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 70 54 65  ereLoop that pTe
288a0 6d 70 6c 61 74 65 20 63 61 6e 20 73 75 70 70 6c  mplate can suppl
288b0 61 6e 74 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  ant, then return
288c0 20 74 68 65 0a 2a 2a 20 6c 69 6e 6b 20 74 68 61   the.** link tha
288d0 74 20 70 6f 69 6e 74 73 20 74 6f 20 70 58 2e 0a  t points to pX..
288e0 2a 2a 0a 2a 2a 20 49 66 20 70 54 65 6d 70 6c 61  **.** If pTempla
288f0 74 65 20 63 61 6e 6e 6f 74 20 73 75 70 70 6c 61  te cannot suppla
28900 6e 74 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20  nt any existing 
28910 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6c  element of the l
28920 69 73 74 20 62 75 74 20 6e 65 65 64 73 0a 2a 2a  ist but needs.**
28930 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20   to be added to 
28940 74 68 65 20 6c 69 73 74 2c 20 74 68 65 6e 20 72  the list, then r
28950 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
28960 74 6f 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74  to the tail of t
28970 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  he list..*/.stat
28980 69 63 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 77  ic WhereLoop **w
28990 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73  hereLoopFindLess
289a0 65 72 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20  er(.  WhereLoop 
289b0 2a 2a 70 70 50 72 65 76 2c 0a 20 20 63 6f 6e 73  **ppPrev,.  cons
289c0 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65  t WhereLoop *pTe
289d0 6d 70 6c 61 74 65 0a 29 7b 0a 20 20 57 68 65 72  mplate.){.  Wher
289e0 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 66 6f 72 28  eLoop *p;.  for(
289f0 70 3d 28 2a 70 70 50 72 65 76 29 3b 20 70 3b 20  p=(*ppPrev); p; 
28a00 70 70 50 72 65 76 3d 26 70 2d 3e 70 4e 65 78 74  ppPrev=&p->pNext
28a10 4c 6f 6f 70 2c 20 70 3d 2a 70 70 50 72 65 76 29  Loop, p=*ppPrev)
28a20 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61  {.    if( p->iTa
28a30 62 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54  b!=pTemplate->iT
28a40 61 62 20 7c 7c 20 70 2d 3e 69 53 6f 72 74 49 64  ab || p->iSortId
28a50 78 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 53  x!=pTemplate->iS
28a60 6f 72 74 49 64 78 20 29 7b 0a 20 20 20 20 20 20  ortIdx ){.      
28a70 2f 2a 20 49 66 20 65 69 74 68 65 72 20 74 68 65  /* If either the
28a80 20 69 54 61 62 20 6f 72 20 69 53 6f 72 74 49 64   iTab or iSortId
28a90 78 20 76 61 6c 75 65 73 20 66 6f 72 20 74 77 6f  x values for two
28aa0 20 57 68 65 72 65 4c 6f 6f 70 20 61 72 65 20 64   WhereLoop are d
28ab0 69 66 66 65 72 65 6e 74 0a 20 20 20 20 20 20 2a  ifferent.      *
28ac0 2a 20 74 68 65 6e 20 74 68 6f 73 65 20 57 68 65  * then those Whe
28ad0 72 65 4c 6f 6f 70 73 20 6e 65 65 64 20 74 6f 20  reLoops need to 
28ae0 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 73 65  be considered se
28af0 70 61 72 61 74 65 6c 79 2e 20 20 4e 65 69 74 68  parately.  Neith
28b00 65 72 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61  er is.      ** a
28b10 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 72 65   candidate to re
28b20 70 6c 61 63 65 20 74 68 65 20 6f 74 68 65 72 2e  place the other.
28b30 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   */.      contin
28b40 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  ue;.    }.    /*
28b50 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   In the current 
28b60 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20  implementation, 
28b70 74 68 65 20 72 53 65 74 75 70 20 76 61 6c 75 65  the rSetup value
28b80 20 69 73 20 65 69 74 68 65 72 20 7a 65 72 6f 0a   is either zero.
28b90 20 20 20 20 2a 2a 20 6f 72 20 74 68 65 20 63 6f      ** or the co
28ba0 73 74 20 6f 66 20 62 75 69 6c 64 69 6e 67 20 61  st of building a
28bb0 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
28bc0 78 20 28 4e 6c 6f 67 4e 29 20 61 6e 64 20 74 68  x (NlogN) and th
28bd0 65 20 4e 6c 6f 67 4e 0a 20 20 20 20 2a 2a 20 69  e NlogN.    ** i
28be0 73 20 74 68 65 20 73 61 6d 65 20 66 6f 72 20 63  s the same for c
28bf0 6f 6d 70 61 74 69 62 6c 65 20 57 68 65 72 65 4c  ompatible WhereL
28c00 6f 6f 70 73 2e 20 2a 2f 0a 20 20 20 20 61 73 73  oops. */.    ass
28c10 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3d 3d  ert( p->rSetup==
28c20 30 20 7c 7c 20 70 54 65 6d 70 6c 61 74 65 2d 3e  0 || pTemplate->
28c30 72 53 65 74 75 70 3d 3d 30 20 0a 20 20 20 20 20  rSetup==0 .     
28c40 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70              || p
28c50 2d 3e 72 53 65 74 75 70 3d 3d 70 54 65 6d 70 6c  ->rSetup==pTempl
28c60 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a  ate->rSetup );..
28c70 20 20 20 20 2f 2a 20 77 68 65 72 65 4c 6f 6f 70      /* whereLoop
28c80 41 64 64 42 74 72 65 65 28 29 20 61 6c 77 61 79  AddBtree() alway
28c90 73 20 67 65 6e 65 72 61 74 65 73 20 61 6e 64 20  s generates and 
28ca0 69 6e 73 65 72 74 73 20 74 68 65 20 61 75 74 6f  inserts the auto
28cb0 6d 61 74 69 63 20 69 6e 64 65 78 0a 20 20 20 20  matic index.    
28cc0 2a 2a 20 63 61 73 65 20 66 69 72 73 74 2e 20 20  ** case first.  
28cd0 48 65 6e 63 65 20 63 6f 6d 70 61 74 69 62 6c 65  Hence compatible
28ce0 20 63 61 6e 64 69 64 61 74 65 20 57 68 65 72 65   candidate Where
28cf0 4c 6f 6f 70 73 20 6e 65 76 65 72 20 68 61 76 65  Loops never have
28d00 20 61 20 6c 61 72 67 65 72 0a 20 20 20 20 2a 2a   a larger.    **
28d10 20 72 53 65 74 75 70 2e 20 43 61 6c 6c 20 74 68   rSetup. Call th
28d20 69 73 20 53 45 54 55 50 2d 49 4e 56 41 52 49 41  is SETUP-INVARIA
28d30 4e 54 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  NT */.    assert
28d40 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65  ( p->rSetup>=pTe
28d50 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29  mplate->rSetup )
28d60 3b 0a 0a 20 20 20 20 2f 2a 20 41 6e 79 20 6c 6f  ;..    /* Any lo
28d70 6f 70 20 75 73 69 6e 67 20 61 6e 20 61 70 70 6c  op using an appl
28d80 69 61 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20 69  iation-defined i
28d90 6e 64 65 78 20 28 6f 72 20 50 52 49 4d 41 52 59  ndex (or PRIMARY
28da0 20 4b 45 59 20 6f 72 0a 20 20 20 20 2a 2a 20 55   KEY or.    ** U
28db0 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
28dc0 29 20 77 69 74 68 20 6f 6e 65 20 6f 72 20 6d 6f  ) with one or mo
28dd0 72 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74  re == constraint
28de0 73 20 69 73 20 62 65 74 74 65 72 0a 20 20 20 20  s is better.    
28df0 2a 2a 20 74 68 61 6e 20 61 6e 20 61 75 74 6f 6d  ** than an autom
28e00 61 74 69 63 20 69 6e 64 65 78 2e 20 55 6e 6c 65  atic index. Unle
28e10 73 73 20 69 74 20 69 73 20 61 20 73 6b 69 70 2d  ss it is a skip-
28e20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28  scan. */.    if(
28e30 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57   (p->wsFlags & W
28e40 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
28e50 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65  !=0.     && (pTe
28e60 6d 70 6c 61 74 65 2d 3e 6e 53 6b 69 70 29 3d 3d  mplate->nSkip)==
28e70 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d 70  0.     && (pTemp
28e80 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26 20  late->wsFlags & 
28e90 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d  WHERE_INDEXED)!=
28ea0 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d 70  0.     && (pTemp
28eb0 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26 20  late->wsFlags & 
28ec0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29  WHERE_COLUMN_EQ)
28ed0 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 2d 3e  !=0.     && (p->
28ee0 70 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61  prereq & pTempla
28ef0 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 54 65  te->prereq)==pTe
28f00 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 0a 20  mplate->prereq. 
28f10 20 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61     ){.      brea
28f20 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
28f30 20 49 66 20 65 78 69 73 74 69 6e 67 20 57 68 65   If existing Whe
28f40 72 65 4c 6f 6f 70 20 70 20 69 73 20 62 65 74 74  reLoop p is bett
28f50 65 72 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74  er than pTemplat
28f60 65 2c 20 70 54 65 6d 70 6c 61 74 65 20 63 61 6e  e, pTemplate can
28f70 20 62 65 0a 20 20 20 20 2a 2a 20 64 69 73 63 61   be.    ** disca
28f80 72 64 65 64 2e 20 20 57 68 65 72 65 4c 6f 6f 70  rded.  WhereLoop
28f90 20 70 20 69 73 20 62 65 74 74 65 72 20 69 66 3a   p is better if:
28fa0 0a 20 20 20 20 2a 2a 20 20 20 28 31 29 20 20 70  .    **   (1)  p
28fb0 20 68 61 73 20 6e 6f 20 6d 6f 72 65 20 64 65 70   has no more dep
28fc0 65 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20 70  endencies than p
28fd0 54 65 6d 70 6c 61 74 65 2c 20 61 6e 64 0a 20 20  Template, and.  
28fe0 20 20 2a 2a 20 20 20 28 32 29 20 20 70 20 68 61    **   (2)  p ha
28ff0 73 20 61 6e 20 65 71 75 61 6c 20 6f 72 20 6c 6f  s an equal or lo
29000 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20 70 54  wer cost than pT
29010 65 6d 70 6c 61 74 65 0a 20 20 20 20 2a 2f 0a 20  emplate.    */. 
29020 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65     if( (p->prere
29030 71 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70  q & pTemplate->p
29040 72 65 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65  rereq)==p->prere
29050 71 20 20 20 20 2f 2a 20 28 31 29 20 20 2a 2f 0a  q    /* (1)  */.
29060 20 20 20 20 20 26 26 20 70 2d 3e 72 53 65 74 75       && p->rSetu
29070 70 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53  p<=pTemplate->rS
29080 65 74 75 70 20 20 20 20 20 20 20 20 20 20 20 20  etup            
29090 20 20 20 20 20 20 2f 2a 20 28 32 61 29 20 2a 2f        /* (2a) */
290a0 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75 6e  .     && p->rRun
290b0 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75  <=pTemplate->rRu
290c0 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
290d0 20 20 20 20 20 20 20 2f 2a 20 28 32 62 29 20 2a         /* (2b) *
290e0 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 6e 4f 75  /.     && p->nOu
290f0 74 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f  t<=pTemplate->nO
29100 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ut              
29110 20 20 20 20 20 20 20 20 2f 2a 20 28 32 63 29 20          /* (2c) 
29120 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  */.    ){.      
29130 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 44 69  return 0;  /* Di
29140 73 63 61 72 64 20 70 54 65 6d 70 6c 61 74 65 20  scard pTemplate 
29150 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  */.    }..    /*
29160 20 49 66 20 70 54 65 6d 70 6c 61 74 65 20 69 73   If pTemplate is
29170 20 61 6c 77 61 79 73 20 62 65 74 74 65 72 20 74   always better t
29180 68 61 6e 20 70 2c 20 74 68 65 6e 20 63 61 75 73  han p, then caus
29190 65 20 70 20 74 6f 20 62 65 20 6f 76 65 72 77 72  e p to be overwr
291a0 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20 77 69 74  itten.    ** wit
291b0 68 20 70 54 65 6d 70 6c 61 74 65 2e 20 20 70 54  h pTemplate.  pT
291c0 65 6d 70 6c 61 74 65 20 69 73 20 62 65 74 74 65  emplate is bette
291d0 72 20 74 68 61 6e 20 70 20 69 66 3a 0a 20 20 20  r than p if:.   
291e0 20 2a 2a 20 20 20 28 31 29 20 20 70 54 65 6d 70   **   (1)  pTemp
291f0 6c 61 74 65 20 68 61 73 20 6e 6f 20 6d 6f 72 65  late has no more
29200 20 64 65 70 65 6e 64 65 6e 63 65 73 20 74 68 61   dependences tha
29210 6e 20 70 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20  n p, and.    ** 
29220 20 20 28 32 29 20 20 70 54 65 6d 70 6c 61 74 65    (2)  pTemplate
29230 20 68 61 73 20 61 6e 20 65 71 75 61 6c 20 6f 72   has an equal or
29240 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e   lower cost than
29250 20 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69   p..    */.    i
29260 66 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20  f( (p->prereq & 
29270 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65  pTemplate->prere
29280 71 29 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70  q)==pTemplate->p
29290 72 65 72 65 71 20 20 20 2f 2a 20 28 31 29 20 20  rereq   /* (1)  
292a0 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52  */.     && p->rR
292b0 75 6e 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72  un>=pTemplate->r
292c0 52 75 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  Run             
292d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
292e0 2f 2a 20 28 32 61 29 20 2a 2f 0a 20 20 20 20 20  /* (2a) */.     
292f0 26 26 20 70 2d 3e 6e 4f 75 74 3e 3d 70 54 65 6d  && p->nOut>=pTem
29300 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 20 20 20 20  plate->nOut     
29310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29320 20 20 20 20 20 20 20 20 2f 2a 20 28 32 62 29 20          /* (2b) 
29330 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  */.    ){.      
29340 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75  assert( p->rSetu
29350 70 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53  p>=pTemplate->rS
29360 65 74 75 70 20 29 3b 20 2f 2a 20 53 45 54 55 50  etup ); /* SETUP
29370 2d 49 4e 56 41 52 49 41 4e 54 20 61 62 6f 76 65  -INVARIANT above
29380 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
29390 20 20 20 2f 2a 20 43 61 75 73 65 20 70 20 74 6f     /* Cause p to
293a0 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20   be overwritten 
293b0 62 79 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a  by pTemplate */.
293c0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
293d0 72 6e 20 70 70 50 72 65 76 3b 0a 7d 0a 0a 2f 2a  rn ppPrev;.}../*
293e0 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20 72 65  .** Insert or re
293f0 70 6c 61 63 65 20 61 20 57 68 65 72 65 4c 6f 6f  place a WhereLoo
29400 70 20 65 6e 74 72 79 20 75 73 69 6e 67 20 74 68  p entry using th
29410 65 20 74 65 6d 70 6c 61 74 65 20 73 75 70 70 6c  e template suppl
29420 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78  ied..**.** An ex
29430 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70  isting WhereLoop
29440 20 65 6e 74 72 79 20 6d 69 67 68 74 20 62 65 20   entry might be 
29450 6f 76 65 72 77 72 69 74 74 65 6e 20 69 66 20 74  overwritten if t
29460 68 65 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 0a  he new template.
29470 2a 2a 20 69 73 20 62 65 74 74 65 72 20 61 6e 64  ** is better and
29480 20 68 61 73 20 66 65 77 65 72 20 64 65 70 65 6e   has fewer depen
29490 64 65 6e 63 69 65 73 2e 20 20 4f 72 20 74 68 65  dencies.  Or the
294a0 20 74 65 6d 70 6c 61 74 65 20 77 69 6c 6c 20 62   template will b
294b0 65 20 69 67 6e 6f 72 65 64 0a 2a 2a 20 61 6e 64  e ignored.** and
294c0 20 6e 6f 20 69 6e 73 65 72 74 20 77 69 6c 6c 20   no insert will 
294d0 6f 63 63 75 72 20 69 66 20 61 6e 20 65 78 69 73  occur if an exis
294e0 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69  ting WhereLoop i
294f0 73 20 66 61 73 74 65 72 20 61 6e 64 20 68 61 73  s faster and has
29500 0a 2a 2a 20 66 65 77 65 72 20 64 65 70 65 6e 64  .** fewer depend
29510 65 6e 63 69 65 73 20 74 68 61 6e 20 74 68 65 20  encies than the 
29520 74 65 6d 70 6c 61 74 65 2e 20 20 4f 74 68 65 72  template.  Other
29530 77 69 73 65 20 61 20 6e 65 77 20 57 68 65 72 65  wise a new Where
29540 4c 6f 6f 70 20 69 73 0a 2a 2a 20 61 64 64 65 64  Loop is.** added
29550 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 74 65   based on the te
29560 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  mplate..**.** If
29570 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65   pBuilder->pOrSe
29580 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68  t is not NULL th
29590 65 6e 20 77 65 20 63 61 72 65 20 61 62 6f 75 74  en we care about
295a0 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 70 72 65   only the.** pre
295b0 72 65 71 75 69 73 69 74 65 73 20 61 6e 64 20 72  requisites and r
295c0 52 75 6e 20 61 6e 64 20 6e 4f 75 74 20 63 6f 73  Run and nOut cos
295d0 74 73 20 6f 66 20 74 68 65 20 4e 20 62 65 73 74  ts of the N best
295e0 20 6c 6f 6f 70 73 2e 20 20 54 68 61 74 0a 2a 2a   loops.  That.**
295f0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
29600 67 61 74 68 65 72 65 64 20 69 6e 20 74 68 65 20  gathered in the 
29610 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74  pBuilder->pOrSet
29620 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 73   object.  This s
29630 70 65 63 69 61 6c 0a 2a 2a 20 70 72 6f 63 65 73  pecial.** proces
29640 73 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65  sing mode is use
29650 64 20 6f 6e 6c 79 20 66 6f 72 20 4f 52 20 63 6c  d only for OR cl
29660 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e  ause processing.
29670 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 63 63 75  .**.** When accu
29680 6d 75 6c 61 74 69 6e 67 20 6d 75 6c 74 69 70 6c  mulating multipl
29690 65 20 6c 6f 6f 70 73 20 28 77 68 65 6e 20 70 42  e loops (when pB
296a0 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69  uilder->pOrSet i
296b0 73 20 4e 55 4c 4c 29 20 77 65 0a 2a 2a 20 73 74  s NULL) we.** st
296c0 69 6c 6c 20 6d 69 67 68 74 20 6f 76 65 72 77 72  ill might overwr
296d0 69 74 65 20 73 69 6d 69 6c 61 72 20 6c 6f 6f 70  ite similar loop
296e0 73 20 77 69 74 68 20 74 68 65 20 6e 65 77 20 74  s with the new t
296f0 65 6d 70 6c 61 74 65 20 69 66 20 74 68 65 0a 2a  emplate if the.*
29700 2a 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 20 69  * new template i
29710 73 20 62 65 74 74 65 72 2e 20 20 4c 6f 6f 70 73  s better.  Loops
29720 20 6d 61 79 20 62 65 20 6f 76 65 72 77 72 69 74   may be overwrit
29730 74 65 6e 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f  ten if the follo
29740 77 69 6e 67 20 0a 2a 2a 20 63 6f 6e 64 69 74 69  wing .** conditi
29750 6f 6e 73 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a  ons are met:.**.
29760 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65 79 20  **    (1)  They 
29770 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 69 54  have the same iT
29780 61 62 2e 0a 2a 2a 20 20 20 20 28 32 29 20 20 54  ab..**    (2)  T
29790 68 65 79 20 68 61 76 65 20 74 68 65 20 73 61 6d  hey have the sam
297a0 65 20 69 53 6f 72 74 49 64 78 2e 0a 2a 2a 20 20  e iSortIdx..**  
297b0 20 20 28 33 29 20 20 54 68 65 20 74 65 6d 70 6c    (3)  The templ
297c0 61 74 65 20 68 61 73 20 73 61 6d 65 20 6f 72 20  ate has same or 
297d0 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69  fewer dependenci
297e0 65 73 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  es than the curr
297f0 65 6e 74 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28  ent loop.**    (
29800 34 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65  4)  The template
29810 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6f 72   has the same or
29820 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e   lower cost than
29830 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f   the current loo
29840 70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  p.*/.static int 
29850 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28  whereLoopInsert(
29860 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
29870 20 2a 70 42 75 69 6c 64 65 72 2c 20 57 68 65 72   *pBuilder, Wher
29880 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65  eLoop *pTemplate
29890 29 7b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  ){.  WhereLoop *
298a0 2a 70 70 50 72 65 76 2c 20 2a 70 3b 0a 20 20 57  *ppPrev, *p;.  W
298b0 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
298c0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
298d0 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  nfo;.  sqlite3 *
298e0 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  db = pWInfo->pPa
298f0 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49  rse->db;..  /* I
29900 66 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53  f pBuilder->pOrS
29910 65 74 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74  et is defined, t
29920 68 65 6e 20 6f 6e 6c 79 20 6b 65 65 70 20 74 72  hen only keep tr
29930 61 63 6b 20 6f 66 20 74 68 65 20 63 6f 73 74 73  ack of the costs
29940 0a 20 20 2a 2a 20 61 6e 64 20 70 72 65 72 65 71  .  ** and prereq
29950 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42  s..  */.  if( pB
29960 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 21 3d  uilder->pOrSet!=
29970 30 20 29 7b 0a 23 69 66 20 57 48 45 52 45 54 52  0 ){.#if WHERETR
29980 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
29990 75 31 36 20 6e 20 3d 20 70 42 75 69 6c 64 65 72  u16 n = pBuilder
299a0 2d 3e 70 4f 72 53 65 74 2d 3e 6e 3b 0a 20 20 20  ->pOrSet->n;.   
299b0 20 69 6e 74 20 78 20 3d 0a 23 65 6e 64 69 66 0a   int x =.#endif.
299c0 20 20 20 20 77 68 65 72 65 4f 72 49 6e 73 65 72      whereOrInser
299d0 74 28 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53  t(pBuilder->pOrS
299e0 65 74 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70  et, pTemplate->p
299f0 72 65 72 65 71 2c 20 70 54 65 6d 70 6c 61 74 65  rereq, pTemplate
29a00 2d 3e 72 52 75 6e 2c 0a 20 20 20 20 20 20 20 20  ->rRun,.        
29a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 65 6d              pTem
29a30 70 6c 61 74 65 2d 3e 6e 4f 75 74 29 3b 0a 23 69  plate->nOut);.#i
29a40 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
29a50 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20  BLED /* 0x8 */. 
29a60 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
29a70 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29  ereTrace & 0x8 )
29a80 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
29a90 65 62 75 67 50 72 69 6e 74 66 28 78 3f 22 20 20  ebugPrintf(x?"  
29aa0 20 6f 72 2d 25 64 3a 20 20 22 3a 22 20 20 20 6f   or-%d:  ":"   o
29ab0 72 2d 58 3a 20 20 22 2c 20 6e 29 3b 0a 20 20 20  r-X:  ", n);.   
29ac0 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e     whereLoopPrin
29ad0 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75  t(pTemplate, pBu
29ae0 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20  ilder->pWC);.   
29af0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65   }.#endif.    re
29b00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
29b10 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 66    }..  /* Look f
29b20 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57  or an existing W
29b30 68 65 72 65 4c 6f 6f 70 20 74 6f 20 72 65 70 6c  hereLoop to repl
29b40 61 63 65 20 77 69 74 68 20 70 54 65 6d 70 6c 61  ace with pTempla
29b50 74 65 0a 20 20 2a 2f 0a 20 20 77 68 65 72 65 4c  te.  */.  whereL
29b60 6f 6f 70 41 64 6a 75 73 74 43 6f 73 74 28 70 57  oopAdjustCost(pW
29b70 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 54  Info->pLoops, pT
29b80 65 6d 70 6c 61 74 65 29 3b 0a 20 20 70 70 50 72  emplate);.  ppPr
29b90 65 76 20 3d 20 77 68 65 72 65 4c 6f 6f 70 46 69  ev = whereLoopFi
29ba0 6e 64 4c 65 73 73 65 72 28 26 70 57 49 6e 66 6f  ndLesser(&pWInfo
29bb0 2d 3e 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70 6c  ->pLoops, pTempl
29bc0 61 74 65 29 3b 0a 0a 20 20 69 66 28 20 70 70 50  ate);..  if( ppP
29bd0 72 65 76 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  rev==0 ){.    /*
29be0 20 54 68 65 72 65 20 61 6c 72 65 61 64 79 20 65   There already e
29bf0 78 69 73 74 73 20 61 20 57 68 65 72 65 4c 6f 6f  xists a WhereLoo
29c00 70 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 74 68  p on the list th
29c10 61 74 20 69 73 20 62 65 74 74 65 72 0a 20 20 20  at is better.   
29c20 20 2a 2a 20 74 68 61 6e 20 70 54 65 6d 70 6c 61   ** than pTempla
29c30 74 65 2c 20 73 6f 20 6a 75 73 74 20 69 67 6e 6f  te, so just igno
29c40 72 65 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a  re pTemplate */.
29c50 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  #if WHERETRACE_E
29c60 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f  NABLED /* 0x8 */
29c70 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
29c80 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38  WhereTrace & 0x8
29c90 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
29ca0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
29cb0 20 73 6b 69 70 3a 20 22 29 3b 0a 20 20 20 20 20   skip: ");.     
29cc0 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
29cd0 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c  pTemplate, pBuil
29ce0 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20 7d  der->pWC);.    }
29cf0 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
29d00 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 0a  rn SQLITE_OK;  .
29d10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d    }else{.    p =
29d20 20 2a 70 70 50 72 65 76 3b 0a 20 20 7d 0a 0a 20   *ppPrev;.  }.. 
29d30 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
29d40 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 6d 65  this point it me
29d50 61 6e 73 20 74 68 61 74 20 65 69 74 68 65 72 20  ans that either 
29d60 70 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 6f 76  p[] should be ov
29d70 65 72 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 77  erwritten.  ** w
29d80 69 74 68 20 70 54 65 6d 70 6c 61 74 65 5b 5d 20  ith pTemplate[] 
29d90 69 66 20 70 5b 5d 20 65 78 69 73 74 73 2c 20 6f  if p[] exists, o
29da0 72 20 69 66 20 70 3d 3d 4e 55 4c 4c 20 74 68 65  r if p==NULL the
29db0 6e 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  n allocate a new
29dc0 0a 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20  .  ** WhereLoop 
29dd0 61 6e 64 20 69 6e 73 65 72 74 20 69 74 2e 0a 20  and insert it.. 
29de0 20 2a 2f 0a 23 69 66 20 57 48 45 52 45 54 52 41   */.#if WHERETRA
29df0 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78  CE_ENABLED /* 0x
29e00 38 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74  8 */.  if( sqlit
29e10 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
29e20 78 38 20 29 7b 0a 20 20 20 20 69 66 28 20 70 21  x8 ){.    if( p!
29e30 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
29e40 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
29e50 72 65 70 6c 61 63 65 3a 20 22 29 3b 0a 20 20 20  replace: ");.   
29e60 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e     whereLoopPrin
29e70 74 28 70 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  t(p, pBuilder->p
29e80 57 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  WC);.    }.    s
29e90 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
29ea0 66 28 22 20 20 20 20 61 64 64 3a 20 22 29 3b 0a  f("    add: ");.
29eb0 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69      whereLoopPri
29ec0 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42  nt(pTemplate, pB
29ed0 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20  uilder->pWC);.  
29ee0 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
29ef0 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c  ==0 ){.    /* Al
29f00 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 57 68 65  locate a new Whe
29f10 72 65 4c 6f 6f 70 20 74 6f 20 61 64 64 20 74 6f  reLoop to add to
29f20 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
29f30 6c 69 73 74 20 2a 2f 0a 20 20 20 20 2a 70 70 50  list */.    *ppP
29f40 72 65 76 20 3d 20 70 20 3d 20 73 71 6c 69 74 65  rev = p = sqlite
29f50 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
29f60 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f   sizeof(WhereLoo
29f70 70 29 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d  p));.    if( p==
29f80 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
29f90 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 77 68 65  E_NOMEM;.    whe
29fa0 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 20  reLoopInit(p);. 
29fb0 20 20 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 20     p->pNextLoop 
29fc0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
29fd0 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 62 65 20    /* We will be 
29fe0 6f 76 65 72 77 72 69 74 69 6e 67 20 57 68 65 72  overwriting Wher
29ff0 65 4c 6f 6f 70 20 70 5b 5d 2e 20 20 42 75 74 20  eLoop p[].  But 
2a000 62 65 66 6f 72 65 20 77 65 20 64 6f 2c 20 66 69  before we do, fi
2a010 72 73 74 0a 20 20 20 20 2a 2a 20 67 6f 20 74 68  rst.    ** go th
2a020 72 6f 75 67 68 20 74 68 65 20 72 65 73 74 20 6f  rough the rest o
2a030 66 20 74 68 65 20 6c 69 73 74 20 61 6e 64 20 64  f the list and d
2a040 65 6c 65 74 65 20 61 6e 79 20 6f 74 68 65 72 20  elete any other 
2a050 65 6e 74 72 69 65 73 20 62 65 73 69 64 65 73 0a  entries besides.
2a060 20 20 20 20 2a 2a 20 70 5b 5d 20 74 68 61 74 20      ** p[] that 
2a070 61 72 65 20 61 6c 73 6f 20 73 75 70 70 6c 61 74  are also supplat
2a080 65 64 20 62 79 20 70 54 65 6d 70 6c 61 74 65 20  ed by pTemplate 
2a090 2a 2f 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70  */.    WhereLoop
2a0a0 20 2a 2a 70 70 54 61 69 6c 20 3d 20 26 70 2d 3e   **ppTail = &p->
2a0b0 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 57  pNextLoop;.    W
2a0c0 68 65 72 65 4c 6f 6f 70 20 2a 70 54 6f 44 65 6c  hereLoop *pToDel
2a0d0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 70 70  ;.    while( *pp
2a0e0 54 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 70 70  Tail ){.      pp
2a0f0 54 61 69 6c 20 3d 20 77 68 65 72 65 4c 6f 6f 70  Tail = whereLoop
2a100 46 69 6e 64 4c 65 73 73 65 72 28 70 70 54 61 69  FindLesser(ppTai
2a110 6c 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20  l, pTemplate);. 
2a120 20 20 20 20 20 69 66 28 20 70 70 54 61 69 6c 3d       if( ppTail=
2a130 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
2a140 20 20 70 54 6f 44 65 6c 20 3d 20 2a 70 70 54 61    pToDel = *ppTa
2a150 69 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  il;.      if( pT
2a160 6f 44 65 6c 3d 3d 30 20 29 20 62 72 65 61 6b 3b  oDel==0 ) break;
2a170 0a 20 20 20 20 20 20 2a 70 70 54 61 69 6c 20 3d  .      *ppTail =
2a180 20 70 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 4c 6f   pToDel->pNextLo
2a190 6f 70 3b 0a 23 69 66 20 57 48 45 52 45 54 52 41  op;.#if WHERETRA
2a1a0 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78  CE_ENABLED /* 0x
2a1b0 38 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73  8 */.      if( s
2a1c0 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
2a1d0 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20 20 20   & 0x8 ){.      
2a1e0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
2a1f0 69 6e 74 66 28 22 20 64 65 6c 65 74 65 3a 20 22  intf(" delete: "
2a200 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  );.        where
2a210 4c 6f 6f 70 50 72 69 6e 74 28 70 54 6f 44 65 6c  LoopPrint(pToDel
2a220 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29  , pBuilder->pWC)
2a230 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
2a240 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  .      whereLoop
2a250 44 65 6c 65 74 65 28 64 62 2c 20 70 54 6f 44 65  Delete(db, pToDe
2a260 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  l);.    }.  }.  
2a270 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 64 62  whereLoopXfer(db
2a280 2c 20 70 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b  , p, pTemplate);
2a290 0a 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61  .  if( (p->wsFla
2a2a0 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
2a2b0 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20  ALTABLE)==0 ){. 
2a2c0 20 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78     Index *pIndex
2a2d0 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49   = p->u.btree.pI
2a2e0 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 49  ndex;.    if( pI
2a2f0 6e 64 65 78 20 26 26 20 70 49 6e 64 65 78 2d 3e  ndex && pIndex->
2a300 74 6e 75 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  tnum==0 ){.     
2a310 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
2a320 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ex = 0;.    }.  
2a330 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
2a340 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
2a350 64 6a 75 73 74 20 74 68 65 20 57 68 65 72 65 4c  djust the WhereL
2a360 6f 6f 70 2e 6e 4f 75 74 20 76 61 6c 75 65 20 64  oop.nOut value d
2a370 6f 77 6e 77 61 72 64 20 74 6f 20 61 63 63 6f 75  ownward to accou
2a380 6e 74 20 66 6f 72 20 74 65 72 6d 73 20 6f 66 20  nt for terms of 
2a390 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61  the.** WHERE cla
2a3a0 75 73 65 20 74 68 61 74 20 72 65 66 65 72 65 6e  use that referen
2a3b0 63 65 20 74 68 65 20 6c 6f 6f 70 20 62 75 74 20  ce the loop but 
2a3c0 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 75 73  which are not us
2a3d0 65 64 20 62 79 20 61 6e 0a 2a 2a 20 69 6e 64 65  ed by an.** inde
2a3e0 78 2e 0a 2a 0a 2a 2a 20 46 6f 72 20 65 76 65 72  x..*.** For ever
2a3f0 79 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  y WHERE clause t
2a400 65 72 6d 20 74 68 61 74 20 69 73 20 6e 6f 74 20  erm that is not 
2a410 75 73 65 64 20 62 79 20 74 68 65 20 69 6e 64 65  used by the inde
2a420 78 0a 2a 2a 20 61 6e 64 20 77 68 69 63 68 20 68  x.** and which h
2a430 61 73 20 61 20 74 72 75 74 68 20 70 72 6f 62 61  as a truth proba
2a440 62 69 6c 69 74 79 20 61 73 73 69 67 6e 65 64 20  bility assigned 
2a450 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 69  by one of the li
2a460 6b 65 6c 69 68 6f 6f 64 28 29 2c 0a 2a 2a 20 6c  kelihood(),.** l
2a470 69 6b 65 6c 79 28 29 2c 20 6f 72 20 75 6e 6c 69  ikely(), or unli
2a480 6b 65 6c 79 28 29 20 53 51 4c 20 66 75 6e 63 74  kely() SQL funct
2a490 69 6f 6e 73 2c 20 72 65 64 75 63 65 20 74 68 65  ions, reduce the
2a4a0 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65   estimated numbe
2a4b0 72 0a 2a 2a 20 6f 66 20 6f 75 74 70 75 74 20 72  r.** of output r
2a4c0 6f 77 73 20 62 79 20 74 68 65 20 70 72 6f 62 61  ows by the proba
2a4d0 62 69 6c 69 74 79 20 73 70 65 63 69 66 69 65 64  bility specified
2a4e0 2e 0a 2a 2a 0a 2a 2a 20 54 55 4e 49 4e 47 3a 20  ..**.** TUNING: 
2a4f0 20 46 6f 72 20 65 76 65 72 79 20 57 48 45 52 45   For every WHERE
2a500 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 68 61   clause term tha
2a510 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 62 79  t is not used by
2a520 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 61 6e   the index.** an
2a530 64 20 77 68 69 63 68 20 64 6f 65 73 20 6e 6f 74  d which does not
2a540 20 68 61 76 65 20 61 6e 20 61 73 73 69 67 6e 65   have an assigne
2a550 64 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c  d truth probabil
2a560 69 74 79 2c 20 68 65 75 72 69 73 74 69 63 73 0a  ity, heuristics.
2a570 2a 2a 20 64 65 73 63 72 69 62 65 64 20 62 65 6c  ** described bel
2a580 6f 77 20 61 72 65 20 75 73 65 64 20 74 6f 20 74  ow are used to t
2a590 72 79 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74  ry to estimate t
2a5a0 68 65 20 74 72 75 74 68 20 70 72 6f 62 61 62 69  he truth probabi
2a5b0 6c 69 74 79 2e 0a 2a 2a 20 54 4f 44 4f 20 2d 2d  lity..** TODO --
2a5c0 3e 20 50 65 72 68 61 70 73 20 74 68 69 73 20 69  > Perhaps this i
2a5d0 73 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74  s something that
2a5e0 20 63 6f 75 6c 64 20 62 65 20 69 6d 70 72 6f 76   could be improv
2a5f0 65 64 20 62 79 20 62 65 74 74 65 72 0a 2a 2a 20  ed by better.** 
2a600 74 61 62 6c 65 20 73 74 61 74 69 73 74 69 63 73  table statistics
2a610 2e 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69 73 74 69  ..**.** Heuristi
2a620 63 20 31 3a 20 20 45 73 74 69 6d 61 74 65 20 74  c 1:  Estimate t
2a630 68 65 20 74 72 75 74 68 20 70 72 6f 62 61 62 69  he truth probabi
2a640 6c 69 74 79 20 61 73 20 39 33 2e 37 35 25 2e 20  lity as 93.75%. 
2a650 20 54 68 65 20 39 33 2e 37 35 25 0a 2a 2a 20 76   The 93.75%.** v
2a660 61 6c 75 65 20 63 6f 72 72 65 73 70 6f 6e 64 73  alue corresponds
2a670 20 74 6f 20 2d 31 20 69 6e 20 4c 6f 67 45 73 74   to -1 in LogEst
2a680 20 6e 6f 74 61 74 69 6f 6e 2c 20 73 6f 20 74 68   notation, so th
2a690 69 73 20 6d 65 61 6e 73 20 64 65 63 72 65 6d 65  is means decreme
2a6a0 6e 74 0a 2a 2a 20 74 68 65 20 57 68 65 72 65 4c  nt.** the WhereL
2a6b0 6f 6f 70 2e 6e 4f 75 74 20 66 69 65 6c 64 20 66  oop.nOut field f
2a6c0 6f 72 20 65 76 65 72 79 20 73 75 63 68 20 57 48  or every such WH
2a6d0 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 2e  ERE clause term.
2a6e0 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69 73 74 69 63  .**.** Heuristic
2a6f0 20 32 3a 20 20 49 66 20 74 68 65 72 65 20 65 78   2:  If there ex
2a700 69 73 74 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ists one or more
2a710 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
2a720 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 66 6f  rms of the.** fo
2a730 72 6d 20 22 78 3d 3d 45 58 50 52 22 20 61 6e 64  rm "x==EXPR" and
2a740 20 45 58 50 52 20 69 73 20 6e 6f 74 20 61 20 63   EXPR is not a c
2a750 6f 6e 73 74 61 6e 74 20 30 20 6f 72 20 31 2c 20  onstant 0 or 1, 
2a760 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 74  then make sure t
2a770 68 65 0a 2a 2a 20 66 69 6e 61 6c 20 6f 75 74 70  he.** final outp
2a780 75 74 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20  ut row estimate 
2a790 69 73 20 6e 6f 20 67 72 65 61 74 65 72 20 74 68  is no greater th
2a7a0 61 6e 20 31 2f 34 20 6f 66 20 74 68 65 20 74 6f  an 1/4 of the to
2a7b0 74 61 6c 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  tal number.** of
2a7c0 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
2a7d0 6c 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  le.  In other wo
2a7e0 72 64 73 2c 20 61 73 73 75 6d 65 20 74 68 61 74  rds, assume that
2a7f0 20 78 3d 3d 45 58 50 52 20 77 69 6c 6c 20 66 69   x==EXPR will fi
2a800 6c 74 65 72 0a 2a 2a 20 6f 75 74 20 61 74 20 6c  lter.** out at l
2a810 65 61 73 74 20 33 20 6f 75 74 20 6f 66 20 34 20  east 3 out of 4 
2a820 72 6f 77 73 2e 20 20 49 66 20 45 58 50 52 20 69  rows.  If EXPR i
2a830 73 20 2d 31 20 6f 72 20 30 20 6f 72 20 31 2c 20  s -1 or 0 or 1, 
2a840 74 68 65 6e 20 6d 61 79 62 65 20 74 68 65 0a 2a  then maybe the.*
2a850 2a 20 22 78 22 20 63 6f 6c 75 6d 6e 20 69 73 20  * "x" column is 
2a860 62 6f 6f 6c 65 61 6e 20 6f 72 20 65 6c 73 65 20  boolean or else 
2a870 2d 31 20 6f 72 20 30 20 6f 72 20 31 20 69 73 20  -1 or 0 or 1 is 
2a880 61 20 63 6f 6d 6d 6f 6e 20 64 65 66 61 75 6c 74  a common default
2a890 20 76 61 6c 75 65 0a 2a 2a 20 6f 6e 20 74 68 65   value.** on the
2a8a0 20 22 78 22 20 63 6f 6c 75 6d 6e 20 61 6e 64 20   "x" column and 
2a8b0 73 6f 20 69 6e 20 74 68 61 74 20 63 61 73 65 20  so in that case 
2a8c0 6f 6e 6c 79 20 63 61 70 20 74 68 65 20 6f 75 74  only cap the out
2a8d0 70 75 74 20 72 6f 77 20 65 73 74 69 6d 61 74 65  put row estimate
2a8e0 0a 2a 2a 20 61 74 20 31 2f 32 20 69 6e 73 74 65  .** at 1/2 inste
2a8f0 61 64 20 6f 66 20 31 2f 34 2e 0a 2a 2f 0a 73 74  ad of 1/4..*/.st
2a900 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c  atic void whereL
2a910 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28  oopOutputAdjust(
2a920 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
2a930 70 57 43 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  pWC,      /* The
2a940 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
2a950 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
2a960 6f 6f 70 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  oop,      /* The
2a970 20 6c 6f 6f 70 20 74 6f 20 61 64 6a 75 73 74 20   loop to adjust 
2a980 64 6f 77 6e 77 61 72 64 20 2a 2f 0a 20 20 4c 6f  downward */.  Lo
2a990 67 45 73 74 20 6e 52 6f 77 20 20 20 20 20 20 20  gEst nRow       
2a9a0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2a9b0 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 65 6e  f rows in the en
2a9c0 74 69 72 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b  tire table */.){
2a9d0 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
2a9e0 65 72 6d 2c 20 2a 70 58 3b 0a 20 20 42 69 74 6d  erm, *pX;.  Bitm
2a9f0 61 73 6b 20 6e 6f 74 41 6c 6c 6f 77 65 64 20 3d  ask notAllowed =
2aa00 20 7e 28 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71   ~(pLoop->prereq
2aa10 7c 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66  |pLoop->maskSelf
2aa20 29 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b  );.  int i, j, k
2aa30 3b 0a 20 20 4c 6f 67 45 73 74 20 69 52 65 64 75  ;.  LogEst iRedu
2aa40 63 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20 70 4c  ce = 0;    /* pL
2aa50 6f 6f 70 2d 3e 6e 4f 75 74 20 73 68 6f 75 6c 64  oop->nOut should
2aa60 20 6e 6f 74 20 65 78 63 65 65 64 20 6e 52 6f 77   not exceed nRow
2aa70 2d 69 52 65 64 75 63 65 20 2a 2f 0a 0a 20 20 61  -iReduce */..  a
2aa80 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77  ssert( (pLoop->w
2aa90 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41  sFlags & WHERE_A
2aaa0 55 54 4f 5f 49 4e 44 45 58 29 3d 3d 30 20 29 3b  UTO_INDEX)==0 );
2aab0 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54  .  for(i=pWC->nT
2aac0 65 72 6d 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e  erm, pTerm=pWC->
2aad0 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 54 65  a; i>0; i--, pTe
2aae0 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28  rm++){.    if( (
2aaf0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
2ab00 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 21 3d   TERM_VIRTUAL)!=
2ab10 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  0 ) break;.    i
2ab20 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
2ab30 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61  qAll & pLoop->ma
2ab40 73 6b 53 65 6c 66 29 3d 3d 30 20 29 20 63 6f 6e  skSelf)==0 ) con
2ab50 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28  tinue;.    if( (
2ab60 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
2ab70 20 26 20 6e 6f 74 41 6c 6c 6f 77 65 64 29 21 3d   & notAllowed)!=
2ab80 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
2ab90 20 20 66 6f 72 28 6a 3d 70 4c 6f 6f 70 2d 3e 6e    for(j=pLoop->n
2aba0 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20 6a  LTerm-1; j>=0; j
2abb0 2d 2d 29 7b 0a 20 20 20 20 20 20 70 58 20 3d 20  --){.      pX = 
2abc0 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  pLoop->aLTerm[j]
2abd0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d  ;.      if( pX==
2abe0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
2abf0 20 20 20 20 69 66 28 20 70 58 3d 3d 70 54 65 72      if( pX==pTer
2ac00 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  m ) break;.     
2ac10 20 69 66 28 20 70 58 2d 3e 69 50 61 72 65 6e 74   if( pX->iParent
2ac20 3e 3d 30 20 26 26 20 28 26 70 57 43 2d 3e 61 5b  >=0 && (&pWC->a[
2ac30 70 58 2d 3e 69 50 61 72 65 6e 74 5d 29 3d 3d 70  pX->iParent])==p
2ac40 54 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20  Term ) break;.  
2ac50 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 30 20    }.    if( j<0 
2ac60 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  ){.      if( pTe
2ac70 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30  rm->truthProb<=0
2ac80 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
2ac90 66 20 61 20 74 72 75 74 68 20 70 72 6f 62 61 62  f a truth probab
2aca0 69 6c 69 74 79 20 69 73 20 73 70 65 63 69 66 69  ility is specifi
2acb0 65 64 20 75 73 69 6e 67 20 74 68 65 20 6c 69 6b  ed using the lik
2acc0 65 6c 69 68 6f 6f 64 28 29 20 68 69 6e 74 73 2c  elihood() hints,
2acd0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
2ace0 20 75 73 65 20 74 68 65 20 70 72 6f 62 61 62 69   use the probabi
2acf0 6c 69 74 79 20 70 72 6f 76 69 64 65 64 20 62 79  lity provided by
2ad00 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e   the application
2ad10 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4c 6f  . */.        pLo
2ad20 6f 70 2d 3e 6e 4f 75 74 20 2b 3d 20 70 54 65 72  op->nOut += pTer
2ad30 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20 20  m->truthProb;.  
2ad40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2ad50 20 20 20 2f 2a 20 49 6e 20 74 68 65 20 61 62 73     /* In the abs
2ad60 65 6e 63 65 20 6f 66 20 65 78 70 6c 69 63 69 74  ence of explicit
2ad70 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69   truth probabili
2ad80 74 69 65 73 2c 20 75 73 65 20 68 65 75 72 69 73  ties, use heuris
2ad90 74 69 63 73 20 74 6f 0a 20 20 20 20 20 20 20 20  tics to.        
2ada0 2a 2a 20 67 75 65 73 73 20 61 20 72 65 61 73 6f  ** guess a reaso
2adb0 6e 61 62 6c 65 20 74 72 75 74 68 20 70 72 6f 62  nable truth prob
2adc0 61 62 69 6c 69 74 79 2e 20 2a 2f 0a 20 20 20 20  ability. */.    
2add0 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 2d      pLoop->nOut-
2ade0 2d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  -;.        if( p
2adf0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26  Term->eOperator&
2ae00 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 29 7b  (WO_EQ|WO_IS) ){
2ae10 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
2ae20 2a 70 52 69 67 68 74 20 3d 20 70 54 65 72 6d 2d  *pRight = pTerm-
2ae30 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  >pExpr->pRight;.
2ae40 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2ae50 73 65 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  se( pTerm->pExpr
2ae60 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20  ->op==TK_IS );. 
2ae70 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
2ae80 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
2ae90 72 28 70 52 69 67 68 74 2c 20 26 6b 29 20 26 26  r(pRight, &k) &&
2aea0 20 6b 3e 3d 28 2d 31 29 20 26 26 20 6b 3c 3d 31   k>=(-1) && k<=1
2aeb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2aec0 6b 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20  k = 10;.        
2aed0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2aee0 20 20 20 20 20 6b 20 3d 20 32 30 3b 0a 20 20 20       k = 20;.   
2aef0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2af00 20 20 20 69 66 28 20 69 52 65 64 75 63 65 3c 6b     if( iReduce<k
2af10 20 29 20 69 52 65 64 75 63 65 20 3d 20 6b 3b 0a   ) iReduce = k;.
2af20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2af30 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
2af40 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3e 20  ( pLoop->nOut > 
2af50 6e 52 6f 77 2d 69 52 65 64 75 63 65 20 29 20 20  nRow-iReduce )  
2af60 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 6e 52  pLoop->nOut = nR
2af70 6f 77 20 2d 20 69 52 65 64 75 63 65 3b 0a 7d 0a  ow - iReduce;.}.
2af80 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68  ./*.** Adjust th
2af90 65 20 63 6f 73 74 20 43 20 62 79 20 74 68 65 20  e cost C by the 
2afa0 63 6f 73 74 4d 75 6c 74 20 66 61 63 74 65 72 20  costMult facter 
2afb0 54 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 6f 63  T.  This only oc
2afc0 63 75 72 73 20 69 66 0a 2a 2a 20 63 6f 6d 70 69  curs if.** compi
2afd0 6c 65 64 20 77 69 74 68 20 2d 44 53 51 4c 49 54  led with -DSQLIT
2afe0 45 5f 45 4e 41 42 4c 45 5f 43 4f 53 54 4d 55 4c  E_ENABLE_COSTMUL
2aff0 54 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  T.*/.#ifdef SQLI
2b000 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 53 54 4d 55  TE_ENABLE_COSTMU
2b010 4c 54 0a 23 20 64 65 66 69 6e 65 20 41 70 70 6c  LT.# define Appl
2b020 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28  yCostMultiplier(
2b030 43 2c 54 29 20 20 43 20 2b 3d 20 54 0a 23 65 6c  C,T)  C += T.#el
2b040 73 65 0a 23 20 64 65 66 69 6e 65 20 41 70 70 6c  se.# define Appl
2b050 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28  yCostMultiplier(
2b060 43 2c 54 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  C,T).#endif../*.
2b070 2a 2a 20 57 65 20 68 61 76 65 20 73 6f 20 66 61  ** We have so fa
2b080 72 20 6d 61 74 63 68 65 64 20 70 42 75 69 6c 64  r matched pBuild
2b090 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65  er->pNew->u.btre
2b0a0 65 2e 6e 45 71 20 74 65 72 6d 73 20 6f 66 20 74  e.nEq terms of t
2b0b0 68 65 20 0a 2a 2a 20 69 6e 64 65 78 20 70 49 6e  he .** index pIn
2b0c0 64 65 78 2e 20 54 72 79 20 74 6f 20 6d 61 74 63  dex. Try to matc
2b0d0 68 20 6f 6e 65 20 6d 6f 72 65 2e 0a 2a 2a 0a 2a  h one more..**.*
2b0e0 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * When this func
2b0f0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
2b100 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
2b110 6e 4f 75 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  nOut contains th
2b120 65 20 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  e .** number of 
2b130 72 6f 77 73 20 65 78 70 65 63 74 65 64 20 74 6f  rows expected to
2b140 20 62 65 20 76 69 73 69 74 65 64 20 62 79 20 66   be visited by f
2b150 69 6c 74 65 72 69 6e 67 20 75 73 69 6e 67 20 74  iltering using t
2b160 68 65 20 6e 45 71 20 0a 2a 2a 20 74 65 72 6d 73  he nEq .** terms
2b170 20 6f 6e 6c 79 2e 20 49 66 20 69 74 20 69 73 20   only. If it is 
2b180 6d 6f 64 69 66 69 65 64 2c 20 74 68 69 73 20 76  modified, this v
2b190 61 6c 75 65 20 69 73 20 72 65 73 74 6f 72 65 64  alue is restored
2b1a0 20 62 65 66 6f 72 65 20 74 68 69 73 20 0a 2a 2a   before this .**
2b1b0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
2b1c0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 72 6f  s..**.** If pPro
2b1d0 62 65 2d 3e 74 6e 75 6d 3d 3d 30 2c 20 74 68 61  be->tnum==0, tha
2b1e0 74 20 6d 65 61 6e 73 20 70 49 6e 64 65 78 20 69  t means pIndex i
2b1f0 73 20 61 20 66 61 6b 65 20 69 6e 64 65 78 20 75  s a fake index u
2b200 73 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 49  sed for the.** I
2b210 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
2b220 45 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  EY..*/.static in
2b230 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  t whereLoopAddBt
2b240 72 65 65 49 6e 64 65 78 28 0a 20 20 57 68 65 72  reeIndex(.  Wher
2b250 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
2b260 75 69 6c 64 65 72 2c 20 20 20 20 20 2f 2a 20 54  uilder,     /* T
2b270 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 66 61 63  he WhereLoop fac
2b280 74 6f 72 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  tory */.  struct
2b290 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
2b2a0 53 72 63 2c 20 20 20 20 20 20 2f 2a 20 46 52 4f  Src,      /* FRO
2b2b0 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65  M clause term be
2b2c0 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a  ing analyzed */.
2b2d0 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 2c    Index *pProbe,
2b2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b2f0 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6f 6e    /* An index on
2b300 20 70 53 72 63 20 2a 2f 0a 20 20 4c 6f 67 45 73   pSrc */.  LogEs
2b310 74 20 6e 49 6e 4d 75 6c 20 20 20 20 20 20 20 20  t nInMul        
2b320 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f             /* lo
2b330 67 28 4e 75 6d 62 65 72 20 6f 66 20 69 74 65 72  g(Number of iter
2b340 61 74 69 6f 6e 73 20 64 75 65 20 74 6f 20 49 4e  ations due to IN
2b350 29 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49  ) */.){.  WhereI
2b360 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42  nfo *pWInfo = pB
2b370 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 20  uilder->pWInfo; 
2b380 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73   /* WHERE analys
2b390 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50  e context */.  P
2b3a0 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
2b3b0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20  WInfo->pParse;  
2b3c0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
2b3d0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71   context */.  sq
2b3e0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
2b3f0 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a  se->db;       /*
2b400 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
2b410 74 69 6f 6e 20 6d 61 6c 6c 6f 63 20 63 6f 6e 74  tion malloc cont
2b420 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  ext */.  WhereLo
2b430 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  op *pNew;       
2b440 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
2b450 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 75  late WhereLoop u
2b460 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
2b470 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  n */.  WhereTerm
2b480 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
2b490 20 20 20 20 20 20 20 2f 2a 20 41 20 57 68 65 72         /* A Wher
2b4a0 65 54 65 72 6d 20 75 6e 64 65 72 20 63 6f 6e 73  eTerm under cons
2b4b0 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  ideration */.  i
2b4c0 6e 74 20 6f 70 4d 61 73 6b 3b 20 20 20 20 20 20  nt opMask;      
2b4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b4e0 2a 20 56 61 6c 69 64 20 6f 70 65 72 61 74 6f 72  * Valid operator
2b4f0 73 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74  s for constraint
2b500 73 20 2a 2f 0a 20 20 57 68 65 72 65 53 63 61 6e  s */.  WhereScan
2b510 20 73 63 61 6e 3b 20 20 20 20 20 20 20 20 20 20   scan;          
2b520 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
2b530 6f 72 20 66 6f 72 20 57 48 45 52 45 20 74 65 72  or for WHERE ter
2b540 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ms */.  Bitmask 
2b550 73 61 76 65 64 5f 70 72 65 72 65 71 3b 20 20 20  saved_prereq;   
2b560 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
2b570 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
2b580 77 2d 3e 70 72 65 72 65 71 20 2a 2f 0a 20 20 75  w->prereq */.  u
2b590 31 36 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b  16 saved_nLTerm;
2b5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b5b0 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
2b5c0 20 6f 66 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d   of pNew->nLTerm
2b5d0 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f   */.  u16 saved_
2b5e0 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  nEq;            
2b5f0 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61        /* Origina
2b600 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d  l value of pNew-
2b610 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 2a 2f 0a  >u.btree.nEq */.
2b620 20 20 75 31 36 20 73 61 76 65 64 5f 6e 53 6b 69    u16 saved_nSki
2b630 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
2b640 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
2b650 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 53 6b  lue of pNew->nSk
2b660 69 70 20 2a 2f 0a 20 20 75 33 32 20 73 61 76 65  ip */.  u32 save
2b670 64 5f 77 73 46 6c 61 67 73 3b 20 20 20 20 20 20  d_wsFlags;      
2b680 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
2b690 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
2b6a0 77 2d 3e 77 73 46 6c 61 67 73 20 2a 2f 0a 20 20  w->wsFlags */.  
2b6b0 4c 6f 67 45 73 74 20 73 61 76 65 64 5f 6e 4f 75  LogEst saved_nOu
2b6c0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
2b6d0 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75  /* Original valu
2b6e0 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  e of pNew->nOut 
2b6f0 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20  */.  int iCol;  
2b700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b710 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
2b720 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74   the column in t
2b730 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  he table */.  in
2b740 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2b750 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2b760 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
2b770 20 20 4c 6f 67 45 73 74 20 72 53 69 7a 65 3b 20    LogEst rSize; 
2b780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b790 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
2b7a0 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
2b7b0 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f   */.  LogEst rLo
2b7c0 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  gSize;          
2b7d0 20 20 20 20 20 20 2f 2a 20 4c 6f 67 61 72 69 74        /* Logarit
2b7e0 68 6d 20 6f 66 20 74 61 62 6c 65 20 73 69 7a 65  hm of table size
2b7f0 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
2b800 2a 70 54 6f 70 20 3d 20 30 2c 20 2a 70 42 74 6d  *pTop = 0, *pBtm
2b810 20 3d 20 30 3b 20 2f 2a 20 54 6f 70 20 61 6e 64   = 0; /* Top and
2b820 20 62 6f 74 74 6f 6d 20 72 61 6e 67 65 20 63 6f   bottom range co
2b830 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 0a 20 20  nstraints */..  
2b840 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d  pNew = pBuilder-
2b850 3e 70 4e 65 77 3b 0a 20 20 69 66 28 20 64 62 2d  >pNew;.  if( db-
2b860 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
2b870 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2b880 4d 45 4d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  MEM;..  assert( 
2b890 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
2b8a0 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
2b8b0 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  BLE)==0 );.  ass
2b8c0 65 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c  ert( (pNew->wsFl
2b8d0 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f  ags & WHERE_TOP_
2b8e0 4c 49 4d 49 54 29 3d 3d 30 20 29 3b 0a 20 20 69  LIMIT)==0 );.  i
2b8f0 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  f( pNew->wsFlags
2b900 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d   & WHERE_BTM_LIM
2b910 49 54 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b  IT ){.    opMask
2b920 20 3d 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a   = WO_LT|WO_LE;.
2b930 20 20 7d 65 6c 73 65 20 69 66 28 20 2f 2a 70 50    }else if( /*pP
2b940 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20 7c 7c  robe->tnum<=0 ||
2b950 2a 2f 20 28 70 53 72 63 2d 3e 6a 6f 69 6e 74 79  */ (pSrc->jointy
2b960 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30  pe & JT_LEFT)!=0
2b970 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d   ){.    opMask =
2b980 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f   WO_EQ|WO_IN|WO_
2b990 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57  GT|WO_GE|WO_LT|W
2b9a0 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  O_LE;.  }else{. 
2b9b0 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45     opMask = WO_E
2b9c0 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 47 54 7c 57 4f  Q|WO_IN|WO_GT|WO
2b9d0 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c  _GE|WO_LT|WO_LE|
2b9e0 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53 3b  WO_ISNULL|WO_IS;
2b9f0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72 6f 62  .  }.  if( pProb
2ba00 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 20  e->bUnordered ) 
2ba10 6f 70 4d 61 73 6b 20 26 3d 20 7e 28 57 4f 5f 47  opMask &= ~(WO_G
2ba20 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f  T|WO_GE|WO_LT|WO
2ba30 5f 4c 45 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  _LE);..  assert(
2ba40 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
2ba50 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75  Eq<pProbe->nColu
2ba60 6d 6e 20 29 3b 0a 20 20 69 43 6f 6c 20 3d 20 70  mn );.  iCol = p
2ba70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Probe->aiColumn[
2ba80 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
2ba90 71 5d 3b 0a 0a 20 20 70 54 65 72 6d 20 3d 20 77  q];..  pTerm = w
2baa0 68 65 72 65 53 63 61 6e 49 6e 69 74 28 26 73 63  hereScanInit(&sc
2bab0 61 6e 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  an, pBuilder->pW
2bac0 43 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  C, pSrc->iCursor
2bad0 2c 20 69 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20  , iCol,.        
2bae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2baf0 6f 70 4d 61 73 6b 2c 20 70 50 72 6f 62 65 29 3b  opMask, pProbe);
2bb00 0a 20 20 73 61 76 65 64 5f 6e 45 71 20 3d 20 70  .  saved_nEq = p
2bb10 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
2bb20 3b 0a 20 20 73 61 76 65 64 5f 6e 53 6b 69 70 20  ;.  saved_nSkip 
2bb30 3d 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 3b 0a 20  = pNew->nSkip;. 
2bb40 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 20 3d 20   saved_nLTerm = 
2bb50 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3b 0a 20 20  pNew->nLTerm;.  
2bb60 73 61 76 65 64 5f 77 73 46 6c 61 67 73 20 3d 20  saved_wsFlags = 
2bb70 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 3b 0a 20  pNew->wsFlags;. 
2bb80 20 73 61 76 65 64 5f 70 72 65 72 65 71 20 3d 20   saved_prereq = 
2bb90 70 4e 65 77 2d 3e 70 72 65 72 65 71 3b 0a 20 20  pNew->prereq;.  
2bba0 73 61 76 65 64 5f 6e 4f 75 74 20 3d 20 70 4e 65  saved_nOut = pNe
2bbb0 77 2d 3e 6e 4f 75 74 3b 0a 20 20 70 4e 65 77 2d  w->nOut;.  pNew-
2bbc0 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 72  >rSetup = 0;.  r
2bbd0 53 69 7a 65 20 3d 20 70 50 72 6f 62 65 2d 3e 61  Size = pProbe->a
2bbe0 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20  iRowLogEst[0];. 
2bbf0 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c   rLogSize = estL
2bc00 6f 67 28 72 53 69 7a 65 29 3b 0a 20 20 66 6f 72  og(rSize);.  for
2bc10 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  (; rc==SQLITE_OK
2bc20 20 26 26 20 70 54 65 72 6d 21 3d 30 3b 20 70 54   && pTerm!=0; pT
2bc30 65 72 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 4e  erm = whereScanN
2bc40 65 78 74 28 26 73 63 61 6e 29 29 7b 0a 20 20 20  ext(&scan)){.   
2bc50 20 75 31 36 20 65 4f 70 20 3d 20 70 54 65 72 6d   u16 eOp = pTerm
2bc60 2d 3e 65 4f 70 65 72 61 74 6f 72 3b 20 20 20 2f  ->eOperator;   /
2bc70 2a 20 53 68 6f 72 74 68 61 6e 64 20 66 6f 72 20  * Shorthand for 
2bc80 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
2bc90 20 2a 2f 0a 20 20 20 20 4c 6f 67 45 73 74 20 72   */.    LogEst r
2bca0 43 6f 73 74 49 64 78 3b 0a 20 20 20 20 4c 6f 67  CostIdx;.    Log
2bcb0 45 73 74 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74  Est nOutUnadjust
2bcc0 65 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 4f  ed;        /* nO
2bcd0 75 74 20 62 65 66 6f 72 65 20 49 4e 28 29 20 61  ut before IN() a
2bce0 6e 64 20 57 48 45 52 45 20 61 64 6a 75 73 74 6d  nd WHERE adjustm
2bcf0 65 6e 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ents */.    int 
2bd00 6e 49 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  nIn = 0;.#ifdef 
2bd10 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
2bd20 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20  AT3_OR_STAT4.   
2bd30 20 69 6e 74 20 6e 52 65 63 56 61 6c 69 64 20 3d   int nRecValid =
2bd40 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56   pBuilder->nRecV
2bd50 61 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20  alid;.#endif.   
2bd60 20 69 66 28 20 28 65 4f 70 3d 3d 57 4f 5f 49 53   if( (eOp==WO_IS
2bd70 4e 55 4c 4c 20 7c 7c 20 28 70 54 65 72 6d 2d 3e  NULL || (pTerm->
2bd80 77 74 46 6c 61 67 73 26 54 45 52 4d 5f 56 4e 55  wtFlags&TERM_VNU
2bd90 4c 4c 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20  LL)!=0).     && 
2bda0 28 69 43 6f 6c 3c 30 20 7c 7c 20 70 53 72 63 2d  (iCol<0 || pSrc-
2bdb0 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  >pTab->aCol[iCol
2bdc0 5d 2e 6e 6f 74 4e 75 6c 6c 29 0a 20 20 20 20 29  ].notNull).    )
2bdd0 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  {.      continue
2bde0 3b 20 2f 2a 20 69 67 6e 6f 72 65 20 49 53 20 5b  ; /* ignore IS [
2bdf0 4e 4f 54 5d 20 4e 55 4c 4c 20 63 6f 6e 73 74 72  NOT] NULL constr
2be00 61 69 6e 74 73 20 6f 6e 20 4e 4f 54 20 4e 55 4c  aints on NOT NUL
2be10 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20  L columns */.   
2be20 20 7d 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d   }.    if( pTerm
2be30 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
2be40 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29  pNew->maskSelf )
2be50 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20   continue;..    
2be60 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20  /* Do not allow 
2be70 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64 20  the upper bound 
2be80 6f 66 20 61 20 4c 49 4b 45 20 6f 70 74 69 6d 69  of a LIKE optimi
2be90 7a 61 74 69 6f 6e 20 72 61 6e 67 65 20 63 6f 6e  zation range con
2bea0 73 74 72 61 69 6e 74 0a 20 20 20 20 2a 2a 20 74  straint.    ** t
2beb0 6f 20 6d 69 78 20 77 69 74 68 20 61 20 6c 6f 77  o mix with a low
2bec0 65 72 20 72 61 6e 67 65 20 62 6f 75 6e 64 20 66  er range bound f
2bed0 72 6f 6d 20 73 6f 6d 65 20 6f 74 68 65 72 20 73  rom some other s
2bee0 6f 75 72 63 65 20 2a 2f 0a 20 20 20 20 69 66 28  ource */.    if(
2bef0 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
2bf00 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 26  & TERM_LIKEOPT &
2bf10 26 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  & pTerm->eOperat
2bf20 6f 72 3d 3d 57 4f 5f 4c 54 20 29 20 63 6f 6e 74  or==WO_LT ) cont
2bf30 69 6e 75 65 3b 0a 0a 20 20 20 20 70 4e 65 77 2d  inue;..    pNew-
2bf40 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64  >wsFlags = saved
2bf50 5f 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 70 4e  _wsFlags;.    pN
2bf60 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  ew->u.btree.nEq 
2bf70 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 20  = saved_nEq;.   
2bf80 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20   pNew->nLTerm = 
2bf90 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20  saved_nLTerm;.  
2bfa0 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52    if( whereLoopR
2bfb0 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20  esize(db, pNew, 
2bfc0 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20  pNew->nLTerm+1) 
2bfd0 29 20 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20  ) break; /* OOM 
2bfe0 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54  */.    pNew->aLT
2bff0 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  erm[pNew->nLTerm
2c000 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  ++] = pTerm;.   
2c010 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20   pNew->prereq = 
2c020 28 73 61 76 65 64 5f 70 72 65 72 65 71 20 7c 20  (saved_prereq | 
2c030 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
2c040 68 74 29 20 26 20 7e 70 4e 65 77 2d 3e 6d 61 73  ht) & ~pNew->mas
2c050 6b 53 65 6c 66 3b 0a 0a 20 20 20 20 61 73 73 65  kSelf;..    asse
2c060 72 74 28 20 6e 49 6e 4d 75 6c 3d 3d 30 0a 20 20  rt( nInMul==0.  
2c070 20 20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e        || (pNew->
2c080 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2c090 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 29 21 3d 30 20  COLUMN_NULL)!=0 
2c0a0 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4e 65  .        || (pNe
2c0b0 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
2c0c0 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 21 3d 30  RE_COLUMN_IN)!=0
2c0d0 20 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4e   .        || (pN
2c0e0 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
2c0f0 45 52 45 5f 53 4b 49 50 53 43 41 4e 29 21 3d 30  ERE_SKIPSCAN)!=0
2c100 20 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 69 66   .    );..    if
2c110 28 20 65 4f 70 20 26 20 57 4f 5f 49 4e 20 29 7b  ( eOp & WO_IN ){
2c120 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78  .      Expr *pEx
2c130 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pr = pTerm->pExp
2c140 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  r;.      pNew->w
2c150 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
2c160 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20  COLUMN_IN;.     
2c170 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
2c180 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
2c190 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
2c1a0 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 53       /* "x IN (S
2c1b0 45 4c 45 43 54 20 2e 2e 2e 29 22 3a 20 20 54 55  ELECT ...)":  TU
2c1c0 4e 49 4e 47 3a 20 74 68 65 20 53 45 4c 45 43 54  NING: the SELECT
2c1d0 20 72 65 74 75 72 6e 73 20 32 35 20 72 6f 77 73   returns 25 rows
2c1e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e 20   */.        nIn 
2c1f0 3d 20 34 36 3b 20 20 61 73 73 65 72 74 28 20 34  = 46;  assert( 4
2c200 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  6==sqlite3LogEst
2c210 28 32 35 29 20 29 3b 0a 20 20 20 20 20 20 7d 65  (25) );.      }e
2c220 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28 70  lse if( ALWAYS(p
2c230 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 26 26  Expr->x.pList &&
2c240 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
2c250 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  >nExpr) ){.     
2c260 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 76 61 6c     /* "x IN (val
2c270 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 22  ue, value, ...)"
2c280 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e 20   */.        nIn 
2c290 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
2c2a0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
2c2b0 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  nExpr);.      }.
2c2c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 49        assert( nI
2c2d0 6e 3e 30 20 29 3b 20 20 2f 2a 20 52 48 53 20 61  n>0 );  /* RHS a
2c2e0 6c 77 61 79 73 20 68 61 73 20 32 20 6f 72 20 6d  lways has 2 or m
2c2f0 6f 72 65 20 74 65 72 6d 73 2e 2e 2e 20 20 54 68  ore terms...  Th
2c300 65 20 70 61 72 73 65 72 0a 20 20 20 20 20 20 20  e parser.       
2c310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c320 20 2a 2a 20 63 68 61 6e 67 65 73 20 22 78 20 49   ** changes "x I
2c330 4e 20 28 3f 29 22 20 69 6e 74 6f 20 22 78 3d 3f  N (?)" into "x=?
2c340 22 2e 20 2a 2f 0a 0a 20 20 20 20 7d 65 6c 73 65  ". */..    }else
2c350 20 69 66 28 20 65 4f 70 20 26 20 28 57 4f 5f 45   if( eOp & (WO_E
2c360 51 7c 57 4f 5f 49 53 29 20 29 7b 0a 20 20 20 20  Q|WO_IS) ){.    
2c370 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
2c380 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
2c390 45 51 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43  EQ;.      if( iC
2c3a0 6f 6c 3c 30 20 7c 7c 20 28 6e 49 6e 4d 75 6c 3d  ol<0 || (nInMul=
2c3b0 3d 30 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74  =0 && pNew->u.bt
2c3c0 72 65 65 2e 6e 45 71 3d 3d 70 50 72 6f 62 65 2d  ree.nEq==pProbe-
2c3d0 3e 6e 4b 65 79 43 6f 6c 2d 31 29 20 29 7b 0a 20  >nKeyCol-1) ){. 
2c3e0 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e         if( iCol>
2c3f0 3d 30 20 26 26 20 70 50 72 6f 62 65 2d 3e 75 6e  =0 && pProbe->un
2c400 69 71 4e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a  iqNotNull==0 ){.
2c410 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
2c420 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
2c430 5f 55 4e 51 5f 57 41 4e 54 45 44 3b 0a 20 20 20  _UNQ_WANTED;.   
2c440 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2c450 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
2c460 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 4e 45  ags |= WHERE_ONE
2c470 52 4f 57 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ROW;.        }. 
2c480 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
2c490 20 69 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 53   if( eOp & WO_IS
2c4a0 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 4e  NULL ){.      pN
2c4b0 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
2c4c0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c  HERE_COLUMN_NULL
2c4d0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2c4e0 65 4f 70 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f  eOp & (WO_GT|WO_
2c4f0 47 45 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73  GE) ){.      tes
2c500 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f  tcase( eOp & WO_
2c510 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  GT );.      test
2c520 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 47  case( eOp & WO_G
2c530 45 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  E );.      pNew-
2c540 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
2c550 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57  E_COLUMN_RANGE|W
2c560 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a  HERE_BTM_LIMIT;.
2c570 20 20 20 20 20 20 70 42 74 6d 20 3d 20 70 54 65        pBtm = pTe
2c580 72 6d 3b 0a 20 20 20 20 20 20 70 54 6f 70 20 3d  rm;.      pTop =
2c590 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54   0;.      if( pT
2c5a0 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
2c5b0 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 29 7b 0a 20  ERM_LIKEOPT ){. 
2c5c0 20 20 20 20 20 20 20 2f 2a 20 52 61 6e 67 65 20         /* Range 
2c5d0 63 6f 6e 74 72 61 69 6e 74 73 20 74 68 61 74 20  contraints that 
2c5e0 63 6f 6d 65 20 66 72 6f 6d 20 74 68 65 20 4c 49  come from the LI
2c5f0 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  KE optimization 
2c600 61 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  are.        ** a
2c610 6c 77 61 79 73 20 75 73 65 64 20 69 6e 20 70 61  lways used in pa
2c620 69 72 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  irs. */.        
2c630 70 54 6f 70 20 3d 20 26 70 54 65 72 6d 5b 31 5d  pTop = &pTerm[1]
2c640 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2c650 28 20 28 70 54 6f 70 2d 28 70 54 65 72 6d 2d 3e  ( (pTop-(pTerm->
2c660 70 57 43 2d 3e 61 29 29 3c 70 54 65 72 6d 2d 3e  pWC->a))<pTerm->
2c670 70 57 43 2d 3e 6e 54 65 72 6d 20 29 3b 0a 20 20  pWC->nTerm );.  
2c680 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
2c690 6f 70 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  op->wtFlags & TE
2c6a0 52 4d 5f 4c 49 4b 45 4f 50 54 20 29 3b 0a 20 20  RM_LIKEOPT );.  
2c6b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
2c6c0 6f 70 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  op->eOperator==W
2c6d0 4f 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 20 20  O_LT );.        
2c6e0 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73  if( whereLoopRes
2c6f0 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e  ize(db, pNew, pN
2c700 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20 29 20  ew->nLTerm+1) ) 
2c710 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f  break; /* OOM */
2c720 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61  .        pNew->a
2c730 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65  LTerm[pNew->nLTe
2c740 72 6d 2b 2b 5d 20 3d 20 70 54 6f 70 3b 0a 20 20  rm++] = pTop;.  
2c750 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
2c760 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 54 4f 50  ags |= WHERE_TOP
2c770 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 7d 0a  _LIMIT;.      }.
2c780 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2c790 20 61 73 73 65 72 74 28 20 65 4f 70 20 26 20 28   assert( eOp & (
2c7a0 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 20 29 3b 0a  WO_LT|WO_LE) );.
2c7b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2c7c0 65 4f 70 20 26 20 57 4f 5f 4c 54 20 29 3b 0a 20  eOp & WO_LT );. 
2c7d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
2c7e0 4f 70 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20  Op & WO_LE );.  
2c7f0 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
2c800 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
2c810 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 54 4f  N_RANGE|WHERE_TO
2c820 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 70  P_LIMIT;.      p
2c830 54 6f 70 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  Top = pTerm;.   
2c840 20 20 20 70 42 74 6d 20 3d 20 28 70 4e 65 77 2d     pBtm = (pNew-
2c850 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
2c860 5f 42 54 4d 5f 4c 49 4d 49 54 29 21 3d 30 20 3f  _BTM_LIMIT)!=0 ?
2c870 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c880 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65        pNew->aLTe
2c890 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2d  rm[pNew->nLTerm-
2c8a0 32 5d 20 3a 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  2] : 0;.    }.. 
2c8b0 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
2c8c0 69 6e 74 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 69  int pNew->nOut i
2c8d0 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
2c8e0 62 65 72 20 6f 66 20 72 6f 77 73 20 65 78 70 65  ber of rows expe
2c8f0 63 74 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62  cted to.    ** b
2c900 65 20 76 69 73 69 74 65 64 20 62 79 20 74 68 65  e visited by the
2c910 20 69 6e 64 65 78 20 73 63 61 6e 20 62 65 66 6f   index scan befo
2c920 72 65 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 74  re considering t
2c930 65 72 6d 20 70 54 65 72 6d 2c 20 6f 72 20 74 68  erm pTerm, or th
2c940 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20  e.    ** values 
2c950 6f 66 20 6e 49 6e 20 61 6e 64 20 6e 49 6e 4d 75  of nIn and nInMu
2c960 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  l. In other word
2c970 73 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74  s, assuming that
2c980 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 22 78 20   all .    ** "x 
2c990 49 4e 28 2e 2e 2e 29 22 20 74 65 72 6d 73 20 61  IN(...)" terms a
2c9a0 72 65 20 72 65 70 6c 61 63 65 64 20 77 69 74 68  re replaced with
2c9b0 20 22 78 20 3d 20 3f 22 2e 20 54 68 69 73 20 62   "x = ?". This b
2c9c0 6c 6f 63 6b 20 75 70 64 61 74 65 73 0a 20 20 20  lock updates.   
2c9d0 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66   ** the value of
2c9e0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 74 6f 20 61   pNew->nOut to a
2c9f0 63 63 6f 75 6e 74 20 66 6f 72 20 70 54 65 72 6d  ccount for pTerm
2ca00 20 28 62 75 74 20 6e 6f 74 20 6e 49 6e 2f 6e 49   (but not nIn/nI
2ca10 6e 4d 75 6c 29 2e 20 20 2a 2f 0a 20 20 20 20 61  nMul).  */.    a
2ca20 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75  ssert( pNew->nOu
2ca30 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b  t==saved_nOut );
2ca40 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 77  .    if( pNew->w
2ca50 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  sFlags & WHERE_C
2ca60 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20  OLUMN_RANGE ){. 
2ca70 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 6e       /* Adjust n
2ca80 4f 75 74 20 75 73 69 6e 67 20 73 74 61 74 33 2f  Out using stat3/
2ca90 73 74 61 74 34 20 64 61 74 61 2e 20 4f 72 2c 20  stat4 data. Or, 
2caa0 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73  if there is no s
2cab0 74 61 74 33 2f 73 74 61 74 34 0a 20 20 20 20 20  tat3/stat4.     
2cac0 20 2a 2a 20 64 61 74 61 2c 20 75 73 69 6e 67 20   ** data, using 
2cad0 73 6f 6d 65 20 6f 74 68 65 72 20 65 73 74 69 6d  some other estim
2cae0 61 74 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 77  ate.  */.      w
2caf0 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74  hereRangeScanEst
2cb00 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65  (pParse, pBuilde
2cb10 72 2c 20 70 42 74 6d 2c 20 70 54 6f 70 2c 20 70  r, pBtm, pTop, p
2cb20 4e 65 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  New);.    }else{
2cb30 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 71 20 3d  .      int nEq =
2cb40 20 2b 2b 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65   ++pNew->u.btree
2cb50 2e 6e 45 71 3b 0a 20 20 20 20 20 20 61 73 73 65  .nEq;.      asse
2cb60 72 74 28 20 65 4f 70 20 26 20 28 57 4f 5f 49 53  rt( eOp & (WO_IS
2cb70 4e 55 4c 4c 7c 57 4f 5f 45 51 7c 57 4f 5f 49 4e  NULL|WO_EQ|WO_IN
2cb80 7c 57 4f 5f 49 53 29 20 29 3b 0a 0a 20 20 20 20  |WO_IS) );..    
2cb90 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
2cba0 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74  nOut==saved_nOut
2cbb0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54   );.      if( pT
2cbc0 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d  erm->truthProb<=
2cbd0 30 20 26 26 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a  0 && iCol>=0 ){.
2cbe0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2cbf0 28 65 4f 70 20 26 20 57 4f 5f 49 4e 29 20 7c 7c  (eOp & WO_IN) ||
2cc00 20 6e 49 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20   nIn==0 );.     
2cc10 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70     testcase( eOp
2cc20 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20   & WO_IN );.    
2cc30 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b      pNew->nOut +
2cc40 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72  = pTerm->truthPr
2cc50 6f 62 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  ob;.        pNew
2cc60 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a 20  ->nOut -= nIn;. 
2cc70 20 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64       }else{.#ifd
2cc80 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
2cc90 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
2cca0 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20          tRowcnt 
2ccb0 6e 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  nOut = 0;.      
2ccc0 20 20 69 66 28 20 6e 49 6e 4d 75 6c 3d 3d 30 20    if( nInMul==0 
2ccd0 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50 72  .         && pPr
2cce0 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20 20  obe->nSample .  
2ccf0 20 20 20 20 20 20 20 26 26 20 70 4e 65 77 2d 3e         && pNew->
2cd00 75 2e 62 74 72 65 65 2e 6e 45 71 3c 3d 70 50 72  u.btree.nEq<=pPr
2cd10 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 0a  obe->nSampleCol.
2cd20 20 20 20 20 20 20 20 20 20 26 26 20 28 28 65 4f           && ((eO
2cd30 70 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 7c 7c  p & WO_IN)==0 ||
2cd40 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
2cd50 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  y(pTerm->pExpr, 
2cd60 45 50 5f 78 49 73 53 65 6c 65 63 74 29 29 0a 20  EP_xIsSelect)). 
2cd70 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
2cd80 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
2cd90 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
2cda0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 65            if( (e
2cdb0 4f 70 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49  Op & (WO_EQ|WO_I
2cdc0 53 4e 55 4c 4c 7c 57 4f 5f 49 53 29 29 21 3d 30  SNULL|WO_IS))!=0
2cdd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2cde0 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20  testcase( eOp & 
2cdf0 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20  WO_EQ );.       
2ce00 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
2ce10 4f 70 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20  Op & WO_IS );.  
2ce20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2ce30 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e  se( eOp & WO_ISN
2ce40 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ULL );.         
2ce50 20 20 20 72 63 20 3d 20 77 68 65 72 65 45 71 75     rc = whereEqu
2ce60 61 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73 65  alScanEst(pParse
2ce70 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 45 78 70  , pBuilder, pExp
2ce80 72 2d 3e 70 52 69 67 68 74 2c 20 26 6e 4f 75 74  r->pRight, &nOut
2ce90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
2cea0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2ceb0 72 63 20 3d 20 77 68 65 72 65 49 6e 53 63 61 6e  rc = whereInScan
2cec0 45 73 74 28 70 50 61 72 73 65 2c 20 70 42 75 69  Est(pParse, pBui
2ced0 6c 64 65 72 2c 20 70 45 78 70 72 2d 3e 78 2e 70  lder, pExpr->x.p
2cee0 4c 69 73 74 2c 20 26 6e 4f 75 74 29 3b 0a 20 20  List, &nOut);.  
2cef0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2cf00 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2cf10 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 20 72 63  TE_NOTFOUND ) rc
2cf20 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2cf30 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2cf40 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61  SQLITE_OK ) brea
2cf50 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  k;          /* J
2cf60 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20 70  ump out of the p
2cf70 54 65 72 6d 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20  Term loop */.   
2cf80 20 20 20 20 20 20 20 69 66 28 20 6e 4f 75 74 20         if( nOut 
2cf90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
2cfa0 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c 69  New->nOut = sqli
2cfb0 74 65 33 4c 6f 67 45 73 74 28 6e 4f 75 74 29 3b  te3LogEst(nOut);
2cfc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2cfd0 20 70 4e 65 77 2d 3e 6e 4f 75 74 3e 73 61 76 65   pNew->nOut>save
2cfe0 64 5f 6e 4f 75 74 20 29 20 70 4e 65 77 2d 3e 6e  d_nOut ) pNew->n
2cff0 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74  Out = saved_nOut
2d000 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e  ;.            pN
2d010 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b  ew->nOut -= nIn;
2d020 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2d030 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
2d040 66 28 20 6e 4f 75 74 3d 3d 30 20 29 0a 23 65 6e  f( nOut==0 ).#en
2d050 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20 20  dif.        {.  
2d060 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f          pNew->nO
2d070 75 74 20 2b 3d 20 28 70 50 72 6f 62 65 2d 3e 61  ut += (pProbe->a
2d080 69 52 6f 77 4c 6f 67 45 73 74 5b 6e 45 71 5d 20  iRowLogEst[nEq] 
2d090 2d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c  - pProbe->aiRowL
2d0a0 6f 67 45 73 74 5b 6e 45 71 2d 31 5d 29 3b 0a 20  ogEst[nEq-1]);. 
2d0b0 20 20 20 20 20 20 20 20 20 69 66 28 20 65 4f 70           if( eOp
2d0c0 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a   & WO_ISNULL ){.
2d0d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2d0e0 55 4e 49 4e 47 3a 20 49 66 20 74 68 65 72 65 20  UNING: If there 
2d0f0 69 73 20 6e 6f 20 6c 69 6b 65 6c 69 68 6f 6f 64  is no likelihood
2d100 28 29 20 76 61 6c 75 65 2c 20 61 73 73 75 6d 65  () value, assume
2d110 20 74 68 61 74 20 61 20 0a 20 20 20 20 20 20 20   that a .       
2d120 20 20 20 20 20 2a 2a 20 22 63 6f 6c 20 49 53 20       ** "col IS 
2d130 4e 55 4c 4c 22 20 65 78 70 72 65 73 73 69 6f 6e  NULL" expression
2d140 20 6d 61 74 63 68 65 73 20 74 77 69 63 65 20 61   matches twice a
2d150 73 20 6d 61 6e 79 20 72 6f 77 73 20 0a 20 20 20  s many rows .   
2d160 20 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20 28           ** as (
2d170 63 6f 6c 3d 3f 29 2e 20 2a 2f 0a 20 20 20 20 20  col=?). */.     
2d180 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75         pNew->nOu
2d190 74 20 2b 3d 20 31 30 3b 0a 20 20 20 20 20 20 20  t += 10;.       
2d1a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2d1b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
2d1c0 20 20 2f 2a 20 53 65 74 20 72 43 6f 73 74 49 64    /* Set rCostId
2d1d0 78 20 74 6f 20 74 68 65 20 63 6f 73 74 20 6f 66  x to the cost of
2d1e0 20 76 69 73 69 74 69 6e 67 20 73 65 6c 65 63 74   visiting select
2d1f0 65 64 20 72 6f 77 73 20 69 6e 20 69 6e 64 65 78  ed rows in index
2d200 2e 20 41 64 64 0a 20 20 20 20 2a 2a 20 69 74 20  . Add.    ** it 
2d210 74 6f 20 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 77  to pNew->rRun, w
2d220 68 69 63 68 20 69 73 20 63 75 72 72 65 6e 74 6c  hich is currentl
2d230 79 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f 73  y set to the cos
2d240 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78 0a 20  t of the index. 
2d250 20 20 20 2a 2a 20 73 65 65 6b 20 6f 6e 6c 79 2e     ** seek only.
2d260 20 54 68 65 6e 2c 20 69 66 20 74 68 69 73 20 69   Then, if this i
2d270 73 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67  s a non-covering
2d280 20 69 6e 64 65 78 2c 20 61 64 64 20 74 68 65 20   index, add the 
2d290 63 6f 73 74 20 6f 66 0a 20 20 20 20 2a 2a 20 76  cost of.    ** v
2d2a0 69 73 69 74 69 6e 67 20 74 68 65 20 72 6f 77 73  isiting the rows
2d2b0 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61 62   in the main tab
2d2c0 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 72 43 6f 73  le.  */.    rCos
2d2d0 74 49 64 78 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75  tIdx = pNew->nOu
2d2e0 74 20 2b 20 31 20 2b 20 28 31 35 2a 70 50 72 6f  t + 1 + (15*pPro
2d2f0 62 65 2d 3e 73 7a 49 64 78 52 6f 77 29 2f 70 53  be->szIdxRow)/pS
2d300 72 63 2d 3e 70 54 61 62 2d 3e 73 7a 54 61 62 52  rc->pTab->szTabR
2d310 6f 77 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52  ow;.    pNew->rR
2d320 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  un = sqlite3LogE
2d330 73 74 41 64 64 28 72 4c 6f 67 53 69 7a 65 2c 20  stAdd(rLogSize, 
2d340 72 43 6f 73 74 49 64 78 29 3b 0a 20 20 20 20 69  rCostIdx);.    i
2d350 66 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67  f( (pNew->wsFlag
2d360 73 20 26 20 28 57 48 45 52 45 5f 49 44 58 5f 4f  s & (WHERE_IDX_O
2d370 4e 4c 59 7c 57 48 45 52 45 5f 49 50 4b 29 29 3d  NLY|WHERE_IPK))=
2d380 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  =0 ){.      pNew
2d390 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33  ->rRun = sqlite3
2d3a0 4c 6f 67 45 73 74 41 64 64 28 70 4e 65 77 2d 3e  LogEstAdd(pNew->
2d3b0 72 52 75 6e 2c 20 70 4e 65 77 2d 3e 6e 4f 75 74  rRun, pNew->nOut
2d3c0 20 2b 20 31 36 29 3b 0a 20 20 20 20 7d 0a 20 20   + 16);.    }.  
2d3d0 20 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69    ApplyCostMulti
2d3e0 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e  plier(pNew->rRun
2d3f0 2c 20 70 50 72 6f 62 65 2d 3e 70 54 61 62 6c 65  , pProbe->pTable
2d400 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 0a 20 20  ->costMult);..  
2d410 20 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65 64    nOutUnadjusted
2d420 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a 20   = pNew->nOut;. 
2d430 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 2b 3d     pNew->rRun +=
2d440 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20   nInMul + nIn;. 
2d450 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d     pNew->nOut +=
2d460 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20   nInMul + nIn;. 
2d470 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70     whereLoopOutp
2d480 75 74 41 64 6a 75 73 74 28 70 42 75 69 6c 64 65  utAdjust(pBuilde
2d490 72 2d 3e 70 57 43 2c 20 70 4e 65 77 2c 20 72 53  r->pWC, pNew, rS
2d4a0 69 7a 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 77  ize);.    rc = w
2d4b0 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70  hereLoopInsert(p
2d4c0 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a  Builder, pNew);.
2d4d0 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 77  .    if( pNew->w
2d4e0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  sFlags & WHERE_C
2d4f0 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20  OLUMN_RANGE ){. 
2d500 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
2d510 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20  = saved_nOut;.  
2d520 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
2d530 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74  New->nOut = nOut
2d540 55 6e 61 64 6a 75 73 74 65 64 3b 0a 20 20 20 20  Unadjusted;.    
2d550 7d 0a 0a 20 20 20 20 69 66 28 20 28 70 4e 65 77  }..    if( (pNew
2d560 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
2d570 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 0a  E_TOP_LIMIT)==0.
2d580 20 20 20 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e       && pNew->u.
2d590 62 74 72 65 65 2e 6e 45 71 3c 70 50 72 6f 62 65  btree.nEq<pProbe
2d5a0 2d 3e 6e 43 6f 6c 75 6d 6e 0a 20 20 20 20 29 7b  ->nColumn.    ){
2d5b0 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  .      whereLoop
2d5c0 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 70 42  AddBtreeIndex(pB
2d5d0 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50  uilder, pSrc, pP
2d5e0 72 6f 62 65 2c 20 6e 49 6e 4d 75 6c 2b 6e 49 6e  robe, nInMul+nIn
2d5f0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65  );.    }.    pNe
2d600 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f  w->nOut = saved_
2d610 6e 4f 75 74 3b 0a 23 69 66 64 65 66 20 53 51 4c  nOut;.#ifdef SQL
2d620 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
2d630 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 70 42  _OR_STAT4.    pB
2d640 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
2d650 64 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a 23  d = nRecValid;.#
2d660 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70 4e 65 77  endif.  }.  pNew
2d670 2d 3e 70 72 65 72 65 71 20 3d 20 73 61 76 65 64  ->prereq = saved
2d680 5f 70 72 65 72 65 71 3b 0a 20 20 70 4e 65 77 2d  _prereq;.  pNew-
2d690 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73  >u.btree.nEq = s
2d6a0 61 76 65 64 5f 6e 45 71 3b 0a 20 20 70 4e 65 77  aved_nEq;.  pNew
2d6b0 2d 3e 6e 53 6b 69 70 20 3d 20 73 61 76 65 64 5f  ->nSkip = saved_
2d6c0 6e 53 6b 69 70 3b 0a 20 20 70 4e 65 77 2d 3e 77  nSkip;.  pNew->w
2d6d0 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77  sFlags = saved_w
2d6e0 73 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e  sFlags;.  pNew->
2d6f0 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75  nOut = saved_nOu
2d700 74 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  t;.  pNew->nLTer
2d710 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d  m = saved_nLTerm
2d720 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72  ;..  /* Consider
2d730 20 75 73 69 6e 67 20 61 20 73 6b 69 70 2d 73 63   using a skip-sc
2d740 61 6e 20 69 66 20 74 68 65 72 65 20 61 72 65 20  an if there are 
2d750 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  no WHERE clause 
2d760 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a  constraints.  **
2d770 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 74   available for t
2d780 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72  he left-most ter
2d790 6d 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2c  ms of the index,
2d7a0 20 61 6e 64 20 69 66 20 74 68 65 20 61 76 65 72   and if the aver
2d7b0 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20  age.  ** number 
2d7c0 6f 66 20 72 65 70 65 61 74 73 20 69 6e 20 74 68  of repeats in th
2d7d0 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d  e left-most term
2d7e0 73 20 69 73 20 61 74 20 6c 65 61 73 74 20 31 38  s is at least 18
2d7f0 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  . .  **.  ** The
2d800 20 6d 61 67 69 63 20 6e 75 6d 62 65 72 20 31 38   magic number 18
2d810 20 69 73 20 73 65 6c 65 63 74 65 64 20 6f 6e 20   is selected on 
2d820 74 68 65 20 62 61 73 69 73 20 74 68 61 74 20 73  the basis that s
2d830 63 61 6e 6e 69 6e 67 20 31 37 20 72 6f 77 73 0a  canning 17 rows.
2d840 20 20 2a 2a 20 69 73 20 61 6c 6d 6f 73 74 20 61    ** is almost a
2d850 6c 77 61 79 73 20 71 75 69 63 6b 65 72 20 74 68  lways quicker th
2d860 61 6e 20 61 6e 20 69 6e 64 65 78 20 73 65 65 6b  an an index seek
2d870 20 28 65 76 65 6e 20 74 68 6f 75 67 68 20 69 66   (even though if
2d880 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20   the index.  ** 
2d890 63 6f 6e 74 61 69 6e 73 20 66 65 77 65 72 20 74  contains fewer t
2d8a0 68 61 6e 20 32 5e 31 37 20 72 6f 77 73 20 77 65  han 2^17 rows we
2d8b0 20 61 73 73 75 6d 65 20 6f 74 68 65 72 77 69 73   assume otherwis
2d8c0 65 20 69 6e 20 6f 74 68 65 72 20 70 61 72 74 73  e in other parts
2d8d0 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 64   of.  ** the cod
2d8e0 65 29 2e 20 41 6e 64 2c 20 65 76 65 6e 20 69 66  e). And, even if
2d8f0 20 69 74 20 69 73 20 6e 6f 74 2c 20 69 74 20 73   it is not, it s
2d900 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 74 6f 6f  hould not be too
2d910 20 6d 75 63 68 20 73 6c 6f 77 65 72 2e 20 0a 20   much slower. . 
2d920 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72   ** On the other
2d930 20 68 61 6e 64 2c 20 74 68 65 20 65 78 74 72 61   hand, the extra
2d940 20 73 65 65 6b 73 20 63 6f 75 6c 64 20 65 6e 64   seeks could end
2d950 20 75 70 20 62 65 69 6e 67 20 73 69 67 6e 69 66   up being signif
2d960 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 6d 6f 72  icantly.  ** mor
2d970 65 20 65 78 70 65 6e 73 69 76 65 2e 20 20 2a 2f  e expensive.  */
2d980 0a 20 20 61 73 73 65 72 74 28 20 34 32 3d 3d 73  .  assert( 42==s
2d990 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 38 29  qlite3LogEst(18)
2d9a0 20 29 3b 0a 20 20 69 66 28 20 73 61 76 65 64 5f   );.  if( saved_
2d9b0 6e 45 71 3d 3d 73 61 76 65 64 5f 6e 53 6b 69 70  nEq==saved_nSkip
2d9c0 0a 20 20 20 26 26 20 73 61 76 65 64 5f 6e 45 71  .   && saved_nEq
2d9d0 2b 31 3c 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43  +1<pProbe->nKeyC
2d9e0 6f 6c 0a 20 20 20 26 26 20 70 50 72 6f 62 65 2d  ol.   && pProbe-
2d9f0 3e 6e 6f 53 6b 69 70 53 63 61 6e 3d 3d 30 0a 20  >noSkipScan==0. 
2da00 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 61 69 52    && pProbe->aiR
2da10 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e  owLogEst[saved_n
2da20 45 71 2b 31 5d 3e 3d 34 32 20 20 2f 2a 20 54 55  Eq+1]>=42  /* TU
2da30 4e 49 4e 47 3a 20 4d 69 6e 69 6d 75 6d 20 66 6f  NING: Minimum fo
2da40 72 20 73 6b 69 70 2d 73 63 61 6e 20 2a 2f 0a 20  r skip-scan */. 
2da50 20 20 26 26 20 28 72 63 20 3d 20 77 68 65 72 65    && (rc = where
2da60 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70  LoopResize(db, p
2da70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  New, pNew->nLTer
2da80 6d 2b 31 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  m+1))==SQLITE_OK
2da90 0a 20 20 29 7b 0a 20 20 20 20 4c 6f 67 45 73 74  .  ){.    LogEst
2daa0 20 6e 49 74 65 72 3b 0a 20 20 20 20 70 4e 65 77   nIter;.    pNew
2dab0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b  ->u.btree.nEq++;
2dac0 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70  .    pNew->nSkip
2dad0 2b 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c  ++;.    pNew->aL
2dae0 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72  Term[pNew->nLTer
2daf0 6d 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 70 4e  m++] = 0;.    pN
2db00 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
2db10 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 3b 0a 20  HERE_SKIPSCAN;. 
2db20 20 20 20 6e 49 74 65 72 20 3d 20 70 50 72 6f 62     nIter = pProb
2db30 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73  e->aiRowLogEst[s
2db40 61 76 65 64 5f 6e 45 71 5d 20 2d 20 70 50 72 6f  aved_nEq] - pPro
2db50 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b  be->aiRowLogEst[
2db60 73 61 76 65 64 5f 6e 45 71 2b 31 5d 3b 0a 20 20  saved_nEq+1];.  
2db70 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20    pNew->nOut -= 
2db80 6e 49 74 65 72 3b 0a 20 20 20 20 2f 2a 20 54 55  nIter;.    /* TU
2db90 4e 49 4e 47 3a 20 20 42 65 63 61 75 73 65 20 75  NING:  Because u
2dba0 6e 63 65 72 74 61 69 6e 74 69 65 73 20 69 6e 20  ncertainties in 
2dbb0 74 68 65 20 65 73 74 69 6d 61 74 65 73 20 66 6f  the estimates fo
2dbc0 72 20 73 6b 69 70 2d 73 63 61 6e 20 71 75 65 72  r skip-scan quer
2dbd0 69 65 73 2c 0a 20 20 20 20 2a 2a 20 61 64 64 20  ies,.    ** add 
2dbe0 61 20 31 2e 33 37 35 20 66 75 64 67 65 20 66 61  a 1.375 fudge fa
2dbf0 63 74 6f 72 20 74 6f 20 6d 61 6b 65 20 73 6b 69  ctor to make ski
2dc00 70 2d 73 63 61 6e 20 73 6c 69 67 68 74 6c 79 20  p-scan slightly 
2dc10 6c 65 73 73 20 6c 69 6b 65 6c 79 2e 20 2a 2f 0a  less likely. */.
2dc20 20 20 20 20 6e 49 74 65 72 20 2b 3d 20 35 3b 0a      nIter += 5;.
2dc30 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 64      whereLoopAdd
2dc40 42 74 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c  BtreeIndex(pBuil
2dc50 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62  der, pSrc, pProb
2dc60 65 2c 20 6e 49 74 65 72 20 2b 20 6e 49 6e 4d 75  e, nIter + nInMu
2dc70 6c 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f  l);.    pNew->nO
2dc80 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b  ut = saved_nOut;
2dc90 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  .    pNew->u.btr
2dca0 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e  ee.nEq = saved_n
2dcb0 45 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53  Eq;.    pNew->nS
2dcc0 6b 69 70 20 3d 20 73 61 76 65 64 5f 6e 53 6b 69  kip = saved_nSki
2dcd0 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  p;.    pNew->wsF
2dce0 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73 46  lags = saved_wsF
2dcf0 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  lags;.  }..  ret
2dd00 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2dd10 20 52 65 74 75 72 6e 20 54 72 75 65 20 69 66 20   Return True if 
2dd20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
2dd30 68 61 74 20 70 49 6e 64 65 78 20 6d 69 67 68 74  hat pIndex might
2dd40 20 62 65 20 75 73 65 66 75 6c 20 69 6e 0a 2a 2a   be useful in.**
2dd50 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
2dd60 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
2dd70 65 20 69 6e 20 70 42 75 69 6c 64 65 72 2e 0a 2a  e in pBuilder..*
2dd80 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46 61 6c 73  *.** Return Fals
2dd90 65 20 69 66 20 70 42 75 69 6c 64 65 72 20 64 6f  e if pBuilder do
2dda0 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
2ddb0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
2ddc0 65 20 6f 72 0a 2a 2a 20 69 66 20 74 68 65 72 65  e or.** if there
2ddd0 20 69 73 20 6e 6f 20 77 61 79 20 66 6f 72 20 70   is no way for p
2dde0 49 6e 64 65 78 20 74 6f 20 62 65 20 75 73 65 66  Index to be usef
2ddf0 75 6c 20 69 6e 20 69 6d 70 6c 65 6d 65 6e 74 69  ul in implementi
2de00 6e 67 20 74 68 61 74 0a 2a 2a 20 4f 52 44 45 52  ng that.** ORDER
2de10 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73   BY clause..*/.s
2de20 74 61 74 69 63 20 69 6e 74 20 69 6e 64 65 78 4d  tatic int indexM
2de30 69 67 68 74 48 65 6c 70 57 69 74 68 4f 72 64 65  ightHelpWithOrde
2de40 72 42 79 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70  rBy(.  WhereLoop
2de50 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
2de60 72 2c 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  r,.  Index *pInd
2de70 65 78 2c 0a 20 20 69 6e 74 20 69 43 75 72 73 6f  ex,.  int iCurso
2de80 72 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  r.){.  ExprList 
2de90 2a 70 4f 42 3b 0a 20 20 69 6e 74 20 69 69 2c 20  *pOB;.  int ii, 
2dea0 6a 6a 3b 0a 0a 20 20 69 66 28 20 70 49 6e 64 65  jj;..  if( pInde
2deb0 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 20  x->bUnordered ) 
2dec0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
2ded0 28 70 4f 42 20 3d 20 70 42 75 69 6c 64 65 72 2d  (pOB = pBuilder-
2dee0 3e 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42  >pWInfo->pOrderB
2def0 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  y)==0 ) return 0
2df00 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  ;.  for(ii=0; ii
2df10 3c 70 4f 42 2d 3e 6e 45 78 70 72 3b 20 69 69 2b  <pOB->nExpr; ii+
2df20 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
2df30 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
2df40 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 42  rSkipCollate(pOB
2df50 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 3b 0a  ->a[ii].pExpr);.
2df60 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
2df70 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72  p!=TK_COLUMN ) r
2df80 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28  eturn 0;.    if(
2df90 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
2dfa0 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20  iCursor ){.     
2dfb0 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
2dfc0 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 31  umn<0 ) return 1
2dfd0 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30  ;.      for(jj=0
2dfe0 3b 20 6a 6a 3c 70 49 6e 64 65 78 2d 3e 6e 4b 65  ; jj<pIndex->nKe
2dff0 79 43 6f 6c 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20  yCol; jj++){.   
2e000 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
2e010 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d  iColumn==pIndex-
2e020 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 6a 5d 20 29 20  >aiColumn[jj] ) 
2e030 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
2e040 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
2e050 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
2e060 20 52 65 74 75 72 6e 20 61 20 62 69 74 6d 61 73   Return a bitmas
2e070 6b 20 77 68 65 72 65 20 31 73 20 69 6e 64 69 63  k where 1s indic
2e080 61 74 65 20 74 68 61 74 20 74 68 65 20 63 6f 72  ate that the cor
2e090 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d  responding colum
2e0a0 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c  n of.** the tabl
2e0b0 65 20 69 73 20 75 73 65 64 20 62 79 20 61 6e 20  e is used by an 
2e0c0 69 6e 64 65 78 2e 20 20 4f 6e 6c 79 20 74 68 65  index.  Only the
2e0d0 20 66 69 72 73 74 20 36 33 20 63 6f 6c 75 6d 6e   first 63 column
2e0e0 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64  s are considered
2e0f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d  ..*/.static Bitm
2e100 61 73 6b 20 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64  ask columnsInInd
2e110 65 78 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b  ex(Index *pIdx){
2e120 0a 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 30  .  Bitmask m = 0
2e130 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 66 6f 72  ;.  int j;.  for
2e140 28 6a 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  (j=pIdx->nColumn
2e150 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a  -1; j>=0; j--){.
2e160 20 20 20 20 69 6e 74 20 78 20 3d 20 70 49 64 78      int x = pIdx
2e170 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20  ->aiColumn[j];. 
2e180 20 20 20 69 66 28 20 78 3e 3d 30 20 29 7b 0a 20     if( x>=0 ){. 
2e190 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78       testcase( x
2e1a0 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20  ==BMS-1 );.     
2e1b0 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d   testcase( x==BM
2e1c0 53 2d 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28  S-2 );.      if(
2e1d0 20 78 3c 42 4d 53 2d 31 20 29 20 6d 20 7c 3d 20   x<BMS-1 ) m |= 
2e1e0 4d 41 53 4b 42 49 54 28 78 29 3b 0a 20 20 20 20  MASKBIT(x);.    
2e1f0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d  }.  }.  return m
2e200 3b 0a 7d 0a 0a 2f 2a 20 43 68 65 63 6b 20 74 6f  ;.}../* Check to
2e210 20 73 65 65 20 69 66 20 61 20 70 61 72 74 69 61   see if a partia
2e220 6c 20 69 6e 64 65 78 20 77 69 74 68 20 70 50 61  l index with pPa
2e230 72 74 49 6e 64 65 78 57 68 65 72 65 20 63 61 6e  rtIndexWhere can
2e240 20 62 65 20 75 73 65 64 0a 2a 2a 20 69 6e 20 74   be used.** in t
2e250 68 65 20 63 75 72 72 65 6e 74 20 71 75 65 72 79  he current query
2e260 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  .  Return true i
2e270 66 20 69 74 20 63 61 6e 20 62 65 20 61 6e 64 20  f it can be and 
2e280 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f  false if not..*/
2e290 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
2e2a0 65 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e  eUsablePartialIn
2e2b0 64 65 78 28 69 6e 74 20 69 54 61 62 2c 20 57 68  dex(int iTab, Wh
2e2c0 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
2e2d0 45 78 70 72 20 2a 70 57 68 65 72 65 29 7b 0a 20  Expr *pWhere){. 
2e2e0 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 54   int i;.  WhereT
2e2f0 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 66 6f  erm *pTerm;.  fo
2e300 72 28 69 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43  r(i=0, pTerm=pWC
2e310 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72  ->a; i<pWC->nTer
2e320 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  m; i++, pTerm++)
2e330 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
2e340 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  r = pTerm->pExpr
2e350 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
2e360 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72  3ExprImpliesExpr
2e370 28 70 45 78 70 72 2c 20 70 57 68 65 72 65 2c 20  (pExpr, pWhere, 
2e380 69 54 61 62 29 20 0a 20 20 20 20 20 26 26 20 28  iTab) .     && (
2e390 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
2e3a0 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
2e3b0 6f 69 6e 29 20 7c 7c 20 70 45 78 70 72 2d 3e 69  oin) || pExpr->i
2e3c0 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d  RightJoinTable==
2e3d0 69 54 61 62 29 0a 20 20 20 20 29 7b 0a 20 20 20  iTab).    ){.   
2e3e0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
2e3f0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2e400 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  0;.}../*.** Add 
2e410 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  all WhereLoop ob
2e420 6a 65 63 74 73 20 66 6f 72 20 61 20 73 69 6e 67  jects for a sing
2e430 6c 65 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  le table of the 
2e440 6a 6f 69 6e 20 77 68 65 72 65 20 74 68 65 20 74  join where the t
2e450 61 62 6c 65 0a 2a 2a 20 69 73 20 69 64 65 6e 66  able.** is idenf
2e460 69 65 64 20 62 79 20 70 42 75 69 6c 64 65 72 2d  ied by pBuilder-
2e470 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68  >pNew->iTab.  Th
2e480 61 74 20 74 61 62 6c 65 20 69 73 20 67 75 61 72  at table is guar
2e490 61 6e 74 65 65 64 20 74 6f 20 62 65 0a 2a 2a 20  anteed to be.** 
2e4a0 61 20 62 2d 74 72 65 65 20 74 61 62 6c 65 2c 20  a b-tree table, 
2e4b0 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74 61  not a virtual ta
2e4c0 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ble..**.** The c
2e4d0 6f 73 74 73 20 28 57 68 65 72 65 4c 6f 6f 70 2e  osts (WhereLoop.
2e4e0 72 52 75 6e 29 20 6f 66 20 74 68 65 20 62 2d 74  rRun) of the b-t
2e4f0 72 65 65 20 6c 6f 6f 70 73 20 61 64 64 65 64 20  ree loops added 
2e500 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
2e510 0a 2a 2a 20 61 72 65 20 63 61 6c 63 75 6c 61 74  .** are calculat
2e520 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ed as follows:.*
2e530 2a 0a 2a 2a 20 46 6f 72 20 61 20 66 75 6c 6c 20  *.** For a full 
2e540 73 63 61 6e 2c 20 61 73 73 75 6d 69 6e 67 20 74  scan, assuming t
2e550 68 65 20 74 61 62 6c 65 20 28 6f 72 20 69 6e 64  he table (or ind
2e560 65 78 29 20 63 6f 6e 74 61 69 6e 73 20 6e 52 6f  ex) contains nRo
2e570 77 20 72 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  w rows:.**.**   
2e580 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20    cost = nRow * 
2e590 33 2e 30 20 20 20 20 20 20 20 20 20 20 20 20 20  3.0             
2e5a0 20 20 20 20 20 20 20 2f 2f 20 66 75 6c 6c 2d 74         // full-t
2e5b0 61 62 6c 65 20 73 63 61 6e 0a 2a 2a 20 20 20 20  able scan.**    
2e5c0 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20 4b   cost = nRow * K
2e5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e5e0 20 20 20 20 20 20 2f 2f 20 73 63 61 6e 20 6f 66        // scan of
2e5f0 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a   covering index.
2e600 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 52  **     cost = nR
2e610 6f 77 20 2a 20 28 4b 2b 33 2e 30 29 20 20 20 20  ow * (K+3.0)    
2e620 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 73              // s
2e630 63 61 6e 20 6f 66 20 6e 6f 6e 2d 63 6f 76 65 72  can of non-cover
2e640 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a 2a 20  ing index.**.** 
2e650 77 68 65 72 65 20 4b 20 69 73 20 61 20 76 61 6c  where K is a val
2e660 75 65 20 62 65 74 77 65 65 6e 20 31 2e 31 20 61  ue between 1.1 a
2e670 6e 64 20 33 2e 30 20 73 65 74 20 62 61 73 65 64  nd 3.0 set based
2e680 20 6f 6e 20 74 68 65 20 72 65 6c 61 74 69 76 65   on the relative
2e690 20 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64 20 61   .** estimated a
2e6a0 76 65 72 61 67 65 20 73 69 7a 65 20 6f 66 20 74  verage size of t
2e6b0 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62  he index and tab
2e6c0 6c 65 20 72 65 63 6f 72 64 73 2e 0a 2a 2a 0a 2a  le records..**.*
2e6d0 2a 20 46 6f 72 20 61 6e 20 69 6e 64 65 78 20 73  * For an index s
2e6e0 63 61 6e 2c 20 77 68 65 72 65 20 6e 56 69 73 69  can, where nVisi
2e6f0 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  t is the number 
2e700 6f 66 20 69 6e 64 65 78 20 72 6f 77 73 20 76 69  of index rows vi
2e710 73 69 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  sited.** by the 
2e720 73 63 61 6e 2c 20 61 6e 64 20 6e 53 65 65 6b 20  scan, and nSeek 
2e730 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
2e740 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e 73   seek operations
2e750 20 72 65 71 75 69 72 65 64 20 6f 6e 20 0a 2a 2a   required on .**
2e760 20 74 68 65 20 69 6e 64 65 78 20 62 2d 74 72 65   the index b-tre
2e770 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f 73  e:.**.**     cos
2e780 74 20 3d 20 6e 53 65 65 6b 20 2a 20 28 6c 6f 67  t = nSeek * (log
2e790 28 6e 52 6f 77 29 20 2b 20 4b 20 2a 20 6e 56 69  (nRow) + K * nVi
2e7a0 73 69 74 29 20 20 20 20 20 20 20 20 20 20 2f 2f  sit)          //
2e7b0 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a   covering index.
2e7c0 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 53  **     cost = nS
2e7d0 65 65 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f 77 29  eek * (log(nRow)
2e7e0 20 2b 20 28 4b 2b 33 2e 30 29 20 2a 20 6e 56 69   + (K+3.0) * nVi
2e7f0 73 69 74 29 20 20 20 20 2f 2f 20 6e 6f 6e 2d 63  sit)    // non-c
2e800 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a  overing index.**
2e810 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 53  .** Normally, nS
2e820 65 65 6b 20 69 73 20 31 2e 20 6e 53 65 65 6b 20  eek is 1. nSeek 
2e830 76 61 6c 75 65 73 20 67 72 65 61 74 65 72 20 74  values greater t
2e840 68 61 6e 20 31 20 63 6f 6d 65 20 61 62 6f 75 74  han 1 come about
2e850 20 69 66 20 74 68 65 20 0a 2a 2a 20 57 48 45 52   if the .** WHER
2e860 45 20 63 6c 61 75 73 65 20 69 6e 63 6c 75 64 65  E clause include
2e870 73 20 22 78 20 49 4e 20 28 2e 2e 2e 2e 29 22 20  s "x IN (....)" 
2e880 74 65 72 6d 73 20 75 73 65 64 20 69 6e 20 70 6c  terms used in pl
2e890 61 63 65 20 6f 66 20 22 78 3d 3f 22 2e 20 4f 72  ace of "x=?". Or
2e8a0 20 77 68 65 6e 20 0a 2a 2a 20 69 6d 70 6c 69 63   when .** implic
2e8b0 69 74 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54  it "x IN (SELECT
2e8c0 20 78 20 46 52 4f 4d 20 74 62 6c 29 22 20 74 65   x FROM tbl)" te
2e8d0 72 6d 73 20 61 72 65 20 61 64 64 65 64 20 66 6f  rms are added fo
2e8e0 72 20 73 6b 69 70 2d 73 63 61 6e 73 2e 0a 2a 2a  r skip-scans..**
2e8f0 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d 61 74 65  .** The estimate
2e900 64 20 76 61 6c 75 65 73 20 28 6e 52 6f 77 2c 20  d values (nRow, 
2e910 6e 56 69 73 69 74 2c 20 6e 53 65 65 6b 29 20 6f  nVisit, nSeek) o
2e920 66 74 65 6e 20 63 6f 6e 74 61 69 6e 20 61 20 6c  ften contain a l
2e930 61 72 67 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f  arge amount.** o
2e940 66 20 75 6e 63 65 72 74 61 69 6e 74 79 2e 20 20  f uncertainty.  
2e950 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c  For this reason,
2e960 20 73 63 6f 72 69 6e 67 20 69 73 20 64 65 73 69   scoring is desi
2e970 67 6e 65 64 20 74 6f 20 70 69 63 6b 20 70 6c 61  gned to pick pla
2e980 6e 73 20 74 68 61 74 0a 2a 2a 20 22 64 6f 20 74  ns that.** "do t
2e990 68 65 20 6c 65 61 73 74 20 68 61 72 6d 22 20 69  he least harm" i
2e9a0 66 20 74 68 65 20 65 73 74 69 6d 61 74 65 73 20  f the estimates 
2e9b0 61 72 65 20 69 6e 61 63 63 75 72 61 74 65 2e 20  are inaccurate. 
2e9c0 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 0a   For example, a.
2e9d0 2a 2a 20 6c 6f 67 28 6e 52 6f 77 29 20 66 61 63  ** log(nRow) fac
2e9e0 74 6f 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66  tor is omitted f
2e9f0 72 6f 6d 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69  rom a non-coveri
2ea00 6e 67 20 69 6e 64 65 78 20 73 63 61 6e 20 69 6e  ng index scan in
2ea10 20 6f 72 64 65 72 20 74 6f 0a 2a 2a 20 62 69 61   order to.** bia
2ea20 73 20 74 68 65 20 73 63 6f 72 69 6e 67 20 69 6e  s the scoring in
2ea30 20 66 61 76 6f 72 20 6f 66 20 75 73 69 6e 67 20   favor of using 
2ea40 61 6e 20 69 6e 64 65 78 2c 20 73 69 6e 63 65 20  an index, since 
2ea50 74 68 65 20 77 6f 72 73 74 2d 63 61 73 65 0a 2a  the worst-case.*
2ea60 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 66  * performance of
2ea70 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 20   using an index 
2ea80 69 73 20 66 61 72 20 62 65 74 74 65 72 20 74 68  is far better th
2ea90 61 6e 20 74 68 65 20 77 6f 72 73 74 2d 63 61 73  an the worst-cas
2eaa0 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a  e performance.**
2eab0 20 6f 66 20 61 20 66 75 6c 6c 20 74 61 62 6c 65   of a full table
2eac0 20 73 63 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63   scan..*/.static
2ead0 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64   int whereLoopAd
2eae0 64 42 74 72 65 65 28 0a 20 20 57 68 65 72 65 4c  dBtree(.  WhereL
2eaf0 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
2eb00 6c 64 65 72 2c 20 2f 2a 20 57 48 45 52 45 20 63  lder, /* WHERE c
2eb10 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f  lause informatio
2eb20 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d  n */.  Bitmask m
2eb30 45 78 74 72 61 20 20 20 20 20 20 20 20 20 20 20  Extra           
2eb40 20 20 20 2f 2a 20 45 78 74 72 61 20 70 72 65 72     /* Extra prer
2eb50 65 71 75 65 73 69 74 65 73 20 66 6f 72 20 75 73  equesites for us
2eb60 69 6e 67 20 74 68 69 73 20 74 61 62 6c 65 20 2a  ing this table *
2eb70 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  /.){.  WhereInfo
2eb80 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20   *pWInfo;       
2eb90 20 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c     /* WHERE anal
2eba0 79 73 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ysis context */.
2ebb0 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b    Index *pProbe;
2ebc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ebd0 20 41 6e 20 69 6e 64 65 78 20 77 65 20 61 72 65   An index we are
2ebe0 20 65 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20   evaluating */. 
2ebf0 20 49 6e 64 65 78 20 73 50 6b 3b 20 20 20 20 20   Index sPk;     
2ec00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ec10 41 20 66 61 6b 65 20 69 6e 64 65 78 20 6f 62 6a  A fake index obj
2ec20 65 63 74 20 66 6f 72 20 74 68 65 20 70 72 69 6d  ect for the prim
2ec30 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20 4c 6f 67  ary key */.  Log
2ec40 45 73 74 20 61 69 52 6f 77 45 73 74 50 6b 5b 32  Est aiRowEstPk[2
2ec50 5d 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ];       /* The 
2ec60 61 69 52 6f 77 4c 6f 67 45 73 74 5b 5d 20 76 61  aiRowLogEst[] va
2ec70 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20  lue for the sPk 
2ec80 69 6e 64 65 78 20 2a 2f 0a 20 20 69 31 36 20 61  index */.  i16 a
2ec90 69 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31 3b 20  iColumnPk = -1; 
2eca0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 43         /* The aC
2ecb0 6f 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65 20 66 6f  olumn[] value fo
2ecc0 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20  r the sPk index 
2ecd0 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
2ece0 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  abList;         
2ecf0 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
2ed00 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
2ed10 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
2ed20 72 63 3b 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  rc;  /* The FROM
2ed30 20 63 6c 61 75 73 65 20 62 74 72 65 65 20 74 65   clause btree te
2ed40 72 6d 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 57  rm to add */.  W
2ed50 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20  hereLoop *pNew; 
2ed60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
2ed70 6d 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70  mplate WhereLoop
2ed80 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
2ed90 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2eda0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2edb0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
2edc0 20 69 53 6f 72 74 49 64 78 20 3d 20 31 3b 20 20   iSortIdx = 1;  
2edd0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
2ede0 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e  x number */.  in
2edf0 74 20 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  t b;            
2ee00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62            /* A b
2ee10 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20 2a 2f 0a  oolean value */.
2ee20 20 20 4c 6f 67 45 73 74 20 72 53 69 7a 65 3b 20    LogEst rSize; 
2ee30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ee40 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
2ee50 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  in the table */.
2ee60 20 20 4c 6f 67 45 73 74 20 72 4c 6f 67 53 69 7a    LogEst rLogSiz
2ee70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
2ee80 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68   Logarithm of th
2ee90 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
2eea0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   in the table */
2eeb0 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
2eec0 70 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 2f  pWC;           /
2eed0 2a 20 54 68 65 20 70 61 72 73 65 64 20 57 48 45  * The parsed WHE
2eee0 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54  RE clause */.  T
2eef0 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
2ef00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
2ef10 62 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69 65  ble being querie
2ef20 64 20 2a 2f 0a 20 20 0a 20 20 70 4e 65 77 20 3d  d */.  .  pNew =
2ef30 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b   pBuilder->pNew;
2ef40 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69  .  pWInfo = pBui
2ef50 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20  lder->pWInfo;.  
2ef60 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66  pTabList = pWInf
2ef70 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 70  o->pTabList;.  p
2ef80 53 72 63 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Src = pTabList->
2ef90 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a  a + pNew->iTab;.
2efa0 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 70    pTab = pSrc->p
2efb0 54 61 62 3b 0a 20 20 70 57 43 20 3d 20 70 42 75  Tab;.  pWC = pBu
2efc0 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 61 73  ilder->pWC;.  as
2efd0 73 65 72 74 28 20 21 49 73 56 69 72 74 75 61 6c  sert( !IsVirtual
2efe0 28 70 53 72 63 2d 3e 70 54 61 62 29 20 29 3b 0a  (pSrc->pTab) );.
2eff0 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49 6e  .  if( pSrc->pIn
2f000 64 65 78 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e  dex ){.    /* An
2f010 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
2f020 73 65 20 73 70 65 63 69 66 69 65 73 20 61 20 70  se specifies a p
2f030 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20  articular index 
2f040 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 70 50  to use */.    pP
2f050 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 49 6e  robe = pSrc->pIn
2f060 64 65 78 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  dex;.  }else if(
2f070 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   !HasRowid(pTab)
2f080 20 29 7b 0a 20 20 20 20 70 50 72 6f 62 65 20 3d   ){.    pProbe =
2f090 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20   pTab->pIndex;. 
2f0a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
2f0b0 68 65 72 65 20 69 73 20 6e 6f 20 49 4e 44 45 58  here is no INDEX
2f0c0 45 44 20 42 59 20 63 6c 61 75 73 65 2e 20 20 43  ED BY clause.  C
2f0d0 72 65 61 74 65 20 61 20 66 61 6b 65 20 49 6e 64  reate a fake Ind
2f0e0 65 78 20 6f 62 6a 65 63 74 20 69 6e 20 6c 6f 63  ex object in loc
2f0f0 61 6c 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62  al.    ** variab
2f100 6c 65 20 73 50 6b 20 74 6f 20 72 65 70 72 65 73  le sPk to repres
2f110 65 6e 74 20 74 68 65 20 72 6f 77 69 64 20 70 72  ent the rowid pr
2f120 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 2e  imary key index.
2f130 20 20 4d 61 6b 65 20 74 68 69 73 0a 20 20 20 20    Make this.    
2f140 2a 2a 20 66 61 6b 65 20 69 6e 64 65 78 20 74 68  ** fake index th
2f150 65 20 66 69 72 73 74 20 69 6e 20 61 20 63 68 61  e first in a cha
2f160 69 6e 20 6f 66 20 49 6e 64 65 78 20 6f 62 6a 65  in of Index obje
2f170 63 74 73 20 77 69 74 68 20 61 6c 6c 20 6f 66 20  cts with all of 
2f180 74 68 65 20 72 65 61 6c 0a 20 20 20 20 2a 2a 20  the real.    ** 
2f190 69 6e 64 69 63 65 73 20 74 6f 20 66 6f 6c 6c 6f  indices to follo
2f1a0 77 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a  w */.    Index *
2f1b0 70 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  pFirst;         
2f1c0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
2f1d0 74 20 6f 66 20 72 65 61 6c 20 69 6e 64 69 63 65  t of real indice
2f1e0 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 2a  s on the table *
2f1f0 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 50  /.    memset(&sP
2f200 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28 49 6e 64  k, 0, sizeof(Ind
2f210 65 78 29 29 3b 0a 20 20 20 20 73 50 6b 2e 6e 4b  ex));.    sPk.nK
2f220 65 79 43 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 73  eyCol = 1;.    s
2f230 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a  Pk.nColumn = 1;.
2f240 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c 75 6d 6e      sPk.aiColumn
2f250 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50 6b 3b 0a   = &aiColumnPk;.
2f260 20 20 20 20 73 50 6b 2e 61 69 52 6f 77 4c 6f 67      sPk.aiRowLog
2f270 45 73 74 20 3d 20 61 69 52 6f 77 45 73 74 50 6b  Est = aiRowEstPk
2f280 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e 45 72 72 6f  ;.    sPk.onErro
2f290 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b 0a  r = OE_Replace;.
2f2a0 20 20 20 20 73 50 6b 2e 70 54 61 62 6c 65 20 3d      sPk.pTable =
2f2b0 20 70 54 61 62 3b 0a 20 20 20 20 73 50 6b 2e 73   pTab;.    sPk.s
2f2c0 7a 49 64 78 52 6f 77 20 3d 20 70 54 61 62 2d 3e  zIdxRow = pTab->
2f2d0 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20 61 69  szTabRow;.    ai
2f2e0 52 6f 77 45 73 74 50 6b 5b 30 5d 20 3d 20 70 54  RowEstPk[0] = pT
2f2f0 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a  ab->nRowLogEst;.
2f300 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 31      aiRowEstPk[1
2f310 5d 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 72 73  ] = 0;.    pFirs
2f320 74 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e  t = pSrc->pTab->
2f330 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20  pIndex;.    if( 
2f340 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64  pSrc->notIndexed
2f350 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
2f360 54 68 65 20 72 65 61 6c 20 69 6e 64 69 63 65 73  The real indices
2f370 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61 72   of the table ar
2f380 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 65  e only considere
2f390 64 20 69 66 20 74 68 65 0a 20 20 20 20 20 20 2a  d if the.      *
2f3a0 2a 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 71 75  * NOT INDEXED qu
2f3b0 61 6c 69 66 69 65 72 20 69 73 20 6f 6d 69 74 74  alifier is omitt
2f3c0 65 64 20 66 72 6f 6d 20 74 68 65 20 46 52 4f 4d  ed from the FROM
2f3d0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
2f3e0 20 73 50 6b 2e 70 4e 65 78 74 20 3d 20 70 46 69   sPk.pNext = pFi
2f3f0 72 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  rst;.    }.    p
2f400 50 72 6f 62 65 20 3d 20 26 73 50 6b 3b 0a 20 20  Probe = &sPk;.  
2f410 7d 0a 20 20 72 53 69 7a 65 20 3d 20 70 54 61 62  }.  rSize = pTab
2f420 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20  ->nRowLogEst;.  
2f430 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f  rLogSize = estLo
2f440 67 28 72 53 69 7a 65 29 3b 0a 0a 23 69 66 6e 64  g(rSize);..#ifnd
2f450 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2f460 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20  UTOMATIC_INDEX. 
2f470 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20 69 6e   /* Automatic in
2f480 64 65 78 65 73 20 2a 2f 0a 20 20 69 66 28 20 21  dexes */.  if( !
2f490 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74  pBuilder->pOrSet
2f4a0 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e  .   && (pWInfo->
2f4b0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2f4c0 52 45 5f 4e 4f 5f 41 55 54 4f 49 4e 44 45 58 29  RE_NO_AUTOINDEX)
2f4d0 3d 3d 30 0a 20 20 20 26 26 20 28 70 57 49 6e 66  ==0.   && (pWInf
2f4e0 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  o->pParse->db->f
2f4f0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 41 75  lags & SQLITE_Au
2f500 74 6f 49 6e 64 65 78 29 21 3d 30 0a 20 20 20 26  toIndex)!=0.   &
2f510 26 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 3d 3d  & pSrc->pIndex==
2f520 30 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e 76  0.   && !pSrc->v
2f530 69 61 43 6f 72 6f 75 74 69 6e 65 0a 20 20 20 26  iaCoroutine.   &
2f540 26 20 21 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65  & !pSrc->notInde
2f550 78 65 64 0a 20 20 20 26 26 20 48 61 73 52 6f 77  xed.   && HasRow
2f560 69 64 28 70 54 61 62 29 0a 20 20 20 26 26 20 21  id(pTab).   && !
2f570 70 53 72 63 2d 3e 69 73 43 6f 72 72 65 6c 61 74  pSrc->isCorrelat
2f580 65 64 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e  ed.   && !pSrc->
2f590 69 73 52 65 63 75 72 73 69 76 65 0a 20 20 29 7b  isRecursive.  ){
2f5a0 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  .    /* Generate
2f5b0 20 61 75 74 6f 2d 69 6e 64 65 78 20 57 68 65 72   auto-index Wher
2f5c0 65 4c 6f 6f 70 73 20 2a 2f 0a 20 20 20 20 57 68  eLoops */.    Wh
2f5d0 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
2f5e0 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
2f5f0 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b  WCEnd = pWC->a +
2f600 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20   pWC->nTerm;.   
2f610 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
2f620 61 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  a; rc==SQLITE_OK
2f630 20 26 26 20 70 54 65 72 6d 3c 70 57 43 45 6e 64   && pTerm<pWCEnd
2f640 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; pTerm++){.    
2f650 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65    if( pTerm->pre
2f660 72 65 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d  reqRight & pNew-
2f670 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74  >maskSelf ) cont
2f680 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
2f690 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65  termCanDriveInde
2f6a0 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 30  x(pTerm, pSrc, 0
2f6b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  ) ){.        pNe
2f6c0 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d  w->u.btree.nEq =
2f6d0 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   1;.        pNew
2f6e0 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20  ->nSkip = 0;.   
2f6f0 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72       pNew->u.btr
2f700 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20  ee.pIndex = 0;. 
2f710 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54         pNew->nLT
2f720 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  erm = 1;.       
2f730 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d   pNew->aLTerm[0]
2f740 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
2f750 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4f 6e 65    /* TUNING: One
2f760 2d 74 69 6d 65 20 63 6f 73 74 20 66 6f 72 20 63  -time cost for c
2f770 6f 6d 70 75 74 69 6e 67 20 74 68 65 20 61 75 74  omputing the aut
2f780 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69 73 0a  omatic index is.
2f790 20 20 20 20 20 20 20 20 2a 2a 20 65 73 74 69 6d          ** estim
2f7a0 61 74 65 64 20 74 6f 20 62 65 20 58 2a 4e 2a 6c  ated to be X*N*l
2f7b0 6f 67 32 28 4e 29 20 77 68 65 72 65 20 4e 20 69  og2(N) where N i
2f7c0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
2f7d0 72 6f 77 73 20 69 6e 0a 20 20 20 20 20 20 20 20  rows in.        
2f7e0 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  ** the table bei
2f7f0 6e 67 20 69 6e 64 65 78 65 64 20 61 6e 64 20 77  ng indexed and w
2f800 68 65 72 65 20 58 20 69 73 20 37 20 28 4c 6f 67  here X is 7 (Log
2f810 45 73 74 3d 32 38 29 20 66 6f 72 20 6e 6f 72 6d  Est=28) for norm
2f820 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61  al.        ** ta
2f830 62 6c 65 73 20 6f 72 20 31 2e 33 37 35 20 28 4c  bles or 1.375 (L
2f840 6f 67 45 73 74 3d 34 29 20 66 6f 72 20 76 69 65  ogEst=4) for vie
2f850 77 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65  ws and subquerie
2f860 73 2e 20 20 54 68 65 20 76 61 6c 75 65 0a 20 20  s.  The value.  
2f870 20 20 20 20 20 20 2a 2a 20 6f 66 20 58 20 69 73        ** of X is
2f880 20 73 6d 61 6c 6c 65 72 20 66 6f 72 20 76 69 65   smaller for vie
2f890 77 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65  ws and subquerie
2f8a0 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 71 75  s so that the qu
2f8b0 65 72 79 20 70 6c 61 6e 6e 65 72 0a 20 20 20 20  ery planner.    
2f8c0 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 6d      ** will be m
2f8d0 6f 72 65 20 61 67 67 72 65 73 73 69 76 65 20 61  ore aggressive a
2f8e0 62 6f 75 74 20 67 65 6e 65 72 61 74 69 6e 67 20  bout generating 
2f8f0 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 65  automatic indexe
2f900 73 20 66 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a  s for.        **
2f910 20 74 68 6f 73 65 20 6f 62 6a 65 63 74 73 2c 20   those objects, 
2f920 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 20 6e  since there is n
2f930 6f 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  o opportunity to
2f940 20 61 64 64 20 73 63 68 65 6d 61 0a 20 20 20 20   add schema.    
2f950 20 20 20 20 2a 2a 20 69 6e 64 65 78 65 73 20 6f      ** indexes o
2f960 6e 20 73 75 62 71 75 65 72 69 65 73 20 61 6e 64  n subqueries and
2f970 20 76 69 65 77 73 2e 20 2a 2f 0a 20 20 20 20 20   views. */.     
2f980 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20     pNew->rSetup 
2f990 3d 20 72 4c 6f 67 53 69 7a 65 20 2b 20 72 53 69  = rLogSize + rSi
2f9a0 7a 65 20 2b 20 34 3b 0a 20 20 20 20 20 20 20 20  ze + 4;.        
2f9b0 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  if( pTab->pSelec
2f9c0 74 3d 3d 30 20 26 26 20 28 70 54 61 62 2d 3e 74  t==0 && (pTab->t
2f9d0 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68  abFlags & TF_Eph
2f9e0 65 6d 65 72 61 6c 29 3d 3d 30 20 29 7b 0a 20 20  emeral)==0 ){.  
2f9f0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53          pNew->rS
2fa00 65 74 75 70 20 2b 3d 20 32 34 3b 0a 20 20 20 20  etup += 24;.    
2fa10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 41 70      }.        Ap
2fa20 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65  plyCostMultiplie
2fa30 72 28 70 4e 65 77 2d 3e 72 53 65 74 75 70 2c 20  r(pNew->rSetup, 
2fa40 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b  pTab->costMult);
2fa50 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49  .        /* TUNI
2fa60 4e 47 3a 20 45 61 63 68 20 69 6e 64 65 78 20 6c  NG: Each index l
2fa70 6f 6f 6b 75 70 20 79 69 65 6c 64 73 20 32 30 20  ookup yields 20 
2fa80 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
2fa90 65 2e 20 20 54 68 69 73 0a 20 20 20 20 20 20 20  e.  This.       
2faa0 20 2a 2a 20 69 73 20 6d 6f 72 65 20 74 68 61 6e   ** is more than
2fab0 20 74 68 65 20 75 73 75 61 6c 20 67 75 65 73 73   the usual guess
2fac0 20 6f 66 20 31 30 20 72 6f 77 73 2c 20 73 69 6e   of 10 rows, sin
2fad0 63 65 20 77 65 20 68 61 76 65 20 6e 6f 20 77 61  ce we have no wa
2fae0 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  y.        ** of 
2faf0 6b 6e 6f 77 69 6e 67 20 68 6f 77 20 73 65 6c 65  knowing how sele
2fb00 63 74 69 76 65 20 74 68 65 20 69 6e 64 65 78 20  ctive the index 
2fb10 77 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79 20  will ultimately 
2fb20 62 65 2e 20 20 49 74 20 77 6f 75 6c 64 0a 20 20  be.  It would.  
2fb30 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 62 65 20        ** not be 
2fb40 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 74 6f 20  unreasonable to 
2fb50 6d 61 6b 65 20 74 68 69 73 20 76 61 6c 75 65 20  make this value 
2fb60 6d 75 63 68 20 6c 61 72 67 65 72 2e 20 2a 2f 0a  much larger. */.
2fb70 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f          pNew->nO
2fb80 75 74 20 3d 20 34 33 3b 20 20 61 73 73 65 72 74  ut = 43;  assert
2fb90 28 20 34 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  ( 43==sqlite3Log
2fba0 45 73 74 28 32 30 29 20 29 3b 0a 20 20 20 20 20  Est(20) );.     
2fbb0 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
2fbc0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
2fbd0 28 72 4c 6f 67 53 69 7a 65 2c 70 4e 65 77 2d 3e  (rLogSize,pNew->
2fbe0 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 70  nOut);.        p
2fbf0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  New->wsFlags = W
2fc00 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 3b  HERE_AUTO_INDEX;
2fc10 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  .        pNew->p
2fc20 72 65 72 65 71 20 3d 20 6d 45 78 74 72 61 20 7c  rereq = mExtra |
2fc30 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
2fc40 67 68 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ght;.        rc 
2fc50 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72  = whereLoopInser
2fc60 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77  t(pBuilder, pNew
2fc70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2fc80 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
2fc90 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d  QLITE_OMIT_AUTOM
2fca0 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 20  ATIC_INDEX */.. 
2fcb0 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c   /* Loop over al
2fcc0 6c 20 69 6e 64 69 63 65 73 0a 20 20 2a 2f 0a 20  l indices.  */. 
2fcd0 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54   for(; rc==SQLIT
2fce0 45 5f 4f 4b 20 26 26 20 70 50 72 6f 62 65 3b 20  E_OK && pProbe; 
2fcf0 70 50 72 6f 62 65 3d 70 50 72 6f 62 65 2d 3e 70  pProbe=pProbe->p
2fd00 4e 65 78 74 2c 20 69 53 6f 72 74 49 64 78 2b 2b  Next, iSortIdx++
2fd10 29 7b 0a 20 20 20 20 69 66 28 20 70 50 72 6f 62  ){.    if( pProb
2fd20 65 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  e->pPartIdxWhere
2fd30 21 3d 30 0a 20 20 20 20 20 26 26 20 21 77 68 65  !=0.     && !whe
2fd40 72 65 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49  reUsablePartialI
2fd50 6e 64 65 78 28 70 53 72 63 2d 3e 69 43 75 72 73  ndex(pSrc->iCurs
2fd60 6f 72 2c 20 70 57 43 2c 20 70 50 72 6f 62 65 2d  or, pWC, pProbe-
2fd70 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 29 20  >pPartIdxWhere) 
2fd80 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
2fd90 65 28 20 70 4e 65 77 2d 3e 69 54 61 62 21 3d 70  e( pNew->iTab!=p
2fda0 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 3b 20  Src->iCursor ); 
2fdb0 20 2f 2a 20 53 65 65 20 74 69 63 6b 65 74 20 5b   /* See ticket [
2fdc0 39 38 64 39 37 33 62 38 66 35 5d 20 2a 2f 0a 20  98d973b8f5] */. 
2fdd0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20       continue;  
2fde0 2f 2a 20 50 61 72 74 69 61 6c 20 69 6e 64 65 78  /* Partial index
2fdf0 20 69 6e 61 70 70 72 6f 70 72 69 61 74 65 20 66   inappropriate f
2fe00 6f 72 20 74 68 69 73 20 71 75 65 72 79 20 2a 2f  or this query */
2fe10 0a 20 20 20 20 7d 0a 20 20 20 20 72 53 69 7a 65  .    }.    rSize
2fe20 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77   = pProbe->aiRow
2fe30 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20 20 20 20 70  LogEst[0];.    p
2fe40 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
2fe50 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
2fe60 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 70  nSkip = 0;.    p
2fe70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b  New->nLTerm = 0;
2fe80 0a 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74  .    pNew->iSort
2fe90 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  Idx = 0;.    pNe
2fea0 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20  w->rSetup = 0;. 
2feb0 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20     pNew->prereq 
2fec0 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20 20 70 4e  = mExtra;.    pN
2fed0 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65  ew->nOut = rSize
2fee0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74  ;.    pNew->u.bt
2fef0 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 50 72  ree.pIndex = pPr
2ff00 6f 62 65 3b 0a 20 20 20 20 62 20 3d 20 69 6e 64  obe;.    b = ind
2ff10 65 78 4d 69 67 68 74 48 65 6c 70 57 69 74 68 4f  exMightHelpWithO
2ff20 72 64 65 72 42 79 28 70 42 75 69 6c 64 65 72 2c  rderBy(pBuilder,
2ff30 20 70 50 72 6f 62 65 2c 20 70 53 72 63 2d 3e 69   pProbe, pSrc->i
2ff40 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 2f 2a 20  Cursor);.    /* 
2ff50 54 68 65 20 4f 4e 45 50 41 53 53 5f 44 45 53 49  The ONEPASS_DESI
2ff60 52 45 44 20 66 6c 61 67 73 20 6e 65 76 65 72 20  RED flags never 
2ff70 6f 63 63 75 72 73 20 74 6f 67 65 74 68 65 72 20  occurs together 
2ff80 77 69 74 68 20 4f 52 44 45 52 20 42 59 20 2a 2f  with ORDER BY */
2ff90 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 57  .    assert( (pW
2ffa0 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
2ffb0 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
2ffc0 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20  _DESIRED)==0 || 
2ffd0 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  b==0 );.    if( 
2ffe0 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20  pProbe->tnum<=0 
2fff0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 74 65  ){.      /* Inte
30000 67 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79 20  ger primary key 
30010 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 70  index */.      p
30020 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  New->wsFlags = W
30030 48 45 52 45 5f 49 50 4b 3b 0a 0a 20 20 20 20 20  HERE_IPK;..     
30040 20 2f 2a 20 46 75 6c 6c 20 74 61 62 6c 65 20 73   /* Full table s
30050 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65  can */.      pNe
30060 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20  w->iSortIdx = b 
30070 3f 20 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a  ? iSortIdx : 0;.
30080 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a        /* TUNING:
30090 20 43 6f 73 74 20 6f 66 20 66 75 6c 6c 20 74 61   Cost of full ta
300a0 62 6c 65 20 73 63 61 6e 20 69 73 20 28 4e 2a 33  ble scan is (N*3
300b0 2e 30 29 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e  .0). */.      pN
300c0 65 77 2d 3e 72 52 75 6e 20 3d 20 72 53 69 7a 65  ew->rRun = rSize
300d0 20 2b 20 31 36 3b 0a 20 20 20 20 20 20 41 70 70   + 16;.      App
300e0 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72  lyCostMultiplier
300f0 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 54 61  (pNew->rRun, pTa
30100 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20  b->costMult);.  
30110 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74      whereLoopOut
30120 70 75 74 41 64 6a 75 73 74 28 70 57 43 2c 20 70  putAdjust(pWC, p
30130 4e 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20  New, rSize);.   
30140 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
30150 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72  pInsert(pBuilder
30160 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 70  , pNew);.      p
30170 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a  New->nOut = rSiz
30180 65 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  e;.      if( rc 
30190 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c  ) break;.    }el
301a0 73 65 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73  se{.      Bitmas
301b0 6b 20 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  k m;.      if( p
301c0 50 72 6f 62 65 2d 3e 69 73 43 6f 76 65 72 69 6e  Probe->isCoverin
301d0 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  g ){.        pNe
301e0 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  w->wsFlags = WHE
301f0 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48  RE_IDX_ONLY | WH
30200 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20  ERE_INDEXED;.   
30210 20 20 20 20 20 6d 20 3d 20 30 3b 0a 20 20 20 20       m = 0;.    
30220 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
30230 20 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73   m = pSrc->colUs
30240 65 64 20 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49  ed & ~columnsInI
30250 6e 64 65 78 28 70 50 72 6f 62 65 29 3b 0a 20 20  ndex(pProbe);.  
30260 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
30270 61 67 73 20 3d 20 28 6d 3d 3d 30 29 20 3f 20 28  ags = (m==0) ? (
30280 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57  WHERE_IDX_ONLY|W
30290 48 45 52 45 5f 49 4e 44 45 58 45 44 29 20 3a 20  HERE_INDEXED) : 
302a0 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20  WHERE_INDEXED;. 
302b0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
302c0 20 46 75 6c 6c 20 73 63 61 6e 20 76 69 61 20 69   Full scan via i
302d0 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 66  ndex */.      if
302e0 28 20 62 0a 20 20 20 20 20 20 20 7c 7c 20 21 48  ( b.       || !H
302f0 61 73 52 6f 77 69 64 28 70 54 61 62 29 0a 20 20  asRowid(pTab).  
30300 20 20 20 20 20 7c 7c 20 28 20 6d 3d 3d 30 0a 20       || ( m==0. 
30310 20 20 20 20 20 20 20 20 26 26 20 70 50 72 6f 62          && pProb
30320 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30  e->bUnordered==0
30330 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 50  .         && (pP
30340 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 3c 70  robe->szIdxRow<p
30350 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 29 0a 20  Tab->szTabRow). 
30360 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49 6e          && (pWIn
30370 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
30380 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
30390 45 53 49 52 45 44 29 3d 3d 30 0a 20 20 20 20 20  ESIRED)==0.     
303a0 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 47 6c      && sqlite3Gl
303b0 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43  obalConfig.bUseC
303c0 69 73 0a 20 20 20 20 20 20 20 20 20 26 26 20 4f  is.         && O
303d0 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
303e0 65 64 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  ed(pWInfo->pPars
303f0 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f  e->db, SQLITE_Co
30400 76 65 72 49 64 78 53 63 61 6e 29 0a 20 20 20 20  verIdxScan).    
30410 20 20 20 20 20 20 29 0a 20 20 20 20 20 20 29 7b        ).      ){
30420 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69  .        pNew->i
30430 53 6f 72 74 49 64 78 20 3d 20 62 20 3f 20 69 53  SortIdx = b ? iS
30440 6f 72 74 49 64 78 20 3a 20 30 3b 0a 0a 20 20 20  ortIdx : 0;..   
30450 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74       /* The cost
30460 20 6f 66 20 76 69 73 69 74 69 6e 67 20 74 68 65   of visiting the
30470 20 69 6e 64 65 78 20 72 6f 77 73 20 69 73 20 4e   index rows is N
30480 2a 4b 2c 20 77 68 65 72 65 20 4b 20 69 73 0a 20  *K, where K is. 
30490 20 20 20 20 20 20 20 2a 2a 20 62 65 74 77 65 65         ** betwee
304a0 6e 20 31 2e 31 20 61 6e 64 20 33 2e 30 2c 20 64  n 1.1 and 3.0, d
304b0 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20  epending on the 
304c0 72 65 6c 61 74 69 76 65 20 73 69 7a 65 73 20 6f  relative sizes o
304d0 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  f the.        **
304e0 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c 65   index and table
304f0 20 72 6f 77 73 2e 20 49 66 20 74 68 69 73 20 69   rows. If this i
30500 73 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67  s a non-covering
30510 20 69 6e 64 65 78 20 73 63 61 6e 2c 0a 20 20 20   index scan,.   
30520 20 20 20 20 20 2a 2a 20 61 6c 73 6f 20 61 64 64       ** also add
30530 20 74 68 65 20 63 6f 73 74 20 6f 66 20 76 69 73   the cost of vis
30540 69 74 69 6e 67 20 74 61 62 6c 65 20 72 6f 77 73  iting table rows
30550 20 28 4e 2a 33 2e 30 29 2e 20 20 2a 2f 0a 20 20   (N*3.0).  */.  
30560 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e        pNew->rRun
30570 20 3d 20 72 53 69 7a 65 20 2b 20 31 20 2b 20 28   = rSize + 1 + (
30580 31 35 2a 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78  15*pProbe->szIdx
30590 52 6f 77 29 2f 70 54 61 62 2d 3e 73 7a 54 61 62  Row)/pTab->szTab
305a0 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Row;.        if(
305b0 20 6d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   m!=0 ){.       
305c0 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
305d0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
305e0 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 72 53 69  (pNew->rRun, rSi
305f0 7a 65 2b 31 36 29 3b 0a 20 20 20 20 20 20 20 20  ze+16);.        
30600 7d 0a 20 20 20 20 20 20 20 20 41 70 70 6c 79 43  }.        ApplyC
30610 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e  ostMultiplier(pN
30620 65 77 2d 3e 72 52 75 6e 2c 20 70 54 61 62 2d 3e  ew->rRun, pTab->
30630 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20 20 20  costMult);.     
30640 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70     whereLoopOutp
30650 75 74 41 64 6a 75 73 74 28 70 57 43 2c 20 70 4e  utAdjust(pWC, pN
30660 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20 20  ew, rSize);.    
30670 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
30680 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
30690 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  r, pNew);.      
306a0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72    pNew->nOut = r
306b0 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Size;.        if
306c0 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20  ( rc ) break;.  
306d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
306e0 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
306f0 64 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75  ddBtreeIndex(pBu
30700 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72  ilder, pSrc, pPr
30710 6f 62 65 2c 20 30 29 3b 0a 23 69 66 64 65 66 20  obe, 0);.#ifdef 
30720 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
30730 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20  AT3_OR_STAT4.   
30740 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f   sqlite3Stat4Pro
30750 62 65 46 72 65 65 28 70 42 75 69 6c 64 65 72 2d  beFree(pBuilder-
30760 3e 70 52 65 63 29 3b 0a 20 20 20 20 70 42 75 69  >pRec);.    pBui
30770 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20  lder->nRecValid 
30780 3d 20 30 3b 0a 20 20 20 20 70 42 75 69 6c 64 65  = 0;.    pBuilde
30790 72 2d 3e 70 52 65 63 20 3d 20 30 3b 0a 23 65 6e  r->pRec = 0;.#en
307a0 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  dif..    /* If t
307b0 68 65 72 65 20 77 61 73 20 61 6e 20 49 4e 44 45  here was an INDE
307c0 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74  XED BY clause, t
307d0 68 65 6e 20 6f 6e 6c 79 20 74 68 61 74 20 6f 6e  hen only that on
307e0 65 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20 2a  e index is.    *
307f0 2a 20 63 6f 6e 73 69 64 65 72 65 64 2e 20 2a 2f  * considered. */
30800 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 70  .    if( pSrc->p
30810 49 6e 64 65 78 20 29 20 62 72 65 61 6b 3b 0a 20  Index ) break;. 
30820 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
30830 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
30840 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
30850 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c  BLE./*.** Add al
30860 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  l WhereLoop obje
30870 63 74 73 20 66 6f 72 20 61 20 74 61 62 6c 65 20  cts for a table 
30880 6f 66 20 74 68 65 20 6a 6f 69 6e 20 69 64 65 6e  of the join iden
30890 74 69 66 69 65 64 20 62 79 0a 2a 2a 20 70 42 75  tified by.** pBu
308a0 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61  ilder->pNew->iTa
308b0 62 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20 69  b.  That table i
308c0 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
308d0 62 65 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  be a virtual tab
308e0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
308f0 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69  t whereLoopAddVi
30900 72 74 75 61 6c 28 0a 20 20 57 68 65 72 65 4c 6f  rtual(.  WhereLo
30910 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
30920 64 65 72 2c 20 20 2f 2a 20 57 48 45 52 45 20 63  der,  /* WHERE c
30930 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f  lause informatio
30940 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d  n */.  Bitmask m
30950 45 78 74 72 61 0a 29 7b 0a 20 20 57 68 65 72 65  Extra.){.  Where
30960 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20  Info *pWInfo;   
30970 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45          /* WHERE
30980 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65 78   analysis contex
30990 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  t */.  Parse *pP
309a0 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  arse;           
309b0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
309c0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
309d0 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
309e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
309f0 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
30a00 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
30a10 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b  List_item *pSrc;
30a20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
30a30 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65  lause term to se
30a40 61 72 63 68 20 2a 2f 0a 20 20 54 61 62 6c 65 20  arch */.  Table 
30a50 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33  *pTab;.  sqlite3
30a60 20 2a 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f   *db;.  sqlite3_
30a70 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78  index_info *pIdx
30a80 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 73  Info;.  struct s
30a90 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
30aa0 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e  straint *pIdxCon
30ab0 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  s;.  struct sqli
30ac0 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
30ad0 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61  aint_usage *pUsa
30ae0 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  ge;.  WhereTerm 
30af0 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 2c  *pTerm;.  int i,
30b00 20 6a 3b 0a 20 20 69 6e 74 20 69 54 65 72 6d 2c   j;.  int iTerm,
30b10 20 6d 78 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e   mxTerm;.  int n
30b20 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69 6e  Constraint;.  in
30b30 74 20 73 65 65 6e 49 6e 20 3d 20 30 3b 20 20 20  t seenIn = 0;   
30b40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
30b50 75 65 20 69 66 20 61 6e 20 49 4e 20 6f 70 65 72  ue if an IN oper
30b60 61 74 6f 72 20 69 73 20 73 65 65 6e 20 2a 2f 0a  ator is seen */.
30b70 20 20 69 6e 74 20 73 65 65 6e 56 61 72 20 3d 20    int seenVar = 
30b80 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
30b90 2a 20 54 72 75 65 20 69 66 20 61 20 6e 6f 6e 2d  * True if a non-
30ba0 63 6f 6e 73 74 61 6e 74 20 63 6f 6e 73 74 72 61  constant constra
30bb0 69 6e 74 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20  int is seen */. 
30bc0 20 69 6e 74 20 69 50 68 61 73 65 3b 20 20 20 20   int iPhase;    
30bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30be0 20 30 3a 20 63 6f 6e 73 74 20 77 2f 6f 20 49 4e   0: const w/o IN
30bf0 2c 20 31 3a 20 63 6f 6e 73 74 2c 20 32 3a 20 6e  , 1: const, 2: n
30c00 6f 20 49 4e 2c 20 20 32 3a 20 49 4e 20 2a 2f 0a  o IN,  2: IN */.
30c10 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65    WhereLoop *pNe
30c20 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  w;.  int rc = SQ
30c30 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 70 57 49 6e  LITE_OK;..  pWIn
30c40 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  fo = pBuilder->p
30c50 57 49 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65 20  WInfo;.  pParse 
30c60 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
30c70 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
30c80 3e 64 62 3b 0a 20 20 70 57 43 20 3d 20 70 42 75  >db;.  pWC = pBu
30c90 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70 4e  ilder->pWC;.  pN
30ca0 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ew = pBuilder->p
30cb0 4e 65 77 3b 0a 20 20 70 53 72 63 20 3d 20 26 70  New;.  pSrc = &p
30cc0 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
30cd0 3e 61 5b 70 4e 65 77 2d 3e 69 54 61 62 5d 3b 0a  >a[pNew->iTab];.
30ce0 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 70    pTab = pSrc->p
30cf0 54 61 62 3b 0a 20 20 61 73 73 65 72 74 28 20 49  Tab;.  assert( I
30d00 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
30d10 3b 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 61  ;.  pIdxInfo = a
30d20 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f  llocateIndexInfo
30d30 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70 53  (pParse, pWC, pS
30d40 72 63 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f  rc, pBuilder->pO
30d50 72 64 65 72 42 79 29 3b 0a 20 20 69 66 28 20 70  rderBy);.  if( p
30d60 49 64 78 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74  IdxInfo==0 ) ret
30d70 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
30d80 3b 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71  ;.  pNew->prereq
30d90 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 72 53   = 0;.  pNew->rS
30da0 65 74 75 70 20 3d 20 30 3b 0a 20 20 70 4e 65 77  etup = 0;.  pNew
30db0 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
30dc0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 3b 0a  E_VIRTUALTABLE;.
30dd0 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
30de0 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74   0;.  pNew->u.vt
30df0 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b  ab.needFree = 0;
30e00 0a 20 20 70 55 73 61 67 65 20 3d 20 70 49 64 78  .  pUsage = pIdx
30e10 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
30e20 74 55 73 61 67 65 3b 0a 20 20 6e 43 6f 6e 73 74  tUsage;.  nConst
30e30 72 61 69 6e 74 20 3d 20 70 49 64 78 49 6e 66 6f  raint = pIdxInfo
30e40 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20  ->nConstraint;. 
30e50 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65   if( whereLoopRe
30e60 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 6e  size(db, pNew, n
30e70 43 6f 6e 73 74 72 61 69 6e 74 29 20 29 7b 0a 20  Constraint) ){. 
30e80 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
30e90 28 64 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a  (db, pIdxInfo);.
30ea0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
30eb0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20  E_NOMEM;.  }..  
30ec0 66 6f 72 28 69 50 68 61 73 65 3d 30 3b 20 69 50  for(iPhase=0; iP
30ed0 68 61 73 65 3c 3d 33 3b 20 69 50 68 61 73 65 2b  hase<=3; iPhase+
30ee0 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 73 65 65  +){.    if( !see
30ef0 6e 49 6e 20 26 26 20 28 69 50 68 61 73 65 26 31  nIn && (iPhase&1
30f00 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 50  )!=0 ){.      iP
30f10 68 61 73 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66  hase++;.      if
30f20 28 20 69 50 68 61 73 65 3e 33 20 29 20 62 72 65  ( iPhase>3 ) bre
30f30 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
30f40 28 20 21 73 65 65 6e 56 61 72 20 26 26 20 69 50  ( !seenVar && iP
30f50 68 61 73 65 3e 31 20 29 20 62 72 65 61 6b 3b 0a  hase>1 ) break;.
30f60 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a      pIdxCons = *
30f70 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
30f80 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
30f90 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43  **)&pIdxInfo->aC
30fa0 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 66  onstraint;.    f
30fb0 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e  or(i=0; i<pIdxIn
30fc0 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->nConstraint;
30fd0 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b   i++, pIdxCons++
30fe0 29 7b 0a 20 20 20 20 20 20 6a 20 3d 20 70 49 64  ){.      j = pId
30ff0 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73  xCons->iTermOffs
31000 65 74 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20  et;.      pTerm 
31010 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20  = &pWC->a[j];.  
31020 20 20 20 20 73 77 69 74 63 68 28 20 69 50 68 61      switch( iPha
31030 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61  se ){.        ca
31040 73 65 20 30 3a 20 20 20 20 2f 2a 20 43 6f 6e 73  se 0:    /* Cons
31050 74 61 6e 74 73 20 77 69 74 68 6f 75 74 20 49 4e  tants without IN
31060 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
31070 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d         pIdxCons-
31080 3e 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20  >usable = 0;.   
31090 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72         if( (pTer
310a0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
310b0 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20  O_IN)!=0 ){.    
310c0 20 20 20 20 20 20 20 20 73 65 65 6e 49 6e 20 3d          seenIn =
310d0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
310e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54            if( pT
310f0 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
31100 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
31110 20 20 20 73 65 65 6e 56 61 72 20 3d 20 31 3b 0a     seenVar = 1;.
31120 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
31130 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
31140 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 3d 3d  rator & WO_IN)==
31150 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
31160 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c   pIdxCons->usabl
31170 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  e = 1;.         
31180 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65   }.          bre
31190 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
311a0 20 31 3a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 61   1:    /* Consta
311b0 6e 74 73 20 77 69 74 68 20 49 4e 20 6f 70 65 72  nts with IN oper
311c0 61 74 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 20  ators */.       
311d0 20 20 20 61 73 73 65 72 74 28 20 73 65 65 6e 49     assert( seenI
311e0 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  n );.          p
311f0 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20  IdxCons->usable 
31200 3d 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  = (pTerm->prereq
31210 52 69 67 68 74 3d 3d 30 29 3b 0a 20 20 20 20 20  Right==0);.     
31220 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
31230 20 20 20 20 63 61 73 65 20 32 3a 20 20 20 20 2f      case 2:    /
31240 2a 20 56 61 72 69 61 62 6c 65 73 20 77 69 74 68  * Variables with
31250 6f 75 74 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20  out IN */.      
31260 20 20 20 20 61 73 73 65 72 74 28 20 73 65 65 6e      assert( seen
31270 56 61 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Var );.         
31280 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c   pIdxCons->usabl
31290 65 20 3d 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  e = (pTerm->eOpe
312a0 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 3d 3d  rator & WO_IN)==
312b0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  0;.          bre
312c0 61 6b 3b 0a 20 20 20 20 20 20 20 20 64 65 66 61  ak;.        defa
312d0 75 6c 74 3a 20 20 20 2f 2a 20 56 61 72 69 61 62  ult:   /* Variab
312e0 6c 65 73 20 77 69 74 68 20 49 4e 20 2a 2f 0a 20  les with IN */. 
312f0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
31300 20 73 65 65 6e 56 61 72 20 26 26 20 73 65 65 6e   seenVar && seen
31310 49 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  In );.          
31320 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65  pIdxCons->usable
31330 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
31340 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
31350 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28     }.    memset(
31360 70 55 73 61 67 65 2c 20 30 2c 20 73 69 7a 65 6f  pUsage, 0, sizeo
31370 66 28 70 55 73 61 67 65 5b 30 5d 29 2a 70 49 64  f(pUsage[0])*pId
31380 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69  xInfo->nConstrai
31390 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  nt);.    if( pId
313a0 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
313b0 65 49 64 78 53 74 72 20 29 20 73 71 6c 69 74 65  eIdxStr ) sqlite
313c0 33 5f 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d  3_free(pIdxInfo-
313d0 3e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 70 49  >idxStr);.    pI
313e0 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20 3d  dxInfo->idxStr =
313f0 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f   0;.    pIdxInfo
31400 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20  ->idxNum = 0;.  
31410 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64    pIdxInfo->need
31420 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20 30  ToFreeIdxStr = 0
31430 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  ;.    pIdxInfo->
31440 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20  orderByConsumed 
31450 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66  = 0;.    pIdxInf
31460 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  o->estimatedCost
31470 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42   = SQLITE_BIG_DB
31480 4c 20 2f 20 28 64 6f 75 62 6c 65 29 32 3b 0a 20  L / (double)2;. 
31490 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74     pIdxInfo->est
314a0 69 6d 61 74 65 64 52 6f 77 73 20 3d 20 32 35 3b  imatedRows = 25;
314b0 0a 20 20 20 20 72 63 20 3d 20 76 74 61 62 42 65  .    rc = vtabBe
314c0 73 74 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  stIndex(pParse, 
314d0 70 54 61 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b  pTab, pIdxInfo);
314e0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
314f0 74 6f 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56  to whereLoopAddV
31500 74 61 62 5f 65 78 69 74 3b 0a 20 20 20 20 70 49  tab_exit;.    pI
31510 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63  dxCons = *(struc
31520 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
31530 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49  constraint**)&pI
31540 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
31550 69 6e 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  int;.    pNew->p
31560 72 65 72 65 71 20 3d 20 6d 45 78 74 72 61 3b 0a  rereq = mExtra;.
31570 20 20 20 20 6d 78 54 65 72 6d 20 3d 20 2d 31 3b      mxTerm = -1;
31580 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
31590 77 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43 6f 6e 73  w->nLSlot>=nCons
315a0 74 72 61 69 6e 74 20 29 3b 0a 20 20 20 20 66 6f  traint );.    fo
315b0 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72  r(i=0; i<nConstr
315c0 61 69 6e 74 3b 20 69 2b 2b 29 20 70 4e 65 77 2d  aint; i++) pNew-
315d0 3e 61 4c 54 65 72 6d 5b 69 5d 20 3d 20 30 3b 0a  >aLTerm[i] = 0;.
315e0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62      pNew->u.vtab
315f0 2e 6f 6d 69 74 4d 61 73 6b 20 3d 20 30 3b 0a 20  .omitMask = 0;. 
31600 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
31610 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20  onstraint; i++, 
31620 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20  pIdxCons++){.   
31630 20 20 20 69 66 28 20 28 69 54 65 72 6d 20 3d 20     if( (iTerm = 
31640 70 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e  pUsage[i].argvIn
31650 64 65 78 20 2d 20 31 29 3e 3d 30 20 29 7b 0a 20  dex - 1)>=0 ){. 
31660 20 20 20 20 20 20 20 6a 20 3d 20 70 49 64 78 43         j = pIdxC
31670 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74  ons->iTermOffset
31680 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 54  ;.        if( iT
31690 65 72 6d 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74  erm>=nConstraint
316a0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6a 3c 30  .         || j<0
316b0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6a 3e 3d  .         || j>=
316c0 70 57 43 2d 3e 6e 54 65 72 6d 0a 20 20 20 20 20  pWC->nTerm.     
316d0 20 20 20 20 7c 7c 20 70 4e 65 77 2d 3e 61 4c 54      || pNew->aLT
316e0 65 72 6d 5b 69 54 65 72 6d 5d 21 3d 30 0a 20 20  erm[iTerm]!=0.  
316f0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
31700 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
31710 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20  RROR;.          
31720 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
31730 70 50 61 72 73 65 2c 20 22 25 73 2e 78 42 65 73  pParse, "%s.xBes
31740 74 49 6e 64 65 78 28 29 20 6d 61 6c 66 75 6e 63  tIndex() malfunc
31750 74 69 6f 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  tion", pTab->zNa
31760 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  me);.          g
31770 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  oto whereLoopAdd
31780 56 74 61 62 5f 65 78 69 74 3b 0a 20 20 20 20 20  Vtab_exit;.     
31790 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73     }.        tes
317a0 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d 6e 43  tcase( iTerm==nC
317b0 6f 6e 73 74 72 61 69 6e 74 2d 31 20 29 3b 0a 20  onstraint-1 );. 
317c0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
317d0 20 6a 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20   j==0 );.       
317e0 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 70 57   testcase( j==pW
317f0 43 2d 3e 6e 54 65 72 6d 2d 31 20 29 3b 0a 20 20  C->nTerm-1 );.  
31800 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
31810 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20  WC->a[j];.      
31820 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 7c    pNew->prereq |
31830 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52  = pTerm->prereqR
31840 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73  ight;.        as
31850 73 65 72 74 28 20 69 54 65 72 6d 3c 70 4e 65 77  sert( iTerm<pNew
31860 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20  ->nLSlot );.    
31870 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d      pNew->aLTerm
31880 5b 69 54 65 72 6d 5d 20 3d 20 70 54 65 72 6d 3b  [iTerm] = pTerm;
31890 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 54 65  .        if( iTe
318a0 72 6d 3e 6d 78 54 65 72 6d 20 29 20 6d 78 54 65  rm>mxTerm ) mxTe
318b0 72 6d 20 3d 20 69 54 65 72 6d 3b 0a 20 20 20 20  rm = iTerm;.    
318c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54      testcase( iT
318d0 65 72 6d 3d 3d 31 35 20 29 3b 0a 20 20 20 20 20  erm==15 );.     
318e0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65     testcase( iTe
318f0 72 6d 3d 3d 31 36 20 29 3b 0a 20 20 20 20 20 20  rm==16 );.      
31900 20 20 69 66 28 20 69 54 65 72 6d 3c 31 36 20 26    if( iTerm<16 &
31910 26 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74  & pUsage[i].omit
31920 20 29 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e   ) pNew->u.vtab.
31930 6f 6d 69 74 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69  omitMask |= 1<<i
31940 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66  Term;.        if
31950 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
31960 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20  tor & WO_IN)!=0 
31970 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
31980 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 3d   pUsage[i].omit=
31990 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
319a0 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65    /* Do not atte
319b0 6d 70 74 20 74 6f 20 75 73 65 20 61 6e 20 49 4e  mpt to use an IN
319c0 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 66 20 74   constraint if t
319d0 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
319e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
319f0 73 61 79 73 20 74 68 61 74 20 74 68 65 20 65 71  says that the eq
31a00 75 69 76 61 6c 65 6e 74 20 45 51 20 63 6f 6e 73  uivalent EQ cons
31a10 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65  traint cannot be
31a20 20 73 61 66 65 6c 79 20 6f 6d 69 74 74 65 64 2e   safely omitted.
31a30 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
31a40 49 66 20 77 65 20 64 6f 20 61 74 74 65 6d 70 74  If we do attempt
31a50 20 74 6f 20 75 73 65 20 73 75 63 68 20 61 20 63   to use such a c
31a60 6f 6e 73 74 72 61 69 6e 74 2c 20 73 6f 6d 65 20  onstraint, some 
31a70 72 6f 77 73 20 6d 69 67 68 74 20 62 65 0a 20 20  rows might be.  
31a80 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65 70            ** rep
31a90 65 61 74 65 64 20 69 6e 20 74 68 65 20 6f 75 74  eated in the out
31aa0 70 75 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  put. */.        
31ab0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
31ac0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
31ad0 20 2f 2a 20 41 20 76 69 72 74 75 61 6c 20 74 61   /* A virtual ta
31ae0 62 6c 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73  ble that is cons
31af0 74 72 61 69 6e 65 64 20 62 79 20 61 6e 20 49 4e  trained by an IN
31b00 20 63 6c 61 75 73 65 20 6d 61 79 20 6e 6f 74 0a   clause may not.
31b10 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e            ** con
31b20 73 75 6d 65 20 74 68 65 20 4f 52 44 45 52 20 42  sume the ORDER B
31b30 59 20 63 6c 61 75 73 65 20 62 65 63 61 75 73 65  Y clause because
31b40 20 28 31 29 20 74 68 65 20 6f 72 64 65 72 20 6f   (1) the order o
31b50 66 20 49 4e 20 74 65 72 6d 73 0a 20 20 20 20 20  f IN terms.     
31b60 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6e       ** is not n
31b70 65 63 65 73 73 61 72 69 6c 79 20 72 65 6c 61 74  ecessarily relat
31b80 65 64 20 74 6f 20 74 68 65 20 6f 72 64 65 72 20  ed to the order 
31b90 6f 66 20 6f 75 74 70 75 74 20 74 65 72 6d 73 20  of output terms 
31ba0 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  and.          **
31bb0 20 28 32 29 20 4d 75 6c 74 69 70 6c 65 20 6f 75   (2) Multiple ou
31bc0 74 70 75 74 73 20 66 72 6f 6d 20 61 20 73 69 6e  tputs from a sin
31bd0 67 6c 65 20 49 4e 20 76 61 6c 75 65 20 77 69 6c  gle IN value wil
31be0 6c 20 6e 6f 74 20 6d 65 72 67 65 0a 20 20 20 20  l not merge.    
31bf0 20 20 20 20 20 20 2a 2a 20 74 6f 67 65 74 68 65        ** togethe
31c00 72 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  r.  */.         
31c10 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72   pIdxInfo->order
31c20 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a  ByConsumed = 0;.
31c30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31c40 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
31c50 69 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29  i>=nConstraint )
31c60 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c  {.      pNew->nL
31c70 54 65 72 6d 20 3d 20 6d 78 54 65 72 6d 2b 31 3b  Term = mxTerm+1;
31c80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
31c90 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3c 3d 70 4e 65  New->nLTerm<=pNe
31ca0 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20  w->nLSlot );.   
31cb0 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e     pNew->u.vtab.
31cc0 69 64 78 4e 75 6d 20 3d 20 70 49 64 78 49 6e 66  idxNum = pIdxInf
31cd0 6f 2d 3e 69 64 78 4e 75 6d 3b 0a 20 20 20 20 20  o->idxNum;.     
31ce0 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65   pNew->u.vtab.ne
31cf0 65 64 46 72 65 65 20 3d 20 70 49 64 78 49 6e 66  edFree = pIdxInf
31d00 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
31d10 53 74 72 3b 0a 20 20 20 20 20 20 70 49 64 78 49  Str;.      pIdxI
31d20 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
31d30 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 20  dxStr = 0;.     
31d40 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64   pNew->u.vtab.id
31d50 78 53 74 72 20 3d 20 70 49 64 78 49 6e 66 6f 2d  xStr = pIdxInfo-
31d60 3e 69 64 78 53 74 72 3b 0a 20 20 20 20 20 20 70  >idxStr;.      p
31d70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72  New->u.vtab.isOr
31d80 64 65 72 65 64 20 3d 20 28 69 38 29 28 70 49 64  dered = (i8)(pId
31d90 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f  xInfo->orderByCo
31da0 6e 73 75 6d 65 64 20 3f 0a 20 20 20 20 20 20 20  nsumed ?.       
31db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
31dd0 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42  IdxInfo->nOrderB
31de0 79 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 70 4e  y : 0);.      pN
31df0 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a  ew->rSetup = 0;.
31e00 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e        pNew->rRun
31e10 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
31e20 46 72 6f 6d 44 6f 75 62 6c 65 28 70 49 64 78 49  FromDouble(pIdxI
31e30 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  nfo->estimatedCo
31e40 73 74 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  st);.      pNew-
31e50 3e 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 4c  >nOut = sqlite3L
31e60 6f 67 45 73 74 28 70 49 64 78 49 6e 66 6f 2d 3e  ogEst(pIdxInfo->
31e70 65 73 74 69 6d 61 74 65 64 52 6f 77 73 29 3b 0a  estimatedRows);.
31e80 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 49        whereLoopI
31e90 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
31ea0 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 69 66 28  pNew);.      if(
31eb0 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65   pNew->u.vtab.ne
31ec0 65 64 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20  edFree ){.      
31ed0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
31ee0 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53  New->u.vtab.idxS
31ef0 74 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  tr);.        pNe
31f00 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  w->u.vtab.needFr
31f10 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ee = 0;.      }.
31f20 20 20 20 20 7d 0a 20 20 7d 20 20 0a 0a 77 68 65      }.  }  ..whe
31f30 72 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f 65 78  reLoopAddVtab_ex
31f40 69 74 3a 0a 20 20 69 66 28 20 70 49 64 78 49 6e  it:.  if( pIdxIn
31f50 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
31f60 78 53 74 72 20 29 20 73 71 6c 69 74 65 33 5f 66  xStr ) sqlite3_f
31f70 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64  ree(pIdxInfo->id
31f80 78 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  xStr);.  sqlite3
31f90 44 62 46 72 65 65 28 64 62 2c 20 70 49 64 78 49  DbFree(db, pIdxI
31fa0 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  nfo);.  return r
31fb0 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
31fc0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
31fd0 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a  ALTABLE */../*.*
31fe0 2a 20 41 64 64 20 57 68 65 72 65 4c 6f 6f 70 20  * Add WhereLoop 
31ff0 65 6e 74 72 69 65 73 20 74 6f 20 68 61 6e 64 6c  entries to handl
32000 65 20 4f 52 20 74 65 72 6d 73 2e 20 20 54 68 69  e OR terms.  Thi
32010 73 20 77 6f 72 6b 73 20 66 6f 72 20 65 69 74 68  s works for eith
32020 65 72 0a 2a 2a 20 62 74 72 65 65 73 20 6f 72 20  er.** btrees or 
32030 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 0a  virtual tables..
32040 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
32050 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 57 68 65  ereLoopAddOr(Whe
32060 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
32070 42 75 69 6c 64 65 72 2c 20 42 69 74 6d 61 73 6b  Builder, Bitmask
32080 20 6d 45 78 74 72 61 29 7b 0a 20 20 57 68 65 72   mExtra){.  Wher
32090 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20  eInfo *pWInfo = 
320a0 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
320b0 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  ;.  WhereClause 
320c0 2a 70 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f  *pWC;.  WhereLoo
320d0 70 20 2a 70 4e 65 77 3b 0a 20 20 57 68 65 72 65  p *pNew;.  Where
320e0 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 57  Term *pTerm, *pW
320f0 43 45 6e 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  CEnd;.  int rc =
32100 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
32110 74 20 69 43 75 72 3b 0a 20 20 57 68 65 72 65 43  t iCur;.  WhereC
32120 6c 61 75 73 65 20 74 65 6d 70 57 43 3b 0a 20 20  lause tempWC;.  
32130 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
32140 20 73 53 75 62 42 75 69 6c 64 3b 0a 20 20 57 68   sSubBuild;.  Wh
32150 65 72 65 4f 72 53 65 74 20 73 53 75 6d 2c 20 73  ereOrSet sSum, s
32160 43 75 72 3b 0a 20 20 73 74 72 75 63 74 20 53 72  Cur;.  struct Sr
32170 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
32180 6d 3b 0a 20 20 0a 20 20 70 57 43 20 3d 20 70 42  m;.  .  pWC = pB
32190 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70  uilder->pWC;.  p
321a0 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b  WCEnd = pWC->a +
321b0 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 70   pWC->nTerm;.  p
321c0 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  New = pBuilder->
321d0 70 4e 65 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26  pNew;.  memset(&
321e0 73 53 75 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  sSum, 0, sizeof(
321f0 73 53 75 6d 29 29 3b 0a 20 20 70 49 74 65 6d 20  sSum));.  pItem 
32200 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
32210 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54  st->a + pNew->iT
32220 61 62 3b 0a 20 20 69 43 75 72 20 3d 20 70 49 74  ab;.  iCur = pIt
32230 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 0a 20 20  em->iCursor;..  
32240 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
32250 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 20 26  ; pTerm<pWCEnd &
32260 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
32270 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69   pTerm++){.    i
32280 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
32290 61 74 6f 72 20 26 20 57 4f 5f 4f 52 29 21 3d 30  ator & WO_OR)!=0
322a0 0a 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d  .     && (pTerm-
322b0 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65  >u.pOrInfo->inde
322c0 78 61 62 6c 65 20 26 20 70 4e 65 77 2d 3e 6d 61  xable & pNew->ma
322d0 73 6b 53 65 6c 66 29 21 3d 30 20 0a 20 20 20 20  skSelf)!=0 .    
322e0 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 43 6c  ){.      WhereCl
322f0 61 75 73 65 20 2a 20 63 6f 6e 73 74 20 70 4f 72  ause * const pOr
32300 57 43 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70  WC = &pTerm->u.p
32310 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20  OrInfo->wc;.    
32320 20 20 57 68 65 72 65 54 65 72 6d 20 2a 20 63 6f    WhereTerm * co
32330 6e 73 74 20 70 4f 72 57 43 45 6e 64 20 3d 20 26  nst pOrWCEnd = &
32340 70 4f 72 57 43 2d 3e 61 5b 70 4f 72 57 43 2d 3e  pOrWC->a[pOrWC->
32350 6e 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 57 68  nTerm];.      Wh
32360 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d  ereTerm *pOrTerm
32370 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e 63 65  ;.      int once
32380 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 1;.      int 
32390 69 2c 20 6a 3b 0a 20 20 20 20 0a 20 20 20 20 20  i, j;.    .     
323a0 20 73 53 75 62 42 75 69 6c 64 20 3d 20 2a 70 42   sSubBuild = *pB
323b0 75 69 6c 64 65 72 3b 0a 20 20 20 20 20 20 73 53  uilder;.      sS
323c0 75 62 42 75 69 6c 64 2e 70 4f 72 64 65 72 42 79  ubBuild.pOrderBy
323d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 53 75 62   = 0;.      sSub
323e0 42 75 69 6c 64 2e 70 4f 72 53 65 74 20 3d 20 26  Build.pOrSet = &
323f0 73 43 75 72 3b 0a 0a 20 20 20 20 20 20 57 48 45  sCur;..      WHE
32400 52 45 54 52 41 43 45 28 30 78 32 30 30 2c 20 28  RETRACE(0x200, (
32410 22 42 65 67 69 6e 20 70 72 6f 63 65 73 73 69 6e  "Begin processin
32420 67 20 4f 52 2d 63 6c 61 75 73 65 20 25 70 5c 6e  g OR-clause %p\n
32430 22 2c 20 70 54 65 72 6d 29 29 3b 0a 20 20 20 20  ", pTerm));.    
32440 20 20 66 6f 72 28 70 4f 72 54 65 72 6d 3d 70 4f    for(pOrTerm=pO
32450 72 57 43 2d 3e 61 3b 20 70 4f 72 54 65 72 6d 3c  rWC->a; pOrTerm<
32460 70 4f 72 57 43 45 6e 64 3b 20 70 4f 72 54 65 72  pOrWCEnd; pOrTer
32470 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  m++){.        if
32480 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65  ( (pOrTerm->eOpe
32490 72 61 74 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21  rator & WO_AND)!
324a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
324b0 73 53 75 62 42 75 69 6c 64 2e 70 57 43 20 3d 20  sSubBuild.pWC = 
324c0 26 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64  &pOrTerm->u.pAnd
324d0 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20  Info->wc;.      
324e0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54    }else if( pOrT
324f0 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  erm->leftCursor=
32500 3d 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20  =iCur ){.       
32510 20 20 20 74 65 6d 70 57 43 2e 70 57 49 6e 66 6f     tempWC.pWInfo
32520 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a   = pWC->pWInfo;.
32530 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
32540 2e 70 4f 75 74 65 72 20 3d 20 70 57 43 3b 0a 20  .pOuter = pWC;. 
32550 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
32560 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20  op = TK_AND;.   
32570 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6e 54         tempWC.nT
32580 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  erm = 1;.       
32590 20 20 20 74 65 6d 70 57 43 2e 61 20 3d 20 70 4f     tempWC.a = pO
325a0 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20  rTerm;.         
325b0 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43 20 3d   sSubBuild.pWC =
325c0 20 26 74 65 6d 70 57 43 3b 0a 20 20 20 20 20 20   &tempWC;.      
325d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
325e0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
325f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
32600 43 75 72 2e 6e 20 3d 20 30 3b 0a 23 69 66 64 65  Cur.n = 0;.#ifde
32610 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
32620 42 4c 45 44 0a 20 20 20 20 20 20 20 20 57 48 45  BLED.        WHE
32630 52 45 54 52 41 43 45 28 30 78 32 30 30 2c 20 28  RETRACE(0x200, (
32640 22 4f 52 2d 74 65 72 6d 20 25 64 20 6f 66 20 25  "OR-term %d of %
32650 70 20 68 61 73 20 25 64 20 73 75 62 74 65 72 6d  p has %d subterm
32660 73 3a 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20  s:\n", .        
32670 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29             (int)
32680 28 70 4f 72 54 65 72 6d 2d 70 4f 72 57 43 2d 3e  (pOrTerm-pOrWC->
32690 61 29 2c 20 70 54 65 72 6d 2c 20 73 53 75 62 42  a), pTerm, sSubB
326a0 75 69 6c 64 2e 70 57 43 2d 3e 6e 54 65 72 6d 29  uild.pWC->nTerm)
326b0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
326c0 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
326d0 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20   & 0x400 ){.    
326e0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
326f0 3c 73 53 75 62 42 75 69 6c 64 2e 70 57 43 2d 3e  <sSubBuild.pWC->
32700 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  nTerm; i++){.   
32710 20 20 20 20 20 20 20 20 20 77 68 65 72 65 54 65           whereTe
32720 72 6d 50 72 69 6e 74 28 26 73 53 75 62 42 75 69  rmPrint(&sSubBui
32730 6c 64 2e 70 57 43 2d 3e 61 5b 69 5d 2c 20 69 29  ld.pWC->a[i], i)
32740 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
32750 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23        }.#endif.#
32760 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
32770 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
32780 20 20 20 20 20 20 20 20 69 66 28 20 49 73 56 69          if( IsVi
32790 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61  rtual(pItem->pTa
327a0 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  b) ){.          
327b0 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
327c0 64 56 69 72 74 75 61 6c 28 26 73 53 75 62 42 75  dVirtual(&sSubBu
327d0 69 6c 64 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20  ild, mExtra);.  
327e0 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
327f0 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  if.        {.   
32800 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
32810 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 26 73  eLoopAddBtree(&s
32820 53 75 62 42 75 69 6c 64 2c 20 6d 45 78 74 72 61  SubBuild, mExtra
32830 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
32840 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
32850 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
32860 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
32870 6f 70 41 64 64 4f 72 28 26 73 53 75 62 42 75 69  opAddOr(&sSubBui
32880 6c 64 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20  ld, mExtra);.   
32890 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
328a0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
328b0 45 5f 4f 4b 20 7c 7c 20 73 43 75 72 2e 6e 3d 3d  E_OK || sCur.n==
328c0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
328d0 20 73 43 75 72 2e 6e 3d 3d 30 20 29 7b 0a 20 20   sCur.n==0 ){.  
328e0 20 20 20 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d          sSum.n =
328f0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   0;.          br
32900 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
32910 73 65 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a 20  se if( once ){. 
32920 20 20 20 20 20 20 20 20 20 77 68 65 72 65 4f 72           whereOr
32930 4d 6f 76 65 28 26 73 53 75 6d 2c 20 26 73 43 75  Move(&sSum, &sCu
32940 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 6e  r);.          on
32950 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ce = 0;.        
32960 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
32970 20 57 68 65 72 65 4f 72 53 65 74 20 73 50 72 65   WhereOrSet sPre
32980 76 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 65  v;.          whe
32990 72 65 4f 72 4d 6f 76 65 28 26 73 50 72 65 76 2c  reOrMove(&sPrev,
329a0 20 26 73 53 75 6d 29 3b 0a 20 20 20 20 20 20 20   &sSum);.       
329b0 20 20 20 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20     sSum.n = 0;. 
329c0 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
329d0 3b 20 69 3c 73 50 72 65 76 2e 6e 3b 20 69 2b 2b  ; i<sPrev.n; i++
329e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ){.            f
329f0 6f 72 28 6a 3d 30 3b 20 6a 3c 73 43 75 72 2e 6e  or(j=0; j<sCur.n
32a00 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
32a10 20 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e 73        whereOrIns
32a20 65 72 74 28 26 73 53 75 6d 2c 20 73 50 72 65 76  ert(&sSum, sPrev
32a30 2e 61 5b 69 5d 2e 70 72 65 72 65 71 20 7c 20 73  .a[i].prereq | s
32a40 43 75 72 2e 61 5b 6a 5d 2e 70 72 65 72 65 71 2c  Cur.a[j].prereq,
32a50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
32a60 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
32a70 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 73 50  ite3LogEstAdd(sP
32a80 72 65 76 2e 61 5b 69 5d 2e 72 52 75 6e 2c 20 73  rev.a[i].rRun, s
32a90 43 75 72 2e 61 5b 6a 5d 2e 72 52 75 6e 29 2c 0a  Cur.a[j].rRun),.
32aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32ab0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
32ac0 74 65 33 4c 6f 67 45 73 74 41 64 64 28 73 50 72  te3LogEstAdd(sPr
32ad0 65 76 2e 61 5b 69 5d 2e 6e 4f 75 74 2c 20 73 43  ev.a[i].nOut, sC
32ae0 75 72 2e 61 5b 6a 5d 2e 6e 4f 75 74 29 29 3b 0a  ur.a[j].nOut));.
32af0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
32b00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32b10 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
32b20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
32b30 20 31 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   1;.      pNew->
32b40 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72  aLTerm[0] = pTer
32b50 6d 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  m;.      pNew->w
32b60 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 4d  sFlags = WHERE_M
32b70 55 4c 54 49 5f 4f 52 3b 0a 20 20 20 20 20 20 70  ULTI_OR;.      p
32b80 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b  New->rSetup = 0;
32b90 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f  .      pNew->iSo
32ba0 72 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20  rtIdx = 0;.     
32bb0 20 6d 65 6d 73 65 74 28 26 70 4e 65 77 2d 3e 75   memset(&pNew->u
32bc0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4e 65 77  , 0, sizeof(pNew
32bd0 2d 3e 75 29 29 3b 0a 20 20 20 20 20 20 66 6f 72  ->u));.      for
32be0 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
32bf0 5f 4f 4b 20 26 26 20 69 3c 73 53 75 6d 2e 6e 3b  _OK && i<sSum.n;
32c00 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 2f   i++){.        /
32c10 2a 20 54 55 4e 49 4e 47 3a 20 43 75 72 72 65 6e  * TUNING: Curren
32c20 74 6c 79 20 73 53 75 6d 2e 61 5b 69 5d 2e 72 52  tly sSum.a[i].rR
32c30 75 6e 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  un is set to the
32c40 20 73 75 6d 20 6f 66 20 74 68 65 20 63 6f 73 74   sum of the cost
32c50 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  s.        ** of 
32c60 61 6c 6c 20 73 75 62 2d 73 63 61 6e 73 20 72 65  all sub-scans re
32c70 71 75 69 72 65 64 20 62 79 20 74 68 65 20 4f 52  quired by the OR
32c80 2d 73 63 61 6e 2e 20 48 6f 77 65 76 65 72 2c 20  -scan. However, 
32c90 64 75 65 20 74 6f 20 72 6f 75 6e 64 69 6e 67 0a  due to rounding.
32ca0 20 20 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72          ** error
32cb0 73 2c 20 69 74 20 6d 61 79 20 62 65 20 74 68 61  s, it may be tha
32cc0 74 20 74 68 65 20 63 6f 73 74 20 6f 66 20 74 68  t the cost of th
32cd0 65 20 4f 52 2d 73 63 61 6e 20 69 73 20 65 71 75  e OR-scan is equ
32ce0 61 6c 20 74 6f 20 69 74 73 0a 20 20 20 20 20 20  al to its.      
32cf0 20 20 2a 2a 20 6d 6f 73 74 20 65 78 70 65 6e 73    ** most expens
32d00 69 76 65 20 73 75 62 2d 73 63 61 6e 2e 20 41 64  ive sub-scan. Ad
32d10 64 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 70  d the smallest p
32d20 6f 73 73 69 62 6c 65 20 70 65 6e 61 6c 74 79 20  ossible penalty 
32d30 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 65 71 75  .        ** (equ
32d40 69 76 61 6c 65 6e 74 20 74 6f 20 6d 75 6c 74 69  ivalent to multi
32d50 70 6c 79 69 6e 67 20 74 68 65 20 63 6f 73 74 20  plying the cost 
32d60 62 79 20 31 2e 30 37 29 20 74 6f 20 65 6e 73 75  by 1.07) to ensu
32d70 72 65 20 74 68 61 74 20 0a 20 20 20 20 20 20 20  re that .       
32d80 20 2a 2a 20 74 68 69 73 20 64 6f 65 73 20 6e 6f   ** this does no
32d90 74 20 68 61 70 70 65 6e 2e 20 4f 74 68 65 72 77  t happen. Otherw
32da0 69 73 65 2c 20 66 6f 72 20 57 48 45 52 45 20 63  ise, for WHERE c
32db0 6c 61 75 73 65 73 20 73 75 63 68 20 61 73 20 74  lauses such as t
32dc0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f  he.        ** fo
32dd0 6c 6c 6f 77 69 6e 67 20 77 68 65 72 65 20 74 68  llowing where th
32de0 65 72 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20  ere is an index 
32df0 6f 6e 20 22 79 22 3a 0a 20 20 20 20 20 20 20 20  on "y":.        
32e00 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
32e10 20 20 57 48 45 52 45 20 6c 69 6b 65 6c 69 68 6f    WHERE likeliho
32e20 6f 64 28 78 3d 3f 2c 20 30 2e 39 39 29 20 4f 52  od(x=?, 0.99) OR
32e30 20 79 3d 3f 0a 20 20 20 20 20 20 20 20 2a 2a 0a   y=?.        **.
32e40 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70          ** the p
32e50 6c 61 6e 6e 65 72 20 6d 61 79 20 65 6c 65 63 74  lanner may elect
32e60 20 74 6f 20 22 4f 52 22 20 74 6f 67 65 74 68 65   to "OR" togethe
32e70 72 20 61 20 66 75 6c 6c 2d 74 61 62 6c 65 20 73  r a full-table s
32e80 63 61 6e 20 61 6e 64 20 61 6e 0a 20 20 20 20 20  can and an.     
32e90 20 20 20 2a 2a 20 69 6e 64 65 78 20 6c 6f 6f 6b     ** index look
32ea0 75 70 2e 20 41 6e 64 20 6f 74 68 65 72 20 73 69  up. And other si
32eb0 6d 69 6c 61 72 6c 79 20 6f 64 64 20 72 65 73 75  milarly odd resu
32ec0 6c 74 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  lts.  */.       
32ed0 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 53   pNew->rRun = sS
32ee0 75 6d 2e 61 5b 69 5d 2e 72 52 75 6e 20 2b 20 31  um.a[i].rRun + 1
32ef0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
32f00 6e 4f 75 74 20 3d 20 73 53 75 6d 2e 61 5b 69 5d  nOut = sSum.a[i]
32f10 2e 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 70  .nOut;.        p
32f20 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 73 53  New->prereq = sS
32f30 75 6d 2e 61 5b 69 5d 2e 70 72 65 72 65 71 3b 0a  um.a[i].prereq;.
32f40 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
32f50 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75  reLoopInsert(pBu
32f60 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20  ilder, pNew);.  
32f70 20 20 20 20 7d 0a 20 20 20 20 20 20 57 48 45 52      }.      WHER
32f80 45 54 52 41 43 45 28 30 78 32 30 30 2c 20 28 22  ETRACE(0x200, ("
32f90 45 6e 64 20 70 72 6f 63 65 73 73 69 6e 67 20 4f  End processing O
32fa0 52 2d 63 6c 61 75 73 65 20 25 70 5c 6e 22 2c 20  R-clause %p\n", 
32fb0 70 54 65 72 6d 29 29 3b 0a 20 20 20 20 7d 0a 20  pTerm));.    }. 
32fc0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
32fd0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c  }../*.** Add all
32fe0 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
32ff0 74 73 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65  ts for all table
33000 73 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s .*/.static int
33010 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c 6c   whereLoopAddAll
33020 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65  (WhereLoopBuilde
33030 72 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20 20  r *pBuilder){.  
33040 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
33050 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  o = pBuilder->pW
33060 49 6e 66 6f 3b 0a 20 20 42 69 74 6d 61 73 6b 20  Info;.  Bitmask 
33070 6d 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 42 69  mExtra = 0;.  Bi
33080 74 6d 61 73 6b 20 6d 50 72 69 6f 72 20 3d 20 30  tmask mPrior = 0
33090 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20  ;.  int iTab;.  
330a0 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
330b0 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  t = pWInfo->pTab
330c0 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53  List;.  struct S
330d0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
330e0 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  em;.  sqlite3 *d
330f0 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  b = pWInfo->pPar
33100 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 54  se->db;.  int nT
33110 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d  abList = pWInfo-
33120 3e 6e 4c 65 76 65 6c 3b 0a 20 20 69 6e 74 20 72  >nLevel;.  int r
33130 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
33140 20 75 38 20 70 72 69 6f 72 4a 6f 69 6e 54 79 70   u8 priorJoinTyp
33150 65 20 3d 20 30 3b 0a 20 20 57 68 65 72 65 4c 6f  e = 0;.  WhereLo
33160 6f 70 20 2a 70 4e 65 77 3b 0a 0a 20 20 2f 2a 20  op *pNew;..  /* 
33170 4c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 74 61  Loop over the ta
33180 62 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e  bles in the join
33190 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72  , from left to r
331a0 69 67 68 74 20 2a 2f 0a 20 20 70 4e 65 77 20 3d  ight */.  pNew =
331b0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b   pBuilder->pNew;
331c0 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74  .  whereLoopInit
331d0 28 70 4e 65 77 29 3b 0a 20 20 66 6f 72 28 69 54  (pNew);.  for(iT
331e0 61 62 3d 30 2c 20 70 49 74 65 6d 3d 70 54 61 62  ab=0, pItem=pTab
331f0 4c 69 73 74 2d 3e 61 3b 20 69 54 61 62 3c 6e 54  List->a; iTab<nT
33200 61 62 4c 69 73 74 3b 20 69 54 61 62 2b 2b 2c 20  abList; iTab++, 
33210 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 70 4e  pItem++){.    pN
33220 65 77 2d 3e 69 54 61 62 20 3d 20 69 54 61 62 3b  ew->iTab = iTab;
33230 0a 20 20 20 20 70 4e 65 77 2d 3e 6d 61 73 6b 53  .    pNew->maskS
33240 65 6c 66 20 3d 20 67 65 74 4d 61 73 6b 28 26 70  elf = getMask(&p
33250 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c  WInfo->sMaskSet,
33260 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29   pItem->iCursor)
33270 3b 0a 20 20 20 20 69 66 28 20 28 28 70 49 74 65  ;.    if( ((pIte
33280 6d 2d 3e 6a 6f 69 6e 74 79 70 65 7c 70 72 69 6f  m->jointype|prio
33290 72 4a 6f 69 6e 54 79 70 65 29 20 26 20 28 4a 54  rJoinType) & (JT
332a0 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29  _LEFT|JT_CROSS))
332b0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 45 78  !=0 ){.      mEx
332c0 74 72 61 20 3d 20 6d 50 72 69 6f 72 3b 0a 20 20  tra = mPrior;.  
332d0 20 20 7d 0a 20 20 20 20 70 72 69 6f 72 4a 6f 69    }.    priorJoi
332e0 6e 54 79 70 65 20 3d 20 70 49 74 65 6d 2d 3e 6a  nType = pItem->j
332f0 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 69 66 28  ointype;.    if(
33300 20 49 73 56 69 72 74 75 61 6c 28 70 49 74 65 6d   IsVirtual(pItem
33310 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  ->pTab) ){.     
33320 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
33330 64 64 56 69 72 74 75 61 6c 28 70 42 75 69 6c 64  ddVirtual(pBuild
33340 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20  er, mExtra);.   
33350 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
33360 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42   = whereLoopAddB
33370 74 72 65 65 28 70 42 75 69 6c 64 65 72 2c 20 6d  tree(pBuilder, m
33380 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20  Extra);.    }.  
33390 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
333a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
333b0 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72  = whereLoopAddOr
333c0 28 70 42 75 69 6c 64 65 72 2c 20 6d 45 78 74 72  (pBuilder, mExtr
333d0 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 50  a);.    }.    mP
333e0 72 69 6f 72 20 7c 3d 20 70 4e 65 77 2d 3e 6d 61  rior |= pNew->ma
333f0 73 6b 53 65 6c 66 3b 0a 20 20 20 20 69 66 28 20  skSelf;.    if( 
33400 72 63 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rc || db->malloc
33410 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a  Failed ) break;.
33420 20 20 7d 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43    }.  whereLoopC
33430 6c 65 61 72 28 64 62 2c 20 70 4e 65 77 29 3b 0a  lear(db, pNew);.
33440 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
33450 2f 2a 0a 2a 2a 20 45 78 61 6d 69 6e 65 20 61 20  /*.** Examine a 
33460 57 68 65 72 65 50 61 74 68 20 28 77 69 74 68 20  WherePath (with 
33470 74 68 65 20 61 64 64 69 74 69 6f 6e 20 6f 66 20  the addition of 
33480 74 68 65 20 65 78 74 72 61 20 57 68 65 72 65 4c  the extra WhereL
33490 6f 6f 70 20 6f 66 20 74 68 65 20 35 74 68 0a 2a  oop of the 5th.*
334a0 2a 20 70 61 72 61 6d 65 74 65 72 73 29 20 74 6f  * parameters) to
334b0 20 73 65 65 20 69 66 20 69 74 20 6f 75 74 70 75   see if it outpu
334c0 74 73 20 72 6f 77 73 20 69 6e 20 74 68 65 20 72  ts rows in the r
334d0 65 71 75 65 73 74 65 64 20 4f 52 44 45 52 20 42  equested ORDER B
334e0 59 0a 2a 2a 20 28 6f 72 20 47 52 4f 55 50 20 42  Y.** (or GROUP B
334f0 59 29 20 77 69 74 68 6f 75 74 20 72 65 71 75 69  Y) without requi
33500 72 69 6e 67 20 61 20 73 65 70 61 72 61 74 65 20  ring a separate 
33510 73 6f 72 74 20 6f 70 65 72 61 74 69 6f 6e 2e 20  sort operation. 
33520 20 52 65 74 75 72 6e 20 4e 3a 0a 2a 2a 20 0a 2a   Return N:.** .*
33530 2a 20 20 20 4e 3e 30 3a 20 20 20 4e 20 74 65 72  *   N>0:   N ter
33540 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ms of the ORDER 
33550 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 73 61  BY clause are sa
33560 74 69 73 66 69 65 64 0a 2a 2a 20 20 20 4e 3d 3d  tisfied.**   N==
33570 30 3a 20 20 4e 6f 20 74 65 72 6d 73 20 6f 66 20  0:  No terms of 
33580 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
33590 75 73 65 20 61 72 65 20 73 61 74 69 73 66 69 65  use are satisfie
335a0 64 0a 2a 2a 20 20 20 4e 3c 30 3a 20 20 20 55 6e  d.**   N<0:   Un
335b0 6b 6e 6f 77 6e 20 79 65 74 20 68 6f 77 20 6d 61  known yet how ma
335c0 6e 79 20 74 65 72 6d 73 20 6f 66 20 4f 52 44 45  ny terms of ORDE
335d0 52 20 42 59 20 6d 69 67 68 74 20 62 65 20 73 61  R BY might be sa
335e0 74 69 73 66 69 65 64 2e 20 20 20 0a 2a 2a 0a 2a  tisfied.   .**.*
335f0 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 72 6f 63  * Note that proc
33600 65 73 73 69 6e 67 20 66 6f 72 20 57 48 45 52 45  essing for WHERE
33610 5f 47 52 4f 55 50 42 59 20 61 6e 64 20 57 48 45  _GROUPBY and WHE
33620 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 69 73  RE_DISTINCTBY is
33630 20 6e 6f 74 20 61 73 0a 2a 2a 20 73 74 72 69 63   not as.** stric
33640 74 2e 20 20 57 69 74 68 20 47 52 4f 55 50 20 42  t.  With GROUP B
33650 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54 20 74  Y and DISTINCT t
33660 68 65 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 6d  he only requirem
33670 65 6e 74 20 69 73 20 74 68 61 74 0a 2a 2a 20 65  ent is that.** e
33680 71 75 69 76 61 6c 65 6e 74 20 72 6f 77 73 20 61  quivalent rows a
33690 70 70 65 61 72 20 69 6d 6d 65 64 69 61 74 65 6c  ppear immediatel
336a0 79 20 61 64 6a 61 63 65 6e 74 20 74 6f 20 6f 6e  y adjacent to on
336b0 65 20 61 6e 6f 74 68 65 72 2e 20 20 47 52 4f 55  e another.  GROU
336c0 50 20 42 59 0a 2a 2a 20 61 6e 64 20 44 49 53 54  P BY.** and DIST
336d0 49 4e 43 54 20 64 6f 20 6e 6f 74 20 72 65 71 75  INCT do not requ
336e0 69 72 65 20 72 6f 77 73 20 74 6f 20 61 70 70 65  ire rows to appe
336f0 61 72 20 69 6e 20 61 6e 79 20 70 61 72 74 69 63  ar in any partic
33700 75 6c 61 72 20 6f 72 64 65 72 20 61 73 20 6c 6f  ular order as lo
33710 6e 67 0a 2a 2a 20 61 73 20 65 71 75 69 76 61 6c  ng.** as equival
33720 65 6e 74 20 72 6f 77 73 20 61 72 65 20 67 72 6f  ent rows are gro
33730 75 70 65 64 20 74 6f 67 65 74 68 65 72 2e 20 20  uped together.  
33740 54 68 75 73 20 66 6f 72 20 47 52 4f 55 50 20 42  Thus for GROUP B
33750 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54 0a 2a  Y and DISTINCT.*
33760 2a 20 74 68 65 20 70 4f 72 64 65 72 42 79 20 74  * the pOrderBy t
33770 65 72 6d 73 20 63 61 6e 20 62 65 20 6d 61 74 63  erms can be matc
33780 68 65 64 20 69 6e 20 61 6e 79 20 6f 72 64 65 72  hed in any order
33790 2e 20 20 57 69 74 68 20 4f 52 44 45 52 20 42 59  .  With ORDER BY
337a0 2c 20 74 68 65 20 0a 2a 2a 20 70 4f 72 64 65 72  , the .** pOrder
337b0 42 79 20 74 65 72 6d 73 20 6d 75 73 74 20 62 65  By terms must be
337c0 20 6d 61 74 63 68 65 64 20 69 6e 20 73 74 72 69   matched in stri
337d0 63 74 20 6c 65 66 74 2d 74 6f 2d 72 69 67 68 74  ct left-to-right
337e0 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
337f0 63 20 69 38 20 77 68 65 72 65 50 61 74 68 53 61  c i8 wherePathSa
33800 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28 0a  tisfiesOrderBy(.
33810 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
33820 6e 66 6f 2c 20 20 20 20 2f 2a 20 54 68 65 20 57  nfo,    /* The W
33830 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
33840 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
33850 72 42 79 2c 20 20 20 2f 2a 20 4f 52 44 45 52 20  rBy,   /* ORDER 
33860 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 6f  BY or GROUP BY o
33870 72 20 44 49 53 54 49 4e 43 54 20 63 6c 61 75 73  r DISTINCT claus
33880 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  e to check */.  
33890 57 68 65 72 65 50 61 74 68 20 2a 70 50 61 74 68  WherePath *pPath
338a0 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65  ,     /* The Whe
338b0 72 65 50 61 74 68 20 74 6f 20 63 68 65 63 6b 20  rePath to check 
338c0 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c  */.  u16 wctrlFl
338d0 61 67 73 2c 20 20 20 20 20 20 20 2f 2a 20 4d 69  ags,       /* Mi
338e0 67 68 74 20 63 6f 6e 74 61 69 6e 20 57 48 45 52  ght contain WHER
338f0 45 5f 47 52 4f 55 50 42 59 20 6f 72 20 57 48 45  E_GROUPBY or WHE
33900 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 2a 2f  RE_DISTINCTBY */
33910 0a 20 20 75 31 36 20 6e 4c 6f 6f 70 2c 20 20 20  .  u16 nLoop,   
33920 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
33930 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
33940 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20   pPath->aLoop[] 
33950 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
33960 70 4c 61 73 74 2c 20 20 20 20 20 2f 2a 20 41 64  pLast,     /* Ad
33970 64 20 74 68 69 73 20 57 68 65 72 65 4c 6f 6f 70  d this WhereLoop
33980 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 70   to the end of p
33990 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f  Path->aLoop[] */
339a0 0a 20 20 42 69 74 6d 61 73 6b 20 2a 70 52 65 76  .  Bitmask *pRev
339b0 4d 61 73 6b 20 20 20 20 20 2f 2a 20 4f 55 54 3a  Mask     /* OUT:
339c0 20 4d 61 73 6b 20 6f 66 20 57 68 65 72 65 4c 6f   Mask of WhereLo
339d0 6f 70 73 20 74 6f 20 72 75 6e 20 69 6e 20 72 65  ops to run in re
339e0 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 29  verse order */.)
339f0 7b 0a 20 20 75 38 20 72 65 76 53 65 74 3b 20 20  {.  u8 revSet;  
33a00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
33a10 65 20 69 66 20 72 65 76 20 69 73 20 6b 6e 6f 77  e if rev is know
33a20 6e 20 2a 2f 0a 20 20 75 38 20 72 65 76 3b 20 20  n */.  u8 rev;  
33a30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33a40 43 6f 6d 70 6f 73 69 74 65 20 73 6f 72 74 20 6f  Composite sort o
33a50 72 64 65 72 20 2a 2f 0a 20 20 75 38 20 72 65 76  rder */.  u8 rev
33a60 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
33a70 2f 2a 20 49 6e 64 65 78 20 73 6f 72 74 20 6f 72  /* Index sort or
33a80 64 65 72 20 2a 2f 0a 20 20 75 38 20 69 73 4f 72  der */.  u8 isOr
33a90 64 65 72 44 69 73 74 69 6e 63 74 3b 20 20 20 2f  derDistinct;   /
33aa0 2a 20 41 6c 6c 20 70 72 69 6f 72 20 57 68 65 72  * All prior Wher
33ab0 65 4c 6f 6f 70 73 20 61 72 65 20 6f 72 64 65 72  eLoops are order
33ac0 2d 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 75  -distinct */.  u
33ad0 38 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e  8 distinctColumn
33ae0 73 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  s;   /* True if 
33af0 74 68 65 20 6c 6f 6f 70 20 68 61 73 20 55 4e 49  the loop has UNI
33b00 51 55 45 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c  QUE NOT NULL col
33b10 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 69 73 4d  umns */.  u8 isM
33b20 61 74 63 68 3b 20 20 20 20 20 20 20 20 20 20 20  atch;           
33b30 2f 2a 20 69 43 6f 6c 75 6d 6e 20 6d 61 74 63 68  /* iColumn match
33b40 65 73 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65  es a term of the
33b50 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
33b60 20 2a 2f 0a 20 20 75 31 36 20 6e 4b 65 79 43 6f   */.  u16 nKeyCo
33b70 6c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  l;          /* N
33b80 75 6d 62 65 72 20 6f 66 20 6b 65 79 20 63 6f 6c  umber of key col
33b90 75 6d 6e 73 20 69 6e 20 70 49 6e 64 65 78 20 2a  umns in pIndex *
33ba0 2f 0a 20 20 75 31 36 20 6e 43 6f 6c 75 6d 6e 3b  /.  u16 nColumn;
33bb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
33bc0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f 72 64  al number of ord
33bd0 65 72 65 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  ered columns in 
33be0 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75  the index */.  u
33bf0 31 36 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20  16 nOrderBy;    
33c00 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 74       /* Number t
33c10 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45  erms in the ORDE
33c20 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
33c30 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20   int iLoop;     
33c40 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
33c50 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 69 6e 20  of WhereLoop in 
33c60 70 50 61 74 68 20 62 65 69 6e 67 20 70 72 6f 63  pPath being proc
33c70 65 73 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  essed */.  int i
33c80 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
33c90 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
33ca0 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b  s */.  int iCur;
33cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33cc0 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  Cursor number fo
33cd0 72 20 63 75 72 72 65 6e 74 20 57 68 65 72 65 4c  r current WhereL
33ce0 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  oop */.  int iCo
33cf0 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 2f  lumn;          /
33d00 2a 20 41 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  * A column numbe
33d10 72 20 77 69 74 68 69 6e 20 74 61 62 6c 65 20 69  r within table i
33d20 43 75 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  Cur */.  WhereLo
33d30 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20 30 3b 20 2f  op *pLoop = 0; /
33d40 2a 20 43 75 72 72 65 6e 74 20 57 68 65 72 65 4c  * Current WhereL
33d50 6f 6f 70 20 62 65 69 6e 67 20 70 72 6f 63 65 73  oop being proces
33d60 73 65 64 2e 20 2a 2f 0a 20 20 57 68 65 72 65 54  sed. */.  WhereT
33d70 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
33d80 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d  /* A single term
33d90 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
33da0 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ause */.  Expr *
33db0 70 4f 42 45 78 70 72 3b 20 20 20 20 20 20 20 20  pOBExpr;        
33dc0 2f 2a 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e  /* An expression
33dd0 20 66 72 6f 6d 20 74 68 65 20 4f 52 44 45 52 20   from the ORDER 
33de0 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 43  BY clause */.  C
33df0 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20  ollSeq *pColl;  
33e00 20 20 20 20 20 2f 2a 20 43 4f 4c 4c 41 54 45 20       /* COLLATE 
33e10 66 75 6e 63 74 69 6f 6e 20 66 72 6f 6d 20 61 6e  function from an
33e20 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
33e30 20 74 65 72 6d 20 2a 2f 0a 20 20 49 6e 64 65 78   term */.  Index
33e40 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20   *pIndex;       
33e50 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 61 73   /* The index as
33e60 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 4c  sociated with pL
33e70 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  oop */.  sqlite3
33e80 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70   *db = pWInfo->p
33e90 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44  Parse->db;  /* D
33ea0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
33eb0 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  on */.  Bitmask 
33ec0 6f 62 53 61 74 20 3d 20 30 3b 20 20 20 20 2f 2a  obSat = 0;    /*
33ed0 20 4d 61 73 6b 20 6f 66 20 4f 52 44 45 52 20 42   Mask of ORDER B
33ee0 59 20 74 65 72 6d 73 20 73 61 74 69 73 66 69 65  Y terms satisfie
33ef0 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 42 69  d so far */.  Bi
33f00 74 6d 61 73 6b 20 6f 62 44 6f 6e 65 3b 20 20 20  tmask obDone;   
33f10 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61      /* Mask of a
33f20 6c 6c 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  ll ORDER BY term
33f30 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f  s */.  Bitmask o
33f40 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b  rderDistinctMask
33f50 3b 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c  ;  /* Mask of al
33f60 6c 20 77 65 6c 6c 2d 6f 72 64 65 72 65 64 20 6c  l well-ordered l
33f70 6f 6f 70 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73  oops */.  Bitmas
33f80 6b 20 72 65 61 64 79 3b 20 20 20 20 20 20 20 20  k ready;        
33f90 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
33fa0 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a   inner loops */.
33fb0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57 65 20 73 61  .  /*.  ** We sa
33fc0 79 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  y the WhereLoop 
33fd0 69 73 20 22 6f 6e 65 2d 72 6f 77 22 20 69 66 20  is "one-row" if 
33fe0 69 74 20 67 65 6e 65 72 61 74 65 73 20 6e 6f 20  it generates no 
33ff0 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 0a 20 20  more than one.  
34000 2a 2a 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74  ** row of output
34010 2e 20 20 41 20 57 68 65 72 65 4c 6f 6f 70 20 69  .  A WhereLoop i
34020 73 20 6f 6e 65 2d 72 6f 77 20 69 66 20 61 6c 6c  s one-row if all
34030 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
34040 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 2a 2a  g are true:.  **
34050 20 20 28 61 29 20 41 6c 6c 20 69 6e 64 65 78 20    (a) All index 
34060 63 6f 6c 75 6d 6e 73 20 6d 61 74 63 68 20 77 69  columns match wi
34070 74 68 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  th WHERE_COLUMN_
34080 45 51 2e 0a 20 20 2a 2a 20 20 28 62 29 20 54 68  EQ..  **  (b) Th
34090 65 20 69 6e 64 65 78 20 69 73 20 75 6e 69 71 75  e index is uniqu
340a0 65 0a 20 20 2a 2a 20 41 6e 79 20 57 68 65 72 65  e.  ** Any Where
340b0 4c 6f 6f 70 20 77 69 74 68 20 61 6e 20 57 48 45  Loop with an WHE
340c0 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 63 6f 6e  RE_COLUMN_EQ con
340d0 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 72  straint on the r
340e0 6f 77 69 64 20 69 73 20 6f 6e 65 2d 72 6f 77 2e  owid is one-row.
340f0 0a 20 20 2a 2a 20 45 76 65 72 79 20 6f 6e 65 2d  .  ** Every one-
34100 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20 77 69  row WhereLoop wi
34110 6c 6c 20 68 61 76 65 20 74 68 65 20 57 48 45 52  ll have the WHER
34120 45 5f 4f 4e 45 52 4f 57 20 62 69 74 20 73 65 74  E_ONEROW bit set
34130 20 69 6e 20 77 73 46 6c 61 67 73 2e 0a 20 20 2a   in wsFlags..  *
34140 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79 20 74 68  *.  ** We say th
34150 65 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 22  e WhereLoop is "
34160 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 22 20  order-distinct" 
34170 69 66 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f  if the set of co
34180 6c 75 6d 6e 73 20 66 72 6f 6d 0a 20 20 2a 2a 20  lumns from.  ** 
34190 74 68 61 74 20 57 68 65 72 65 4c 6f 6f 70 20 74  that WhereLoop t
341a0 68 61 74 20 61 72 65 20 69 6e 20 74 68 65 20 4f  hat are in the O
341b0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
341c0 72 65 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72  re different for
341d0 20 65 76 65 72 79 0a 20 20 2a 2a 20 72 6f 77 20   every.  ** row 
341e0 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  of the WhereLoop
341f0 2e 20 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77  .  Every one-row
34200 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 61 75   WhereLoop is au
34210 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 20 20 2a 2a  tomatically.  **
34220 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e   order-distinct.
34230 20 20 20 41 20 57 68 65 72 65 4c 6f 6f 70 20 74     A WhereLoop t
34240 68 61 74 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d  hat has no colum
34250 6e 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  ns in the ORDER 
34260 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20 69  BY clause.  ** i
34270 73 20 6e 6f 74 20 6f 72 64 65 72 2d 64 69 73 74  s not order-dist
34280 69 6e 63 74 2e 20 54 6f 20 62 65 20 6f 72 64 65  inct. To be orde
34290 72 2d 64 69 73 74 69 6e 63 74 20 69 73 20 6e 6f  r-distinct is no
342a0 74 20 71 75 69 74 65 20 74 68 65 20 73 61 6d 65  t quite the same
342b0 20 61 73 20 62 65 69 6e 67 0a 20 20 2a 2a 20 55   as being.  ** U
342c0 4e 49 51 55 45 20 73 69 6e 63 65 20 61 20 55 4e  NIQUE since a UN
342d0 49 51 55 45 20 63 6f 6c 75 6d 6e 20 6f 72 20 69  IQUE column or i
342e0 6e 64 65 78 20 63 61 6e 20 68 61 76 65 20 6d 75  ndex can have mu
342f0 6c 74 69 70 6c 65 20 72 6f 77 73 20 74 68 61 74  ltiple rows that
34300 20 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 20   .  ** are NULL 
34310 61 6e 64 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20  and NULL values 
34320 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66  are equivalent f
34330 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 20 6f  or the purpose o
34340 66 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  f order-distinct
34350 2e 0a 20 20 2a 2a 20 54 6f 20 62 65 20 6f 72 64  ..  ** To be ord
34360 65 72 2d 64 69 73 74 69 6e 63 74 2c 20 74 68 65  er-distinct, the
34370 20 63 6f 6c 75 6d 6e 73 20 6d 75 73 74 20 62 65   columns must be
34380 20 55 4e 49 51 55 45 20 61 6e 64 20 4e 4f 54 20   UNIQUE and NOT 
34390 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  NULL..  **.  ** 
343a0 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 61 20  The rowid for a 
343b0 74 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73 20  table is always 
343c0 55 4e 49 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e  UNIQUE and NOT N
343d0 55 4c 4c 20 73 6f 20 77 68 65 6e 65 76 65 72 20  ULL so whenever 
343e0 74 68 65 0a 20 20 2a 2a 20 72 6f 77 69 64 20 61  the.  ** rowid a
343f0 70 70 65 61 72 73 20 69 6e 20 74 68 65 20 4f 52  ppears in the OR
34400 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74  DER BY clause, t
34410 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
34420 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 0a 20 20   WhereLoop is.  
34430 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
34440 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e   order-distinct.
34450 0a 20 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  .  */..  assert(
34460 20 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a   pOrderBy!=0 );.
34470 20 20 69 66 28 20 6e 4c 6f 6f 70 20 26 26 20 4f    if( nLoop && O
34480 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62  ptimizationDisab
34490 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  led(db, SQLITE_O
344a0 72 64 65 72 42 79 49 64 78 4a 6f 69 6e 29 20 29  rderByIdxJoin) )
344b0 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 6e 4f   return 0;..  nO
344c0 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
344d0 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 74 65 73 74  y->nExpr;.  test
344e0 63 61 73 65 28 20 6e 4f 72 64 65 72 42 79 3d 3d  case( nOrderBy==
344f0 42 4d 53 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e  BMS-1 );.  if( n
34500 4f 72 64 65 72 42 79 3e 42 4d 53 2d 31 20 29 20  OrderBy>BMS-1 ) 
34510 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 61  return 0;  /* Ca
34520 6e 6e 6f 74 20 6f 70 74 69 6d 69 7a 65 20 6f 76  nnot optimize ov
34530 65 72 6c 79 20 6c 61 72 67 65 20 4f 52 44 45 52  erly large ORDER
34540 20 42 59 73 20 2a 2f 0a 20 20 69 73 4f 72 64 65   BYs */.  isOrde
34550 72 44 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20  rDistinct = 1;. 
34560 20 6f 62 44 6f 6e 65 20 3d 20 4d 41 53 4b 42 49   obDone = MASKBI
34570 54 28 6e 4f 72 64 65 72 42 79 29 2d 31 3b 0a 20  T(nOrderBy)-1;. 
34580 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61   orderDistinctMa
34590 73 6b 20 3d 20 30 3b 0a 20 20 72 65 61 64 79 20  sk = 0;.  ready 
345a0 3d 20 30 3b 0a 20 20 66 6f 72 28 69 4c 6f 6f 70  = 0;.  for(iLoop
345b0 3d 30 3b 20 69 73 4f 72 64 65 72 44 69 73 74 69  =0; isOrderDisti
345c0 6e 63 74 20 26 26 20 6f 62 53 61 74 3c 6f 62 44  nct && obSat<obD
345d0 6f 6e 65 20 26 26 20 69 4c 6f 6f 70 3c 3d 6e 4c  one && iLoop<=nL
345e0 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20  oop; iLoop++){. 
345f0 20 20 20 69 66 28 20 69 4c 6f 6f 70 3e 30 20 29     if( iLoop>0 )
34600 20 72 65 61 64 79 20 7c 3d 20 70 4c 6f 6f 70 2d   ready |= pLoop-
34610 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 70  >maskSelf;.    p
34620 4c 6f 6f 70 20 3d 20 69 4c 6f 6f 70 3c 6e 4c 6f  Loop = iLoop<nLo
34630 6f 70 20 3f 20 70 50 61 74 68 2d 3e 61 4c 6f 6f  op ? pPath->aLoo
34640 70 5b 69 4c 6f 6f 70 5d 20 3a 20 70 4c 61 73 74  p[iLoop] : pLast
34650 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d  ;.    if( pLoop-
34660 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
34670 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 29 7b  _VIRTUALTABLE ){
34680 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70  .      if( pLoop
34690 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64 65 72  ->u.vtab.isOrder
346a0 65 64 20 29 20 6f 62 53 61 74 20 3d 20 6f 62 44  ed ) obSat = obD
346b0 6f 6e 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  one;.      break
346c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 43 75 72  ;.    }.    iCur
346d0 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
346e0 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54  ist->a[pLoop->iT
346f0 61 62 5d 2e 69 43 75 72 73 6f 72 3b 0a 0a 20 20  ab].iCursor;..  
34700 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e    /* Mark off an
34710 79 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20  y ORDER BY term 
34720 58 20 74 68 61 74 20 69 73 20 61 20 63 6f 6c 75  X that is a colu
34730 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  mn in the table 
34740 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75  of.    ** the cu
34750 72 72 65 6e 74 20 6c 6f 6f 70 20 66 6f 72 20 77  rrent loop for w
34760 68 69 63 68 20 74 68 65 72 65 20 69 73 20 74 65  hich there is te
34770 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 0a  rm in the WHERE.
34780 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66      ** clause of
34790 20 74 68 65 20 66 6f 72 6d 20 58 20 49 53 20 4e   the form X IS N
347a0 55 4c 4c 20 6f 72 20 58 3d 3f 20 74 68 61 74 20  ULL or X=? that 
347b0 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f  reference only o
347c0 75 74 65 72 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70  uter.    ** loop
347d0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  s..    */.    fo
347e0 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42  r(i=0; i<nOrderB
347f0 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  y; i++){.      i
34800 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20  f( MASKBIT(i) & 
34810 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65  obSat ) continue
34820 3b 0a 20 20 20 20 20 20 70 4f 42 45 78 70 72 20  ;.      pOBExpr 
34830 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
34840 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72 42  pCollate(pOrderB
34850 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  y->a[i].pExpr);.
34860 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70        if( pOBExp
34870 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
34880 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
34890 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e     if( pOBExpr->
348a0 69 54 61 62 6c 65 21 3d 69 43 75 72 20 29 20 63  iTable!=iCur ) c
348b0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70  ontinue;.      p
348c0 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28  Term = findTerm(
348d0 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 69 43  &pWInfo->sWC, iC
348e0 75 72 2c 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f  ur, pOBExpr->iCo
348f0 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  lumn,.          
34900 20 20 20 20 20 20 20 20 20 20 20 20 20 7e 72 65               ~re
34910 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 53  ady, WO_EQ|WO_IS
34920 4e 55 4c 4c 7c 57 4f 5f 49 53 2c 20 30 29 3b 0a  NULL|WO_IS, 0);.
34930 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d        if( pTerm=
34940 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
34950 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
34960 3e 65 4f 70 65 72 61 74 6f 72 26 28 57 4f 5f 45  >eOperator&(WO_E
34970 51 7c 57 4f 5f 49 53 29 29 21 3d 30 20 26 26 20  Q|WO_IS))!=0 && 
34980 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  pOBExpr->iColumn
34990 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  >=0 ){.        c
349a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 2c 20 2a  onst char *z1, *
349b0 7a 32 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  z2;.        pCol
349c0 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
349d0 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70  ollSeq(pWInfo->p
349e0 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d  Parse, pOrderBy-
349f0 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
34a00 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
34a10 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   ) pColl = db->p
34a20 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
34a30 20 20 7a 31 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e    z1 = pColl->zN
34a40 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  ame;.        pCo
34a50 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
34a60 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e  CollSeq(pWInfo->
34a70 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70  pParse, pTerm->p
34a80 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69  Expr);.        i
34a90 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c  f( !pColl ) pCol
34aa0 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
34ab0 6c 3b 0a 20 20 20 20 20 20 20 20 7a 32 20 3d 20  l;.        z2 = 
34ac0 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  pColl->zName;.  
34ad0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
34ae0 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29  3StrICmp(z1, z2)
34af0 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
34b00 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
34b10 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  ( pTerm->pExpr->
34b20 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20  op==TK_IS );.   
34b30 20 20 20 7d 0a 20 20 20 20 20 20 6f 62 53 61 74     }.      obSat
34b40 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a   |= MASKBIT(i);.
34b50 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28      }..    if( (
34b60 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
34b70 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d   WHERE_ONEROW)==
34b80 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
34b90 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
34ba0 57 48 45 52 45 5f 49 50 4b 20 29 7b 0a 20 20 20  WHERE_IPK ){.   
34bb0 20 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b       pIndex = 0;
34bc0 0a 20 20 20 20 20 20 20 20 6e 4b 65 79 43 6f 6c  .        nKeyCol
34bd0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 43   = 0;.        nC
34be0 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20 20 20 20  olumn = 1;.     
34bf0 20 7d 65 6c 73 65 20 69 66 28 20 28 70 49 6e 64   }else if( (pInd
34c00 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  ex = pLoop->u.bt
34c10 72 65 65 2e 70 49 6e 64 65 78 29 3d 3d 30 20 7c  ree.pIndex)==0 |
34c20 7c 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64  | pIndex->bUnord
34c30 65 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  ered ){.        
34c40 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
34c50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e  }else{.        n
34c60 4b 65 79 43 6f 6c 20 3d 20 70 49 6e 64 65 78 2d  KeyCol = pIndex-
34c70 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20  >nKeyCol;.      
34c80 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64    nColumn = pInd
34c90 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ex->nColumn;.   
34ca0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f       assert( nCo
34cb0 6c 75 6d 6e 3d 3d 6e 4b 65 79 43 6f 6c 2b 31 20  lumn==nKeyCol+1 
34cc0 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 49 6e  || !HasRowid(pIn
34cd0 64 65 78 2d 3e 70 54 61 62 6c 65 29 20 29 3b 0a  dex->pTable) );.
34ce0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
34cf0 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
34d00 5b 6e 43 6f 6c 75 6d 6e 2d 31 5d 3d 3d 28 2d 31  [nColumn-1]==(-1
34d10 29 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70  ) || !HasRowid(p
34d20 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 29 29 3b  Index->pTable));
34d30 0a 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72  .        isOrder
34d40 44 69 73 74 69 6e 63 74 20 3d 20 49 73 55 6e 69  Distinct = IsUni
34d50 71 75 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29  queIndex(pIndex)
34d60 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
34d70 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   /* Loop through
34d80 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   all columns of 
34d90 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 64 65  the index and de
34da0 61 6c 20 77 69 74 68 20 74 68 65 20 6f 6e 65 73  al with the ones
34db0 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 61  .      ** that a
34dc0 72 65 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69 6e  re not constrain
34dd0 65 64 20 62 79 20 3d 3d 20 6f 72 20 49 4e 2e 0a  ed by == or IN..
34de0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
34df0 65 76 20 3d 20 72 65 76 53 65 74 20 3d 20 30 3b  ev = revSet = 0;
34e00 0a 20 20 20 20 20 20 64 69 73 74 69 6e 63 74 43  .      distinctC
34e10 6f 6c 75 6d 6e 73 20 3d 20 30 3b 0a 20 20 20 20  olumns = 0;.    
34e20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f    for(j=0; j<nCo
34e30 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  lumn; j++){.    
34e40 20 20 20 20 75 38 20 62 4f 6e 63 65 3b 20 20 20      u8 bOnce;   
34e50 2f 2a 20 54 72 75 65 20 74 6f 20 72 75 6e 20 74  /* True to run t
34e60 68 65 20 4f 52 44 45 52 20 42 59 20 73 65 61 72  he ORDER BY sear
34e70 63 68 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20  ch loop */..    
34e80 20 20 20 20 2f 2a 20 53 6b 69 70 20 6f 76 65 72      /* Skip over
34e90 20 3d 3d 20 61 6e 64 20 49 53 20 4e 55 4c 4c 20   == and IS NULL 
34ea0 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 20  terms */.       
34eb0 20 69 66 28 20 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e   if( j<pLoop->u.
34ec0 62 74 72 65 65 2e 6e 45 71 0a 20 20 20 20 20 20  btree.nEq.      
34ed0 20 20 20 26 26 20 70 4c 6f 6f 70 2d 3e 6e 53 6b     && pLoop->nSk
34ee0 69 70 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26  ip==0.         &
34ef0 26 20 28 28 69 20 3d 20 70 4c 6f 6f 70 2d 3e 61  & ((i = pLoop->a
34f00 4c 54 65 72 6d 5b 6a 5d 2d 3e 65 4f 70 65 72 61  LTerm[j]->eOpera
34f10 74 6f 72 29 20 26 20 28 57 4f 5f 45 51 7c 57 4f  tor) & (WO_EQ|WO
34f20 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53 29 29 21  _ISNULL|WO_IS))!
34f30 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  =0.        ){.  
34f40 20 20 20 20 20 20 20 20 69 66 28 20 69 20 26 20          if( i & 
34f50 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20  WO_ISNULL ){.   
34f60 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
34f70 65 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  e( isOrderDistin
34f80 63 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ct );.          
34f90 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63    isOrderDistinc
34fa0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
34fb0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e   }.          con
34fc0 74 69 6e 75 65 3b 20 20 0a 20 20 20 20 20 20 20  tinue;  .       
34fd0 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 47   }..        /* G
34fe0 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75  et the column nu
34ff0 6d 62 65 72 20 69 6e 20 74 68 65 20 74 61 62 6c  mber in the tabl
35000 65 20 28 69 43 6f 6c 75 6d 6e 29 20 61 6e 64 20  e (iColumn) and 
35010 73 6f 72 74 20 6f 72 64 65 72 0a 20 20 20 20 20  sort order.     
35020 20 20 20 2a 2a 20 28 72 65 76 49 64 78 29 20 66     ** (revIdx) f
35030 6f 72 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75  or the j-th colu
35040 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  mn of the index.
35050 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
35060 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 20 29      if( pIndex )
35070 7b 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c  {.          iCol
35080 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69  umn = pIndex->ai
35090 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20  Column[j];.     
350a0 20 20 20 20 20 72 65 76 49 64 78 20 3d 20 70 49       revIdx = pI
350b0 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  ndex->aSortOrder
350c0 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  [j];.          i
350d0 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64  f( iColumn==pInd
350e0 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65  ex->pTable->iPKe
350f0 79 20 29 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31  y ) iColumn = -1
35100 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
35110 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 75  .          iColu
35120 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  mn = -1;.       
35130 20 20 20 72 65 76 49 64 78 20 3d 20 30 3b 0a 20     revIdx = 0;. 
35140 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
35150 20 20 2f 2a 20 41 6e 20 75 6e 63 6f 6e 73 74 72    /* An unconstr
35160 61 69 6e 65 64 20 63 6f 6c 75 6d 6e 20 74 68 61  ained column tha
35170 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  t might be NULL 
35180 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 0a  means that this.
35190 20 20 20 20 20 20 20 20 2a 2a 20 57 68 65 72 65          ** Where
351a0 4c 6f 6f 70 20 69 73 20 6e 6f 74 20 77 65 6c 6c  Loop is not well
351b0 2d 6f 72 64 65 72 65 64 0a 20 20 20 20 20 20 20  -ordered.       
351c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
351d0 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 0a  isOrderDistinct.
351e0 20 20 20 20 20 20 20 20 20 26 26 20 69 43 6f 6c           && iCol
351f0 75 6d 6e 3e 3d 30 0a 20 20 20 20 20 20 20 20 20  umn>=0.         
35200 26 26 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e 62  && j>=pLoop->u.b
35210 74 72 65 65 2e 6e 45 71 0a 20 20 20 20 20 20 20  tree.nEq.       
35220 20 20 26 26 20 70 49 6e 64 65 78 2d 3e 70 54 61    && pIndex->pTa
35230 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d  ble->aCol[iColum
35240 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a 20 20  n].notNull==0.  
35250 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
35260 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e     isOrderDistin
35270 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ct = 0;.        
35280 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 69  }..        /* Fi
35290 6e 64 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  nd the ORDER BY 
352a0 74 65 72 6d 20 74 68 61 74 20 63 6f 72 72 65 73  term that corres
352b0 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 6a 2d 74  ponds to the j-t
352c0 68 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20  h column.       
352d0 20 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78   ** of the index
352e0 20 61 6e 64 20 6d 61 72 6b 20 74 68 61 74 20 4f   and mark that O
352f0 52 44 45 52 20 42 59 20 74 65 72 6d 20 6f 66 66  RDER BY term off
35300 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20   .        */.   
35310 20 20 20 20 20 62 4f 6e 63 65 20 3d 20 31 3b 0a       bOnce = 1;.
35320 20 20 20 20 20 20 20 20 69 73 4d 61 74 63 68 20          isMatch 
35330 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  = 0;.        for
35340 28 69 3d 30 3b 20 62 4f 6e 63 65 20 26 26 20 69  (i=0; bOnce && i
35350 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b  <nOrderBy; i++){
35360 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 4d  .          if( M
35370 41 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61  ASKBIT(i) & obSa
35380 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  t ) continue;.  
35390 20 20 20 20 20 20 20 20 70 4f 42 45 78 70 72 20          pOBExpr 
353a0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
353b0 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72 42  pCollate(pOrderB
353c0 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  y->a[i].pExpr);.
353d0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
353e0 73 65 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26  se( wctrlFlags &
353f0 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 29   WHERE_GROUPBY )
35400 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
35410 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61 67 73  case( wctrlFlags
35420 20 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   & WHERE_DISTINC
35430 54 42 59 20 29 3b 0a 20 20 20 20 20 20 20 20 20  TBY );.         
35440 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73   if( (wctrlFlags
35450 20 26 20 28 57 48 45 52 45 5f 47 52 4f 55 50 42   & (WHERE_GROUPB
35460 59 7c 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  Y|WHERE_DISTINCT
35470 42 59 29 29 3d 3d 30 20 29 20 62 4f 6e 63 65 20  BY))==0 ) bOnce 
35480 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = 0;.          i
35490 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d  f( pOBExpr->op!=
354a0 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74  TK_COLUMN ) cont
354b0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
354c0 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 54 61  if( pOBExpr->iTa
354d0 62 6c 65 21 3d 69 43 75 72 20 29 20 63 6f 6e 74  ble!=iCur ) cont
354e0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
354f0 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f  if( pOBExpr->iCo
35500 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 20  lumn!=iColumn ) 
35510 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
35520 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3e      if( iColumn>
35530 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
35540 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
35550 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49  3ExprCollSeq(pWI
35560 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72  nfo->pParse, pOr
35570 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
35580 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
35590 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f  if( !pColl ) pCo
355a0 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
355b0 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll;.            
355c0 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
355d0 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c  mp(pColl->zName,
355e0 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b   pIndex->azColl[
355f0 6a 5d 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  j])!=0 ) continu
35600 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
35610 20 20 20 20 20 20 20 20 20 69 73 4d 61 74 63 68           isMatch
35620 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
35630 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
35640 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4d  .        if( isM
35650 61 74 63 68 20 26 26 20 28 77 63 74 72 6c 46 6c  atch && (wctrlFl
35660 61 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55  ags & WHERE_GROU
35670 50 42 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  PBY)==0 ){.     
35680 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72       /* Make sur
35690 65 20 74 68 65 20 73 6f 72 74 20 6f 72 64 65 72  e the sort order
356a0 20 69 73 20 63 6f 6d 70 61 74 69 62 6c 65 20 69   is compatible i
356b0 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  n an ORDER BY cl
356c0 61 75 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20  ause..          
356d0 2a 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 69 73  ** Sort order is
356e0 20 69 72 72 65 6c 65 76 61 6e 74 20 66 6f 72 20   irrelevant for 
356f0 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
35700 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  e. */.          
35710 69 66 28 20 72 65 76 53 65 74 20 29 7b 0a 20 20  if( revSet ){.  
35720 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 72            if( (r
35730 65 76 20 5e 20 72 65 76 49 64 78 29 21 3d 70 4f  ev ^ revIdx)!=pO
35740 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72  rderBy->a[i].sor
35750 74 4f 72 64 65 72 20 29 20 69 73 4d 61 74 63 68  tOrder ) isMatch
35760 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
35770 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
35780 20 20 20 72 65 76 20 3d 20 72 65 76 49 64 78 20     rev = revIdx 
35790 5e 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  ^ pOrderBy->a[i]
357a0 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  .sortOrder;.    
357b0 20 20 20 20 20 20 20 20 69 66 28 20 72 65 76 20          if( rev 
357c0 29 20 2a 70 52 65 76 4d 61 73 6b 20 7c 3d 20 4d  ) *pRevMask |= M
357d0 41 53 4b 42 49 54 28 69 4c 6f 6f 70 29 3b 0a 20  ASKBIT(iLoop);. 
357e0 20 20 20 20 20 20 20 20 20 20 20 72 65 76 53 65             revSe
357f0 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  t = 1;.         
35800 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
35810 20 20 20 20 20 69 66 28 20 69 73 4d 61 74 63 68       if( isMatch
35820 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
35830 28 20 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  ( iColumn<0 ){. 
35840 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
35850 61 73 65 28 20 64 69 73 74 69 6e 63 74 43 6f 6c  ase( distinctCol
35860 75 6d 6e 73 3d 3d 30 20 29 3b 0a 20 20 20 20 20  umns==0 );.     
35870 20 20 20 20 20 20 20 64 69 73 74 69 6e 63 74 43         distinctC
35880 6f 6c 75 6d 6e 73 20 3d 20 31 3b 0a 20 20 20 20  olumns = 1;.    
35890 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
358a0 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42    obSat |= MASKB
358b0 49 54 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d  IT(i);.        }
358c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
358d0 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 66 6f 75 6e  /* No match foun
358e0 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  d */.          i
358f0 66 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3c 6e 4b 65  f( j==0 || j<nKe
35900 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  yCol ){.        
35910 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73      testcase( is
35920 4f 72 64 65 72 44 69 73 74 69 6e 63 74 21 3d 30  OrderDistinct!=0
35930 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
35940 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
35950 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
35960 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
35970 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
35980 20 20 7d 20 2f 2a 20 65 6e 64 20 4c 6f 6f 70 20    } /* end Loop 
35990 6f 76 65 72 20 61 6c 6c 20 69 6e 64 65 78 20 63  over all index c
359a0 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20  olumns */.      
359b0 69 66 28 20 64 69 73 74 69 6e 63 74 43 6f 6c 75  if( distinctColu
359c0 6d 6e 73 20 29 7b 0a 20 20 20 20 20 20 20 20 74  mns ){.        t
359d0 65 73 74 63 61 73 65 28 20 69 73 4f 72 64 65 72  estcase( isOrder
359e0 44 69 73 74 69 6e 63 74 3d 3d 30 20 29 3b 0a 20  Distinct==0 );. 
359f0 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69         isOrderDi
35a00 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20 20 20  stinct = 1;.    
35a10 20 20 7d 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64    }.    } /* end
35a20 2d 69 66 20 6e 6f 74 20 6f 6e 65 2d 72 6f 77 20  -if not one-row 
35a30 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20  */..    /* Mark 
35a40 6f 66 66 20 61 6e 79 20 6f 74 68 65 72 20 4f 52  off any other OR
35a50 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 68 61  DER BY terms tha
35a60 74 20 72 65 66 65 72 65 6e 63 65 20 70 4c 6f 6f  t reference pLoo
35a70 70 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 4f  p */.    if( isO
35a80 72 64 65 72 44 69 73 74 69 6e 63 74 20 29 7b 0a  rderDistinct ){.
35a90 20 20 20 20 20 20 6f 72 64 65 72 44 69 73 74 69        orderDisti
35aa0 6e 63 74 4d 61 73 6b 20 7c 3d 20 70 4c 6f 6f 70  nctMask |= pLoop
35ab0 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20  ->maskSelf;.    
35ac0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72    for(i=0; i<nOr
35ad0 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  derBy; i++){.   
35ae0 20 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20       Expr *p;.  
35af0 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 54        Bitmask mT
35b00 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  erm;.        if(
35b10 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f 62   MASKBIT(i) & ob
35b20 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Sat ) continue;.
35b30 20 20 20 20 20 20 20 20 70 20 3d 20 70 4f 72 64          p = pOrd
35b40 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
35b50 3b 0a 20 20 20 20 20 20 20 20 6d 54 65 72 6d 20  ;.        mTerm 
35b60 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
35b70 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53  (&pWInfo->sMaskS
35b80 65 74 2c 70 29 3b 0a 20 20 20 20 20 20 20 20 69  et,p);.        i
35b90 66 28 20 6d 54 65 72 6d 3d 3d 30 20 26 26 20 21  f( mTerm==0 && !
35ba0 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
35bb0 73 74 61 6e 74 28 70 29 20 29 20 63 6f 6e 74 69  stant(p) ) conti
35bc0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
35bd0 20 28 6d 54 65 72 6d 26 7e 6f 72 64 65 72 44 69   (mTerm&~orderDi
35be0 73 74 69 6e 63 74 4d 61 73 6b 29 3d 3d 30 20 29  stinctMask)==0 )
35bf0 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 62 53 61  {.          obSa
35c00 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b  t |= MASKBIT(i);
35c10 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
35c20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 2f 2a 20   }.    }.  } /* 
35c30 45 6e 64 20 74 68 65 20 6c 6f 6f 70 20 6f 76 65  End the loop ove
35c40 72 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 73  r all WhereLoops
35c50 20 66 72 6f 6d 20 6f 75 74 65 72 2d 6d 6f 73 74   from outer-most
35c60 20 64 6f 77 6e 20 74 6f 20 69 6e 6e 65 72 2d 6d   down to inner-m
35c70 6f 73 74 20 2a 2f 0a 20 20 69 66 28 20 6f 62 53  ost */.  if( obS
35c80 61 74 3d 3d 6f 62 44 6f 6e 65 20 29 20 72 65 74  at==obDone ) ret
35c90 75 72 6e 20 28 69 38 29 6e 4f 72 64 65 72 42 79  urn (i8)nOrderBy
35ca0 3b 0a 20 20 69 66 28 20 21 69 73 4f 72 64 65 72  ;.  if( !isOrder
35cb0 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
35cc0 66 6f 72 28 69 3d 6e 4f 72 64 65 72 42 79 2d 31  for(i=nOrderBy-1
35cd0 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20  ; i>0; i--){.   
35ce0 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 4d     Bitmask m = M
35cf0 41 53 4b 42 49 54 28 69 29 20 2d 20 31 3b 0a 20  ASKBIT(i) - 1;. 
35d00 20 20 20 20 20 69 66 28 20 28 6f 62 53 61 74 26       if( (obSat&
35d10 6d 29 3d 3d 6d 20 29 20 72 65 74 75 72 6e 20 69  m)==m ) return i
35d20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
35d30 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
35d40 72 6e 20 2d 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn -1;.}.../*.**
35d50 20 49 66 20 74 68 65 20 57 48 45 52 45 5f 47 52   If the WHERE_GR
35d60 4f 55 50 42 59 20 66 6c 61 67 20 69 73 20 73 65  OUPBY flag is se
35d70 74 20 69 6e 20 74 68 65 20 6d 61 73 6b 20 70 61  t in the mask pa
35d80 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57  ssed to sqlite3W
35d90 68 65 72 65 42 65 67 69 6e 28 29 2c 0a 2a 2a 20  hereBegin(),.** 
35da0 74 68 65 20 70 6c 61 6e 6e 65 72 20 61 73 73 75  the planner assu
35db0 6d 65 73 20 74 68 61 74 20 74 68 65 20 73 70 65  mes that the spe
35dc0 63 69 66 69 65 64 20 70 4f 72 64 65 72 42 79 20  cified pOrderBy 
35dd0 6c 69 73 74 20 69 73 20 61 63 74 75 61 6c 6c 79  list is actually
35de0 20 61 20 47 52 4f 55 50 0a 2a 2a 20 42 59 20 63   a GROUP.** BY c
35df0 6c 61 75 73 65 20 2d 20 61 6e 64 20 73 6f 20 61  lause - and so a
35e00 6e 79 20 6f 72 64 65 72 20 74 68 61 74 20 67 72  ny order that gr
35e10 6f 75 70 73 20 72 6f 77 73 20 61 73 20 72 65 71  oups rows as req
35e20 75 69 72 65 64 20 73 61 74 69 73 66 69 65 73 20  uired satisfies 
35e30 74 68 65 0a 2a 2a 20 72 65 71 75 65 73 74 2e 0a  the.** request..
35e40 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  **.** Normally, 
35e50 69 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20  in this case it 
35e60 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
35e70 66 6f 72 20 74 68 65 20 63 61 6c 6c 65 72 20 74  for the caller t
35e80 6f 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 77  o determine.** w
35e90 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
35ea0 65 20 72 6f 77 73 20 61 72 65 20 72 65 61 6c 6c  e rows are reall
35eb0 79 20 62 65 69 6e 67 20 64 65 6c 69 76 65 72 65  y being delivere
35ec0 64 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65  d in sorted orde
35ed0 72 2c 20 6f 72 0a 2a 2a 20 6a 75 73 74 20 69 6e  r, or.** just in
35ee0 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 72 64 65   some other orde
35ef0 72 20 74 68 61 74 20 70 72 6f 76 69 64 65 73 20  r that provides 
35f00 74 68 65 20 72 65 71 75 69 72 65 64 20 67 72 6f  the required gro
35f10 75 70 69 6e 67 2e 20 48 6f 77 65 76 65 72 2c 0a  uping. However,.
35f20 2a 2a 20 69 66 20 74 68 65 20 57 48 45 52 45 5f  ** if the WHERE_
35f30 53 4f 52 54 42 59 47 52 4f 55 50 20 66 6c 61 67  SORTBYGROUP flag
35f40 20 69 73 20 61 6c 73 6f 20 70 61 73 73 65 64 20   is also passed 
35f50 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
35f60 65 67 69 6e 28 29 2c 20 74 68 65 6e 0a 2a 2a 20  egin(), then.** 
35f70 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  this function ma
35f80 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 74  y be called on t
35f90 68 65 20 72 65 74 75 72 6e 65 64 20 57 68 65 72  he returned Wher
35fa0 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 49 74  eInfo object. It
35fb0 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 72 75 65   returns.** true
35fc0 20 69 66 20 74 68 65 20 72 6f 77 73 20 72 65 61   if the rows rea
35fd0 6c 6c 79 20 77 69 6c 6c 20 62 65 20 73 6f 72 74  lly will be sort
35fe0 65 64 20 69 6e 20 74 68 65 20 73 70 65 63 69 66  ed in the specif
35ff0 69 65 64 20 6f 72 64 65 72 2c 20 6f 72 20 66 61  ied order, or fa
36000 6c 73 65 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65  lse.** otherwise
36010 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
36020 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 3a 0a 2a  ple, assuming:.*
36030 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e  *.**   CREATE IN
36040 44 45 58 20 69 31 20 4f 4e 20 74 31 28 78 2c 20  DEX i1 ON t1(x, 
36050 59 29 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 0a 2a  Y);.**.** then.*
36060 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20  *.**   SELECT * 
36070 46 52 4f 4d 20 74 31 20 47 52 4f 55 50 20 42 59  FROM t1 GROUP BY
36080 20 78 2c 79 20 4f 52 44 45 52 20 42 59 20 78 2c   x,y ORDER BY x,
36090 79 3b 20 20 20 2d 2d 20 49 73 53 6f 72 74 65 64  y;   -- IsSorted
360a0 28 29 3d 3d 31 0a 2a 2a 20 20 20 53 45 4c 45 43  ()==1.**   SELEC
360b0 54 20 2a 20 46 52 4f 4d 20 74 31 20 47 52 4f 55  T * FROM t1 GROU
360c0 50 20 42 59 20 79 2c 78 20 4f 52 44 45 52 20 42  P BY y,x ORDER B
360d0 59 20 79 2c 78 3b 20 20 20 2d 2d 20 49 73 53 6f  Y y,x;   -- IsSo
360e0 72 74 65 64 28 29 3d 3d 30 0a 2a 2f 0a 69 6e 74  rted()==0.*/.int
360f0 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 53   sqlite3WhereIsS
36100 6f 72 74 65 64 28 57 68 65 72 65 49 6e 66 6f 20  orted(WhereInfo 
36110 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 61 73 73 65  *pWInfo){.  asse
36120 72 74 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72  rt( pWInfo->wctr
36130 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47  lFlags & WHERE_G
36140 52 4f 55 50 42 59 20 29 3b 0a 20 20 61 73 73 65  ROUPBY );.  asse
36150 72 74 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72  rt( pWInfo->wctr
36160 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53  lFlags & WHERE_S
36170 4f 52 54 42 59 47 52 4f 55 50 20 29 3b 0a 20 20  ORTBYGROUP );.  
36180 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 73  return pWInfo->s
36190 6f 72 74 65 64 3b 0a 7d 0a 0a 23 69 66 64 65 66  orted;.}..#ifdef
361a0 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
361b0 4c 45 44 0a 2f 2a 20 46 6f 72 20 64 65 62 75 67  LED./* For debug
361c0 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79 3a 20 2a  ging use only: *
361d0 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
361e0 68 61 72 20 2a 77 68 65 72 65 50 61 74 68 4e 61  har *wherePathNa
361f0 6d 65 28 57 68 65 72 65 50 61 74 68 20 2a 70 50  me(WherePath *pP
36200 61 74 68 2c 20 69 6e 74 20 6e 4c 6f 6f 70 2c 20  ath, int nLoop, 
36210 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73 74  WhereLoop *pLast
36220 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72  ){.  static char
36230 20 7a 4e 61 6d 65 5b 36 35 5d 3b 0a 20 20 69 6e   zName[65];.  in
36240 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
36250 69 3c 6e 4c 6f 6f 70 3b 20 69 2b 2b 29 7b 20 7a  i<nLoop; i++){ z
36260 4e 61 6d 65 5b 69 5d 20 3d 20 70 50 61 74 68 2d  Name[i] = pPath-
36270 3e 61 4c 6f 6f 70 5b 69 5d 2d 3e 63 49 64 3b 20  >aLoop[i]->cId; 
36280 7d 0a 20 20 69 66 28 20 70 4c 61 73 74 20 29 20  }.  if( pLast ) 
36290 7a 4e 61 6d 65 5b 69 2b 2b 5d 20 3d 20 70 4c 61  zName[i++] = pLa
362a0 73 74 2d 3e 63 49 64 3b 0a 20 20 7a 4e 61 6d 65  st->cId;.  zName
362b0 5b 69 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  [i] = 0;.  retur
362c0 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69  n zName;.}.#endi
362d0 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
362e0 74 68 65 20 63 6f 73 74 20 6f 66 20 73 6f 72 74  the cost of sort
362f0 69 6e 67 20 6e 52 6f 77 20 72 6f 77 73 2c 20 61  ing nRow rows, a
36300 73 73 75 6d 69 6e 67 20 74 68 61 74 20 74 68 65  ssuming that the
36310 20 6b 65 79 73 20 68 61 76 65 20 0a 2a 2a 20 6e   keys have .** n
36320 4f 72 64 65 72 62 79 20 63 6f 6c 75 6d 6e 73 20  Orderby columns 
36330 61 6e 64 20 74 68 61 74 20 74 68 65 20 66 69 72  and that the fir
36340 73 74 20 6e 53 6f 72 74 65 64 20 63 6f 6c 75 6d  st nSorted colum
36350 6e 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 69  ns are already i
36360 6e 0a 2a 2a 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  n.** order..*/.s
36370 74 61 74 69 63 20 4c 6f 67 45 73 74 20 77 68 65  tatic LogEst whe
36380 72 65 53 6f 72 74 69 6e 67 43 6f 73 74 28 0a 20  reSortingCost(. 
36390 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
363a0 66 6f 2c 0a 20 20 4c 6f 67 45 73 74 20 6e 52 6f  fo,.  LogEst nRo
363b0 77 2c 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42  w,.  int nOrderB
363c0 79 2c 0a 20 20 69 6e 74 20 6e 53 6f 72 74 65 64  y,.  int nSorted
363d0 0a 29 7b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a  .){.  /* TUNING:
363e0 20 45 73 74 69 6d 61 74 65 64 20 63 6f 73 74 20   Estimated cost 
363f0 6f 66 20 61 20 66 75 6c 6c 20 65 78 74 65 72 6e  of a full extern
36400 61 6c 20 73 6f 72 74 2c 20 77 68 65 72 65 20 4e  al sort, where N
36410 20 69 73 20 0a 20 20 2a 2a 20 74 68 65 20 6e 75   is .  ** the nu
36420 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 6f 20  mber of rows to 
36430 73 6f 72 74 20 69 73 3a 0a 20 20 2a 2a 0a 20 20  sort is:.  **.  
36440 2a 2a 20 20 20 63 6f 73 74 20 3d 20 28 33 2e 30  **   cost = (3.0
36450 20 2a 20 4e 20 2a 20 6c 6f 67 28 4e 29 29 2e 0a   * N * log(N))..
36460 20 20 2a 2a 20 0a 20 20 2a 2a 20 4f 72 2c 20 69    ** .  ** Or, i
36470 66 20 74 68 65 20 6f 72 64 65 72 2d 62 79 20 63  f the order-by c
36480 6c 61 75 73 65 20 68 61 73 20 58 20 74 65 72 6d  lause has X term
36490 73 20 62 75 74 20 6f 6e 6c 79 20 74 68 65 20 6c  s but only the l
364a0 61 73 74 20 59 20 0a 20 20 2a 2a 20 74 65 72 6d  ast Y .  ** term
364b0 73 20 61 72 65 20 6f 75 74 20 6f 66 20 6f 72 64  s are out of ord
364c0 65 72 2c 20 74 68 65 6e 20 62 6c 6f 63 6b 2d 73  er, then block-s
364d0 6f 72 74 69 6e 67 20 77 69 6c 6c 20 72 65 64 75  orting will redu
364e0 63 65 20 74 68 65 20 0a 20 20 2a 2a 20 73 6f 72  ce the .  ** sor
364f0 74 69 6e 67 20 63 6f 73 74 20 74 6f 3a 0a 20 20  ting cost to:.  
36500 2a 2a 0a 20 20 2a 2a 20 20 20 63 6f 73 74 20 3d  **.  **   cost =
36510 20 28 33 2e 30 20 2a 20 4e 20 2a 20 6c 6f 67 28   (3.0 * N * log(
36520 4e 29 29 20 2a 20 28 59 2f 58 29 0a 20 20 2a 2a  N)) * (Y/X).  **
36530 0a 20 20 2a 2a 20 54 68 65 20 28 59 2f 58 29 20  .  ** The (Y/X) 
36540 74 65 72 6d 20 69 73 20 69 6d 70 6c 65 6d 65 6e  term is implemen
36550 74 65 64 20 75 73 69 6e 67 20 73 74 61 63 6b 20  ted using stack 
36560 76 61 72 69 61 62 6c 65 20 72 53 63 61 6c 65 0a  variable rScale.
36570 20 20 2a 2a 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a    ** below.  */.
36580 20 20 4c 6f 67 45 73 74 20 72 53 63 61 6c 65 2c    LogEst rScale,
36590 20 72 53 6f 72 74 43 6f 73 74 3b 0a 20 20 61 73   rSortCost;.  as
365a0 73 65 72 74 28 20 6e 4f 72 64 65 72 42 79 3e 30  sert( nOrderBy>0
365b0 20 26 26 20 36 36 3d 3d 73 71 6c 69 74 65 33 4c   && 66==sqlite3L
365c0 6f 67 45 73 74 28 31 30 30 29 20 29 3b 0a 20 20  ogEst(100) );.  
365d0 72 53 63 61 6c 65 20 3d 20 73 71 6c 69 74 65 33  rScale = sqlite3
365e0 4c 6f 67 45 73 74 28 28 6e 4f 72 64 65 72 42 79  LogEst((nOrderBy
365f0 2d 6e 53 6f 72 74 65 64 29 2a 31 30 30 2f 6e 4f  -nSorted)*100/nO
36600 72 64 65 72 42 79 29 20 2d 20 36 36 3b 0a 20 20  rderBy) - 66;.  
36610 72 53 6f 72 74 43 6f 73 74 20 3d 20 6e 52 6f 77  rSortCost = nRow
36620 20 2b 20 65 73 74 4c 6f 67 28 6e 52 6f 77 29 20   + estLog(nRow) 
36630 2b 20 72 53 63 61 6c 65 20 2b 20 31 36 3b 0a 0a  + rScale + 16;..
36640 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 54 68 65    /* TUNING: The
36650 20 63 6f 73 74 20 6f 66 20 69 6d 70 6c 65 6d 65   cost of impleme
36660 6e 74 69 6e 67 20 44 49 53 54 49 4e 43 54 20 75  nting DISTINCT u
36670 73 69 6e 67 20 61 20 42 2d 54 52 45 45 20 69 73  sing a B-TREE is
36680 0a 20 20 2a 2a 20 73 69 6d 69 6c 61 72 20 62 75  .  ** similar bu
36690 74 20 77 69 74 68 20 61 20 6c 61 72 67 65 72 20  t with a larger 
366a0 63 6f 6e 73 74 61 6e 74 20 6f 66 20 70 72 6f 70  constant of prop
366b0 6f 72 74 69 6f 6e 61 6c 69 74 79 2e 20 0a 20 20  ortionality. .  
366c0 2a 2a 20 4d 75 6c 74 69 70 6c 79 20 62 79 20 61  ** Multiply by a
366d0 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 66 61 63  n additional fac
366e0 74 6f 72 20 6f 66 20 33 2e 30 2e 20 20 2a 2f 0a  tor of 3.0.  */.
366f0 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63    if( pWInfo->wc
36700 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
36710 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29  _WANT_DISTINCT )
36720 7b 0a 20 20 20 20 72 53 6f 72 74 43 6f 73 74 20  {.    rSortCost 
36730 2b 3d 20 31 36 3b 0a 20 20 7d 0a 0a 20 20 72 65  += 16;.  }..  re
36740 74 75 72 6e 20 72 53 6f 72 74 43 6f 73 74 3b 0a  turn rSortCost;.
36750 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74  }../*.** Given t
36760 68 65 20 6c 69 73 74 20 6f 66 20 57 68 65 72 65  he list of Where
36770 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 61 74 20  Loop objects at 
36780 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20  pWInfo->pLoops, 
36790 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
367a0 61 74 74 65 6d 70 74 73 20 74 6f 20 66 69 6e 64  attempts to find
367b0 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74   the lowest cost
367c0 20 70 61 74 68 20 74 68 61 74 20 76 69 73 69 74   path that visit
367d0 73 20 65 61 63 68 20 57 68 65 72 65 4c 6f 6f 70  s each WhereLoop
367e0 0a 2a 2a 20 6f 6e 63 65 2e 20 20 54 68 69 73 20  .** once.  This 
367f0 70 61 74 68 20 69 73 20 74 68 65 6e 20 6c 6f 61  path is then loa
36800 64 65 64 20 69 6e 74 6f 20 74 68 65 20 70 57 49  ded into the pWI
36810 6e 66 6f 2d 3e 61 5b 5d 2e 70 57 4c 6f 6f 70 20  nfo->a[].pWLoop 
36820 66 69 65 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 73  fields..**.** As
36830 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 74 6f  sume that the to
36840 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75  tal number of ou
36850 74 70 75 74 20 72 6f 77 73 20 74 68 61 74 20 77  tput rows that w
36860 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73  ill need to be s
36870 6f 72 74 65 64 0a 2a 2a 20 77 69 6c 6c 20 62 65  orted.** will be
36880 20 6e 52 6f 77 45 73 74 20 28 69 6e 20 74 68 65   nRowEst (in the
36890 20 31 30 2a 6c 6f 67 32 20 72 65 70 72 65 73 65   10*log2 represe
368a0 6e 74 61 74 69 6f 6e 29 2e 20 20 4f 72 2c 20 69  ntation).  Or, i
368b0 67 6e 6f 72 65 20 73 6f 72 74 69 6e 67 0a 2a 2a  gnore sorting.**
368c0 20 63 6f 73 74 73 20 69 66 20 6e 52 6f 77 45 73   costs if nRowEs
368d0 74 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  t==0..**.** Retu
368e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
368f0 73 75 63 63 65 73 73 20 6f 72 20 53 51 4c 49 54  success or SQLIT
36900 45 5f 4e 4f 4d 45 4d 20 6f 66 20 61 20 6d 65 6d  E_NOMEM of a mem
36910 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  ory allocation.*
36920 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a  * error occurs..
36930 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
36940 65 72 65 50 61 74 68 53 6f 6c 76 65 72 28 57 68  erePathSolver(Wh
36950 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
36960 20 4c 6f 67 45 73 74 20 6e 52 6f 77 45 73 74 29   LogEst nRowEst)
36970 7b 0a 20 20 69 6e 74 20 6d 78 43 68 6f 69 63 65  {.  int mxChoice
36980 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
36990 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   Maximum number 
369a0 6f 66 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20  of simultaneous 
369b0 70 61 74 68 73 20 74 72 61 63 6b 65 64 20 2a 2f  paths tracked */
369c0 0a 20 20 69 6e 74 20 6e 4c 6f 6f 70 3b 20 20 20  .  int nLoop;   
369d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
369e0 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20  Number of terms 
369f0 69 6e 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20  in the join */. 
36a00 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20   Parse *pParse; 
36a10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
36a20 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
36a30 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
36a40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36a50 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
36a60 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
36a70 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20   iLoop;         
36a80 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
36a90 6f 75 6e 74 65 72 20 6f 76 65 72 20 74 68 65 20  ounter over the 
36aa0 74 65 72 6d 73 20 6f 66 20 74 68 65 20 6a 6f 69  terms of the joi
36ab0 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69 2c 20 6a  n */.  int ii, j
36ac0 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
36ad0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
36ae0 73 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 49 20 3d  s */.  int mxI =
36af0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
36b00 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65 78   /* Index of nex
36b10 74 20 65 6e 74 72 79 20 74 6f 20 72 65 70 6c 61  t entry to repla
36b20 63 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64  ce */.  int nOrd
36b30 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 20 20  erBy;           
36b40 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f    /* Number of O
36b50 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74  RDER BY clause t
36b60 65 72 6d 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  erms */.  LogEst
36b70 20 6d 78 43 6f 73 74 20 3d 20 30 3b 20 20 20 20   mxCost = 0;    
36b80 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 63      /* Maximum c
36b90 6f 73 74 20 6f 66 20 61 20 73 65 74 20 6f 66 20  ost of a set of 
36ba0 70 61 74 68 73 20 2a 2f 0a 20 20 4c 6f 67 45 73  paths */.  LogEs
36bb0 74 20 6d 78 55 6e 73 6f 72 74 65 64 20 3d 20 30  t mxUnsorted = 0
36bc0 3b 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20  ;    /* Maximum 
36bd0 75 6e 73 6f 72 74 65 64 20 63 6f 73 74 20 6f 66  unsorted cost of
36be0 20 61 20 73 65 74 20 6f 66 20 70 61 74 68 20 2a   a set of path *
36bf0 2f 0a 20 20 69 6e 74 20 6e 54 6f 2c 20 6e 46 72  /.  int nTo, nFr
36c00 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  om;           /*
36c10 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64   Number of valid
36c20 20 65 6e 74 72 69 65 73 20 69 6e 20 61 54 6f 5b   entries in aTo[
36c30 5d 20 61 6e 64 20 61 46 72 6f 6d 5b 5d 20 2a 2f  ] and aFrom[] */
36c40 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 61 46  .  WherePath *aF
36c50 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  rom;         /* 
36c60 41 6c 6c 20 6e 46 72 6f 6d 20 70 61 74 68 73 20  All nFrom paths 
36c70 61 74 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  at the previous 
36c80 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65  level */.  Where
36c90 50 61 74 68 20 2a 61 54 6f 3b 20 20 20 20 20 20  Path *aTo;      
36ca0 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 54 6f 20       /* The nTo 
36cb0 62 65 73 74 20 70 61 74 68 73 20 61 74 20 74 68  best paths at th
36cc0 65 20 63 75 72 72 65 6e 74 20 6c 65 76 65 6c 20  e current level 
36cd0 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a  */.  WherePath *
36ce0 70 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f  pFrom;         /
36cf0 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20  * An element of 
36d00 61 46 72 6f 6d 5b 5d 20 74 68 61 74 20 77 65 20  aFrom[] that we 
36d10 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a  are working on *
36d20 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70  /.  WherePath *p
36d30 54 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  To;           /*
36d40 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61   An element of a
36d50 54 6f 5b 5d 20 74 68 61 74 20 77 65 20 61 72 65  To[] that we are
36d60 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20   working on */. 
36d70 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 57 4c 6f   WhereLoop *pWLo
36d80 6f 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e  op;        /* On
36d90 65 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f  e of the WhereLo
36da0 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20  op objects */.  
36db0 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 58 3b 20  WhereLoop **pX; 
36dc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
36dd0 64 20 74 6f 20 64 69 76 79 20 75 70 20 74 68 65  d to divy up the
36de0 20 70 53 70 61 63 65 20 6d 65 6d 6f 72 79 20 2a   pSpace memory *
36df0 2f 0a 20 20 4c 6f 67 45 73 74 20 2a 61 53 6f 72  /.  LogEst *aSor
36e00 74 43 6f 73 74 20 3d 20 30 3b 20 20 20 20 2f 2a  tCost = 0;    /*
36e10 20 53 6f 72 74 69 6e 67 20 61 6e 64 20 70 61 72   Sorting and par
36e20 74 69 61 6c 20 73 6f 72 74 69 6e 67 20 63 6f 73  tial sorting cos
36e30 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53  ts */.  char *pS
36e40 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  pace;           
36e50 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 6d    /* Temporary m
36e60 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74 68  emory used by th
36e70 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  is routine */.  
36e80 69 6e 74 20 6e 53 70 61 63 65 3b 20 20 20 20 20  int nSpace;     
36e90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
36ea0 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f  es of space allo
36eb0 63 61 74 65 64 20 61 74 20 70 53 70 61 63 65 20  cated at pSpace 
36ec0 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70  */..  pParse = p
36ed0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20  WInfo->pParse;. 
36ee0 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
36ef0 3b 0a 20 20 6e 4c 6f 6f 70 20 3d 20 70 57 49 6e  ;.  nLoop = pWIn
36f00 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 2f 2a  fo->nLevel;.  /*
36f10 20 54 55 4e 49 4e 47 3a 20 46 6f 72 20 73 69 6d   TUNING: For sim
36f20 70 6c 65 20 71 75 65 72 69 65 73 2c 20 6f 6e 6c  ple queries, onl
36f30 79 20 74 68 65 20 62 65 73 74 20 70 61 74 68 20  y the best path 
36f40 69 73 20 74 72 61 63 6b 65 64 2e 0a 20 20 2a 2a  is tracked..  **
36f50 20 46 6f 72 20 32 2d 77 61 79 20 6a 6f 69 6e 73   For 2-way joins
36f60 2c 20 74 68 65 20 35 20 62 65 73 74 20 70 61 74  , the 5 best pat
36f70 68 73 20 61 72 65 20 66 6f 6c 6c 6f 77 65 64 2e  hs are followed.
36f80 0a 20 20 2a 2a 20 46 6f 72 20 6a 6f 69 6e 73 20  .  ** For joins 
36f90 6f 66 20 33 20 6f 72 20 6d 6f 72 65 20 74 61 62  of 3 or more tab
36fa0 6c 65 73 2c 20 74 72 61 63 6b 20 74 68 65 20 31  les, track the 1
36fb0 30 20 62 65 73 74 20 70 61 74 68 73 20 2a 2f 0a  0 best paths */.
36fc0 20 20 6d 78 43 68 6f 69 63 65 20 3d 20 28 6e 4c    mxChoice = (nL
36fd0 6f 6f 70 3c 3d 31 29 20 3f 20 31 20 3a 20 28 6e  oop<=1) ? 1 : (n
36fe0 4c 6f 6f 70 3d 3d 32 20 3f 20 35 20 3a 20 31 30  Loop==2 ? 5 : 10
36ff0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4c 6f  );.  assert( nLo
37000 6f 70 3c 3d 70 57 49 6e 66 6f 2d 3e 70 54 61 62  op<=pWInfo->pTab
37010 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20  List->nSrc );.  
37020 57 48 45 52 45 54 52 41 43 45 28 30 78 30 30 32  WHERETRACE(0x002
37030 2c 20 28 22 2d 2d 2d 2d 20 62 65 67 69 6e 20 73  , ("---- begin s
37040 6f 6c 76 65 72 2e 20 20 28 6e 52 6f 77 45 73 74  olver.  (nRowEst
37050 3d 25 64 29 5c 6e 22 2c 20 6e 52 6f 77 45 73 74  =%d)\n", nRowEst
37060 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 52 6f  ));..  /* If nRo
37070 77 45 73 74 20 69 73 20 7a 65 72 6f 20 61 6e 64  wEst is zero and
37080 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
37090 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 69 67  ER BY clause, ig
370a0 6e 6f 72 65 20 69 74 2e 20 49 6e 20 74 68 69 73  nore it. In this
370b0 0a 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20 70  .  ** case the p
370c0 75 72 70 6f 73 65 20 6f 66 20 74 68 69 73 20 63  urpose of this c
370d0 61 6c 6c 20 69 73 20 74 6f 20 65 73 74 69 6d 61  all is to estima
370e0 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
370f0 20 72 6f 77 73 20 72 65 74 75 72 6e 65 64 0a 20   rows returned. 
37100 20 2a 2a 20 62 79 20 74 68 65 20 6f 76 65 72 61   ** by the overa
37110 6c 6c 20 71 75 65 72 79 2e 20 4f 6e 63 65 20 74  ll query. Once t
37120 68 69 73 20 65 73 74 69 6d 61 74 65 20 68 61 73  his estimate has
37130 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 2c 20   been obtained, 
37140 74 68 65 20 63 61 6c 6c 65 72 0a 20 20 2a 2a 20  the caller.  ** 
37150 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 69 73  will invoke this
37160 20 66 75 6e 63 74 69 6f 6e 20 61 20 73 65 63 6f   function a seco
37170 6e 64 20 74 69 6d 65 2c 20 70 61 73 73 69 6e 67  nd time, passing
37180 20 74 68 65 20 65 73 74 69 6d 61 74 65 20 61 73   the estimate as
37190 20 74 68 65 0a 20 20 2a 2a 20 6e 52 6f 77 45 73   the.  ** nRowEs
371a0 74 20 70 61 72 61 6d 65 74 65 72 2e 20 20 2a 2f  t parameter.  */
371b0 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70  .  if( pWInfo->p
371c0 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 6e 52  OrderBy==0 || nR
371d0 6f 77 45 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  owEst==0 ){.    
371e0 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  nOrderBy = 0;.  
371f0 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4f 72 64 65  }else{.    nOrde
37200 72 42 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4f  rBy = pWInfo->pO
37210 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
37220 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74   }..  /* Allocat
37230 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  e and initialize
37240 20 73 70 61 63 65 20 66 6f 72 20 61 54 6f 2c 20   space for aTo, 
37250 61 46 72 6f 6d 20 61 6e 64 20 61 53 6f 72 74 43  aFrom and aSortC
37260 6f 73 74 5b 5d 20 2a 2f 0a 20 20 6e 53 70 61 63  ost[] */.  nSpac
37270 65 20 3d 20 28 73 69 7a 65 6f 66 28 57 68 65 72  e = (sizeof(Wher
37280 65 50 61 74 68 29 2b 73 69 7a 65 6f 66 28 57 68  ePath)+sizeof(Wh
37290 65 72 65 4c 6f 6f 70 2a 29 2a 6e 4c 6f 6f 70 29  ereLoop*)*nLoop)
372a0 2a 6d 78 43 68 6f 69 63 65 2a 32 3b 0a 20 20 6e  *mxChoice*2;.  n
372b0 53 70 61 63 65 20 2b 3d 20 73 69 7a 65 6f 66 28  Space += sizeof(
372c0 4c 6f 67 45 73 74 29 20 2a 20 6e 4f 72 64 65 72  LogEst) * nOrder
372d0 42 79 3b 0a 20 20 70 53 70 61 63 65 20 3d 20 73  By;.  pSpace = s
372e0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
372f0 77 28 64 62 2c 20 6e 53 70 61 63 65 29 3b 0a 20  w(db, nSpace);. 
37300 20 69 66 28 20 70 53 70 61 63 65 3d 3d 30 20 29   if( pSpace==0 )
37310 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
37320 4f 4d 45 4d 3b 0a 20 20 61 54 6f 20 3d 20 28 57  OMEM;.  aTo = (W
37330 68 65 72 65 50 61 74 68 2a 29 70 53 70 61 63 65  herePath*)pSpace
37340 3b 0a 20 20 61 46 72 6f 6d 20 3d 20 61 54 6f 2b  ;.  aFrom = aTo+
37350 6d 78 43 68 6f 69 63 65 3b 0a 20 20 6d 65 6d 73  mxChoice;.  mems
37360 65 74 28 61 46 72 6f 6d 2c 20 30 2c 20 73 69 7a  et(aFrom, 0, siz
37370 65 6f 66 28 61 46 72 6f 6d 5b 30 5d 29 29 3b 0a  eof(aFrom[0]));.
37380 20 20 70 58 20 3d 20 28 57 68 65 72 65 4c 6f 6f    pX = (WhereLoo
37390 70 2a 2a 29 28 61 46 72 6f 6d 2b 6d 78 43 68 6f  p**)(aFrom+mxCho
373a0 69 63 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d 6d  ice);.  for(ii=m
373b0 78 43 68 6f 69 63 65 2a 32 2c 20 70 46 72 6f 6d  xChoice*2, pFrom
373c0 3d 61 54 6f 3b 20 69 69 3e 30 3b 20 69 69 2d 2d  =aTo; ii>0; ii--
373d0 2c 20 70 46 72 6f 6d 2b 2b 2c 20 70 58 20 2b 3d  , pFrom++, pX +=
373e0 20 6e 4c 6f 6f 70 29 7b 0a 20 20 20 20 70 46 72   nLoop){.    pFr
373f0 6f 6d 2d 3e 61 4c 6f 6f 70 20 3d 20 70 58 3b 0a  om->aLoop = pX;.
37400 20 20 7d 0a 20 20 69 66 28 20 6e 4f 72 64 65 72    }.  if( nOrder
37410 42 79 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  By ){.    /* If 
37420 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
37430 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20  R BY clause and 
37440 69 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20  it is not being 
37450 69 67 6e 6f 72 65 64 2c 20 73 65 74 20 75 70 0a  ignored, set up.
37460 20 20 20 20 2a 2a 20 73 70 61 63 65 20 66 6f 72      ** space for
37470 20 74 68 65 20 61 53 6f 72 74 43 6f 73 74 5b 5d   the aSortCost[]
37480 20 61 72 72 61 79 2e 20 45 61 63 68 20 65 6c 65   array. Each ele
37490 6d 65 6e 74 20 6f 66 20 74 68 65 20 61 53 6f 72  ment of the aSor
374a0 74 43 6f 73 74 20 61 72 72 61 79 0a 20 20 20 20  tCost array.    
374b0 2a 2a 20 69 73 20 65 69 74 68 65 72 20 7a 65 72  ** is either zer
374c0 6f 20 2d 20 6d 65 61 6e 69 6e 67 20 69 74 20 68  o - meaning it h
374d0 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  as not yet been 
374e0 69 6e 69 74 69 61 6c 69 7a 65 64 20 2d 20 6f 72  initialized - or
374f0 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 73 74   the.    ** cost
37500 20 6f 66 20 73 6f 72 74 69 6e 67 20 6e 52 6f 77   of sorting nRow
37510 45 73 74 20 72 6f 77 73 20 6f 66 20 64 61 74 61  Est rows of data
37520 20 77 68 65 72 65 20 74 68 65 20 66 69 72 73 74   where the first
37530 20 58 20 74 65 72 6d 73 20 6f 66 0a 20 20 20 20   X terms of.    
37540 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ** the ORDER BY 
37550 63 6c 61 75 73 65 20 61 72 65 20 61 6c 72 65 61  clause are alrea
37560 64 79 20 69 6e 20 6f 72 64 65 72 2c 20 77 68 65  dy in order, whe
37570 72 65 20 58 20 69 73 20 74 68 65 20 61 72 72 61  re X is the arra
37580 79 20 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 2e  y .    ** index.
37590 20 20 2a 2f 0a 20 20 20 20 61 53 6f 72 74 43 6f    */.    aSortCo
375a0 73 74 20 3d 20 28 4c 6f 67 45 73 74 2a 29 70 58  st = (LogEst*)pX
375b0 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 61 53 6f  ;.    memset(aSo
375c0 72 74 43 6f 73 74 2c 20 30 2c 20 73 69 7a 65 6f  rtCost, 0, sizeo
375d0 66 28 4c 6f 67 45 73 74 29 20 2a 20 6e 4f 72 64  f(LogEst) * nOrd
375e0 65 72 42 79 29 3b 0a 20 20 7d 0a 20 20 61 73 73  erBy);.  }.  ass
375f0 65 72 74 28 20 61 53 6f 72 74 43 6f 73 74 3d 3d  ert( aSortCost==
37600 30 20 7c 7c 20 26 70 53 70 61 63 65 5b 6e 53 70  0 || &pSpace[nSp
37610 61 63 65 5d 3d 3d 28 63 68 61 72 2a 29 26 61 53  ace]==(char*)&aS
37620 6f 72 74 43 6f 73 74 5b 6e 4f 72 64 65 72 42 79  ortCost[nOrderBy
37630 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  ] );.  assert( a
37640 53 6f 72 74 43 6f 73 74 21 3d 30 20 7c 7c 20 26  SortCost!=0 || &
37650 70 53 70 61 63 65 5b 6e 53 70 61 63 65 5d 3d 3d  pSpace[nSpace]==
37660 28 63 68 61 72 2a 29 70 58 20 29 3b 0a 0a 20 20  (char*)pX );..  
37670 2f 2a 20 53 65 65 64 20 74 68 65 20 73 65 61 72  /* Seed the sear
37680 63 68 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65  ch with a single
37690 20 57 68 65 72 65 50 61 74 68 20 63 6f 6e 74 61   WherePath conta
376a0 69 6e 69 6e 67 20 7a 65 72 6f 20 57 68 65 72 65  ining zero Where
376b0 4c 6f 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  Loops..  **.  **
376c0 20 54 55 4e 49 4e 47 3a 20 44 6f 20 6e 6f 74 20   TUNING: Do not 
376d0 6c 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  let the number o
376e0 66 20 69 74 65 72 61 74 69 6f 6e 73 20 67 6f 20  f iterations go 
376f0 61 62 6f 76 65 20 32 38 2e 20 20 49 66 20 74 68  above 28.  If th
37700 65 20 63 6f 73 74 0a 20 20 2a 2a 20 6f 66 20 63  e cost.  ** of c
37710 6f 6d 70 75 74 69 6e 67 20 61 6e 20 61 75 74 6f  omputing an auto
37720 6d 61 74 69 63 20 69 6e 64 65 78 20 69 73 20 6e  matic index is n
37730 6f 74 20 70 61 69 64 20 62 61 63 6b 20 77 69 74  ot paid back wit
37740 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 32 38  hin the first 28
37750 0a 20 20 2a 2a 20 72 6f 77 73 2c 20 74 68 65 6e  .  ** rows, then
37760 20 64 6f 20 6e 6f 74 20 75 73 65 20 74 68 65 20   do not use the 
37770 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e  automatic index.
37780 20 2a 2f 0a 20 20 61 46 72 6f 6d 5b 30 5d 2e 6e   */.  aFrom[0].n
37790 52 6f 77 20 3d 20 4d 49 4e 28 70 50 61 72 73 65  Row = MIN(pParse
377a0 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 2c 20 34 38  ->nQueryLoop, 48
377b0 29 3b 20 20 61 73 73 65 72 74 28 20 34 38 3d 3d  );  assert( 48==
377c0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 38  sqlite3LogEst(28
377d0 29 20 29 3b 0a 20 20 6e 46 72 6f 6d 20 3d 20 31  ) );.  nFrom = 1
377e0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 46 72 6f  ;.  assert( aFro
377f0 6d 5b 30 5d 2e 69 73 4f 72 64 65 72 65 64 3d 3d  m[0].isOrdered==
37800 30 20 29 3b 0a 20 20 69 66 28 20 6e 4f 72 64 65  0 );.  if( nOrde
37810 72 42 79 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  rBy ){.    /* If
37820 20 6e 4c 6f 6f 70 20 69 73 20 7a 65 72 6f 2c 20   nLoop is zero, 
37830 74 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e  then there are n
37840 6f 20 46 52 4f 4d 20 74 65 72 6d 73 20 69 6e 20  o FROM terms in 
37850 74 68 65 20 71 75 65 72 79 2e 20 53 69 6e 63 65  the query. Since
37860 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 69 73 20  .    ** in this 
37870 63 61 73 65 20 74 68 65 20 71 75 65 72 79 20 6d  case the query m
37880 61 79 20 72 65 74 75 72 6e 20 61 20 6d 61 78 69  ay return a maxi
37890 6d 75 6d 20 6f 66 20 6f 6e 65 20 72 6f 77 2c 20  mum of one row, 
378a0 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20  the results.    
378b0 2a 2a 20 61 72 65 20 61 6c 72 65 61 64 79 20 69  ** are already i
378c0 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
378d0 6f 72 64 65 72 2e 20 53 65 74 20 69 73 4f 72 64  order. Set isOrd
378e0 65 72 65 64 20 74 6f 20 6e 4f 72 64 65 72 42 79  ered to nOrderBy
378f0 20 74 6f 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63   to.    ** indic
37900 61 74 65 20 74 68 69 73 2e 20 4f 72 2c 20 69 66  ate this. Or, if
37910 20 6e 4c 6f 6f 70 20 69 73 20 67 72 65 61 74 65   nLoop is greate
37920 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 73 65 74  r than zero, set
37930 20 69 73 4f 72 64 65 72 65 64 20 74 6f 0a 20 20   isOrdered to.  
37940 20 20 2a 2a 20 2d 31 2c 20 69 6e 64 69 63 61 74    ** -1, indicat
37950 69 6e 67 20 74 68 61 74 20 74 68 65 20 72 65 73  ing that the res
37960 75 6c 74 20 73 65 74 20 6d 61 79 20 6f 72 20 6d  ult set may or m
37970 61 79 20 6e 6f 74 20 62 65 20 6f 72 64 65 72 65  ay not be ordere
37980 64 2c 20 0a 20 20 20 20 2a 2a 20 64 65 70 65 6e  d, .    ** depen
37990 64 69 6e 67 20 6f 6e 20 74 68 65 20 6c 6f 6f 70  ding on the loop
379a0 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 63  s added to the c
379b0 75 72 72 65 6e 74 20 70 6c 61 6e 2e 20 20 2a 2f  urrent plan.  */
379c0 0a 20 20 20 20 61 46 72 6f 6d 5b 30 5d 2e 69 73  .    aFrom[0].is
379d0 4f 72 64 65 72 65 64 20 3d 20 6e 4c 6f 6f 70 3e  Ordered = nLoop>
379e0 30 20 3f 20 2d 31 20 3a 20 6e 4f 72 64 65 72 42  0 ? -1 : nOrderB
379f0 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d  y;.  }..  /* Com
37a00 70 75 74 65 20 73 75 63 63 65 73 73 69 76 65 6c  pute successivel
37a10 79 20 6c 6f 6e 67 65 72 20 57 68 65 72 65 50 61  y longer WherePa
37a20 74 68 73 20 75 73 69 6e 67 20 74 68 65 20 70 72  ths using the pr
37a30 65 76 69 6f 75 73 20 67 65 6e 65 72 61 74 69 6f  evious generatio
37a40 6e 0a 20 20 2a 2a 20 6f 66 20 57 68 65 72 65 50  n.  ** of WhereP
37a50 61 74 68 73 20 61 73 20 74 68 65 20 62 61 73 69  aths as the basi
37a60 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 2e 20  s for the next. 
37a70 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74   Keep track of t
37a80 68 65 20 6d 78 43 68 6f 69 63 65 0a 20 20 2a 2a  he mxChoice.  **
37a90 20 62 65 73 74 20 70 61 74 68 73 20 61 74 20 65   best paths at e
37aa0 61 63 68 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a  ach generation *
37ab0 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b  /.  for(iLoop=0;
37ac0 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c   iLoop<nLoop; iL
37ad0 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 6e 54 6f 20  oop++){.    nTo 
37ae0 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d  = 0;.    for(ii=
37af0 30 2c 20 70 46 72 6f 6d 3d 61 46 72 6f 6d 3b 20  0, pFrom=aFrom; 
37b00 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 2c 20  ii<nFrom; ii++, 
37b10 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pFrom++){.      
37b20 66 6f 72 28 70 57 4c 6f 6f 70 3d 70 57 49 6e 66  for(pWLoop=pWInf
37b30 6f 2d 3e 70 4c 6f 6f 70 73 3b 20 70 57 4c 6f 6f  o->pLoops; pWLoo
37b40 70 3b 20 70 57 4c 6f 6f 70 3d 70 57 4c 6f 6f 70  p; pWLoop=pWLoop
37b50 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20  ->pNextLoop){.  
37b60 20 20 20 20 20 20 4c 6f 67 45 73 74 20 6e 4f 75        LogEst nOu
37b70 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
37b80 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20          /* Rows 
37b90 76 69 73 69 74 65 64 20 62 79 20 28 70 46 72 6f  visited by (pFro
37ba0 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20  m+pWLoop) */.   
37bb0 20 20 20 20 20 4c 6f 67 45 73 74 20 72 43 6f 73       LogEst rCos
37bc0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
37bd0 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f         /* Cost o
37be0 66 20 70 61 74 68 20 28 70 46 72 6f 6d 2b 70 57  f path (pFrom+pW
37bf0 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20 20  Loop) */.       
37c00 20 4c 6f 67 45 73 74 20 72 55 6e 73 6f 72 74 65   LogEst rUnsorte
37c10 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
37c20 20 20 20 2f 2a 20 55 6e 73 6f 72 74 65 64 20 63     /* Unsorted c
37c30 6f 73 74 20 6f 66 20 28 70 46 72 6f 6d 2b 70 57  ost of (pFrom+pW
37c40 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20 20  Loop) */.       
37c50 20 69 38 20 69 73 4f 72 64 65 72 65 64 20 3d 20   i8 isOrdered = 
37c60 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64  pFrom->isOrdered
37c70 3b 20 20 2f 2a 20 69 73 4f 72 64 65 72 65 64 20  ;  /* isOrdered 
37c80 66 6f 72 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f  for (pFrom+pWLoo
37c90 70 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 42 69  p) */.        Bi
37ca0 74 6d 61 73 6b 20 6d 61 73 6b 4e 65 77 3b 20 20  tmask maskNew;  
37cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37cc0 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 72 63 20 76  /* Mask of src v
37cd0 69 73 69 74 65 64 20 62 79 20 28 2e 2e 29 20 2a  isited by (..) *
37ce0 2f 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73  /.        Bitmas
37cf0 6b 20 72 65 76 4d 61 73 6b 20 3d 20 30 3b 20 20  k revMask = 0;  
37d00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
37d10 61 73 6b 20 6f 66 20 72 65 76 2d 6f 72 64 65 72  ask of rev-order
37d20 20 6c 6f 6f 70 73 20 66 6f 72 20 28 2e 2e 29 20   loops for (..) 
37d30 2a 2f 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  */..        if( 
37d40 28 70 57 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 20  (pWLoop->prereq 
37d50 26 20 7e 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f  & ~pFrom->maskLo
37d60 6f 70 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  op)!=0 ) continu
37d70 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  e;.        if( (
37d80 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66  pWLoop->maskSelf
37d90 20 26 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f   & pFrom->maskLo
37da0 6f 70 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  op)!=0 ) continu
37db0 65 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74  e;.        /* At
37dc0 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 70 57 4c   this point, pWL
37dd0 6f 6f 70 20 69 73 20 61 20 63 61 6e 64 69 64 61  oop is a candida
37de0 74 65 20 74 6f 20 62 65 20 74 68 65 20 6e 65 78  te to be the nex
37df0 74 20 6c 6f 6f 70 2e 20 0a 20 20 20 20 20 20 20  t loop. .       
37e00 20 2a 2a 20 43 6f 6d 70 75 74 65 20 69 74 73 20   ** Compute its 
37e10 63 6f 73 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  cost */.        
37e20 72 55 6e 73 6f 72 74 65 64 20 3d 20 73 71 6c 69  rUnsorted = sqli
37e30 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70 57 4c  te3LogEstAdd(pWL
37e40 6f 6f 70 2d 3e 72 53 65 74 75 70 2c 70 57 4c 6f  oop->rSetup,pWLo
37e50 6f 70 2d 3e 72 52 75 6e 20 2b 20 70 46 72 6f 6d  op->rRun + pFrom
37e60 2d 3e 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 20  ->nRow);.       
37e70 20 72 55 6e 73 6f 72 74 65 64 20 3d 20 73 71 6c   rUnsorted = sql
37e80 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72 55  ite3LogEstAdd(rU
37e90 6e 73 6f 72 74 65 64 2c 20 70 46 72 6f 6d 2d 3e  nsorted, pFrom->
37ea0 72 55 6e 73 6f 72 74 65 64 29 3b 0a 20 20 20 20  rUnsorted);.    
37eb0 20 20 20 20 6e 4f 75 74 20 3d 20 70 46 72 6f 6d      nOut = pFrom
37ec0 2d 3e 6e 52 6f 77 20 2b 20 70 57 4c 6f 6f 70 2d  ->nRow + pWLoop-
37ed0 3e 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 6d  >nOut;.        m
37ee0 61 73 6b 4e 65 77 20 3d 20 70 46 72 6f 6d 2d 3e  askNew = pFrom->
37ef0 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f  maskLoop | pWLoo
37f00 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20  p->maskSelf;.   
37f10 20 20 20 20 20 69 66 28 20 69 73 4f 72 64 65 72       if( isOrder
37f20 65 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ed<0 ){.        
37f30 20 20 69 73 4f 72 64 65 72 65 64 20 3d 20 77 68    isOrdered = wh
37f40 65 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73  erePathSatisfies
37f50 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 0a  OrderBy(pWInfo,.
37f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37f70 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70         pWInfo->p
37f80 4f 72 64 65 72 42 79 2c 20 70 46 72 6f 6d 2c 20  OrderBy, pFrom, 
37f90 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
37fa0 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  gs,.            
37fb0 20 20 20 20 20 20 20 20 20 20 20 69 4c 6f 6f 70             iLoop
37fc0 2c 20 70 57 4c 6f 6f 70 2c 20 26 72 65 76 4d 61  , pWLoop, &revMa
37fd0 73 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  sk);.        }el
37fe0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65  se{.          re
37ff0 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72  vMask = pFrom->r
38000 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20  evLoop;.        
38010 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  }.        if( is
38020 4f 72 64 65 72 65 64 3e 3d 30 20 26 26 20 69 73  Ordered>=0 && is
38030 4f 72 64 65 72 65 64 3c 6e 4f 72 64 65 72 42 79  Ordered<nOrderBy
38040 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
38050 28 20 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72  ( aSortCost[isOr
38060 64 65 72 65 64 5d 3d 3d 30 20 29 7b 0a 20 20 20  dered]==0 ){.   
38070 20 20 20 20 20 20 20 20 20 61 53 6f 72 74 43 6f           aSortCo
38080 73 74 5b 69 73 4f 72 64 65 72 65 64 5d 20 3d 20  st[isOrdered] = 
38090 77 68 65 72 65 53 6f 72 74 69 6e 67 43 6f 73 74  whereSortingCost
380a0 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
380b0 20 20 70 57 49 6e 66 6f 2c 20 6e 52 6f 77 45 73    pWInfo, nRowEs
380c0 74 2c 20 6e 4f 72 64 65 72 42 79 2c 20 69 73 4f  t, nOrderBy, isO
380d0 72 64 65 72 65 64 0a 20 20 20 20 20 20 20 20 20  rdered.         
380e0 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20     );.          
380f0 7d 0a 20 20 20 20 20 20 20 20 20 20 72 43 6f 73  }.          rCos
38100 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  t = sqlite3LogEs
38110 74 41 64 64 28 72 55 6e 73 6f 72 74 65 64 2c 20  tAdd(rUnsorted, 
38120 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64 65  aSortCost[isOrde
38130 72 65 64 5d 29 3b 0a 0a 20 20 20 20 20 20 20 20  red]);..        
38140 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 30    WHERETRACE(0x0
38150 30 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  02,.            
38160 20 20 28 22 2d 2d 2d 2d 20 73 6f 72 74 20 63 6f    ("---- sort co
38170 73 74 3d 25 2d 33 64 20 28 25 64 2f 25 64 29 20  st=%-3d (%d/%d) 
38180 69 6e 63 7