/ Hex Artifact Content
Login

Artifact 5eb9ab47f6e256f0f241a000469bc4e1bd2cb085:


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 57 65 20 61 6c 72 65 61 64 79 20  *.** We already 
a3a0: 6b 6e 6f 77 20 74 68 61 74 20 70 45 78 70 72 20  know that pExpr 
a3b0: 69 73 20 61 20 62 69 6e 61 72 79 20 6f 70 65 72  is a binary oper
a3c0: 61 74 6f 72 20 77 68 65 72 65 20 62 6f 74 68 20  ator where both 
a3d0: 6f 70 65 72 61 6e 64 73 20 61 72 65 0a 2a 2a 20  operands are.** 
a3e0: 63 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63 65  column reference
a3f0: 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  s.  This routine
a400: 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69   checks to see i
a410: 66 20 70 45 78 70 72 20 69 73 20 61 6e 20 65 71  f pExpr is an eq
a420: 75 69 76 61 6c 65 6e 63 65 0a 2a 2a 20 72 65 6c  uivalence.** rel
a430: 61 74 69 6f 6e 3a 0a 2a 2a 20 20 20 31 2e 20 20  ation:.**   1.  
a440: 54 68 65 20 53 51 4c 49 54 45 5f 54 72 61 6e 73  The SQLITE_Trans
a450: 69 74 69 76 65 20 6f 70 74 69 6d 69 7a 61 74 69  itive optimizati
a460: 6f 6e 20 6d 75 73 74 20 62 65 20 65 6e 61 62 6c  on must be enabl
a470: 65 64 0a 2a 2a 20 20 20 32 2e 20 20 4d 75 73 74  ed.**   2.  Must
a480: 20 62 65 20 65 69 74 68 65 72 20 61 6e 20 3d 3d   be either an ==
a490: 20 6f 72 20 61 6e 20 49 53 20 6f 70 65 72 61 74   or an IS operat
a4a0: 6f 72 0a 2a 2a 20 20 20 33 2e 20 20 4e 6f 74 20  or.**   3.  Not 
a4b0: 6f 72 69 67 69 6e 61 74 69 6e 67 20 74 68 65 20  originating the 
a4c0: 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 6e 20  ON clause of an 
a4d0: 4f 55 54 45 52 20 4a 4f 49 4e 0a 2a 2a 20 20 20  OUTER JOIN.**   
a4e0: 34 2e 20 20 54 68 65 20 61 66 66 69 6e 69 74 69  4.  The affiniti
a4f0: 65 73 20 6f 66 20 41 20 61 6e 64 20 42 20 6d 75  es of A and B mu
a500: 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65  st be compatible
a510: 0a 2a 2a 20 20 20 35 61 2e 20 42 6f 74 68 20 6f  .**   5a. Both o
a520: 70 65 72 61 6e 64 73 20 75 73 65 20 74 68 65 20  perands use the 
a530: 73 61 6d 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  same collating s
a540: 65 71 75 65 6e 63 65 20 4f 52 0a 2a 2a 20 20 20  equence OR.**   
a550: 35 62 2e 20 54 68 65 20 6f 76 65 72 61 6c 6c 20  5b. The overall 
a560: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
a570: 63 65 20 69 73 20 42 49 4e 41 52 59 0a 2a 2a 20  ce is BINARY.** 
a580: 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  If this routine 
a590: 72 65 74 75 72 6e 73 20 54 52 55 45 2c 20 74 68  returns TRUE, th
a5a0: 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  at means that th
a5b0: 65 20 52 48 53 20 63 61 6e 20 62 65 20 73 75 62  e RHS can be sub
a5c0: 73 74 69 74 75 74 65 64 0a 2a 2a 20 66 6f 72 20  stituted.** for 
a5d0: 74 68 65 20 4c 48 53 20 61 6e 79 70 6c 61 63 65  the LHS anyplace
a5e0: 20 65 6c 73 65 20 69 6e 20 74 68 65 20 57 48 45   else in the WHE
a5f0: 52 45 20 63 6c 61 75 73 65 20 77 68 65 72 65 20  RE clause where 
a600: 74 68 65 20 4c 48 53 20 63 6f 6c 75 6d 6e 20 6f  the LHS column o
a610: 63 63 75 72 73 2e 0a 2a 2a 20 54 68 69 73 20 69  ccurs..** This i
a620: 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
a630: 6e 2e 20 20 4e 6f 20 68 61 72 6d 20 63 6f 6d 65  n.  No harm come
a640: 73 20 66 72 6f 6d 20 72 65 74 75 72 6e 69 6e 67  s from returning
a650: 20 30 2e 20 20 42 75 74 20 69 66 20 31 20 69 73   0.  But if 1 is
a660: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68 65  .** returned whe
a670: 6e 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20  n it should not 
a680: 62 65 2c 20 74 68 65 6e 20 69 6e 63 6f 72 72 65  be, then incorre
a690: 63 74 20 61 6e 73 77 65 72 73 20 6d 69 67 68 74  ct answers might
a6a0: 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74   result..*/.stat
a6b0: 69 63 20 69 6e 74 20 74 65 72 6d 49 73 45 71 75  ic int termIsEqu
a6c0: 69 76 61 6c 65 6e 63 65 28 50 61 72 73 65 20 2a  ivalence(Parse *
a6d0: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
a6e0: 78 70 72 29 7b 0a 20 20 63 68 61 72 20 61 66 66  xpr){.  char aff
a6f0: 31 2c 20 61 66 66 32 3b 0a 20 20 43 6f 6c 6c 53  1, aff2;.  CollS
a700: 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 63 6f 6e  eq *pColl;.  con
a710: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 31 2c  st char *zColl1,
a720: 20 2a 7a 43 6f 6c 6c 32 3b 0a 20 20 69 66 28 20   *zColl2;.  if( 
a730: 21 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61  !OptimizationEna
a740: 62 6c 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  bled(pParse->db,
a750: 20 53 51 4c 49 54 45 5f 54 72 61 6e 73 69 74 69   SQLITE_Transiti
a760: 76 65 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ve) ) return 0;.
a770: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
a780: 3d 54 4b 5f 45 51 20 26 26 20 70 45 78 70 72 2d  =TK_EQ && pExpr-
a790: 3e 6f 70 21 3d 54 4b 5f 49 53 20 29 20 72 65 74  >op!=TK_IS ) ret
a7a0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 45 78 70  urn 0;.  if( Exp
a7b0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
a7c0: 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
a7d0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61   ) return 0;.  a
a7e0: 66 66 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ff1 = sqlite3Exp
a7f0: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d  rAffinity(pExpr-
a800: 3e 70 4c 65 66 74 29 3b 0a 20 20 61 66 66 32 20  >pLeft);.  aff2 
a810: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
a820: 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 52 69  inity(pExpr->pRi
a830: 67 68 74 29 3b 0a 20 20 69 66 28 20 61 66 66 31  ght);.  if( aff1
a840: 21 3d 61 66 66 32 0a 20 20 20 26 26 20 28 21 73  !=aff2.   && (!s
a850: 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41  qlite3IsNumericA
a860: 66 66 69 6e 69 74 79 28 61 66 66 31 29 20 7c 7c  ffinity(aff1) ||
a870: 20 21 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72   !sqlite3IsNumer
a880: 69 63 41 66 66 69 6e 69 74 79 28 61 66 66 32 29  icAffinity(aff2)
a890: 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
a8a0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 6c  n 0;.  }.  pColl
a8b0: 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79   = sqlite3Binary
a8c0: 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
a8d0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
a8e0: 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
a8f0: 68 74 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c  ht);.  if( pColl
a900: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 74  ==0 || sqlite3St
a910: 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  rICmp(pColl->zNa
a920: 6d 65 2c 20 22 42 49 4e 41 52 59 22 29 3d 3d 30  me, "BINARY")==0
a930: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 70   ) return 1;.  p
a940: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
a950: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
a960: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
a970: 0a 20 20 2f 2a 20 53 69 6e 63 65 20 70 4c 65 66  .  /* Since pLef
a980: 74 20 61 6e 64 20 70 52 69 67 68 74 20 61 72 65  t and pRight are
a990: 20 62 6f 74 68 20 61 20 63 6f 6c 75 6d 6e 20 72   both a column r
a9a0: 65 66 65 72 65 6e 63 65 73 2c 20 74 68 65 69 72  eferences, their
a9b0: 20 63 6f 6c 6c 61 74 69 6e 67 0a 20 20 2a 2a 20   collating.  ** 
a9c0: 73 65 71 75 65 6e 63 65 20 73 68 6f 75 6c 64 20  sequence should 
a9d0: 61 6c 77 61 79 73 20 62 65 20 64 65 66 69 6e 65  always be define
a9e0: 64 2e 20 2a 2f 0a 20 20 7a 43 6f 6c 6c 31 20 3d  d. */.  zColl1 =
a9f0: 20 41 4c 57 41 59 53 28 70 43 6f 6c 6c 29 20 3f   ALWAYS(pColl) ?
aa00: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20   pColl->zName : 
aa10: 30 3b 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  0;.  pColl = sql
aa20: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
aa30: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
aa40: 52 69 67 68 74 29 3b 0a 20 20 7a 43 6f 6c 6c 32  Right);.  zColl2
aa50: 20 3d 20 41 4c 57 41 59 53 28 70 43 6f 6c 6c 29   = ALWAYS(pColl)
aa60: 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20   ? pColl->zName 
aa70: 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  : 0;.  return sq
aa80: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 43 6f  lite3StrICmp(zCo
aa90: 6c 6c 31 2c 20 7a 43 6f 6c 6c 32 29 3d 3d 30 3b  ll1, zColl2)==0;
aaa0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e  .}../*.** The in
aab0: 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74  put to this rout
aac0: 69 6e 65 20 69 73 20 61 6e 20 57 68 65 72 65 54  ine is an WhereT
aad0: 65 72 6d 20 73 74 72 75 63 74 75 72 65 20 77 69  erm structure wi
aae0: 74 68 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 22  th only the.** "
aaf0: 70 45 78 70 72 22 20 66 69 65 6c 64 20 66 69 6c  pExpr" field fil
ab00: 6c 65 64 20 69 6e 2e 20 20 54 68 65 20 6a 6f 62  led in.  The job
ab10: 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
ab20: 20 69 73 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74   is to analyze t
ab30: 68 65 0a 2a 2a 20 73 75 62 65 78 70 72 65 73 73  he.** subexpress
ab40: 69 6f 6e 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  ion and populate
ab50: 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 66   all the other f
ab60: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 57 68 65  ields of the Whe
ab70: 72 65 54 65 72 6d 0a 2a 2a 20 73 74 72 75 63 74  reTerm.** struct
ab80: 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ure..**.** If th
ab90: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
aba0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 65 78  of the form "<ex
abb0: 70 72 3e 20 3c 6f 70 3e 20 58 22 20 69 74 20 67  pr> <op> X" it g
abc0: 65 74 73 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a 20  ets commuted.** 
abd0: 74 6f 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  to the standard 
abe0: 66 6f 72 6d 20 6f 66 20 22 58 20 3c 6f 70 3e 20  form of "X <op> 
abf0: 3c 65 78 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20 49  <expr>"..**.** I
ac00: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
ac10: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   is of the form 
ac20: 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65  "X <op> Y" where
ac30: 20 62 6f 74 68 20 58 20 61 6e 64 20 59 20 61 72   both X and Y ar
ac40: 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 2c 20 74 68  e.** columns, th
ac50: 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  en the original 
ac60: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75 6e  expression is un
ac70: 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20 6e 65  changed and a ne
ac80: 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72  w virtual.** ter
ac90: 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 59  m of the form "Y
aca0: 20 3c 6f 70 3e 20 58 22 20 69 73 20 61 64 64 65   <op> X" is adde
acb0: 64 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  d to the WHERE c
acc0: 6c 61 75 73 65 20 61 6e 64 0a 2a 2a 20 61 6e 61  lause and.** ana
acd0: 6c 79 7a 65 64 20 73 65 70 61 72 61 74 65 6c 79  lyzed separately
ace0: 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  .  The original 
acf0: 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77  term is marked w
ad00: 69 74 68 20 54 45 52 4d 5f 43 4f 50 49 45 44 0a  ith TERM_COPIED.
ad10: 2a 2a 20 61 6e 64 20 74 68 65 20 6e 65 77 20 74  ** and the new t
ad20: 65 72 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69  erm is marked wi
ad30: 74 68 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20  th TERM_DYNAMIC 
ad40: 28 62 65 63 61 75 73 65 20 69 74 27 73 20 70 45  (because it's pE
ad50: 78 70 72 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20  xpr.** needs to 
ad60: 62 65 20 66 72 65 65 64 20 77 69 74 68 20 74 68  be freed with th
ad70: 65 20 57 68 65 72 65 43 6c 61 75 73 65 29 20 61  e WhereClause) a
ad80: 6e 64 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20  nd TERM_VIRTUAL 
ad90: 28 62 65 63 61 75 73 65 20 69 74 0a 2a 2a 20 69  (because it.** i
ada0: 73 20 61 20 63 6f 6d 6d 75 74 65 64 20 63 6f 70  s a commuted cop
adb0: 79 20 6f 66 20 61 20 70 72 69 6f 72 20 74 65 72  y of a prior ter
adc0: 6d 2e 29 20 20 54 68 65 20 6f 72 69 67 69 6e 61  m.)  The origina
add0: 6c 20 74 65 72 6d 20 68 61 73 20 6e 43 68 69 6c  l term has nChil
ade0: 64 3d 31 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63  d=1.** and the c
adf0: 6f 70 79 20 68 61 73 20 69 64 78 50 61 72 65 6e  opy has idxParen
ae00: 74 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64  t set to the ind
ae10: 65 78 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e  ex of the origin
ae20: 61 6c 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74  al term..*/.stat
ae30: 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c  ic void exprAnal
ae40: 79 7a 65 28 0a 20 20 53 72 63 4c 69 73 74 20 2a  yze(.  SrcList *
ae50: 70 53 72 63 2c 20 20 20 20 20 20 20 20 20 20 20  pSrc,           
ae60: 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   /* the FROM cla
ae70: 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  use */.  WhereCl
ae80: 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
ae90: 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20     /* the WHERE 
aea0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
aeb0: 69 64 78 54 65 72 6d 20 20 20 20 20 20 20 20 20  idxTerm         
aec0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
aed0: 66 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65  f the term to be
aee0: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a   analyzed */.){.
aef0: 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
af00: 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66  nfo = pWC->pWInf
af10: 6f 3b 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75  o; /* WHERE clau
af20: 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f  se processing co
af30: 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
af40: 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
af50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
af60: 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e  he term to be an
af70: 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72  alyzed */.  Wher
af80: 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  eMaskSet *pMaskS
af90: 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  et;          /* 
afa0: 53 65 74 20 6f 66 20 74 61 62 6c 65 20 69 6e 64  Set of table ind
afb0: 65 78 20 6d 61 73 6b 73 20 2a 2f 0a 20 20 45 78  ex masks */.  Ex
afc0: 70 72 20 2a 70 45 78 70 72 3b 20 20 20 20 20 20  pr *pExpr;      
afd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
afe0: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
aff0: 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20   to be analyzed 
b000: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65  */.  Bitmask pre
b010: 72 65 71 4c 65 66 74 3b 20 20 20 20 20 20 20 20  reqLeft;        
b020: 20 20 20 20 20 20 2f 2a 20 50 72 65 72 65 71 75        /* Prerequ
b030: 65 73 69 74 65 73 20 6f 66 20 74 68 65 20 70 45  esites of the pE
b040: 78 70 72 2d 3e 70 4c 65 66 74 20 2a 2f 0a 20 20  xpr->pLeft */.  
b050: 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41 6c  Bitmask prereqAl
b060: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
b070: 20 2f 2a 20 50 72 65 72 65 71 75 65 73 69 74 65   /* Prerequesite
b080: 73 20 6f 66 20 70 45 78 70 72 20 2a 2f 0a 20 20  s of pExpr */.  
b090: 42 69 74 6d 61 73 6b 20 65 78 74 72 61 52 69 67  Bitmask extraRig
b0a0: 68 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ht = 0;         
b0b0: 20 2f 2a 20 45 78 74 72 61 20 64 65 70 65 6e 64   /* Extra depend
b0c0: 65 6e 63 69 65 73 20 6f 6e 20 4c 45 46 54 20 4a  encies on LEFT J
b0d0: 4f 49 4e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  OIN */.  Expr *p
b0e0: 53 74 72 31 20 3d 20 30 3b 20 20 20 20 20 20 20  Str1 = 0;       
b0f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 48 53            /* RHS
b100: 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70   of LIKE/GLOB op
b110: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  erator */.  int 
b120: 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 20  isComplete = 0; 
b130: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b140: 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42  RHS of LIKE/GLOB
b150: 20 65 6e 64 73 20 77 69 74 68 20 77 69 6c 64 63   ends with wildc
b160: 61 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43  ard */.  int noC
b170: 61 73 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ase = 0;        
b180: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 75 70 70            /* upp
b190: 65 72 63 61 73 65 20 65 71 75 69 76 61 6c 65 6e  ercase equivalen
b1a0: 74 20 74 6f 20 6c 6f 77 65 72 63 61 73 65 20 2a  t to lowercase *
b1b0: 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20  /.  int op;     
b1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1d0: 20 20 20 20 20 2f 2a 20 54 6f 70 2d 6c 65 76 65       /* Top-leve
b1e0: 6c 20 6f 70 65 72 61 74 6f 72 2e 20 20 70 45 78  l operator.  pEx
b1f0: 70 72 2d 3e 6f 70 20 2a 2f 0a 20 20 50 61 72 73  pr->op */.  Pars
b200: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e  e *pParse = pWIn
b210: 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20 2f 2a 20  fo->pParse;  /* 
b220: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
b230: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
b240: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
b250: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
b260: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
b270: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
b280: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  cFailed ){.    r
b290: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 65  eturn;.  }.  pTe
b2a0: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
b2b0: 54 65 72 6d 5d 3b 0a 20 20 70 4d 61 73 6b 53 65  Term];.  pMaskSe
b2c0: 74 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  t = &pWInfo->sMa
b2d0: 73 6b 53 65 74 3b 0a 20 20 70 45 78 70 72 20 3d  skSet;.  pExpr =
b2e0: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
b2f0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
b300: 6f 70 21 3d 54 4b 5f 41 53 20 26 26 20 70 45 78  op!=TK_AS && pEx
b310: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 4c 41  pr->op!=TK_COLLA
b320: 54 45 20 29 3b 0a 20 20 70 72 65 72 65 71 4c 65  TE );.  prereqLe
b330: 66 74 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73  ft = exprTableUs
b340: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45  age(pMaskSet, pE
b350: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 6f  xpr->pLeft);.  o
b360: 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20  p = pExpr->op;. 
b370: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29   if( op==TK_IN )
b380: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  {.    assert( pE
b390: 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  xpr->pRight==0 )
b3a0: 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  ;.    if( ExprHa
b3b0: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
b3c0: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
b3d0: 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70  {.      pTerm->p
b3e0: 72 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70  rereqRight = exp
b3f0: 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67  rSelectTableUsag
b400: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70  e(pMaskSet, pExp
b410: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20  r->x.pSelect);. 
b420: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b430: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
b440: 68 74 20 3d 20 65 78 70 72 4c 69 73 74 54 61 62  ht = exprListTab
b450: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
b460: 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  , pExpr->x.pList
b470: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
b480: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55   if( op==TK_ISNU
b490: 4c 4c 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d  LL ){.    pTerm-
b4a0: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 30  >prereqRight = 0
b4b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
b4c0: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
b4d0: 74 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61  t = exprTableUsa
b4e0: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78  ge(pMaskSet, pEx
b4f0: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d  pr->pRight);.  }
b500: 0a 20 20 70 72 65 72 65 71 41 6c 6c 20 3d 20 65  .  prereqAll = e
b510: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
b520: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 29 3b 0a  askSet, pExpr);.
b530: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
b540: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
b550: 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20  FromJoin) ){.   
b560: 20 42 69 74 6d 61 73 6b 20 78 20 3d 20 67 65 74   Bitmask x = get
b570: 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
b580: 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  Expr->iRightJoin
b590: 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 72 65 72  Table);.    prer
b5a0: 65 71 41 6c 6c 20 7c 3d 20 78 3b 0a 20 20 20 20  eqAll |= x;.    
b5b0: 65 78 74 72 61 52 69 67 68 74 20 3d 20 78 2d 31  extraRight = x-1
b5c0: 3b 20 20 2f 2a 20 4f 4e 20 63 6c 61 75 73 65 20  ;  /* ON clause 
b5d0: 74 65 72 6d 73 20 6d 61 79 20 6e 6f 74 20 62 65  terms may not be
b5e0: 20 75 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e   used with an in
b5f0: 64 65 78 0a 20 20 20 20 20 20 20 20 20 20 20 20  dex.            
b600: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e             ** on
b610: 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20 61   left table of a
b620: 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 20 54 69 63   LEFT JOIN.  Tic
b630: 6b 65 74 20 23 33 30 31 35 20 2a 2f 0a 20 20 7d  ket #3015 */.  }
b640: 0a 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  .  pTerm->prereq
b650: 41 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b  All = prereqAll;
b660: 0a 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  .  pTerm->leftCu
b670: 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70 54 65  rsor = -1;.  pTe
b680: 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31  rm->iParent = -1
b690: 3b 0a 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  ;.  pTerm->eOper
b6a0: 61 74 6f 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  ator = 0;.  if( 
b6b0: 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20 29 7b  allowedOp(op) ){
b6c0: 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74  .    Expr *pLeft
b6d0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
b6e0: 69 70 43 6f 6c 6c 61 74 65 28 70 45 78 70 72 2d  ipCollate(pExpr-
b6f0: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 45 78 70  >pLeft);.    Exp
b700: 72 20 2a 70 52 69 67 68 74 20 3d 20 73 71 6c 69  r *pRight = sqli
b710: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
b720: 74 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  te(pExpr->pRight
b730: 29 3b 0a 20 20 20 20 75 31 36 20 6f 70 4d 61 73  );.    u16 opMas
b740: 6b 20 3d 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  k = (pTerm->prer
b750: 65 71 52 69 67 68 74 20 26 20 70 72 65 72 65 71  eqRight & prereq
b760: 4c 65 66 74 29 3d 3d 30 20 3f 20 57 4f 5f 41 4c  Left)==0 ? WO_AL
b770: 4c 20 3a 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20  L : WO_EQUIV;.  
b780: 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d    if( pLeft->op=
b790: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  =TK_COLUMN ){.  
b7a0: 20 20 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43      pTerm->leftC
b7b0: 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69  ursor = pLeft->i
b7c0: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 54 65  Table;.      pTe
b7d0: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
b7e0: 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d   = pLeft->iColum
b7f0: 6e 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  n;.      pTerm->
b800: 65 4f 70 65 72 61 74 6f 72 20 3d 20 6f 70 65 72  eOperator = oper
b810: 61 74 6f 72 4d 61 73 6b 28 6f 70 29 20 26 20 6f  atorMask(op) & o
b820: 70 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  pMask;.    }.   
b830: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29   if( op==TK_IS )
b840: 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
b850: 7c 3d 20 54 45 52 4d 5f 49 53 3b 0a 20 20 20 20  |= TERM_IS;.    
b860: 69 66 28 20 70 52 69 67 68 74 20 26 26 20 70 52  if( pRight && pR
b870: 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ight->op==TK_COL
b880: 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 57 68 65  UMN ){.      Whe
b890: 72 65 54 65 72 6d 20 2a 70 4e 65 77 3b 0a 20 20  reTerm *pNew;.  
b8a0: 20 20 20 20 45 78 70 72 20 2a 70 44 75 70 3b 0a      Expr *pDup;.
b8b0: 20 20 20 20 20 20 75 31 36 20 65 45 78 74 72 61        u16 eExtra
b8c0: 4f 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  Op = 0;        /
b8d0: 2a 20 45 78 74 72 61 20 62 69 74 73 20 66 6f 72  * Extra bits for
b8e0: 20 70 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f 72   pNew->eOperator
b8f0: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 54   */.      if( pT
b900: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3e  erm->leftCursor>
b910: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  =0 ){.        in
b920: 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20  t idxNew;.      
b930: 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33    pDup = sqlite3
b940: 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70  ExprDup(db, pExp
b950: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  r, 0);.        i
b960: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
b970: 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  led ){.         
b980: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
b990: 74 65 28 64 62 2c 20 70 44 75 70 29 3b 0a 20 20  te(db, pDup);.  
b9a0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
b9b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b9c0: 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65    idxNew = where
b9d0: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
b9e0: 2c 20 70 44 75 70 2c 20 54 45 52 4d 5f 56 49 52  , pDup, TERM_VIR
b9f0: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
ba00: 43 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  C);.        if( 
ba10: 69 64 78 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  idxNew==0 ) retu
ba20: 72 6e 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  rn;.        pNew
ba30: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65   = &pWC->a[idxNe
ba40: 77 5d 3b 0a 20 20 20 20 20 20 20 20 6d 61 72 6b  w];.        mark
ba50: 54 65 72 6d 41 73 43 68 69 6c 64 28 70 57 43 2c  TermAsChild(pWC,
ba60: 20 69 64 78 4e 65 77 2c 20 69 64 78 54 65 72 6d   idxNew, idxTerm
ba70: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f  );.        if( o
ba80: 70 3d 3d 54 4b 5f 49 53 20 29 20 70 4e 65 77 2d  p==TK_IS ) pNew-
ba90: 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
baa0: 5f 49 53 3b 0a 20 20 20 20 20 20 20 20 70 54 65  _IS;.        pTe
bab0: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
bac0: 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20 70  Term];.        p
bad0: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d  Term->wtFlags |=
bae0: 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 0a 20   TERM_COPIED;.. 
baf0: 20 20 20 20 20 20 20 69 66 28 20 74 65 72 6d 49         if( termI
bb00: 73 45 71 75 69 76 61 6c 65 6e 63 65 28 70 50 61  sEquivalence(pPa
bb10: 72 73 65 2c 20 70 44 75 70 29 20 29 7b 0a 20 20  rse, pDup) ){.  
bb20: 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65          pTerm->e
bb30: 4f 70 65 72 61 74 6f 72 20 7c 3d 20 57 4f 5f 45  Operator |= WO_E
bb40: 51 55 49 56 3b 0a 20 20 20 20 20 20 20 20 20 20  QUIV;.          
bb50: 65 45 78 74 72 61 4f 70 20 3d 20 57 4f 5f 45 51  eExtraOp = WO_EQ
bb60: 55 49 56 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  UIV;.        }. 
bb70: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
bb80: 20 20 20 20 70 44 75 70 20 3d 20 70 45 78 70 72      pDup = pExpr
bb90: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d  ;.        pNew =
bba0: 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a   pTerm;.      }.
bbb0: 20 20 20 20 20 20 65 78 70 72 43 6f 6d 6d 75 74        exprCommut
bbc0: 65 28 70 50 61 72 73 65 2c 20 70 44 75 70 29 3b  e(pParse, pDup);
bbd0: 0a 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73  .      pLeft = s
bbe0: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
bbf0: 6c 6c 61 74 65 28 70 44 75 70 2d 3e 70 4c 65 66  llate(pDup->pLef
bc00: 74 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  t);.      pNew->
bc10: 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65  leftCursor = pLe
bc20: 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  ft->iTable;.    
bc30: 20 20 70 4e 65 77 2d 3e 75 2e 6c 65 66 74 43 6f    pNew->u.leftCo
bc40: 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43  lumn = pLeft->iC
bc50: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 74 65 73  olumn;.      tes
bc60: 74 63 61 73 65 28 20 28 70 72 65 72 65 71 4c 65  tcase( (prereqLe
bc70: 66 74 20 7c 20 65 78 74 72 61 52 69 67 68 74 29  ft | extraRight)
bc80: 20 21 3d 20 70 72 65 72 65 71 4c 65 66 74 20 29   != prereqLeft )
bc90: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72  ;.      pNew->pr
bca0: 65 72 65 71 52 69 67 68 74 20 3d 20 70 72 65 72  ereqRight = prer
bcb0: 65 71 4c 65 66 74 20 7c 20 65 78 74 72 61 52 69  eqLeft | extraRi
bcc0: 67 68 74 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  ght;.      pNew-
bcd0: 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72 65  >prereqAll = pre
bce0: 72 65 71 41 6c 6c 3b 0a 20 20 20 20 20 20 70 4e  reqAll;.      pN
bcf0: 65 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  ew->eOperator = 
bd00: 28 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 70 44  (operatorMask(pD
bd10: 75 70 2d 3e 6f 70 29 20 2b 20 65 45 78 74 72 61  up->op) + eExtra
bd20: 4f 70 29 20 26 20 6f 70 4d 61 73 6b 3b 0a 20 20  Op) & opMask;.  
bd30: 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66    }.  }..#ifndef
bd40: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54   SQLITE_OMIT_BET
bd50: 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  WEEN_OPTIMIZATIO
bd60: 4e 0a 20 20 2f 2a 20 49 66 20 61 20 74 65 72 6d  N.  /* If a term
bd70: 20 69 73 20 74 68 65 20 42 45 54 57 45 45 4e 20   is the BETWEEN 
bd80: 6f 70 65 72 61 74 6f 72 2c 20 63 72 65 61 74 65  operator, create
bd90: 20 74 77 6f 20 6e 65 77 20 76 69 72 74 75 61 6c   two new virtual
bda0: 20 74 65 72 6d 73 0a 20 20 2a 2a 20 74 68 61 74   terms.  ** that
bdb0: 20 64 65 66 69 6e 65 20 74 68 65 20 72 61 6e 67   define the rang
bdc0: 65 20 74 68 61 74 20 74 68 65 20 42 45 54 57 45  e that the BETWE
bdd0: 45 4e 20 69 6d 70 6c 65 6d 65 6e 74 73 2e 20 20  EN implements.  
bde0: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20 2a  For example:.  *
bdf0: 2a 0a 20 20 2a 2a 20 20 20 20 20 20 61 20 42 45  *.  **      a BE
be00: 54 57 45 45 4e 20 62 20 41 4e 44 20 63 0a 20 20  TWEEN b AND c.  
be10: 2a 2a 0a 20 20 2a 2a 20 69 73 20 63 6f 6e 76 65  **.  ** is conve
be20: 72 74 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a  rted into:.  **.
be30: 20 20 2a 2a 20 20 20 20 20 20 28 61 20 42 45 54    **      (a BET
be40: 57 45 45 4e 20 62 20 41 4e 44 20 63 29 20 41 4e  WEEN b AND c) AN
be50: 44 20 28 61 3e 3d 62 29 20 41 4e 44 20 28 61 3c  D (a>=b) AND (a<
be60: 3d 63 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  =c).  **.  ** Th
be70: 65 20 74 77 6f 20 6e 65 77 20 74 65 72 6d 73 20  e two new terms 
be80: 61 72 65 20 61 64 64 65 64 20 6f 6e 74 6f 20 74  are added onto t
be90: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 68  he end of the Wh
bea0: 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74  ereClause object
beb0: 2e 0a 20 20 2a 2a 20 54 68 65 20 6e 65 77 20 74  ..  ** The new t
bec0: 65 72 6d 73 20 61 72 65 20 22 64 79 6e 61 6d 69  erms are "dynami
bed0: 63 22 20 61 6e 64 20 61 72 65 20 63 68 69 6c 64  c" and are child
bee0: 72 65 6e 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ren of the origi
bef0: 6e 61 6c 20 42 45 54 57 45 45 4e 0a 20 20 2a 2a  nal BETWEEN.  **
bf00: 20 74 65 72 6d 2e 20 20 54 68 61 74 20 6d 65 61   term.  That mea
bf10: 6e 73 20 74 68 61 74 20 69 66 20 74 68 65 20 42  ns that if the B
bf20: 45 54 57 45 45 4e 20 74 65 72 6d 20 69 73 20 63  ETWEEN term is c
bf30: 6f 64 65 64 2c 20 74 68 65 20 63 68 69 6c 64 72  oded, the childr
bf40: 65 6e 20 61 72 65 0a 20 20 2a 2a 20 73 6b 69 70  en are.  ** skip
bf50: 70 65 64 2e 20 20 4f 72 2c 20 69 66 20 74 68 65  ped.  Or, if the
bf60: 20 63 68 69 6c 64 72 65 6e 20 61 72 65 20 73 61   children are sa
bf70: 74 69 73 66 69 65 64 20 62 79 20 61 6e 20 69 6e  tisfied by an in
bf80: 64 65 78 2c 20 74 68 65 20 6f 72 69 67 69 6e 61  dex, the origina
bf90: 6c 0a 20 20 2a 2a 20 42 45 54 57 45 45 4e 20 74  l.  ** BETWEEN t
bfa0: 65 72 6d 20 69 73 20 73 6b 69 70 70 65 64 2e 0a  erm is skipped..
bfb0: 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20    */.  else if( 
bfc0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 42 45  pExpr->op==TK_BE
bfd0: 54 57 45 45 4e 20 26 26 20 70 57 43 2d 3e 6f 70  TWEEN && pWC->op
bfe0: 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20  ==TK_AND ){.    
bff0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
c000: 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
c010: 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
c020: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
c030: 20 6f 70 73 5b 5d 20 3d 20 7b 54 4b 5f 47 45 2c   ops[] = {TK_GE,
c040: 20 54 4b 5f 4c 45 7d 3b 0a 20 20 20 20 61 73 73   TK_LE};.    ass
c050: 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b  ert( pList!=0 );
c060: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
c070: 73 74 2d 3e 6e 45 78 70 72 3d 3d 32 20 29 3b 0a  st->nExpr==2 );.
c080: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32      for(i=0; i<2
c090: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  ; i++){.      Ex
c0a0: 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20  pr *pNewExpr;.  
c0b0: 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a      int idxNew;.
c0c0: 20 20 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d        pNewExpr =
c0d0: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
c0e0: 61 72 73 65 2c 20 6f 70 73 5b 69 5d 2c 20 0a 20  arse, ops[i], . 
c0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c100: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
c110: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
c120: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30 29 2c  Expr->pLeft, 0),
c130: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
c150: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
c160: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
c170: 70 72 2c 20 30 29 2c 20 30 29 3b 0a 20 20 20 20  pr, 0), 0);.    
c180: 20 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61    transferJoinMa
c190: 72 6b 69 6e 67 73 28 70 4e 65 77 45 78 70 72 2c  rkings(pNewExpr,
c1a0: 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69   pExpr);.      i
c1b0: 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61  dxNew = whereCla
c1c0: 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70  useInsert(pWC, p
c1d0: 4e 65 77 45 78 70 72 2c 20 54 45 52 4d 5f 56 49  NewExpr, TERM_VI
c1e0: 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d  RTUAL|TERM_DYNAM
c1f0: 49 43 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  IC);.      testc
c200: 61 73 65 28 20 69 64 78 4e 65 77 3d 3d 30 20 29  ase( idxNew==0 )
c210: 3b 0a 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c  ;.      exprAnal
c220: 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69  yze(pSrc, pWC, i
c230: 64 78 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 54  dxNew);.      pT
c240: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
c250: 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 6d 61  xTerm];.      ma
c260: 72 6b 54 65 72 6d 41 73 43 68 69 6c 64 28 70 57  rkTermAsChild(pW
c270: 43 2c 20 69 64 78 4e 65 77 2c 20 69 64 78 54 65  C, idxNew, idxTe
c280: 72 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  rm);.    }.  }.#
c290: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
c2a0: 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54  OMIT_BETWEEN_OPT
c2b0: 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69  IMIZATION */..#i
c2c0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
c2d0: 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49  E_OMIT_OR_OPTIMI
c2e0: 5a 41 54 49 4f 4e 29 20 26 26 20 21 64 65 66 69  ZATION) && !defi
c2f0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
c300: 53 55 42 51 55 45 52 59 29 0a 20 20 2f 2a 20 41  SUBQUERY).  /* A
c310: 6e 61 6c 79 7a 65 20 61 20 74 65 72 6d 20 74 68  nalyze a term th
c320: 61 74 20 69 73 20 63 6f 6d 70 6f 73 65 64 20 6f  at is composed o
c330: 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 75  f two or more su
c340: 62 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64  bterms connected
c350: 20 62 79 0a 20 20 2a 2a 20 61 6e 20 4f 52 20 6f   by.  ** an OR o
c360: 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20  perator..  */.  
c370: 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e  else if( pExpr->
c380: 6f 70 3d 3d 54 4b 5f 4f 52 20 29 7b 0a 20 20 20  op==TK_OR ){.   
c390: 20 61 73 73 65 72 74 28 20 70 57 43 2d 3e 6f 70   assert( pWC->op
c3a0: 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20  ==TK_AND );.    
c3b0: 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72  exprAnalyzeOrTer
c3c0: 6d 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78  m(pSrc, pWC, idx
c3d0: 54 65 72 6d 29 3b 0a 20 20 20 20 70 54 65 72 6d  Term);.    pTerm
c3e0: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
c3f0: 72 6d 5d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  rm];.  }.#endif 
c400: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f  /* SQLITE_OMIT_O
c410: 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a  R_OPTIMIZATION *
c420: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
c430: 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49  E_OMIT_LIKE_OPTI
c440: 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 41 64  MIZATION.  /* Ad
c450: 64 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f  d constraints to
c460: 20 72 65 64 75 63 65 20 74 68 65 20 73 65 61 72   reduce the sear
c470: 63 68 20 73 70 61 63 65 20 6f 6e 20 61 20 4c 49  ch space on a LI
c480: 4b 45 20 6f 72 20 47 4c 4f 42 0a 20 20 2a 2a 20  KE or GLOB.  ** 
c490: 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20  operator..  **. 
c4a0: 20 2a 2a 20 41 20 6c 69 6b 65 20 70 61 74 74 65   ** A like patte
c4b0: 72 6e 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  rn of the form "
c4c0: 78 20 4c 49 4b 45 20 27 61 42 63 25 27 22 20 69  x LIKE 'aBc%'" i
c4d0: 73 20 63 68 61 6e 67 65 64 20 69 6e 74 6f 20 63  s changed into c
c4e0: 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 0a  onstraints.  **.
c4f0: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 78 3e    **          x>
c500: 3d 27 41 42 43 27 20 41 4e 44 20 78 3c 27 61 62  ='ABC' AND x<'ab
c510: 64 27 20 41 4e 44 20 78 20 4c 49 4b 45 20 27 61  d' AND x LIKE 'a
c520: 42 63 25 27 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  Bc%'.  **.  ** T
c530: 68 65 20 6c 61 73 74 20 63 68 61 72 61 63 74 65  he last characte
c540: 72 20 6f 66 20 74 68 65 20 70 72 65 66 69 78 20  r of the prefix 
c550: 22 61 62 63 22 20 69 73 20 69 6e 63 72 65 6d 65  "abc" is increme
c560: 6e 74 65 64 20 74 6f 20 66 6f 72 6d 20 74 68 65  nted to form the
c570: 0a 20 20 2a 2a 20 74 65 72 6d 69 6e 61 74 69 6f  .  ** terminatio
c580: 6e 20 63 6f 6e 64 69 74 69 6f 6e 20 22 61 62 64  n condition "abd
c590: 22 2e 20 20 49 66 20 63 61 73 65 20 69 73 20 6e  ".  If case is n
c5a0: 6f 74 20 73 69 67 6e 69 66 69 63 61 6e 74 20 28  ot significant (
c5b0: 74 68 65 20 64 65 66 61 75 6c 74 0a 20 20 2a 2a  the default.  **
c5c0: 20 66 6f 72 20 4c 49 4b 45 29 20 74 68 65 6e 20   for LIKE) then 
c5d0: 74 68 65 20 6c 6f 77 65 72 2d 62 6f 75 6e 64 20  the lower-bound 
c5e0: 69 73 20 6d 61 64 65 20 61 6c 6c 20 75 70 70 65  is made all uppe
c5f0: 72 63 61 73 65 20 61 6e 64 20 74 68 65 20 75 70  rcase and the up
c600: 70 65 72 2d 0a 20 20 2a 2a 20 62 6f 75 6e 64 20  per-.  ** bound 
c610: 69 73 20 6d 61 64 65 20 61 6c 6c 20 6c 6f 77 65  is made all lowe
c620: 72 63 61 73 65 20 73 6f 20 74 68 61 74 20 74 68  rcase so that th
c630: 65 20 62 6f 75 6e 64 73 20 61 6c 73 6f 20 77 6f  e bounds also wo
c640: 72 6b 20 77 68 65 6e 20 63 6f 6d 70 61 72 69 6e  rk when comparin
c650: 67 0a 20 20 2a 2a 20 42 4c 4f 42 73 2e 0a 20 20  g.  ** BLOBs..  
c660: 2a 2f 0a 20 20 69 66 28 20 70 57 43 2d 3e 6f 70  */.  if( pWC->op
c670: 3d 3d 54 4b 5f 41 4e 44 20 0a 20 20 20 26 26 20  ==TK_AND .   && 
c680: 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 70 50 61  isLikeOrGlob(pPa
c690: 72 73 65 2c 20 70 45 78 70 72 2c 20 26 70 53 74  rse, pExpr, &pSt
c6a0: 72 31 2c 20 26 69 73 43 6f 6d 70 6c 65 74 65 2c  r1, &isComplete,
c6b0: 20 26 6e 6f 43 61 73 65 29 0a 20 20 29 7b 0a 20   &noCase).  ){. 
c6c0: 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 20     Expr *pLeft; 
c6d0: 20 20 20 20 20 20 2f 2a 20 4c 48 53 20 6f 66 20        /* LHS of 
c6e0: 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74  LIKE/GLOB operat
c6f0: 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a  or */.    Expr *
c700: 70 53 74 72 32 3b 20 20 20 20 20 20 20 2f 2a 20  pStr2;       /* 
c710: 43 6f 70 79 20 6f 66 20 70 53 74 72 31 20 2d 20  Copy of pStr1 - 
c720: 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42  RHS of LIKE/GLOB
c730: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
c740: 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 31   Expr *pNewExpr1
c750: 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77  ;.    Expr *pNew
c760: 45 78 70 72 32 3b 0a 20 20 20 20 69 6e 74 20 69  Expr2;.    int i
c770: 64 78 4e 65 77 31 3b 0a 20 20 20 20 69 6e 74 20  dxNew1;.    int 
c780: 69 64 78 4e 65 77 32 3b 0a 20 20 20 20 63 6f 6e  idxNew2;.    con
c790: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 53 65  st char *zCollSe
c7a0: 71 4e 61 6d 65 3b 20 20 20 20 20 2f 2a 20 4e 61  qName;     /* Na
c7b0: 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6e 67 20  me of collating 
c7c0: 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 20 20  sequence */.    
c7d0: 63 6f 6e 73 74 20 75 31 36 20 77 74 46 6c 61 67  const u16 wtFlag
c7e0: 73 20 3d 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54  s = TERM_LIKEOPT
c7f0: 20 7c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   | TERM_VIRTUAL 
c800: 7c 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 3b 0a  | TERM_DYNAMIC;.
c810: 0a 20 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78  .    pLeft = pEx
c820: 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31  pr->x.pList->a[1
c830: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 53 74  ].pExpr;.    pSt
c840: 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
c850: 44 75 70 28 64 62 2c 20 70 53 74 72 31 2c 20 30  Dup(db, pStr1, 0
c860: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65  );..    /* Conve
c870: 72 74 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75  rt the lower bou
c880: 6e 64 20 74 6f 20 75 70 70 65 72 2d 63 61 73 65  nd to upper-case
c890: 20 61 6e 64 20 74 68 65 20 75 70 70 65 72 20 62   and the upper b
c8a0: 6f 75 6e 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6c  ound to.    ** l
c8b0: 6f 77 65 72 2d 63 61 73 65 20 28 75 70 70 65 72  ower-case (upper
c8c0: 2d 63 61 73 65 20 69 73 20 6c 65 73 73 20 74 68  -case is less th
c8d0: 61 6e 20 6c 6f 77 65 72 2d 63 61 73 65 20 69 6e  an lower-case in
c8e0: 20 41 53 43 49 49 29 20 73 6f 20 74 68 61 74 0a   ASCII) so that.
c8f0: 20 20 20 20 2a 2a 20 74 68 65 20 72 61 6e 67 65      ** the range
c900: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 6c 73   constraints als
c910: 6f 20 77 6f 72 6b 20 66 6f 72 20 42 4c 4f 42 73  o work for BLOBs
c920: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
c930: 6e 6f 43 61 73 65 20 26 26 20 21 70 50 61 72 73  noCase && !pPars
c940: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
c950: 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  led ){.      int
c960: 20 69 3b 0a 20 20 20 20 20 20 63 68 61 72 20 63   i;.      char c
c970: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77  ;.      pTerm->w
c980: 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4c  tFlags |= TERM_L
c990: 49 4b 45 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  IKE;.      for(i
c9a0: 3d 30 3b 20 28 63 20 3d 20 70 53 74 72 31 2d 3e  =0; (c = pStr1->
c9b0: 75 2e 7a 54 6f 6b 65 6e 5b 69 5d 29 21 3d 30 3b  u.zToken[i])!=0;
c9c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
c9d0: 53 74 72 31 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 69  Str1->u.zToken[i
c9e0: 5d 20 3d 20 73 71 6c 69 74 65 33 54 6f 75 70 70  ] = sqlite3Toupp
c9f0: 65 72 28 63 29 3b 0a 20 20 20 20 20 20 20 20 70  er(c);.        p
ca00: 53 74 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 69  Str2->u.zToken[i
ca10: 5d 20 3d 20 73 71 6c 69 74 65 33 54 6f 6c 6f 77  ] = sqlite3Tolow
ca20: 65 72 28 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20  er(c);.      }. 
ca30: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 64     }..    if( !d
ca40: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
ca50: 29 7b 0a 20 20 20 20 20 20 75 38 20 63 2c 20 2a  ){.      u8 c, *
ca60: 70 43 3b 20 20 20 20 20 20 20 2f 2a 20 4c 61 73  pC;       /* Las
ca70: 74 20 63 68 61 72 61 63 74 65 72 20 62 65 66 6f  t character befo
ca80: 72 65 20 74 68 65 20 66 69 72 73 74 20 77 69 6c  re the first wil
ca90: 64 63 61 72 64 20 2a 2f 0a 20 20 20 20 20 20 70  dcard */.      p
caa0: 43 20 3d 20 28 75 38 2a 29 26 70 53 74 72 32 2d  C = (u8*)&pStr2-
cab0: 3e 75 2e 7a 54 6f 6b 65 6e 5b 73 71 6c 69 74 65  >u.zToken[sqlite
cac0: 33 53 74 72 6c 65 6e 33 30 28 70 53 74 72 32 2d  3Strlen30(pStr2-
cad0: 3e 75 2e 7a 54 6f 6b 65 6e 29 2d 31 5d 3b 0a 20  >u.zToken)-1];. 
cae0: 20 20 20 20 20 63 20 3d 20 2a 70 43 3b 0a 20 20       c = *pC;.  
caf0: 20 20 20 20 69 66 28 20 6e 6f 43 61 73 65 20 29      if( noCase )
cb00: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
cb10: 20 70 6f 69 6e 74 20 69 73 20 74 6f 20 69 6e 63   point is to inc
cb20: 72 65 6d 65 6e 74 20 74 68 65 20 6c 61 73 74 20  rement the last 
cb30: 63 68 61 72 61 63 74 65 72 20 62 65 66 6f 72 65  character before
cb40: 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 20   the first.     
cb50: 20 20 20 2a 2a 20 77 69 6c 64 63 61 72 64 2e 20     ** wildcard. 
cb60: 20 42 75 74 20 69 66 20 77 65 20 69 6e 63 72 65   But if we incre
cb70: 6d 65 6e 74 20 27 40 27 2c 20 74 68 61 74 20 77  ment '@', that w
cb80: 69 6c 6c 20 70 75 73 68 20 69 74 20 69 6e 74 6f  ill push it into
cb90: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
cba0: 61 6c 70 68 61 62 65 74 69 63 20 72 61 6e 67 65  alphabetic range
cbb0: 20 77 68 65 72 65 20 63 61 73 65 20 63 6f 6e 76   where case conv
cbc0: 65 72 73 69 6f 6e 73 20 77 69 6c 6c 20 6d 65 73  ersions will mes
cbd0: 73 20 75 70 20 74 68 65 20 0a 20 20 20 20 20 20  s up the .      
cbe0: 20 20 2a 2a 20 69 6e 65 71 75 61 6c 69 74 79 2e    ** inequality.
cbf0: 20 20 54 6f 20 61 76 6f 69 64 20 74 68 69 73 2c    To avoid this,
cc00: 20 6d 61 6b 65 20 73 75 72 65 20 74 6f 20 61 6c   make sure to al
cc10: 73 6f 20 72 75 6e 20 74 68 65 20 66 75 6c 6c 0a  so run the full.
cc20: 20 20 20 20 20 20 20 20 2a 2a 20 4c 49 4b 45 20          ** LIKE 
cc30: 6f 6e 20 61 6c 6c 20 63 61 6e 64 69 64 61 74 65  on all candidate
cc40: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 62 79 20   expressions by 
cc50: 63 6c 65 61 72 69 6e 67 20 74 68 65 20 69 73 43  clearing the isC
cc60: 6f 6d 70 6c 65 74 65 20 66 6c 61 67 0a 20 20 20  omplete flag.   
cc70: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
cc80: 69 66 28 20 63 3d 3d 27 41 27 2d 31 20 29 20 69  if( c=='A'-1 ) i
cc90: 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 0a 20  sComplete = 0;. 
cca0: 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74         c = sqlit
ccb0: 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63  e3UpperToLower[c
ccc0: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ];.      }.     
ccd0: 20 2a 70 43 20 3d 20 63 20 2b 20 31 3b 0a 20 20   *pC = c + 1;.  
cce0: 20 20 7d 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71    }.    zCollSeq
ccf0: 4e 61 6d 65 20 3d 20 6e 6f 43 61 73 65 20 3f 20  Name = noCase ? 
cd00: 22 4e 4f 43 41 53 45 22 20 3a 20 22 42 49 4e 41  "NOCASE" : "BINA
cd10: 52 59 22 3b 0a 20 20 20 20 70 4e 65 77 45 78 70  RY";.    pNewExp
cd20: 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
cd30: 44 75 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30  Dup(db, pLeft, 0
cd40: 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72 31  );.    pNewExpr1
cd50: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
cd60: 70 50 61 72 73 65 2c 20 54 4b 5f 47 45 2c 0a 20  pParse, TK_GE,. 
cd70: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
cd80: 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 53  3ExprAddCollateS
cd90: 74 72 69 6e 67 28 70 50 61 72 73 65 2c 70 4e 65  tring(pParse,pNe
cda0: 77 45 78 70 72 31 2c 7a 43 6f 6c 6c 53 65 71 4e  wExpr1,zCollSeqN
cdb0: 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ame),.          
cdc0: 20 70 53 74 72 31 2c 20 30 29 3b 0a 20 20 20 20   pStr1, 0);.    
cdd0: 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b  transferJoinMark
cde0: 69 6e 67 73 28 70 4e 65 77 45 78 70 72 31 2c 20  ings(pNewExpr1, 
cdf0: 70 45 78 70 72 29 3b 0a 20 20 20 20 69 64 78 4e  pExpr);.    idxN
ce00: 65 77 31 20 3d 20 77 68 65 72 65 43 6c 61 75 73  ew1 = whereClaus
ce10: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65  eInsert(pWC, pNe
ce20: 77 45 78 70 72 31 2c 20 77 74 46 6c 61 67 73 29  wExpr1, wtFlags)
ce30: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
ce40: 69 64 78 4e 65 77 31 3d 3d 30 20 29 3b 0a 20 20  idxNew1==0 );.  
ce50: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53    exprAnalyze(pS
ce60: 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 31  rc, pWC, idxNew1
ce70: 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72 32  );.    pNewExpr2
ce80: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
ce90: 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b  p(db, pLeft, 0);
cea0: 0a 20 20 20 20 70 4e 65 77 45 78 70 72 32 20 3d  .    pNewExpr2 =
ceb0: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
cec0: 61 72 73 65 2c 20 54 4b 5f 4c 54 2c 0a 20 20 20  arse, TK_LT,.   
ced0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
cee0: 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 53 74 72  xprAddCollateStr
cef0: 69 6e 67 28 70 50 61 72 73 65 2c 70 4e 65 77 45  ing(pParse,pNewE
cf00: 78 70 72 32 2c 7a 43 6f 6c 6c 53 65 71 4e 61 6d  xpr2,zCollSeqNam
cf10: 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  e),.           p
cf20: 53 74 72 32 2c 20 30 29 3b 0a 20 20 20 20 74 72  Str2, 0);.    tr
cf30: 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e  ansferJoinMarkin
cf40: 67 73 28 70 4e 65 77 45 78 70 72 32 2c 20 70 45  gs(pNewExpr2, pE
cf50: 78 70 72 29 3b 0a 20 20 20 20 69 64 78 4e 65 77  xpr);.    idxNew
cf60: 32 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  2 = whereClauseI
cf70: 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45  nsert(pWC, pNewE
cf80: 78 70 72 32 2c 20 77 74 46 6c 61 67 73 29 3b 0a  xpr2, wtFlags);.
cf90: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64      testcase( id
cfa0: 78 4e 65 77 32 3d 3d 30 20 29 3b 0a 20 20 20 20  xNew2==0 );.    
cfb0: 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63  exprAnalyze(pSrc
cfc0: 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 32 29 3b  , pWC, idxNew2);
cfd0: 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57  .    pTerm = &pW
cfe0: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
cff0: 20 20 20 69 66 28 20 69 73 43 6f 6d 70 6c 65 74     if( isComplet
d000: 65 20 29 7b 0a 20 20 20 20 20 20 6d 61 72 6b 54  e ){.      markT
d010: 65 72 6d 41 73 43 68 69 6c 64 28 70 57 43 2c 20  ermAsChild(pWC, 
d020: 69 64 78 4e 65 77 31 2c 20 69 64 78 54 65 72 6d  idxNew1, idxTerm
d030: 29 3b 0a 20 20 20 20 20 20 6d 61 72 6b 54 65 72  );.      markTer
d040: 6d 41 73 43 68 69 6c 64 28 70 57 43 2c 20 69 64  mAsChild(pWC, id
d050: 78 4e 65 77 32 2c 20 69 64 78 54 65 72 6d 29 3b  xNew2, idxTerm);
d060: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
d070: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
d080: 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49  _LIKE_OPTIMIZATI
d090: 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  ON */..#ifndef S
d0a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
d0b0: 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 41 64 64  ALTABLE.  /* Add
d0c0: 20 61 20 57 4f 5f 4d 41 54 43 48 20 61 75 78 69   a WO_MATCH auxi
d0d0: 6c 69 61 72 79 20 74 65 72 6d 20 74 6f 20 74 68  liary term to th
d0e0: 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 73 65 74  e constraint set
d0f0: 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 63 75 72   if the.  ** cur
d100: 72 65 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20  rent expression 
d110: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20  is of the form: 
d120: 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78   column MATCH ex
d130: 70 72 2e 0a 20 20 2a 2a 20 54 68 69 73 20 69 6e  pr..  ** This in
d140: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
d150: 64 20 62 79 20 74 68 65 20 78 42 65 73 74 49 6e  d by the xBestIn
d160: 64 65 78 20 6d 65 74 68 6f 64 73 20 6f 66 0a 20  dex methods of. 
d170: 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c   ** virtual tabl
d180: 65 73 2e 20 20 54 68 65 20 6e 61 74 69 76 65 20  es.  The native 
d190: 71 75 65 72 79 20 6f 70 74 69 6d 69 7a 65 72 20  query optimizer 
d1a0: 64 6f 65 73 20 6e 6f 74 20 61 74 74 65 6d 70 74  does not attempt
d1b0: 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 61 6e 79 74  .  ** to do anyt
d1c0: 68 69 6e 67 20 77 69 74 68 20 4d 41 54 43 48 20  hing with MATCH 
d1d0: 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  functions..  */.
d1e0: 20 20 69 66 28 20 69 73 4d 61 74 63 68 4f 66 43    if( isMatchOfC
d1f0: 6f 6c 75 6d 6e 28 70 45 78 70 72 29 20 29 7b 0a  olumn(pExpr) ){.
d200: 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a      int idxNew;.
d210: 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
d220: 2c 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20 57 68  , *pLeft;.    Wh
d230: 65 72 65 54 65 72 6d 20 2a 70 4e 65 77 54 65 72  ereTerm *pNewTer
d240: 6d 3b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 70  m;.    Bitmask p
d250: 72 65 72 65 71 43 6f 6c 75 6d 6e 2c 20 70 72 65  rereqColumn, pre
d260: 72 65 71 45 78 70 72 3b 0a 0a 20 20 20 20 70 52  reqExpr;..    pR
d270: 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  ight = pExpr->x.
d280: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
d290: 72 3b 0a 20 20 20 20 70 4c 65 66 74 20 3d 20 70  r;.    pLeft = p
d2a0: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  Expr->x.pList->a
d2b0: 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70  [1].pExpr;.    p
d2c0: 72 65 72 65 71 45 78 70 72 20 3d 20 65 78 70 72  rereqExpr = expr
d2d0: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
d2e0: 53 65 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  Set, pRight);.  
d2f0: 20 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 20 3d    prereqColumn =
d300: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
d310: 70 4d 61 73 6b 53 65 74 2c 20 70 4c 65 66 74 29  pMaskSet, pLeft)
d320: 3b 0a 20 20 20 20 69 66 28 20 28 70 72 65 72 65  ;.    if( (prere
d330: 71 45 78 70 72 20 26 20 70 72 65 72 65 71 43 6f  qExpr & prereqCo
d340: 6c 75 6d 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  lumn)==0 ){.    
d350: 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72    Expr *pNewExpr
d360: 3b 0a 20 20 20 20 20 20 70 4e 65 77 45 78 70 72  ;.      pNewExpr
d370: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
d380: 70 50 61 72 73 65 2c 20 54 4b 5f 4d 41 54 43 48  pParse, TK_MATCH
d390: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
d3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3b0: 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44   0, sqlite3ExprD
d3c0: 75 70 28 64 62 2c 20 70 52 69 67 68 74 2c 20 30  up(db, pRight, 0
d3d0: 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 64 78  ), 0);.      idx
d3e0: 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73  New = whereClaus
d3f0: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65  eInsert(pWC, pNe
d400: 77 45 78 70 72 2c 20 54 45 52 4d 5f 56 49 52 54  wExpr, TERM_VIRT
d410: 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43  UAL|TERM_DYNAMIC
d420: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
d430: 65 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a  e( idxNew==0 );.
d440: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 20 3d        pNewTerm =
d450: 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d   &pWC->a[idxNew]
d460: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
d470: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20  ->prereqRight = 
d480: 70 72 65 72 65 71 45 78 70 72 3b 0a 20 20 20 20  prereqExpr;.    
d490: 20 20 70 4e 65 77 54 65 72 6d 2d 3e 6c 65 66 74    pNewTerm->left
d4a0: 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e  Cursor = pLeft->
d4b0: 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e  iTable;.      pN
d4c0: 65 77 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f  ewTerm->u.leftCo
d4d0: 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43  lumn = pLeft->iC
d4e0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 4e 65  olumn;.      pNe
d4f0: 77 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  wTerm->eOperator
d500: 20 3d 20 57 4f 5f 4d 41 54 43 48 3b 0a 20 20 20   = WO_MATCH;.   
d510: 20 20 20 6d 61 72 6b 54 65 72 6d 41 73 43 68 69     markTermAsChi
d520: 6c 64 28 70 57 43 2c 20 69 64 78 4e 65 77 2c 20  ld(pWC, idxNew, 
d530: 69 64 78 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  idxTerm);.      
d540: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
d550: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20  idxTerm];.      
d560: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  pTerm->wtFlags |
d570: 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20  = TERM_COPIED;. 
d580: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70       pNewTerm->p
d590: 72 65 72 65 71 41 6c 6c 20 3d 20 70 54 65 72 6d  rereqAll = pTerm
d5a0: 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20  ->prereqAll;.   
d5b0: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a   }.  }.#endif /*
d5c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
d5d0: 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69  TUALTABLE */..#i
d5e0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
d5f0: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
d600: 34 0a 20 20 2f 2a 20 57 68 65 6e 20 73 71 6c 69  4.  /* When sqli
d610: 74 65 5f 73 74 61 74 33 20 68 69 73 74 6f 67 72  te_stat3 histogr
d620: 61 6d 20 64 61 74 61 20 69 73 20 61 76 61 69 6c  am data is avail
d630: 61 62 6c 65 20 61 6e 20 6f 70 65 72 61 74 6f 72  able an operator
d640: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66 6f 72   of the.  ** for
d650: 6d 20 22 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c  m "x IS NOT NULL
d660: 22 20 63 61 6e 20 73 6f 6d 65 74 69 6d 65 73 20  " can sometimes 
d670: 62 65 20 65 76 61 6c 75 61 74 65 64 20 6d 6f 72  be evaluated mor
d680: 65 20 65 66 66 69 63 69 65 6e 74 6c 79 0a 20 20  e efficiently.  
d690: 2a 2a 20 61 73 20 22 78 3e 4e 55 4c 4c 22 20 69  ** as "x>NULL" i
d6a0: 66 20 78 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e  f x is not an IN
d6b0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
d6c0: 59 2e 20 20 53 6f 20 63 6f 6e 73 74 72 75 63 74  Y.  So construct
d6d0: 20 61 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20   a.  ** virtual 
d6e0: 74 65 72 6d 20 6f 66 20 74 68 61 74 20 66 6f 72  term of that for
d6f0: 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74  m..  **.  ** Not
d700: 65 20 74 68 61 74 20 74 68 65 20 76 69 72 74 75  e that the virtu
d710: 61 6c 20 74 65 72 6d 20 6d 75 73 74 20 62 65 20  al term must be 
d720: 74 61 67 67 65 64 20 77 69 74 68 20 54 45 52 4d  tagged with TERM
d730: 5f 56 4e 55 4c 4c 2e 0a 20 20 2a 2f 0a 20 20 69  _VNULL..  */.  i
d740: 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
d750: 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26 26 20 70  _NOTNULL.   && p
d760: 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d  Expr->pLeft->op=
d770: 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26 26  =TK_COLUMN.   &&
d780: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69   pExpr->pLeft->i
d790: 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20 26 26 20  Column>=0.   && 
d7a0: 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
d7b0: 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 53  led(db, SQLITE_S
d7c0: 74 61 74 33 34 29 0a 20 20 29 7b 0a 20 20 20 20  tat34).  ){.    
d7d0: 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a  Expr *pNewExpr;.
d7e0: 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
d7f0: 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
d800: 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a      int idxNew;.
d810: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
d820: 4e 65 77 54 65 72 6d 3b 0a 0a 20 20 20 20 70 4e  NewTerm;..    pN
d830: 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ewExpr = sqlite3
d840: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
d850: 5f 47 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20  _GT,.           
d860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d870: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
d880: 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 2c 0a 20  db, pLeft, 0),. 
d890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8a0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
d8b0: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
d8c0: 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c 20 30  TK_NULL, 0, 0, 0
d8d0: 29 2c 20 30 29 3b 0a 0a 20 20 20 20 69 64 78 4e  ), 0);..    idxN
d8e0: 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65  ew = whereClause
d8f0: 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77  Insert(pWC, pNew
d900: 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20  Expr,.          
d910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d920: 20 20 20 20 54 45 52 4d 5f 56 49 52 54 55 41 4c      TERM_VIRTUAL
d930: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c 54 45  |TERM_DYNAMIC|TE
d940: 52 4d 5f 56 4e 55 4c 4c 29 3b 0a 20 20 20 20 69  RM_VNULL);.    i
d950: 66 28 20 69 64 78 4e 65 77 20 29 7b 0a 20 20 20  f( idxNew ){.   
d960: 20 20 20 70 4e 65 77 54 65 72 6d 20 3d 20 26 70     pNewTerm = &p
d970: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20  WC->a[idxNew];. 
d980: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70       pNewTerm->p
d990: 72 65 72 65 71 52 69 67 68 74 20 3d 20 30 3b 0a  rereqRight = 0;.
d9a0: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
d9b0: 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65  leftCursor = pLe
d9c0: 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  ft->iTable;.    
d9d0: 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c 65    pNewTerm->u.le
d9e0: 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74  ftColumn = pLeft
d9f0: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
da00: 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70 65 72   pNewTerm->eOper
da10: 61 74 6f 72 20 3d 20 57 4f 5f 47 54 3b 0a 20 20  ator = WO_GT;.  
da20: 20 20 20 20 6d 61 72 6b 54 65 72 6d 41 73 43 68      markTermAsCh
da30: 69 6c 64 28 70 57 43 2c 20 69 64 78 4e 65 77 2c  ild(pWC, idxNew,
da40: 20 69 64 78 54 65 72 6d 29 3b 0a 20 20 20 20 20   idxTerm);.     
da50: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
da60: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20  [idxTerm];.     
da70: 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
da80: 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a  |= TERM_COPIED;.
da90: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
daa0: 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 54 65 72  prereqAll = pTer
dab0: 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20  m->prereqAll;.  
dac0: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    }.  }.#endif /
dad0: 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
dae0: 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a  STAT3_OR_STAT4 *
daf0: 2f 0a 0a 20 20 2f 2a 20 50 72 65 76 65 6e 74 20  /..  /* Prevent 
db00: 4f 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  ON clause terms 
db10: 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 66  of a LEFT JOIN f
db20: 72 6f 6d 20 62 65 69 6e 67 20 75 73 65 64 20 74  rom being used t
db30: 6f 20 64 72 69 76 65 0a 20 20 2a 2a 20 61 6e 20  o drive.  ** an 
db40: 69 6e 64 65 78 20 66 6f 72 20 74 61 62 6c 65 73  index for tables
db50: 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
db60: 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20  the join..  */. 
db70: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
db80: 67 68 74 20 7c 3d 20 65 78 74 72 61 52 69 67 68  ght |= extraRigh
db90: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  t;.}../*.** This
dba0: 20 66 75 6e 63 74 69 6f 6e 20 73 65 61 72 63 68   function search
dbb0: 65 73 20 70 4c 69 73 74 20 66 6f 72 20 61 6e 20  es pList for an 
dbc0: 65 6e 74 72 79 20 74 68 61 74 20 6d 61 74 63 68  entry that match
dbd0: 65 73 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63  es the iCol-th c
dbe0: 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 69 6e 64 65  olumn.** of inde
dbf0: 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 49 66  x pIdx..**.** If
dc00: 20 73 75 63 68 20 61 6e 20 65 78 70 72 65 73 73   such an express
dc10: 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20 69 74  ion is found, it
dc20: 73 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74  s index in pList
dc30: 2d 3e 61 5b 5d 20 69 73 20 72 65 74 75 72 6e 65  ->a[] is returne
dc40: 64 2e 20 49 66 0a 2a 2a 20 6e 6f 20 65 78 70 72  d. If.** no expr
dc50: 65 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c  ession is found,
dc60: 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e   -1 is returned.
dc70: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
dc80: 69 6e 64 49 6e 64 65 78 43 6f 6c 28 0a 20 20 50  indIndexCol(.  P
dc90: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
dca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dcb0: 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
dcc0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
dcd0: 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  List,           
dce0: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
dcf0: 6f 6e 20 6c 69 73 74 20 74 6f 20 73 65 61 72 63  on list to searc
dd00: 68 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61 73 65  h */.  int iBase
dd10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
dd20: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
dd30: 20 66 6f 72 20 74 61 62 6c 65 20 61 73 73 6f 63   for table assoc
dd40: 69 61 74 65 64 20 77 69 74 68 20 70 49 64 78 20  iated with pIdx 
dd50: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
dd60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
dd70: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f       /* Index to
dd80: 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e 20 6f 66   match column of
dd90: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20 20   */.  int iCol  
dda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddb0: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
ddc0: 6f 66 20 69 6e 64 65 78 20 74 6f 20 6d 61 74 63  of index to matc
ddd0: 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  h */.){.  int i;
dde0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
ddf0: 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43  Coll = pIdx->azC
de00: 6f 6c 6c 5b 69 43 6f 6c 5d 3b 0a 0a 20 20 66 6f  oll[iCol];..  fo
de10: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
de20: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
de30: 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74   Expr *p = sqlit
de40: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
de50: 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  e(pList->a[i].pE
de60: 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  xpr);.    if( p-
de70: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20  >op==TK_COLUMN. 
de80: 20 20 20 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d      && p->iColum
de90: 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  n==pIdx->aiColum
dea0: 6e 5b 69 43 6f 6c 5d 0a 20 20 20 20 20 26 26 20  n[iCol].     && 
deb0: 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65  p->iTable==iBase
dec0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 43 6f  .    ){.      Co
ded0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73  llSeq *pColl = s
dee0: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
def0: 71 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d  q(pParse, pList-
df00: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
df10: 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26      if( pColl &&
df20: 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43   0==sqlite3StrIC
df30: 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c  mp(pColl->zName,
df40: 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20   zColl) ){.     
df50: 20 20 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 20     return i;.   
df60: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
df70: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a    return -1;.}..
df80: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
df90: 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43  e if the DISTINC
dfa0: 54 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73  T expression-lis
dfb0: 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
dfc0: 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 0a 2a  third argument.*
dfd0: 2a 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 0a  * is redundant..
dfe0: 2a 2a 0a 2a 2a 20 41 20 44 49 53 54 49 4e 43 54  **.** A DISTINCT
dff0: 20 6c 69 73 74 20 69 73 20 72 65 64 75 6e 64 61   list is redunda
e000: 6e 74 20 69 66 20 74 68 65 20 64 61 74 61 62 61  nt if the databa
e010: 73 65 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65  se contains some
e020: 20 73 75 62 73 65 74 20 6f 66 0a 2a 2a 20 63 6f   subset of.** co
e030: 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20 75  lumns that are u
e040: 6e 69 71 75 65 20 61 6e 64 20 6e 6f 6e 2d 6e 75  nique and non-nu
e050: 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ll..*/.static in
e060: 74 20 69 73 44 69 73 74 69 6e 63 74 52 65 64 75  t isDistinctRedu
e070: 6e 64 61 6e 74 28 0a 20 20 50 61 72 73 65 20 2a  ndant(.  Parse *
e080: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
e090: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
e0a0: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
e0b0: 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20  st *pTabList,   
e0c0: 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d       /* The FROM
e0d0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65   clause */.  Whe
e0e0: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
e0f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
e100: 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
e110: 45 78 70 72 4c 69 73 74 20 2a 70 44 69 73 74 69  ExprList *pDisti
e120: 6e 63 74 20 20 20 20 20 20 20 2f 2a 20 54 68 65  nct       /* The
e130: 20 72 65 73 75 6c 74 20 73 65 74 20 74 68 61 74   result set that
e140: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 44 49 53   needs to be DIS
e150: 54 49 4e 43 54 20 2a 2f 0a 29 7b 0a 20 20 54 61  TINCT */.){.  Ta
e160: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64  ble *pTab;.  Ind
e170: 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20  ex *pIdx;.  int 
e180: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
e190: 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 69              .  i
e1a0: 6e 74 20 69 42 61 73 65 3b 0a 0a 20 20 2f 2a 20  nt iBase;..  /* 
e1b0: 49 66 20 74 68 65 72 65 20 69 73 20 6d 6f 72 65  If there is more
e1c0: 20 74 68 61 6e 20 6f 6e 65 20 74 61 62 6c 65 20   than one table 
e1d0: 6f 72 20 73 75 62 2d 73 65 6c 65 63 74 20 69 6e  or sub-select in
e1e0: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
e1f0: 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 71 75   of.  ** this qu
e200: 65 72 79 2c 20 74 68 65 6e 20 69 74 20 77 69 6c  ery, then it wil
e210: 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c  l not be possibl
e220: 65 20 74 6f 20 73 68 6f 77 20 74 68 61 74 20 74  e to show that t
e230: 68 65 20 44 49 53 54 49 4e 43 54 20 0a 20 20 2a  he DISTINCT .  *
e240: 2a 20 63 6c 61 75 73 65 20 69 73 20 72 65 64 75  * clause is redu
e250: 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20  ndant. */.  if( 
e260: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 21 3d  pTabList->nSrc!=
e270: 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  1 ) return 0;.  
e280: 69 42 61 73 65 20 3d 20 70 54 61 62 4c 69 73 74  iBase = pTabList
e290: 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a  ->a[0].iCursor;.
e2a0: 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73    pTab = pTabLis
e2b0: 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20  t->a[0].pTab;.. 
e2c0: 20 2f 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68   /* If any of th
e2d0: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 73  e expressions is
e2e0: 20 61 6e 20 49 50 4b 20 63 6f 6c 75 6d 6e 20 6f   an IPK column o
e2f0: 6e 20 74 61 62 6c 65 20 69 42 61 73 65 2c 20 74  n table iBase, t
e300: 68 65 6e 20 72 65 74 75 72 6e 20 0a 20 20 2a 2a  hen return .  **
e310: 20 74 72 75 65 2e 20 4e 6f 74 65 3a 20 54 68 65   true. Note: The
e320: 20 28 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61   (p->iTable==iBa
e330: 73 65 29 20 70 61 72 74 20 6f 66 20 74 68 69 73  se) part of this
e340: 20 74 65 73 74 20 6d 61 79 20 62 65 20 66 61 6c   test may be fal
e350: 73 65 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 63  se if the.  ** c
e360: 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69 73  urrent SELECT is
e370: 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75   a correlated su
e380: 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  b-query..  */.  
e390: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 44 69 73 74  for(i=0; i<pDist
e3a0: 69 6e 63 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  inct->nExpr; i++
e3b0: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d  ){.    Expr *p =
e3c0: 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
e3d0: 43 6f 6c 6c 61 74 65 28 70 44 69 73 74 69 6e 63  Collate(pDistinc
e3e0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
e3f0: 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54      if( p->op==T
e400: 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 2d 3e 69  K_COLUMN && p->i
e410: 54 61 62 6c 65 3d 3d 69 42 61 73 65 20 26 26 20  Table==iBase && 
e420: 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72  p->iColumn<0 ) r
e430: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20  eturn 1;.  }..  
e440: 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
e450: 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20 74  all indices on t
e460: 68 65 20 74 61 62 6c 65 2c 20 63 68 65 63 6b 69  he table, checki
e470: 6e 67 20 65 61 63 68 20 74 6f 20 73 65 65 20 69  ng each to see i
e480: 66 20 69 74 20 6d 61 6b 65 73 0a 20 20 2a 2a 20  f it makes.  ** 
e490: 74 68 65 20 44 49 53 54 49 4e 43 54 20 71 75 61  the DISTINCT qua
e4a0: 6c 69 66 69 65 72 20 72 65 64 75 6e 64 61 6e 74  lifier redundant
e4b0: 2e 20 49 74 20 64 6f 65 73 20 73 6f 20 69 66 3a  . It does so if:
e4c0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e 20  .  **.  **   1. 
e4d0: 54 68 65 20 69 6e 64 65 78 20 69 73 20 69 74 73  The index is its
e4e0: 65 6c 66 20 55 4e 49 51 55 45 2c 20 61 6e 64 0a  elf UNIQUE, and.
e4f0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 41    **.  **   2. A
e500: 6c 6c 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ll of the column
e510: 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 61  s in the index a
e520: 72 65 20 65 69 74 68 65 72 20 70 61 72 74 20 6f  re either part o
e530: 66 20 74 68 65 20 70 44 69 73 74 69 6e 63 74 0a  f the pDistinct.
e540: 20 20 2a 2a 20 20 20 20 20 20 6c 69 73 74 2c 20    **      list, 
e550: 6f 72 20 65 6c 73 65 20 74 68 65 20 57 48 45 52  or else the WHER
e560: 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  E clause contain
e570: 73 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20  s a term of the 
e580: 66 6f 72 6d 20 22 63 6f 6c 3d 58 22 2c 0a 20 20  form "col=X",.  
e590: 2a 2a 20 20 20 20 20 20 77 68 65 72 65 20 58 20  **      where X 
e5a0: 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 76 61  is a constant va
e5b0: 6c 75 65 2e 20 54 68 65 20 63 6f 6c 6c 61 74 69  lue. The collati
e5c0: 6f 6e 20 73 65 71 75 65 6e 63 65 73 20 6f 66 20  on sequences of 
e5d0: 74 68 65 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f  the.  **      co
e5e0: 6d 70 61 72 69 73 6f 6e 20 61 6e 64 20 73 65 6c  mparison and sel
e5f0: 65 63 74 2d 6c 69 73 74 20 65 78 70 72 65 73 73  ect-list express
e600: 69 6f 6e 73 20 6d 75 73 74 20 6d 61 74 63 68 20  ions must match 
e610: 74 68 6f 73 65 20 6f 66 20 74 68 65 20 69 6e 64  those of the ind
e620: 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ex..  **.  **   
e630: 33 2e 20 41 6c 6c 20 6f 66 20 74 68 6f 73 65 20  3. All of those 
e640: 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 66 6f  index columns fo
e650: 72 20 77 68 69 63 68 20 74 68 65 20 57 48 45 52  r which the WHER
e660: 45 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f  E clause does no
e670: 74 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f 6e 74  t.  **      cont
e680: 61 69 6e 20 61 20 22 63 6f 6c 3d 58 22 20 74 65  ain a "col=X" te
e690: 72 6d 20 61 72 65 20 73 75 62 6a 65 63 74 20 74  rm are subject t
e6a0: 6f 20 61 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e  o a NOT NULL con
e6b0: 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20  straint..  */.  
e6c0: 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
e6d0: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
e6e0: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
e6f0: 20 20 20 20 69 66 28 20 21 49 73 55 6e 69 71 75      if( !IsUniqu
e700: 65 49 6e 64 65 78 28 70 49 64 78 29 20 29 20 63  eIndex(pIdx) ) c
e710: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72  ontinue;.    for
e720: 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 4b  (i=0; i<pIdx->nK
e730: 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  eyCol; i++){.   
e740: 20 20 20 69 31 36 20 69 43 6f 6c 20 3d 20 70 49     i16 iCol = pI
e750: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b  dx->aiColumn[i];
e760: 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 66 69  .      if( 0==fi
e770: 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 42 61 73  ndTerm(pWC, iBas
e780: 65 2c 20 69 43 6f 6c 2c 20 7e 28 42 69 74 6d 61  e, iCol, ~(Bitma
e790: 73 6b 29 30 2c 20 57 4f 5f 45 51 2c 20 70 49 64  sk)0, WO_EQ, pId
e7a0: 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  x) ){.        in
e7b0: 74 20 69 49 64 78 43 6f 6c 20 3d 20 66 69 6e 64  t iIdxCol = find
e7c0: 49 6e 64 65 78 43 6f 6c 28 70 50 61 72 73 65 2c  IndexCol(pParse,
e7d0: 20 70 44 69 73 74 69 6e 63 74 2c 20 69 42 61 73   pDistinct, iBas
e7e0: 65 2c 20 70 49 64 78 2c 20 69 29 3b 0a 20 20 20  e, pIdx, i);.   
e7f0: 20 20 20 20 20 69 66 28 20 69 49 64 78 43 6f 6c       if( iIdxCol
e800: 3c 30 20 7c 7c 20 70 54 61 62 2d 3e 61 43 6f 6c  <0 || pTab->aCol
e810: 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d  [iCol].notNull==
e820: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62  0 ){.          b
e830: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
e840: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
e850: 20 20 69 66 28 20 69 3d 3d 70 49 64 78 2d 3e 6e    if( i==pIdx->n
e860: 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  KeyCol ){.      
e870: 2f 2a 20 54 68 69 73 20 69 6e 64 65 78 20 69 6d  /* This index im
e880: 70 6c 69 65 73 20 74 68 61 74 20 74 68 65 20 44  plies that the D
e890: 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65  ISTINCT qualifie
e8a0: 72 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20  r is redundant. 
e8b0: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
e8c0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
e8d0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a  return 0;.}.../*
e8e0: 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65  .** Estimate the
e8f0: 20 6c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68   logarithm of th
e900: 65 20 69 6e 70 75 74 20 76 61 6c 75 65 20 74 6f  e input value to
e910: 20 62 61 73 65 20 32 2e 0a 2a 2f 0a 73 74 61 74   base 2..*/.stat
e920: 69 63 20 4c 6f 67 45 73 74 20 65 73 74 4c 6f 67  ic LogEst estLog
e930: 28 4c 6f 67 45 73 74 20 4e 29 7b 0a 20 20 72 65  (LogEst N){.  re
e940: 74 75 72 6e 20 4e 3c 3d 31 30 20 3f 20 30 20 3a  turn N<=10 ? 0 :
e950: 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 4e   sqlite3LogEst(N
e960: 29 20 2d 20 33 33 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ) - 33;.}../*.**
e970: 20 43 6f 6e 76 65 72 74 20 4f 50 5f 43 6f 6c 75   Convert OP_Colu
e980: 6d 6e 20 6f 70 63 6f 64 65 73 20 74 6f 20 4f 50  mn opcodes to OP
e990: 5f 43 6f 70 79 20 69 6e 20 70 72 65 76 69 6f 75  _Copy in previou
e9a0: 73 6c 79 20 67 65 6e 65 72 61 74 65 64 20 63 6f  sly generated co
e9b0: 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  de..**.** This r
e9c0: 6f 75 74 69 6e 65 20 72 75 6e 73 20 6f 76 65 72  outine runs over
e9d0: 20 67 65 6e 65 72 61 74 65 64 20 56 44 42 45 20   generated VDBE 
e9e0: 63 6f 64 65 20 61 6e 64 20 74 72 61 6e 73 6c 61  code and transla
e9f0: 74 65 73 20 4f 50 5f 43 6f 6c 75 6d 6e 0a 2a 2a  tes OP_Column.**
ea00: 20 6f 70 63 6f 64 65 73 20 69 6e 74 6f 20 4f 50   opcodes into OP
ea10: 5f 43 6f 70 79 2c 20 61 6e 64 20 4f 50 5f 52 6f  _Copy, and OP_Ro
ea20: 77 69 64 20 69 6e 74 6f 20 4f 50 5f 4e 75 6c 6c  wid into OP_Null
ea30: 2c 20 77 68 65 6e 20 74 68 65 20 74 61 62 6c 65  , when the table
ea40: 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20 61 63 63   is being.** acc
ea50: 65 73 73 65 64 20 76 69 61 20 63 6f 2d 72 6f 75  essed via co-rou
ea60: 74 69 6e 65 20 69 6e 73 74 65 61 64 20 6f 66 20  tine instead of 
ea70: 76 69 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 75 70  via table lookup
ea80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
ea90: 20 74 72 61 6e 73 6c 61 74 65 43 6f 6c 75 6d 6e   translateColumn
eaa0: 54 6f 43 6f 70 79 28 0a 20 20 56 64 62 65 20 2a  ToCopy(.  Vdbe *
eab0: 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  v,            /*
eac0: 20 54 68 65 20 56 44 42 45 20 63 6f 6e 74 61 69   The VDBE contai
ead0: 6e 69 6e 67 20 63 6f 64 65 20 74 6f 20 74 72 61  ning code to tra
eae0: 6e 73 6c 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20  nslate */.  int 
eaf0: 69 53 74 61 72 74 2c 20 20 20 20 20 20 20 20 20  iStart,         
eb00: 2f 2a 20 54 72 61 6e 73 6c 61 74 65 20 66 72 6f  /* Translate fro
eb10: 6d 20 74 68 69 73 20 6f 70 63 6f 64 65 20 74 6f  m this opcode to
eb20: 20 74 68 65 20 65 6e 64 20 2a 2f 0a 20 20 69 6e   the end */.  in
eb30: 74 20 69 54 61 62 43 75 72 2c 20 20 20 20 20 20  t iTabCur,      
eb40: 20 20 2f 2a 20 4f 50 5f 43 6f 6c 75 6d 6e 2f 4f    /* OP_Column/O
eb50: 50 5f 52 6f 77 69 64 20 72 65 66 65 72 65 6e 63  P_Rowid referenc
eb60: 65 73 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65  es to this table
eb70: 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 69 73   */.  int iRegis
eb80: 74 65 72 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ter       /* The
eb90: 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 69 73   first column is
eba0: 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65   in this registe
ebb0: 72 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 4f 70  r */.){.  VdbeOp
ebc0: 20 2a 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56   *pOp = sqlite3V
ebd0: 64 62 65 47 65 74 4f 70 28 76 2c 20 69 53 74 61  dbeGetOp(v, iSta
ebe0: 72 74 29 3b 0a 20 20 69 6e 74 20 69 45 6e 64 20  rt);.  int iEnd 
ebf0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
ec00: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 66  rentAddr(v);.  f
ec10: 6f 72 28 3b 20 69 53 74 61 72 74 3c 69 45 6e 64  or(; iStart<iEnd
ec20: 3b 20 69 53 74 61 72 74 2b 2b 2c 20 70 4f 70 2b  ; iStart++, pOp+
ec30: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d  +){.    if( pOp-
ec40: 3e 70 31 21 3d 69 54 61 62 43 75 72 20 29 20 63  >p1!=iTabCur ) c
ec50: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
ec60: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
ec70: 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  _Column ){.     
ec80: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f   pOp->opcode = O
ec90: 50 5f 43 6f 70 79 3b 0a 20 20 20 20 20 20 70 4f  P_Copy;.      pO
eca0: 70 2d 3e 70 31 20 3d 20 70 4f 70 2d 3e 70 32 20  p->p1 = pOp->p2 
ecb0: 2b 20 69 52 65 67 69 73 74 65 72 3b 0a 20 20 20  + iRegister;.   
ecc0: 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 70 4f 70     pOp->p2 = pOp
ecd0: 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70 4f 70 2d  ->p3;.      pOp-
ece0: 3e 70 33 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  >p3 = 0;.    }el
ecf0: 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f  se if( pOp->opco
ed00: 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a  de==OP_Rowid ){.
ed10: 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64        pOp->opcod
ed20: 65 20 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a 20 20 20  e = OP_Null;.   
ed30: 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 30 3b 0a     pOp->p1 = 0;.
ed40: 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20        pOp->p3 = 
ed50: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
ed60: 2f 2a 0a 2a 2a 20 54 77 6f 20 72 6f 75 74 69 6e  /*.** Two routin
ed70: 65 73 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20  es for printing 
ed80: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  the content of a
ed90: 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  n sqlite3_index_
eda0: 69 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72  info.** structur
edb0: 65 2e 20 20 55 73 65 64 20 66 6f 72 20 74 65 73  e.  Used for tes
edc0: 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69  ting and debuggi
edd0: 6e 67 20 6f 6e 6c 79 2e 20 20 49 66 20 6e 65 69  ng only.  If nei
ede0: 74 68 65 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 54  ther.** SQLITE_T
edf0: 45 53 54 20 6f 72 20 53 51 4c 49 54 45 5f 44 45  EST or SQLITE_DE
ee00: 42 55 47 20 61 72 65 20 64 65 66 69 6e 65 64 2c  BUG are defined,
ee10: 20 74 68 65 6e 20 74 68 65 73 65 20 72 6f 75 74   then these rout
ee20: 69 6e 65 73 0a 2a 2a 20 61 72 65 20 6e 6f 2d 6f  ines.** are no-o
ee30: 70 73 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69  ps..*/.#if !defi
ee40: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
ee50: 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26  VIRTUALTABLE) &&
ee60: 20 64 65 66 69 6e 65 64 28 57 48 45 52 45 54 52   defined(WHERETR
ee70: 41 43 45 5f 45 4e 41 42 4c 45 44 29 0a 73 74 61  ACE_ENABLED).sta
ee80: 74 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49  tic void TRACE_I
ee90: 44 58 5f 49 4e 50 55 54 53 28 73 71 6c 69 74 65  DX_INPUTS(sqlite
eea0: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29  3_index_info *p)
eeb0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
eec0: 20 21 73 71 6c 69 74 65 33 57 68 65 72 65 54 72   !sqlite3WhereTr
eed0: 61 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ace ) return;.  
eee0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
eef0: 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b  onstraint; i++){
ef00: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
ef10: 67 50 72 69 6e 74 66 28 22 20 20 63 6f 6e 73 74  gPrintf("  const
ef20: 72 61 69 6e 74 5b 25 64 5d 3a 20 63 6f 6c 3d 25  raint[%d]: col=%
ef30: 64 20 74 65 72 6d 69 64 3d 25 64 20 6f 70 3d 25  d termid=%d op=%
ef40: 64 20 75 73 61 62 6c 65 64 3d 25 64 5c 6e 22 2c  d usabled=%d\n",
ef50: 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20  .       i,.     
ef60: 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
ef70: 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20  [i].iColumn,.   
ef80: 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
ef90: 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65  nt[i].iTermOffse
efa0: 74 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  t,.       p->aCo
efb0: 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 6f 70 2c 0a  nstraint[i].op,.
efc0: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
efd0: 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 29  raint[i].usable)
efe0: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
eff0: 20 69 3c 70 2d 3e 6e 4f 72 64 65 72 42 79 3b 20   i<p->nOrderBy; 
f000: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
f010: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
f020: 6f 72 64 65 72 62 79 5b 25 64 5d 3a 20 63 6f 6c  orderby[%d]: col
f030: 3d 25 64 20 64 65 73 63 3d 25 64 5c 6e 22 2c 0a  =%d desc=%d\n",.
f040: 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20         i,.      
f050: 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e   p->aOrderBy[i].
f060: 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20  iColumn,.       
f070: 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 64  p->aOrderBy[i].d
f080: 65 73 63 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  esc);.  }.}.stat
f090: 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44  ic void TRACE_ID
f0a0: 58 5f 4f 55 54 50 55 54 53 28 73 71 6c 69 74 65  X_OUTPUTS(sqlite
f0b0: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29  3_index_info *p)
f0c0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
f0d0: 20 21 73 71 6c 69 74 65 33 57 68 65 72 65 54 72   !sqlite3WhereTr
f0e0: 61 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ace ) return;.  
f0f0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
f100: 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b  onstraint; i++){
f110: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
f120: 67 50 72 69 6e 74 66 28 22 20 20 75 73 61 67 65  gPrintf("  usage
f130: 5b 25 64 5d 3a 20 61 72 67 76 49 64 78 3d 25 64  [%d]: argvIdx=%d
f140: 20 6f 6d 69 74 3d 25 64 5c 6e 22 2c 0a 20 20 20   omit=%d\n",.   
f150: 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d      i,.       p-
f160: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
f170: 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 2c 0a  e[i].argvIndex,.
f180: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
f190: 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 6f 6d  raintUsage[i].om
f1a0: 69 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  it);.  }.  sqlit
f1b0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
f1c0: 20 69 64 78 4e 75 6d 3d 25 64 5c 6e 22 2c 20 70   idxNum=%d\n", p
f1d0: 2d 3e 69 64 78 4e 75 6d 29 3b 0a 20 20 73 71 6c  ->idxNum);.  sql
f1e0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
f1f0: 22 20 20 69 64 78 53 74 72 3d 25 73 5c 6e 22 2c  "  idxStr=%s\n",
f200: 20 70 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 73   p->idxStr);.  s
f210: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
f220: 66 28 22 20 20 6f 72 64 65 72 42 79 43 6f 6e 73  f("  orderByCons
f230: 75 6d 65 64 3d 25 64 5c 6e 22 2c 20 70 2d 3e 6f  umed=%d\n", p->o
f240: 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 29 3b  rderByConsumed);
f250: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
f260: 72 69 6e 74 66 28 22 20 20 65 73 74 69 6d 61 74  rintf("  estimat
f270: 65 64 43 6f 73 74 3d 25 67 5c 6e 22 2c 20 70 2d  edCost=%g\n", p-
f280: 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b  >estimatedCost);
f290: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
f2a0: 72 69 6e 74 66 28 22 20 20 65 73 74 69 6d 61 74  rintf("  estimat
f2b0: 65 64 52 6f 77 73 3d 25 6c 6c 64 5c 6e 22 2c 20  edRows=%lld\n", 
f2c0: 70 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73  p->estimatedRows
f2d0: 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69  );.}.#else.#defi
f2e0: 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50  ne TRACE_IDX_INP
f2f0: 55 54 53 28 41 29 0a 23 64 65 66 69 6e 65 20 54  UTS(A).#define T
f300: 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53  RACE_IDX_OUTPUTS
f310: 28 41 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  (A).#endif..#ifn
f320: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f330: 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a  AUTOMATIC_INDEX.
f340: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
f350: 45 20 69 66 20 74 68 65 20 57 48 45 52 45 20 63  E if the WHERE c
f360: 6c 61 75 73 65 20 74 65 72 6d 20 70 54 65 72 6d  lause term pTerm
f370: 20 69 73 20 6f 66 20 61 20 66 6f 72 6d 20 77 68   is of a form wh
f380: 65 72 65 20 69 74 0a 2a 2a 20 63 6f 75 6c 64 20  ere it.** could 
f390: 62 65 20 75 73 65 64 20 77 69 74 68 20 61 6e 20  be used with an 
f3a0: 69 6e 64 65 78 20 74 6f 20 61 63 63 65 73 73 20  index to access 
f3b0: 70 53 72 63 2c 20 61 73 73 75 6d 69 6e 67 20 61  pSrc, assuming a
f3c0: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a  n appropriate.**
f3d0: 20 69 6e 64 65 78 20 65 78 69 73 74 65 64 2e 0a   index existed..
f3e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
f3f0: 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28  rmCanDriveIndex(
f400: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
f410: 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  erm,            
f420: 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73    /* WHERE claus
f430: 65 20 74 65 72 6d 20 74 6f 20 63 68 65 63 6b 20  e term to check 
f440: 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
f450: 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20  ist_item *pSrc, 
f460: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 77 65 20      /* Table we 
f470: 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20 61 63  are trying to ac
f480: 63 65 73 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73  cess */.  Bitmas
f490: 6b 20 6e 6f 74 52 65 61 64 79 20 20 20 20 20 20  k notReady      
f4a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
f4b0: 65 73 20 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70  es in outer loop
f4c0: 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f  s of the join */
f4d0: 0a 29 7b 0a 20 20 63 68 61 72 20 61 66 66 3b 0a  .){.  char aff;.
f4e0: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66    if( pTerm->lef
f4f0: 74 43 75 72 73 6f 72 21 3d 70 53 72 63 2d 3e 69  tCursor!=pSrc->i
f500: 43 75 72 73 6f 72 20 29 20 72 65 74 75 72 6e 20  Cursor ) return 
f510: 30 3b 0a 20 20 69 66 28 20 28 70 54 65 72 6d 2d  0;.  if( (pTerm-
f520: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
f530: 5f 45 51 7c 57 4f 5f 49 53 29 29 3d 3d 30 20 29  _EQ|WO_IS))==0 )
f540: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
f550: 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52   (pTerm->prereqR
f560: 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29  ight & notReady)
f570: 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=0 ) return 0;.
f580: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 75 2e 6c    if( pTerm->u.l
f590: 65 66 74 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65  eftColumn<0 ) re
f5a0: 74 75 72 6e 20 30 3b 0a 20 20 61 66 66 20 3d 20  turn 0;.  aff = 
f5b0: 70 53 72 63 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c  pSrc->pTab->aCol
f5c0: 5b 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f  [pTerm->u.leftCo
f5d0: 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a  lumn].affinity;.
f5e0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e    if( !sqlite3In
f5f0: 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 54  dexAffinityOk(pT
f600: 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61 66 66 29  erm->pExpr, aff)
f610: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 74   ) return 0;.  t
f620: 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
f630: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
f640: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   );.  return 1;.
f650: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64  }.#endif...#ifnd
f660: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
f670: 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f  UTOMATIC_INDEX./
f680: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
f690: 64 65 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20  de to construct 
f6a0: 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  the Index object
f6b0: 20 66 6f 72 20 61 6e 20 61 75 74 6f 6d 61 74 69   for an automati
f6c0: 63 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74  c index.** and t
f6d0: 6f 20 73 65 74 20 75 70 20 74 68 65 20 57 68 65  o set up the Whe
f6e0: 72 65 4c 65 76 65 6c 20 6f 62 6a 65 63 74 20 70  reLevel object p
f6f0: 4c 65 76 65 6c 20 73 6f 20 74 68 61 74 20 74 68  Level so that th
f700: 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  e code generator
f710: 0a 2a 2a 20 6d 61 6b 65 73 20 75 73 65 20 6f 66  .** makes use of
f720: 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
f730: 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
f740: 76 6f 69 64 20 63 6f 6e 73 74 72 75 63 74 41 75  void constructAu
f750: 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 0a 20 20  tomaticIndex(.  
f760: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
f770: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
f780: 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
f790: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  xt */.  WhereCla
f7a0: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
f7b0: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
f7c0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
f7d0: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
f7e0: 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20   *pSrc,  /* The 
f7f0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
f800: 20 74 6f 20 67 65 74 20 74 68 65 20 6e 65 78 74   to get the next
f810: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 42 69 74 6d   index */.  Bitm
f820: 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20  ask notReady,   
f830: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
f840: 6f 66 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  of cursors that 
f850: 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  are not availabl
f860: 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65  e */.  WhereLeve
f870: 6c 20 2a 70 4c 65 76 65 6c 20 20 20 20 20 20 20  l *pLevel       
f880: 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20     /* Write new 
f890: 69 6e 64 65 78 20 68 65 72 65 20 2a 2f 0a 29 7b  index here */.){
f8a0: 0a 20 20 69 6e 74 20 6e 4b 65 79 43 6f 6c 3b 20  .  int nKeyCol; 
f8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f8c0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
f8d0: 6d 6e 73 20 69 6e 20 74 68 65 20 63 6f 6e 73 74  mns in the const
f8e0: 72 75 63 74 65 64 20 69 6e 64 65 78 20 2a 2f 0a  ructed index */.
f8f0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
f900: 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  rm;           /*
f910: 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f   A single term o
f920: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
f930: 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  se */.  WhereTer
f940: 6d 20 2a 70 57 43 45 6e 64 3b 20 20 20 20 20 20  m *pWCEnd;      
f950: 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57      /* End of pW
f960: 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 49 6e 64 65  C->a[] */.  Inde
f970: 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
f980: 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63          /* Objec
f990: 74 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65  t describing the
f9a0: 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78   transient index
f9b0: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
f9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9d0: 20 20 2f 2a 20 50 72 65 70 61 72 65 64 20 73 74    /* Prepared st
f9e0: 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f  atement under co
f9f0: 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
fa00: 69 6e 74 20 61 64 64 72 49 6e 69 74 3b 20 20 20  int addrInit;   
fa10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
fa20: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 69 6e  ddress of the in
fa30: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 62 79 70  itialization byp
fa40: 61 73 73 20 6a 75 6d 70 20 2a 2f 0a 20 20 54 61  ass jump */.  Ta
fa50: 62 6c 65 20 2a 70 54 61 62 6c 65 3b 20 20 20 20  ble *pTable;    
fa60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
fa70: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 69 6e 64   table being ind
fa80: 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64  exed */.  int ad
fa90: 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20  drTop;          
faa0: 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20        /* Top of 
fab0: 74 68 65 20 69 6e 64 65 78 20 66 69 6c 6c 20 6c  the index fill l
fac0: 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  oop */.  int reg
fad0: 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20  Record;         
fae0: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
faf0: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 64 65   holding an inde
fb00: 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  x record */.  in
fb10: 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
fb20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
fb30: 75 6d 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  umn counter */. 
fb40: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
fb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fb60: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
fb70: 20 20 69 6e 74 20 6d 78 42 69 74 43 6f 6c 3b 20    int mxBitCol; 
fb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fb90: 20 4d 61 78 69 6d 75 6d 20 63 6f 6c 75 6d 6e 20   Maximum column 
fba0: 69 6e 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64  in pSrc->colUsed
fbb0: 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70   */.  CollSeq *p
fbc0: 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
fbd0: 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73    /* Collating s
fbe0: 65 71 75 65 6e 63 65 20 74 6f 20 6f 6e 20 61 20  equence to on a 
fbf0: 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 57 68 65 72  column */.  Wher
fc00: 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20  eLoop *pLoop;   
fc10: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c          /* The L
fc20: 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  oop object */.  
fc30: 63 68 61 72 20 2a 7a 4e 6f 74 55 73 65 64 3b 20  char *zNotUsed; 
fc40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
fc50: 78 74 72 61 20 73 70 61 63 65 20 6f 6e 20 74 68  xtra space on th
fc60: 65 20 65 6e 64 20 6f 66 20 70 49 64 78 20 2a 2f  e end of pIdx */
fc70: 0a 20 20 42 69 74 6d 61 73 6b 20 69 64 78 43 6f  .  Bitmask idxCo
fc80: 6c 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ls;            /
fc90: 2a 20 42 69 74 6d 61 70 20 6f 66 20 63 6f 6c 75  * Bitmap of colu
fca0: 6d 6e 73 20 75 73 65 64 20 66 6f 72 20 69 6e 64  mns used for ind
fcb0: 65 78 69 6e 67 20 2a 2f 0a 20 20 42 69 74 6d 61  exing */.  Bitma
fcc0: 73 6b 20 65 78 74 72 61 43 6f 6c 73 3b 20 20 20  sk extraCols;   
fcd0: 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70         /* Bitmap
fce0: 20 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63   of additional c
fcf0: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 73  olumns */.  u8 s
fd00: 65 6e 74 57 61 72 6e 69 6e 67 20 3d 20 30 3b 20  entWarning = 0; 
fd10: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
fd20: 69 66 20 61 20 77 61 72 6e 6e 69 6e 67 20 68 61  if a warnning ha
fd30: 73 20 62 65 65 6e 20 69 73 73 75 65 64 20 2a 2f  s been issued */
fd40: 0a 20 20 45 78 70 72 20 2a 70 50 61 72 74 69 61  .  Expr *pPartia
fd50: 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  l = 0;         /
fd60: 2a 20 50 61 72 74 69 61 6c 20 49 6e 64 65 78 20  * Partial Index 
fd70: 45 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  Expression */.  
fd80: 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20  int iContinue = 
fd90: 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  0;          /* J
fda0: 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70  ump here to skip
fdb0: 20 65 78 63 6c 75 64 65 64 20 72 6f 77 73 20 2a   excluded rows *
fdc0: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
fdd0: 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65  st_item *pTabIte
fde0: 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75  m;  /* FROM clau
fdf0: 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20 69 6e  se term being in
fe00: 64 65 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 47  dexed */..  /* G
fe10: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
fe20: 73 6b 69 70 20 6f 76 65 72 20 74 68 65 20 63 72  skip over the cr
fe30: 65 61 74 69 6f 6e 20 61 6e 64 20 69 6e 69 74 69  eation and initi
fe40: 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 65  alization of the
fe50: 0a 20 20 2a 2a 20 74 72 61 6e 73 69 65 6e 74 20  .  ** transient 
fe60: 69 6e 64 65 78 20 6f 6e 20 32 6e 64 20 61 6e 64  index on 2nd and
fe70: 20 73 75 62 73 65 71 75 65 6e 74 20 69 74 65 72   subsequent iter
fe80: 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f  ations of the lo
fe90: 6f 70 2e 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61  op. */.  v = pPa
fea0: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73  rse->pVdbe;.  as
feb0: 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
fec0: 61 64 64 72 49 6e 69 74 20 3d 20 73 71 6c 69 74  addrInit = sqlit
fed0: 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73  e3CodeOnce(pPars
fee0: 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
fef0: 28 76 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74  (v);..  /* Count
ff00: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
ff10: 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c  olumns that will
ff20: 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65   be added to the
ff30: 20 69 6e 64 65 78 0a 20 20 2a 2a 20 61 6e 64 20   index.  ** and 
ff40: 75 73 65 64 20 74 6f 20 6d 61 74 63 68 20 57 48  used to match WH
ff50: 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74  ERE clause const
ff60: 72 61 69 6e 74 73 20 2a 2f 0a 20 20 6e 4b 65 79  raints */.  nKey
ff70: 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c  Col = 0;.  pTabl
ff80: 65 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a  e = pSrc->pTab;.
ff90: 20 20 70 57 43 45 6e 64 20 3d 20 26 70 57 43 2d    pWCEnd = &pWC-
ffa0: 3e 61 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a  >a[pWC->nTerm];.
ffb0: 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c    pLoop = pLevel
ffc0: 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 69 64 78 43  ->pWLoop;.  idxC
ffd0: 6f 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70  ols = 0;.  for(p
ffe0: 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65  Term=pWC->a; pTe
fff0: 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d  rm<pWCEnd; pTerm
10000 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
10010 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45  Expr = pTerm->pE
10020 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  xpr;.    assert(
10030 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
10040 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  y(pExpr, EP_From
10050 4a 6f 69 6e 29 20 20 20 20 2f 2a 20 70 72 65 72  Join)    /* prer
10060 65 71 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 7a 65  eq always non-ze
10070 72 6f 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 7c  ro */.         |
10080 7c 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a  | pExpr->iRightJ
10090 6f 69 6e 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e  oinTable!=pSrc->
100a0 69 43 75 72 73 6f 72 20 20 20 2f 2a 20 20 20 66  iCursor   /*   f
100b0 6f 72 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  or the right-han
100c0 64 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  d   */.         
100d0 7c 7c 20 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71  || pLoop->prereq
100e0 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20  !=0 );          
100f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20             /*   
10100 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20  table of a LEFT 
10110 4a 4f 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20  JOIN */.    if( 
10120 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 3d 3d 30  pLoop->prereq==0
10130 0a 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d  .     && (pTerm-
10140 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
10150 56 49 52 54 55 41 4c 29 3d 3d 30 0a 20 20 20 20  VIRTUAL)==0.    
10160 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
10170 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46  erty(pExpr, EP_F
10180 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 26 26  romJoin).     &&
10190 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 54 61   sqlite3ExprIsTa
101a0 62 6c 65 43 6f 6e 73 74 61 6e 74 28 70 45 78 70  bleConstant(pExp
101b0 72 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  r, pSrc->iCursor
101c0 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 74  ) ){.      pPart
101d0 69 61 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ial = sqlite3Exp
101e0 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  rAnd(pParse->db,
101f0 20 70 50 61 72 74 69 61 6c 2c 0a 20 20 20 20 20   pPartial,.     
10200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10210 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
10220 65 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65  e3ExprDup(pParse
10230 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 30 29 29  ->db, pExpr, 0))
10240 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
10250 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65  termCanDriveInde
10260 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 6e  x(pTerm, pSrc, n
10270 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20 20 20  otReady) ){.    
10280 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 54 65    int iCol = pTe
10290 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
102a0 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  ;.      Bitmask 
102b0 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d  cMask = iCol>=BM
102c0 53 20 3f 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d  S ? MASKBIT(BMS-
102d0 31 29 20 3a 20 4d 41 53 4b 42 49 54 28 69 43 6f  1) : MASKBIT(iCo
102e0 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  l);.      testca
102f0 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b  se( iCol==BMS );
10300 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
10310 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a   iCol==BMS-1 );.
10320 20 20 20 20 20 20 69 66 28 20 21 73 65 6e 74 57        if( !sentW
10330 61 72 6e 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  arning ){.      
10340 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
10350 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41 55 54  LITE_WARNING_AUT
10360 4f 49 4e 44 45 58 2c 0a 20 20 20 20 20 20 20 20  OINDEX,.        
10370 20 20 20 20 22 61 75 74 6f 6d 61 74 69 63 20 69      "automatic i
10380 6e 64 65 78 20 6f 6e 20 25 73 28 25 73 29 22 2c  ndex on %s(%s)",
10390 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 0a   pTable->zName,.
103a0 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62              pTab
103b0 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  le->aCol[iCol].z
103c0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 73  Name);.        s
103d0 65 6e 74 57 61 72 6e 69 6e 67 20 3d 20 31 3b 0a  entWarning = 1;.
103e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
103f0 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63 4d 61  ( (idxCols & cMa
10400 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
10410 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52    if( whereLoopR
10420 65 73 69 7a 65 28 70 50 61 72 73 65 2d 3e 64 62  esize(pParse->db
10430 2c 20 70 4c 6f 6f 70 2c 20 6e 4b 65 79 43 6f 6c  , pLoop, nKeyCol
10440 2b 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  +1) ){.         
10450 20 67 6f 74 6f 20 65 6e 64 5f 61 75 74 6f 5f 69   goto end_auto_i
10460 6e 64 65 78 5f 63 72 65 61 74 65 3b 0a 20 20 20  ndex_create;.   
10470 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
10480 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6e 4b 65  Loop->aLTerm[nKe
10490 79 43 6f 6c 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b  yCol++] = pTerm;
104a0 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f 6c 73  .        idxCols
104b0 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20 20   |= cMask;.     
104c0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61   }.    }.  }.  a
104d0 73 73 65 72 74 28 20 6e 4b 65 79 43 6f 6c 3e 30  ssert( nKeyCol>0
104e0 20 29 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62   );.  pLoop->u.b
104f0 74 72 65 65 2e 6e 45 71 20 3d 20 70 4c 6f 6f 70  tree.nEq = pLoop
10500 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6e 4b 65 79 43  ->nLTerm = nKeyC
10510 6f 6c 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46  ol;.  pLoop->wsF
10520 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c  lags = WHERE_COL
10530 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52 45 5f 49  UMN_EQ | WHERE_I
10540 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45 52 45 5f  DX_ONLY | WHERE_
10550 49 4e 44 45 58 45 44 0a 20 20 20 20 20 20 20 20  INDEXED.        
10560 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 57               | W
10570 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 3b  HERE_AUTO_INDEX;
10580 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65  ..  /* Count the
10590 20 6e 75 6d 62 65 72 20 6f 66 20 61 64 64 69 74   number of addit
105a0 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65  ional columns ne
105b0 65 64 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  eded to create a
105c0 0a 20 20 2a 2a 20 63 6f 76 65 72 69 6e 67 20 69  .  ** covering i
105d0 6e 64 65 78 2e 20 20 41 20 22 63 6f 76 65 72 69  ndex.  A "coveri
105e0 6e 67 20 69 6e 64 65 78 22 20 69 73 20 61 6e 20  ng index" is an 
105f0 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61  index that conta
10600 69 6e 73 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f 6c  ins all.  ** col
10610 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20 6e 65  umns that are ne
10620 65 64 65 64 20 62 79 20 74 68 65 20 71 75 65 72  eded by the quer
10630 79 2e 20 20 57 69 74 68 20 61 20 63 6f 76 65 72  y.  With a cover
10640 69 6e 67 20 69 6e 64 65 78 2c 20 74 68 65 0a 20  ing index, the. 
10650 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61 62   ** original tab
10660 6c 65 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74  le never needs t
10670 6f 20 62 65 20 61 63 63 65 73 73 65 64 2e 20 20  o be accessed.  
10680 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 69 63 65  Automatic indice
10690 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20 61  s must.  ** be a
106a0 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20   covering index 
106b0 62 65 63 61 75 73 65 20 74 68 65 20 69 6e 64 65  because the inde
106c0 78 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70  x will not be up
106d0 64 61 74 65 64 20 69 66 20 74 68 65 0a 20 20 2a  dated if the.  *
106e0 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c 65  * original table
106f0 20 63 68 61 6e 67 65 73 20 61 6e 64 20 74 68 65   changes and the
10700 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c 65   index and table
10710 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20 62 65 20   cannot both be 
10720 75 73 65 64 0a 20 20 2a 2a 20 69 66 20 74 68 65  used.  ** if the
10730 79 20 67 6f 20 6f 75 74 20 6f 66 20 73 79 6e 63  y go out of sync
10740 2e 0a 20 20 2a 2f 0a 20 20 65 78 74 72 61 43 6f  ..  */.  extraCo
10750 6c 73 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73  ls = pSrc->colUs
10760 65 64 20 26 20 28 7e 69 64 78 43 6f 6c 73 20 7c  ed & (~idxCols |
10770 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 29   MASKBIT(BMS-1))
10780 3b 0a 20 20 6d 78 42 69 74 43 6f 6c 20 3d 20 4d  ;.  mxBitCol = M
10790 49 4e 28 42 4d 53 2d 31 2c 70 54 61 62 6c 65 2d  IN(BMS-1,pTable-
107a0 3e 6e 43 6f 6c 29 3b 0a 20 20 74 65 73 74 63 61  >nCol);.  testca
107b0 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  se( pTable->nCol
107c0 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 74 65 73  ==BMS-1 );.  tes
107d0 74 63 61 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e  tcase( pTable->n
107e0 43 6f 6c 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20  Col==BMS-2 );.  
107f0 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74  for(i=0; i<mxBit
10800 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Col; i++){.    i
10810 66 28 20 65 78 74 72 61 43 6f 6c 73 20 26 20 4d  f( extraCols & M
10820 41 53 4b 42 49 54 28 69 29 20 29 20 6e 4b 65 79  ASKBIT(i) ) nKey
10830 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28  Col++;.  }.  if(
10840 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26   pSrc->colUsed &
10850 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20   MASKBIT(BMS-1) 
10860 29 7b 0a 20 20 20 20 6e 4b 65 79 43 6f 6c 20 2b  ){.    nKeyCol +
10870 3d 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 2d  = pTable->nCol -
10880 20 42 4d 53 20 2b 20 31 3b 0a 20 20 7d 0a 0a 20   BMS + 1;.  }.. 
10890 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68   /* Construct th
108a0 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 74  e Index object t
108b0 6f 20 64 65 73 63 72 69 62 65 20 74 68 69 73 20  o describe this 
108c0 69 6e 64 65 78 20 2a 2f 0a 20 20 70 49 64 78 20  index */.  pIdx 
108d0 3d 20 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74  = sqlite3Allocat
108e0 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 70 50 61  eIndexObject(pPa
108f0 72 73 65 2d 3e 64 62 2c 20 6e 4b 65 79 43 6f 6c  rse->db, nKeyCol
10900 2b 31 2c 20 30 2c 20 26 7a 4e 6f 74 55 73 65 64  +1, 0, &zNotUsed
10910 29 3b 0a 20 20 69 66 28 20 70 49 64 78 3d 3d 30  );.  if( pIdx==0
10920 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61 75 74 6f   ) goto end_auto
10930 5f 69 6e 64 65 78 5f 63 72 65 61 74 65 3b 0a 20  _index_create;. 
10940 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
10950 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20  pIndex = pIdx;. 
10960 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3d 20 22   pIdx->zName = "
10970 61 75 74 6f 2d 69 6e 64 65 78 22 3b 0a 20 20 70  auto-index";.  p
10980 49 64 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54  Idx->pTable = pT
10990 61 62 6c 65 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20  able;.  n = 0;. 
109a0 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20   idxCols = 0;.  
109b0 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
109c0 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20  ; pTerm<pWCEnd; 
109d0 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  pTerm++){.    if
109e0 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e  ( termCanDriveIn
109f0 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c  dex(pTerm, pSrc,
10a00 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20   notReady) ){.  
10a10 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
10a20 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
10a30 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73  mn;.      Bitmas
10a40 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d  k cMask = iCol>=
10a50 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28 42 4d  BMS ? MASKBIT(BM
10a60 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54 28 69  S-1) : MASKBIT(i
10a70 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Col);.      test
10a80 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d  case( iCol==BMS-
10a90 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  1 );.      testc
10aa0 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29  ase( iCol==BMS )
10ab0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 64 78  ;.      if( (idx
10ac0 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30  Cols & cMask)==0
10ad0 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72   ){.        Expr
10ae0 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45   *pX = pTerm->pE
10af0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 64 78  xpr;.        idx
10b00 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20  Cols |= cMask;. 
10b10 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43         pIdx->aiC
10b20 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 70 54 65 72 6d  olumn[n] = pTerm
10b30 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a  ->u.leftColumn;.
10b40 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
10b50 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d  sqlite3BinaryCom
10b60 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  pareCollSeq(pPar
10b70 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70  se, pX->pLeft, p
10b80 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  X->pRight);.    
10b90 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c      pIdx->azColl
10ba0 5b 6e 5d 20 3d 20 70 43 6f 6c 6c 20 3f 20 70 43  [n] = pColl ? pC
10bb0 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22 42 49  oll->zName : "BI
10bc0 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 20 20 6e  NARY";.        n
10bd0 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
10be0 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
10bf0 28 75 33 32 29 6e 3d 3d 70 4c 6f 6f 70 2d 3e 75  (u32)n==pLoop->u
10c00 2e 62 74 72 65 65 2e 6e 45 71 20 29 3b 0a 0a 20  .btree.nEq );.. 
10c10 20 2f 2a 20 41 64 64 20 61 64 64 69 74 69 6f 6e   /* Add addition
10c20 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65  al columns neede
10c30 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 61 75  d to make the au
10c40 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69 6e  tomatic index in
10c50 74 6f 0a 20 20 2a 2a 20 61 20 63 6f 76 65 72 69  to.  ** a coveri
10c60 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 66 6f  ng index */.  fo
10c70 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f  r(i=0; i<mxBitCo
10c80 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; i++){.    if(
10c90 20 65 78 74 72 61 43 6f 6c 73 20 26 20 4d 41 53   extraCols & MAS
10ca0 4b 42 49 54 28 69 29 20 29 7b 0a 20 20 20 20 20  KBIT(i) ){.     
10cb0 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
10cc0 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49  n] = i;.      pI
10cd0 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20  dx->azColl[n] = 
10ce0 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20  "BINARY";.      
10cf0 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n++;.    }.  }. 
10d00 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73   if( pSrc->colUs
10d10 65 64 20 26 20 4d 41 53 4b 42 49 54 28 42 4d 53  ed & MASKBIT(BMS
10d20 2d 31 29 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  -1) ){.    for(i
10d30 3d 42 4d 53 2d 31 3b 20 69 3c 70 54 61 62 6c 65  =BMS-1; i<pTable
10d40 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
10d50 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75      pIdx->aiColu
10d60 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20  mn[n] = i;.     
10d70 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d   pIdx->azColl[n]
10d80 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20   = "BINARY";.   
10d90 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     n++;.    }.  
10da0 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 6e  }.  assert( n==n
10db0 4b 65 79 43 6f 6c 20 29 3b 0a 20 20 70 49 64 78  KeyCol );.  pIdx
10dc0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20  ->aiColumn[n] = 
10dd0 2d 31 3b 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f  -1;.  pIdx->azCo
10de0 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22  ll[n] = "BINARY"
10df0 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74  ;..  /* Create t
10e00 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  he automatic ind
10e10 65 78 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ex */.  assert( 
10e20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e  pLevel->iIdxCur>
10e30 3d 30 20 29 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e  =0 );.  pLevel->
10e40 69 49 64 78 43 75 72 20 3d 20 70 50 61 72 73 65  iIdxCur = pParse
10e50 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73 71 6c 69  ->nTab++;.  sqli
10e60 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10e70 20 4f 50 5f 4f 70 65 6e 41 75 74 6f 69 6e 64 65   OP_OpenAutoinde
10e80 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  x, pLevel->iIdxC
10e90 75 72 2c 20 6e 4b 65 79 43 6f 6c 2b 31 29 3b 0a  ur, nKeyCol+1);.
10ea0 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
10eb0 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65  P4KeyInfo(pParse
10ec0 2c 20 70 49 64 78 29 3b 0a 20 20 56 64 62 65 43  , pIdx);.  VdbeC
10ed0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66 6f 72 20  omment((v, "for 
10ee0 25 73 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  %s", pTable->zNa
10ef0 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c  me));..  /* Fill
10f00 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
10f10 6e 64 65 78 20 77 69 74 68 20 63 6f 6e 74 65 6e  ndex with conten
10f20 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78  t */.  sqlite3Ex
10f30 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
10f40 73 65 29 3b 0a 20 20 70 54 61 62 49 74 65 6d 20  se);.  pTabItem 
10f50 3d 20 26 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e  = &pWC->pWInfo->
10f60 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
10f70 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 69 66  el->iFrom];.  if
10f80 28 20 70 54 61 62 49 74 65 6d 2d 3e 76 69 61 43  ( pTabItem->viaC
10f90 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  oroutine ){.    
10fa0 69 6e 74 20 72 65 67 59 69 65 6c 64 20 3d 20 70  int regYield = p
10fb0 54 61 62 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  TabItem->regRetu
10fc0 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  rn;.    sqlite3V
10fd0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
10fe0 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72  InitCoroutine, r
10ff0 65 67 59 69 65 6c 64 2c 20 30 2c 20 70 54 61 62  egYield, 0, pTab
11000 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
11010 62 29 3b 0a 20 20 20 20 61 64 64 72 54 6f 70 20  b);.    addrTop 
11020 3d 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  =  sqlite3VdbeAd
11030 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp1(v, OP_Yield
11040 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20  , regYield);.   
11050 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
11060 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
11070 74 28 28 76 2c 20 22 6e 65 78 74 20 72 6f 77 20  t((v, "next row 
11080 6f 66 20 5c 22 25 73 5c 22 22 2c 20 70 54 61 62  of \"%s\"", pTab
11090 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
110a0 65 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  e));.  }else{.  
110b0 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69    addrTop = sqli
110c0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
110d0 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70 4c 65 76   OP_Rewind, pLev
110e0 65 6c 2d 3e 69 54 61 62 43 75 72 29 3b 20 56 64  el->iTabCur); Vd
110f0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
11100 20 7d 0a 20 20 69 66 28 20 70 50 61 72 74 69 61   }.  if( pPartia
11110 6c 20 29 7b 0a 20 20 20 20 69 43 6f 6e 74 69 6e  l ){.    iContin
11120 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ue = sqlite3Vdbe
11130 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
11140 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
11150 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 50 61  alse(pParse, pPa
11160 72 74 69 61 6c 2c 20 69 43 6f 6e 74 69 6e 75 65  rtial, iContinue
11170 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
11180 55 4c 4c 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d  ULL);.    pLoop-
11190 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
111a0 45 5f 50 41 52 54 49 41 4c 49 44 58 3b 0a 20 20  E_PARTIALIDX;.  
111b0 7d 0a 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20  }.  regRecord = 
111c0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
111d0 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c  g(pParse);.  sql
111e0 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65  ite3GenerateInde
111f0 78 4b 65 79 28 70 50 61 72 73 65 2c 20 70 49 64  xKey(pParse, pId
11200 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  x, pLevel->iTabC
11210 75 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 30  ur, regRecord, 0
11220 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71  , 0, 0, 0);.  sq
11230 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
11240 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
11250 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
11260 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
11270 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
11280 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53  eP5(v, OPFLAG_US
11290 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20  ESEEKRESULT);.  
112a0 69 66 28 20 70 50 61 72 74 69 61 6c 20 29 20 73  if( pPartial ) s
112b0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
112c0 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69  eLabel(v, iConti
112d0 6e 75 65 29 3b 0a 20 20 69 66 28 20 70 54 61 62  nue);.  if( pTab
112e0 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69  Item->viaCorouti
112f0 6e 65 20 29 7b 0a 20 20 20 20 74 72 61 6e 73 6c  ne ){.    transl
11300 61 74 65 43 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28  ateColumnToCopy(
11310 76 2c 20 61 64 64 72 54 6f 70 2c 20 70 4c 65 76  v, addrTop, pLev
11320 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20 70 54 61  el->iTabCur, pTa
11330 62 49 74 65 6d 2d 3e 72 65 67 52 65 73 75 6c 74  bItem->regResult
11340 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
11350 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
11360 6f 74 6f 2c 20 30 2c 20 61 64 64 72 54 6f 70 29  oto, 0, addrTop)
11370 3b 0a 20 20 20 20 70 54 61 62 49 74 65 6d 2d 3e  ;.    pTabItem->
11380 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d 20 30  viaCoroutine = 0
11390 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
113a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
113b0 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 4c 65  (v, OP_Next, pLe
113c0 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20 61 64  vel->iTabCur, ad
113d0 64 72 54 6f 70 2b 31 29 3b 20 56 64 62 65 43 6f  drTop+1); VdbeCo
113e0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20  verage(v);.  }. 
113f0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
11400 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 53  geP5(v, SQLITE_S
11410 54 4d 54 53 54 41 54 55 53 5f 41 55 54 4f 49 4e  TMTSTATUS_AUTOIN
11420 44 45 58 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  DEX);.  sqlite3V
11430 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
11440 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74  ddrTop);.  sqlit
11450 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
11460 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f  (pParse, regReco
11470 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  rd);.  sqlite3Ex
11480 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
11490 65 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a 75 6d 70  e);.  .  /* Jump
114a0 20 68 65 72 65 20 77 68 65 6e 20 73 6b 69 70 70   here when skipp
114b0 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c 69  ing the initiali
114c0 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69  zation */.  sqli
114d0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
114e0 76 2c 20 61 64 64 72 49 6e 69 74 29 3b 0a 0a 65  v, addrInit);..e
114f0 6e 64 5f 61 75 74 6f 5f 69 6e 64 65 78 5f 63 72  nd_auto_index_cr
11500 65 61 74 65 3a 0a 20 20 73 71 6c 69 74 65 33 45  eate:.  sqlite3E
11510 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65  xprDelete(pParse
11520 2d 3e 64 62 2c 20 70 50 61 72 74 69 61 6c 29 3b  ->db, pPartial);
11530 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
11540 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
11550 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 23 69 66  IC_INDEX */..#if
11560 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11570 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
11580 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  .** Allocate and
11590 20 70 6f 70 75 6c 61 74 65 20 61 6e 20 73 71 6c   populate an sql
115a0 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
115b0 73 74 72 75 63 74 75 72 65 2e 20 49 74 20 69 73  structure. It is
115c0 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73   the .** respons
115d0 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
115e0 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
115f0 6c 6c 79 20 72 65 6c 65 61 73 65 20 74 68 65 20  lly release the 
11600 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 62 79 20  structure.** by 
11610 70 61 73 73 69 6e 67 20 74 68 65 20 70 6f 69 6e  passing the poin
11620 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20  ter returned by 
11630 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f  this function to
11640 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e   sqlite3_free().
11650 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74  .*/.static sqlit
11660 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 61  e3_index_info *a
11670 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f  llocateIndexInfo
11680 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
11690 65 2c 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  e,.  WhereClause
116a0 20 2a 70 57 43 2c 0a 20 20 73 74 72 75 63 74 20   *pWC,.  struct 
116b0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
116c0 72 63 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  rc,.  ExprList *
116d0 70 4f 72 64 65 72 42 79 0a 29 7b 0a 20 20 69 6e  pOrderBy.){.  in
116e0 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54  t i, j;.  int nT
116f0 65 72 6d 3b 0a 20 20 73 74 72 75 63 74 20 73 71  erm;.  struct sq
11700 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
11710 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73  traint *pIdxCons
11720 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
11730 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79  e3_index_orderby
11740 20 2a 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20   *pIdxOrderBy;. 
11750 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
11760 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
11770 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a  _usage *pUsage;.
11780 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
11790 72 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72  rm;.  int nOrder
117a0 42 79 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  By;.  sqlite3_in
117b0 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e  dex_info *pIdxIn
117c0 66 6f 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20  fo;..  /* Count 
117d0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f  the number of po
117e0 73 73 69 62 6c 65 20 57 48 45 52 45 20 63 6c 61  ssible WHERE cla
117f0 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  use constraints 
11800 72 65 66 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74  referring.  ** t
11810 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 74  o this virtual t
11820 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  able */.  for(i=
11830 6e 54 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70  nTerm=0, pTerm=p
11840 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54  WC->a; i<pWC->nT
11850 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b  erm; i++, pTerm+
11860 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72  +){.    if( pTer
11870 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d  m->leftCursor !=
11880 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29   pSrc->iCursor )
11890 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61   continue;.    a
118a0 73 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66  ssert( IsPowerOf
118b0 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  Two(pTerm->eOper
118c0 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56  ator & ~WO_EQUIV
118d0 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  ) );.    testcas
118e0 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
118f0 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20  tor & WO_IN );. 
11900 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
11910 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
11920 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  WO_ISNULL );.   
11930 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
11940 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
11950 5f 49 53 20 29 3b 0a 20 20 20 20 74 65 73 74 63  _IS );.    testc
11960 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
11970 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 20 29  rator & WO_ALL )
11980 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  ;.    if( (pTerm
11990 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 28  ->eOperator & ~(
119a0 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51 55  WO_ISNULL|WO_EQU
119b0 49 56 7c 57 4f 5f 49 53 29 29 3d 3d 30 20 29 20  IV|WO_IS))==0 ) 
119c0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
119d0 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
119e0 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20   & TERM_VNULL ) 
119f0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6e 54  continue;.    nT
11a00 65 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  erm++;.  }..  /*
11a10 20 49 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   If the ORDER BY
11a20 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73   clause contains
11a30 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20 69 6e   only columns in
11a40 20 74 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20   the current .  
11a50 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ** virtual table
11a60 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 73   then allocate s
11a70 70 61 63 65 20 66 6f 72 20 74 68 65 20 61 4f 72  pace for the aOr
11a80 64 65 72 42 79 20 70 61 72 74 20 6f 66 0a 20 20  derBy part of.  
11a90 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ** the sqlite3_i
11aa0 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
11ab0 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 72 64  ure..  */.  nOrd
11ac0 65 72 42 79 20 3d 20 30 3b 0a 20 20 69 66 28 20  erBy = 0;.  if( 
11ad0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
11ae0 69 6e 74 20 6e 20 3d 20 70 4f 72 64 65 72 42 79  int n = pOrderBy
11af0 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72  ->nExpr;.    for
11b00 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  (i=0; i<n; i++){
11b10 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78  .      Expr *pEx
11b20 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  pr = pOrderBy->a
11b30 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
11b40 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
11b50 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78  TK_COLUMN || pEx
11b60 70 72 2d 3e 69 54 61 62 6c 65 21 3d 70 53 72 63  pr->iTable!=pSrc
11b70 2d 3e 69 43 75 72 73 6f 72 20 29 20 62 72 65 61  ->iCursor ) brea
11b80 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
11b90 20 69 3d 3d 6e 29 7b 0a 20 20 20 20 20 20 6e 4f   i==n){.      nO
11ba0 72 64 65 72 42 79 20 3d 20 6e 3b 0a 20 20 20 20  rderBy = n;.    
11bb0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  }.  }..  /* Allo
11bc0 63 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 33  cate the sqlite3
11bd0 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
11be0 63 74 75 72 65 0a 20 20 2a 2f 0a 20 20 70 49 64  cture.  */.  pId
11bf0 78 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  xInfo = sqlite3D
11c00 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72  bMallocZero(pPar
11c10 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a  se->db, sizeof(*
11c20 70 49 64 78 49 6e 66 6f 29 0a 20 20 20 20 20 20  pIdxInfo).      
11c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c40 20 20 20 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a       + (sizeof(*
11c50 70 49 64 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65  pIdxCons) + size
11c60 6f 66 28 2a 70 55 73 61 67 65 29 29 2a 6e 54 65  of(*pUsage))*nTe
11c70 72 6d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  rm.             
11c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
11c90 73 69 7a 65 6f 66 28 2a 70 49 64 78 4f 72 64 65  sizeof(*pIdxOrde
11ca0 72 42 79 29 2a 6e 4f 72 64 65 72 42 79 20 29 3b  rBy)*nOrderBy );
11cb0 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d  .  if( pIdxInfo=
11cc0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
11cd0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
11ce0 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  , "out of memory
11cf0 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  ");.    return 0
11d00 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74  ;.  }..  /* Init
11d10 69 61 6c 69 7a 65 20 74 68 65 20 73 74 72 75 63  ialize the struc
11d20 74 75 72 65 2e 20 20 54 68 65 20 73 71 6c 69 74  ture.  The sqlit
11d30 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
11d40 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
11d50 0a 20 20 2a 2a 20 6d 61 6e 79 20 66 69 65 6c 64  .  ** many field
11d60 73 20 74 68 61 74 20 61 72 65 20 64 65 63 6c 61  s that are decla
11d70 72 65 64 20 22 63 6f 6e 73 74 22 20 74 6f 20 70  red "const" to p
11d80 72 65 76 65 6e 74 20 78 42 65 73 74 49 6e 64 65  revent xBestInde
11d90 78 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 68 61 6e  x from.  ** chan
11da0 67 69 6e 67 20 74 68 65 6d 2e 20 20 57 65 20 68  ging them.  We h
11db0 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66  ave to do some f
11dc0 75 6e 6b 79 20 63 61 73 74 69 6e 67 20 69 6e 20  unky casting in 
11dd0 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20 69 6e  order to.  ** in
11de0 69 74 69 61 6c 69 7a 65 20 74 68 6f 73 65 20 66  itialize those f
11df0 69 65 6c 64 73 2e 0a 20 20 2a 2f 0a 20 20 70 49  ields..  */.  pI
11e00 64 78 43 6f 6e 73 20 3d 20 28 73 74 72 75 63 74  dxCons = (struct
11e10 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
11e20 6f 6e 73 74 72 61 69 6e 74 2a 29 26 70 49 64 78  onstraint*)&pIdx
11e30 49 6e 66 6f 5b 31 5d 3b 0a 20 20 70 49 64 78 4f  Info[1];.  pIdxO
11e40 72 64 65 72 42 79 20 3d 20 28 73 74 72 75 63 74  rderBy = (struct
11e50 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f   sqlite3_index_o
11e60 72 64 65 72 62 79 2a 29 26 70 49 64 78 43 6f 6e  rderby*)&pIdxCon
11e70 73 5b 6e 54 65 72 6d 5d 3b 0a 20 20 70 55 73 61  s[nTerm];.  pUsa
11e80 67 65 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c  ge = (struct sql
11e90 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
11ea0 72 61 69 6e 74 5f 75 73 61 67 65 2a 29 26 70 49  raint_usage*)&pI
11eb0 64 78 4f 72 64 65 72 42 79 5b 6e 4f 72 64 65 72  dxOrderBy[nOrder
11ec0 42 79 5d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70  By];.  *(int*)&p
11ed0 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72  IdxInfo->nConstr
11ee0 61 69 6e 74 20 3d 20 6e 54 65 72 6d 3b 0a 20 20  aint = nTerm;.  
11ef0 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f  *(int*)&pIdxInfo
11f00 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72  ->nOrderBy = nOr
11f10 64 65 72 42 79 3b 0a 20 20 2a 28 73 74 72 75 63  derBy;.  *(struc
11f20 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
11f30 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49  constraint**)&pI
11f40 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
11f50 69 6e 74 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a  int = pIdxCons;.
11f60 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74    *(struct sqlit
11f70 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79  e3_index_orderby
11f80 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f  **)&pIdxInfo->aO
11f90 72 64 65 72 42 79 20 3d 20 70 49 64 78 4f 72 64  rderBy = pIdxOrd
11fa0 65 72 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74  erBy;.  *(struct
11fb0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
11fc0 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a  onstraint_usage*
11fd0 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f  *)&pIdxInfo->aCo
11fe0 6e 73 74 72 61 69 6e 74 55 73 61 67 65 20 3d 0a  nstraintUsage =.
11ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12030 20 20 20 70 55 73 61 67 65 3b 0a 0a 20 20 66 6f     pUsage;..  fo
12040 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70  r(i=j=0, pTerm=p
12050 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54  WC->a; i<pWC->nT
12060 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b  erm; i++, pTerm+
12070 2b 29 7b 0a 20 20 20 20 75 38 20 6f 70 3b 0a 20  +){.    u8 op;. 
12080 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65     if( pTerm->le
12090 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63  ftCursor != pSrc
120a0 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74  ->iCursor ) cont
120b0 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74  inue;.    assert
120c0 28 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 70  ( IsPowerOfTwo(p
120d0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
120e0 26 20 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a  & ~WO_EQUIV) );.
120f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
12100 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
12110 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65   WO_IN );.    te
12120 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
12130 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53  Operator & WO_IS
12140 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
12150 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
12160 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  or & WO_ISNULL )
12170 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
12180 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
12190 20 26 20 57 4f 5f 41 4c 4c 20 29 3b 0a 20 20 20   & WO_ALL );.   
121a0 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
121b0 65 72 61 74 6f 72 20 26 20 7e 28 57 4f 5f 49 53  erator & ~(WO_IS
121c0 4e 55 4c 4c 7c 57 4f 5f 45 51 55 49 56 7c 57 4f  NULL|WO_EQUIV|WO
121d0 5f 49 53 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69  _IS))==0 ) conti
121e0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65  nue;.    if( pTe
121f0 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
12200 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69  RM_VNULL ) conti
12210 6e 75 65 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e  nue;.    pIdxCon
12220 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70  s[j].iColumn = p
12230 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
12240 6d 6e 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73  mn;.    pIdxCons
12250 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 20  [j].iTermOffset 
12260 3d 20 69 3b 0a 20 20 20 20 6f 70 20 3d 20 28 75  = i;.    op = (u
12270 38 29 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  8)pTerm->eOperat
12280 6f 72 20 26 20 57 4f 5f 41 4c 4c 3b 0a 20 20 20  or & WO_ALL;.   
12290 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 49 4e 20 29   if( op==WO_IN )
122a0 20 6f 70 20 3d 20 57 4f 5f 45 51 3b 0a 20 20 20   op = WO_EQ;.   
122b0 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20   pIdxCons[j].op 
122c0 3d 20 6f 70 3b 0a 20 20 20 20 2f 2a 20 54 68 65  = op;.    /* The
122d0 20 64 69 72 65 63 74 20 61 73 73 69 67 6e 6d 65   direct assignme
122e0 6e 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f  nt in the previo
122f0 75 73 20 6c 69 6e 65 20 69 73 20 70 6f 73 73 69  us line is possi
12300 62 6c 65 20 6f 6e 6c 79 20 62 65 63 61 75 73 65  ble only because
12310 0a 20 20 20 20 2a 2a 20 74 68 65 20 57 4f 5f 20  .    ** the WO_ 
12320 61 6e 64 20 53 51 4c 49 54 45 5f 49 4e 44 45 58  and SQLITE_INDEX
12330 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 20 63 6f 64  _CONSTRAINT_ cod
12340 65 73 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c  es are identical
12350 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 66 6f  .  The.    ** fo
12360 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20  llowing asserts 
12370 76 65 72 69 66 79 20 74 68 69 73 20 66 61 63 74  verify this fact
12380 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
12390 20 57 4f 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49   WO_EQ==SQLITE_I
123a0 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
123b0 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  EQ );.    assert
123c0 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f  ( WO_LT==SQLITE_
123d0 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
123e0 5f 4c 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _LT );.    asser
123f0 74 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45  t( WO_LE==SQLITE
12400 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
12410 54 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73 73 65  T_LE );.    asse
12420 72 74 28 20 57 4f 5f 47 54 3d 3d 53 51 4c 49 54  rt( WO_GT==SQLIT
12430 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
12440 4e 54 5f 47 54 20 29 3b 0a 20 20 20 20 61 73 73  NT_GT );.    ass
12450 65 72 74 28 20 57 4f 5f 47 45 3d 3d 53 51 4c 49  ert( WO_GE==SQLI
12460 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
12470 49 4e 54 5f 47 45 20 29 3b 0a 20 20 20 20 61 73  INT_GE );.    as
12480 73 65 72 74 28 20 57 4f 5f 4d 41 54 43 48 3d 3d  sert( WO_MATCH==
12490 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
124a0 53 54 52 41 49 4e 54 5f 4d 41 54 43 48 20 29 3b  STRAINT_MATCH );
124b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
124c0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
124d0 28 57 4f 5f 49 4e 7c 57 4f 5f 45 51 7c 57 4f 5f  (WO_IN|WO_EQ|WO_
124e0 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57  LT|WO_LE|WO_GT|W
124f0 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43 48 29 20 29  O_GE|WO_MATCH) )
12500 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20  ;.    j++;.  }. 
12510 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64   for(i=0; i<nOrd
12520 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
12530 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f  Expr *pExpr = pO
12540 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
12550 70 72 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65  pr;.    pIdxOrde
12560 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d  rBy[i].iColumn =
12570 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
12580 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79  .    pIdxOrderBy
12590 5b 69 5d 2e 64 65 73 63 20 3d 20 70 4f 72 64 65  [i].desc = pOrde
125a0 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  rBy->a[i].sortOr
125b0 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  der;.  }..  retu
125c0 72 6e 20 70 49 64 78 49 6e 66 6f 3b 0a 7d 0a 0a  rn pIdxInfo;.}..
125d0 2f 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20  /*.** The table 
125e0 6f 62 6a 65 63 74 20 72 65 66 65 72 65 6e 63 65  object reference
125f0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
12600 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
12610 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  o this function.
12620 2a 2a 20 6d 75 73 74 20 72 65 70 72 65 73 65 6e  ** must represen
12630 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  t a virtual tabl
12640 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
12650 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 78 42 65   invokes the xBe
12660 73 74 49 6e 64 65 78 28 29 0a 2a 2a 20 6d 65 74  stIndex().** met
12670 68 6f 64 20 6f 66 20 74 68 65 20 76 69 72 74 75  hod of the virtu
12680 61 6c 20 74 61 62 6c 65 20 77 69 74 68 20 74 68  al table with th
12690 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
126a0 69 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74  info object that
126b0 0a 2a 2a 20 63 6f 6d 65 73 20 69 6e 20 61 73 20  .** comes in as 
126c0 74 68 65 20 33 72 64 20 61 72 67 75 6d 65 6e 74  the 3rd argument
126d0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
126e0 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  n..**.** If an e
126f0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 70 50 61  rror occurs, pPa
12700 72 73 65 20 69 73 20 70 6f 70 75 6c 61 74 65 64  rse is populated
12710 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 6d   with an error m
12720 65 73 73 61 67 65 20 61 6e 64 20 61 0a 2a 2a 20  essage and a.** 
12730 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69  non-zero value i
12740 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
12750 72 77 69 73 65 2c 20 30 20 69 73 20 72 65 74 75  rwise, 0 is retu
12760 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6f 75 74  rned and the out
12770 70 75 74 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74  put.** part of t
12780 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
12790 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  _info structure 
127a0 69 73 20 6c 65 66 74 20 70 6f 70 75 6c 61 74 65  is left populate
127b0 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72  d..**.** Whether
127c0 20 6f 72 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72   or not an error
127d0 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74   is returned, it
127e0 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
127f0 62 69 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a  bility of the.**
12800 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74   caller to event
12810 75 61 6c 6c 79 20 66 72 65 65 20 70 2d 3e 69 64  ually free p->id
12820 78 53 74 72 20 69 66 20 70 2d 3e 6e 65 65 64 54  xStr if p->needT
12830 6f 46 72 65 65 49 64 78 53 74 72 20 69 6e 64 69  oFreeIdxStr indi
12840 63 61 74 65 73 0a 2a 2a 20 74 68 61 74 20 74 68  cates.** that th
12850 69 73 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  is is required..
12860 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 74  */.static int vt
12870 61 62 42 65 73 74 49 6e 64 65 78 28 50 61 72 73  abBestIndex(Pars
12880 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
12890 20 2a 70 54 61 62 2c 20 73 71 6c 69 74 65 33 5f   *pTab, sqlite3_
128a0 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a  index_info *p){.
128b0 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
128c0 70 56 74 61 62 20 3d 20 73 71 6c 69 74 65 33 47  pVtab = sqlite3G
128d0 65 74 56 54 61 62 6c 65 28 70 50 61 72 73 65 2d  etVTable(pParse-
128e0 3e 64 62 2c 20 70 54 61 62 29 2d 3e 70 56 74 61  >db, pTab)->pVta
128f0 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  b;.  int i;.  in
12900 74 20 72 63 3b 0a 0a 20 20 54 52 41 43 45 5f 49  t rc;..  TRACE_I
12910 44 58 5f 49 4e 50 55 54 53 28 70 29 3b 0a 20 20  DX_INPUTS(p);.  
12920 72 63 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64  rc = pVtab->pMod
12930 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64 65 78 28  ule->xBestIndex(
12940 70 56 74 61 62 2c 20 70 29 3b 0a 20 20 54 52 41  pVtab, p);.  TRA
12950 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 70  CE_IDX_OUTPUTS(p
12960 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  );..  if( rc!=SQ
12970 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
12980 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
12990 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 70 50 61  MEM ){.      pPa
129a0 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
129b0 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  ailed = 1;.    }
129c0 65 6c 73 65 20 69 66 28 20 21 70 56 74 61 62 2d  else if( !pVtab-
129d0 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20  >zErrMsg ){.    
129e0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
129f0 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20  g(pParse, "%s", 
12a00 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63  sqlite3ErrStr(rc
12a10 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
12a20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
12a30 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
12a40 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  ", pVtab->zErrMs
12a50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  g);.    }.  }.  
12a60 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74  sqlite3_free(pVt
12a70 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ab->zErrMsg);.  
12a80 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d  pVtab->zErrMsg =
12a90 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20   0;..  for(i=0; 
12aa0 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  i<p->nConstraint
12ab0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
12ac0 21 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b  !p->aConstraint[
12ad0 69 5d 2e 75 73 61 62 6c 65 20 26 26 20 70 2d 3e  i].usable && p->
12ae0 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
12af0 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30 20  [i].argvIndex>0 
12b00 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
12b10 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
12b20 20 0a 20 20 20 20 20 20 20 20 20 20 22 74 61 62   .          "tab
12b30 6c 65 20 25 73 3a 20 78 42 65 73 74 49 6e 64 65  le %s: xBestInde
12b40 78 20 72 65 74 75 72 6e 65 64 20 61 6e 20 69 6e  x returned an in
12b50 76 61 6c 69 64 20 70 6c 61 6e 22 2c 20 70 54 61  valid plan", pTa
12b60 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  b->zName);.    }
12b70 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
12b80 50 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 23  Parse->nErr;.}.#
12b90 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
12ba0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
12bb0 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a  RTUALTABLE) */..
12bc0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
12bd0 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
12be0 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61  AT4./*.** Estima
12bf0 74 65 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20  te the location 
12c00 6f 66 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  of a particular 
12c10 6b 65 79 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65  key among all ke
12c20 79 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65  ys in an.** inde
12c30 78 2e 20 20 53 74 6f 72 65 20 74 68 65 20 72 65  x.  Store the re
12c40 73 75 6c 74 73 20 69 6e 20 61 53 74 61 74 20 61  sults in aStat a
12c50 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
12c60 20 20 20 20 61 53 74 61 74 5b 30 5d 20 20 20 20      aStat[0]    
12c70 20 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66    Est. number of
12c80 20 72 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20   rows less than 
12c90 70 52 65 63 0a 2a 2a 20 20 20 20 61 53 74 61 74  pRec.**    aStat
12ca0 5b 31 5d 20 20 20 20 20 20 45 73 74 2e 20 6e 75  [1]      Est. nu
12cb0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 65 71 75  mber of rows equ
12cc0 61 6c 20 74 6f 20 70 52 65 63 0a 2a 2a 0a 2a 2a  al to pRec.**.**
12cd0 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
12ce0 78 20 6f 66 20 74 68 65 20 73 61 6d 70 6c 65 20  x of the sample 
12cf0 74 68 61 74 20 69 73 20 74 68 65 20 73 6d 61 6c  that is the smal
12d00 6c 65 73 74 20 73 61 6d 70 6c 65 20 74 68 61 74  lest sample that
12d10 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74  .** is greater t
12d20 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
12d30 70 52 65 63 2e 20 4e 6f 74 65 20 74 68 61 74 20  pRec. Note that 
12d40 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 6e 6f  this index is no
12d50 74 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 69 6e  t an index.** in
12d60 74 6f 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d  to the aSample[]
12d70 20 61 72 72 61 79 20 2d 20 69 74 20 69 73 20 61   array - it is a
12d80 6e 20 69 6e 64 65 78 20 69 6e 74 6f 20 61 20 76  n index into a v
12d90 69 72 74 75 61 6c 20 73 65 74 20 6f 66 20 73 61  irtual set of sa
12da0 6d 70 6c 65 73 0a 2a 2a 20 62 61 73 65 64 20 6f  mples.** based o
12db0 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  n the contents o
12dc0 66 20 61 53 61 6d 70 6c 65 5b 5d 20 61 6e 64 20  f aSample[] and 
12dd0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69  the number of fi
12de0 65 6c 64 73 20 69 6e 20 72 65 63 6f 72 64 20 0a  elds in record .
12df0 2a 2a 20 70 52 65 63 2e 20 0a 2a 2f 0a 73 74 61  ** pRec. .*/.sta
12e00 74 69 63 20 69 6e 74 20 77 68 65 72 65 4b 65 79  tic int whereKey
12e10 53 74 61 74 73 28 0a 20 20 50 61 72 73 65 20 2a  Stats(.  Parse *
12e20 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
12e30 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
12e40 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
12e50 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20   Index *pIdx,   
12e60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12e70 49 6e 64 65 78 20 74 6f 20 63 6f 6e 73 69 64 65  Index to conside
12e80 72 20 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a 20  r domain of */. 
12e90 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
12ea0 2a 70 52 65 63 2c 20 20 20 20 20 20 20 2f 2a 20  *pRec,       /* 
12eb0 56 65 63 74 6f 72 20 6f 66 20 76 61 6c 75 65 73  Vector of values
12ec0 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 2a 2f 0a   to consider */.
12ed0 20 20 69 6e 74 20 72 6f 75 6e 64 55 70 2c 20 20    int roundUp,  
12ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12ef0 20 52 6f 75 6e 64 20 75 70 20 69 66 20 74 72 75   Round up if tru
12f00 65 2e 20 20 52 6f 75 6e 64 20 64 6f 77 6e 20 69  e.  Round down i
12f10 66 20 66 61 6c 73 65 20 2a 2f 0a 20 20 74 52 6f  f false */.  tRo
12f20 77 63 6e 74 20 2a 61 53 74 61 74 20 20 20 20 20  wcnt *aStat     
12f30 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
12f40 20 73 74 61 74 73 20 77 72 69 74 74 65 6e 20 68   stats written h
12f50 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65  ere */.){.  Inde
12f60 78 53 61 6d 70 6c 65 20 2a 61 53 61 6d 70 6c 65  xSample *aSample
12f70 20 3d 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65   = pIdx->aSample
12f80 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20  ;.  int iCol;   
12f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fa0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 65 71 75  /* Index of requ
12fb0 69 72 65 64 20 73 74 61 74 73 20 69 6e 20 61 6e  ired stats in an
12fc0 45 71 5b 5d 20 65 74 63 2e 20 2a 2f 0a 20 20 69  Eq[] etc. */.  i
12fd0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
12fe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
12ff0 64 65 78 20 6f 66 20 66 69 72 73 74 20 73 61 6d  dex of first sam
13000 70 6c 65 20 3e 3d 20 70 52 65 63 20 2a 2f 0a 20  ple >= pRec */. 
13010 20 69 6e 74 20 69 53 61 6d 70 6c 65 3b 20 20 20   int iSample;   
13020 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13030 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20  Smallest sample 
13040 6c 61 72 67 65 72 20 74 68 61 6e 20 6f 72 20 65  larger than or e
13050 71 75 61 6c 20 74 6f 20 70 52 65 63 20 2a 2f 0a  qual to pRec */.
13060 20 20 69 6e 74 20 69 4d 69 6e 20 3d 20 30 3b 20    int iMin = 0; 
13070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13080 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65   Smallest sample
13090 20 6e 6f 74 20 79 65 74 20 74 65 73 74 65 64 20   not yet tested 
130a0 2a 2f 0a 20 20 69 6e 74 20 69 54 65 73 74 3b 20  */.  int iTest; 
130b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130c0 20 2f 2a 20 4e 65 78 74 20 73 61 6d 70 6c 65 20   /* Next sample 
130d0 74 6f 20 74 65 73 74 20 2a 2f 0a 20 20 69 6e 74  to test */.  int
130e0 20 72 65 73 3b 20 20 20 20 20 20 20 20 20 20 20   res;           
130f0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
13100 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  lt of comparison
13110 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   operation */.  
13120 69 6e 74 20 6e 46 69 65 6c 64 3b 20 20 20 20 20  int nField;     
13130 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
13140 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20  umber of fields 
13150 69 6e 20 70 52 65 63 20 2a 2f 0a 20 20 74 52 6f  in pRec */.  tRo
13160 77 63 6e 74 20 69 4c 6f 77 65 72 20 3d 20 30 3b  wcnt iLower = 0;
13170 20 20 20 20 20 20 20 20 20 2f 2a 20 61 6e 4c 74           /* anLt
13180 5b 5d 20 2b 20 61 6e 45 71 5b 5d 20 6f 66 20 6c  [] + anEq[] of l
13190 61 72 67 65 73 74 20 73 61 6d 70 6c 65 20 70 52  argest sample pR
131a0 65 63 20 69 73 20 3e 20 2a 2f 0a 0a 23 69 66 6e  ec is > */..#ifn
131b0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
131c0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
131d0 54 45 52 28 20 70 50 61 72 73 65 20 29 3b 0a 23  TER( pParse );.#
131e0 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
131f0 70 52 65 63 21 3d 30 20 29 3b 0a 20 20 61 73 73  pRec!=0 );.  ass
13200 65 72 74 28 20 70 49 64 78 2d 3e 6e 53 61 6d 70  ert( pIdx->nSamp
13210 6c 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  le>0 );.  assert
13220 28 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3e 30  ( pRec->nField>0
13230 20 26 26 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64   && pRec->nField
13240 3c 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 43  <=pIdx->nSampleC
13250 6f 6c 20 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20 61  ol );..  /* Do a
13260 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 20 74   binary search t
13270 6f 20 66 69 6e 64 20 74 68 65 20 66 69 72 73 74  o find the first
13280 20 73 61 6d 70 6c 65 20 67 72 65 61 74 65 72 20   sample greater 
13290 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 20 20  than or equal.  
132a0 2a 2a 20 74 6f 20 70 52 65 63 2e 20 49 66 20 70  ** to pRec. If p
132b0 52 65 63 20 63 6f 6e 74 61 69 6e 73 20 61 20 73  Rec contains a s
132c0 69 6e 67 6c 65 20 66 69 65 6c 64 2c 20 74 68 65  ingle field, the
132d0 20 73 65 74 20 6f 66 20 73 61 6d 70 6c 65 73 20   set of samples 
132e0 74 6f 20 73 65 61 72 63 68 0a 20 20 2a 2a 20 69  to search.  ** i
132f0 73 20 73 69 6d 70 6c 79 20 74 68 65 20 61 53 61  s simply the aSa
13300 6d 70 6c 65 5b 5d 20 61 72 72 61 79 2e 20 49 66  mple[] array. If
13310 20 74 68 65 20 73 61 6d 70 6c 65 73 20 69 6e 20   the samples in 
13320 61 53 61 6d 70 6c 65 5b 5d 20 63 6f 6e 74 61 69  aSample[] contai
13330 6e 20 6d 6f 72 65 0a 20 20 2a 2a 20 74 68 61 6e  n more.  ** than
13340 20 6f 6e 65 20 66 69 65 6c 64 73 2c 20 61 6c 6c   one fields, all
13350 20 66 69 65 6c 64 73 20 66 6f 6c 6c 6f 77 69 6e   fields followin
13360 67 20 74 68 65 20 66 69 72 73 74 20 61 72 65 20  g the first are 
13370 69 67 6e 6f 72 65 64 2e 0a 20 20 2a 2a 0a 20 20  ignored..  **.  
13380 2a 2a 20 49 66 20 70 52 65 63 20 63 6f 6e 74 61  ** If pRec conta
13390 69 6e 73 20 4e 20 66 69 65 6c 64 73 2c 20 77 68  ins N fields, wh
133a0 65 72 65 20 4e 20 69 73 20 6d 6f 72 65 20 74 68  ere N is more th
133b0 61 6e 20 6f 6e 65 2c 20 74 68 65 6e 20 61 73 20  an one, then as 
133c0 77 65 6c 6c 20 61 73 20 74 68 65 0a 20 20 2a 2a  well as the.  **
133d0 20 73 61 6d 70 6c 65 73 20 69 6e 20 61 53 61 6d   samples in aSam
133e0 70 6c 65 5b 5d 20 28 74 72 75 6e 63 61 74 65 64  ple[] (truncated
133f0 20 74 6f 20 4e 20 66 69 65 6c 64 73 29 2c 20 74   to N fields), t
13400 68 65 20 73 65 61 72 63 68 20 61 6c 73 6f 20 68  he search also h
13410 61 73 20 74 6f 0a 20 20 2a 2a 20 63 6f 6e 73 69  as to.  ** consi
13420 64 65 72 20 70 72 65 66 69 78 65 73 20 6f 66 20  der prefixes of 
13430 74 68 6f 73 65 20 73 61 6d 70 6c 65 73 2e 20 46  those samples. F
13440 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  or example, if t
13450 68 65 20 73 65 74 20 6f 66 20 73 61 6d 70 6c 65  he set of sample
13460 73 0a 20 20 2a 2a 20 69 6e 20 61 53 61 6d 70 6c  s.  ** in aSampl
13470 65 20 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  e is:.  **.  ** 
13480 20 20 20 20 61 53 61 6d 70 6c 65 5b 30 5d 20 3d      aSample[0] =
13490 20 28 61 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20   (a, 5) .  **   
134a0 20 20 61 53 61 6d 70 6c 65 5b 31 5d 20 3d 20 28    aSample[1] = (
134b0 61 2c 20 31 30 29 20 0a 20 20 2a 2a 20 20 20 20  a, 10) .  **    
134c0 20 61 53 61 6d 70 6c 65 5b 32 5d 20 3d 20 28 62   aSample[2] = (b
134d0 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20 20 20 61  , 5) .  **     a
134e0 53 61 6d 70 6c 65 5b 33 5d 20 3d 20 28 63 2c 20  Sample[3] = (c, 
134f0 31 30 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 61  100) .  **     a
13500 53 61 6d 70 6c 65 5b 34 5d 20 3d 20 28 63 2c 20  Sample[4] = (c, 
13510 31 30 35 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  105).  **.  ** T
13520 68 65 6e 20 74 68 65 20 73 65 61 72 63 68 20 73  hen the search s
13530 70 61 63 65 20 73 68 6f 75 6c 64 20 69 64 65 61  pace should idea
13540 6c 6c 79 20 62 65 20 74 68 65 20 73 61 6d 70 6c  lly be the sampl
13550 65 73 20 61 62 6f 76 65 20 61 6e 64 20 74 68 65  es above and the
13560 20 0a 20 20 2a 2a 20 75 6e 69 71 75 65 20 70 72   .  ** unique pr
13570 65 66 69 78 65 73 20 5b 61 5d 2c 20 5b 62 5d 20  efixes [a], [b] 
13580 61 6e 64 20 5b 63 5d 2e 20 42 75 74 20 73 69 6e  and [c]. But sin
13590 63 65 20 74 68 61 74 20 69 73 20 68 61 72 64 20  ce that is hard 
135a0 74 6f 20 6f 72 67 61 6e 69 7a 65 2c 20 0a 20 20  to organize, .  
135b0 2a 2a 20 74 68 65 20 63 6f 64 65 20 61 63 74 75  ** the code actu
135c0 61 6c 6c 79 20 73 65 61 72 63 68 65 73 20 74 68  ally searches th
135d0 69 73 20 73 65 74 3a 0a 20 20 2a 2a 0a 20 20 2a  is set:.  **.  *
135e0 2a 20 20 20 20 20 30 3a 20 28 61 29 20 0a 20 20  *     0: (a) .  
135f0 2a 2a 20 20 20 20 20 31 3a 20 28 61 2c 20 35 29  **     1: (a, 5)
13600 20 0a 20 20 2a 2a 20 20 20 20 20 32 3a 20 28 61   .  **     2: (a
13610 2c 20 31 30 29 20 0a 20 20 2a 2a 20 20 20 20 20  , 10) .  **     
13620 33 3a 20 28 61 2c 20 31 30 29 20 0a 20 20 2a 2a  3: (a, 10) .  **
13630 20 20 20 20 20 34 3a 20 28 62 29 20 0a 20 20 2a       4: (b) .  *
13640 2a 20 20 20 20 20 35 3a 20 28 62 2c 20 35 29 20  *     5: (b, 5) 
13650 0a 20 20 2a 2a 20 20 20 20 20 36 3a 20 28 63 29  .  **     6: (c)
13660 20 0a 20 20 2a 2a 20 20 20 20 20 37 3a 20 28 63   .  **     7: (c
13670 2c 20 31 30 30 29 20 0a 20 20 2a 2a 20 20 20 20  , 100) .  **    
13680 20 38 3a 20 28 63 2c 20 31 30 35 29 0a 20 20 2a   8: (c, 105).  *
13690 2a 20 20 20 20 20 39 3a 20 28 63 2c 20 31 30 35  *     9: (c, 105
136a0 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20  ).  **.  ** For 
136b0 65 61 63 68 20 73 61 6d 70 6c 65 20 69 6e 20 74  each sample in t
136c0 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72  he aSample[] arr
136d0 61 79 2c 20 4e 20 73 61 6d 70 6c 65 73 20 61 72  ay, N samples ar
136e0 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65  e present in the
136f0 0a 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65 20  .  ** effective 
13700 73 61 6d 70 6c 65 20 61 72 72 61 79 2e 20 49 6e  sample array. In
13710 20 74 68 65 20 61 62 6f 76 65 2c 20 73 61 6d 70   the above, samp
13720 6c 65 73 20 30 20 61 6e 64 20 31 20 61 72 65 20  les 0 and 1 are 
13730 62 61 73 65 64 20 6f 6e 20 0a 20 20 2a 2a 20 73  based on .  ** s
13740 61 6d 70 6c 65 20 61 53 61 6d 70 6c 65 5b 30 5d  ample aSample[0]
13750 2e 20 53 61 6d 70 6c 65 73 20 32 20 61 6e 64 20  . Samples 2 and 
13760 33 20 6f 6e 20 61 53 61 6d 70 6c 65 5b 31 5d 20  3 on aSample[1] 
13770 65 74 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f  etc..  **.  ** O
13780 66 74 65 6e 2c 20 73 61 6d 70 6c 65 20 69 20 6f  ften, sample i o
13790 66 20 65 61 63 68 20 62 6c 6f 63 6b 20 6f 66 20  f each block of 
137a0 4e 20 65 66 66 65 63 74 69 76 65 20 73 61 6d 70  N effective samp
137b0 6c 65 73 20 68 61 73 20 28 69 2b 31 29 20 66 69  les has (i+1) fi
137c0 65 6c 64 73 2e 0a 20 20 2a 2a 20 45 78 63 65 70  elds..  ** Excep
137d0 74 2c 20 65 61 63 68 20 73 61 6d 70 6c 65 20 6d  t, each sample m
137e0 61 79 20 62 65 20 65 78 74 65 6e 64 65 64 20 74  ay be extended t
137f0 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 69 74  o ensure that it
13800 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
13810 20 6f 72 0a 20 20 2a 2a 20 65 71 75 61 6c 20 74   or.  ** equal t
13820 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73  o the previous s
13830 61 6d 70 6c 65 20 69 6e 20 74 68 65 20 61 72 72  ample in the arr
13840 61 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  ay. For example,
13850 20 69 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 0a   in the above, .
13860 20 20 2a 2a 20 73 61 6d 70 6c 65 20 32 20 69 73    ** sample 2 is
13870 20 74 68 65 20 66 69 72 73 74 20 73 61 6d 70 6c   the first sampl
13880 65 20 6f 66 20 61 20 62 6c 6f 63 6b 20 6f 66 20  e of a block of 
13890 4e 20 73 61 6d 70 6c 65 73 2c 20 73 6f 20 61 74  N samples, so at
138a0 20 66 69 72 73 74 20 69 74 20 0a 20 20 2a 2a 20   first it .  ** 
138b0 61 70 70 65 61 72 73 20 74 68 61 74 20 69 74 20  appears that it 
138c0 73 68 6f 75 6c 64 20 62 65 20 31 20 66 69 65 6c  should be 1 fiel
138d0 64 20 69 6e 20 73 69 7a 65 2e 20 48 6f 77 65 76  d in size. Howev
138e0 65 72 2c 20 74 68 61 74 20 77 6f 75 6c 64 20 6d  er, that would m
138f0 61 6b 65 20 69 74 20 0a 20 20 2a 2a 20 73 6d 61  ake it .  ** sma
13900 6c 6c 65 72 20 74 68 61 6e 20 73 61 6d 70 6c 65  ller than sample
13910 20 31 2c 20 73 6f 20 74 68 65 20 62 69 6e 61 72   1, so the binar
13920 79 20 73 65 61 72 63 68 20 77 6f 75 6c 64 20 6e  y search would n
13930 6f 74 20 77 6f 72 6b 2e 20 41 73 20 61 20 72 65  ot work. As a re
13940 73 75 6c 74 2c 20 0a 20 20 2a 2a 20 69 74 20 69  sult, .  ** it i
13950 73 20 65 78 74 65 6e 64 65 64 20 74 6f 20 74 77  s extended to tw
13960 6f 20 66 69 65 6c 64 73 2e 20 54 68 65 20 64 75  o fields. The du
13970 70 6c 69 63 61 74 65 73 20 74 68 61 74 20 74 68  plicates that th
13980 69 73 20 63 72 65 61 74 65 73 20 64 6f 20 6e 6f  is creates do no
13990 74 20 0a 20 20 2a 2a 20 63 61 75 73 65 20 61 6e  t .  ** cause an
139a0 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f  y problems..  */
139b0 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70 52 65 63  .  nField = pRec
139c0 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 69 43 6f 6c  ->nField;.  iCol
139d0 20 3d 20 30 3b 0a 20 20 69 53 61 6d 70 6c 65 20   = 0;.  iSample 
139e0 3d 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20  = pIdx->nSample 
139f0 2a 20 6e 46 69 65 6c 64 3b 0a 20 20 64 6f 7b 0a  * nField;.  do{.
13a00 20 20 20 20 69 6e 74 20 69 53 61 6d 70 3b 20 20      int iSamp;  
13a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 53    /* Index in aS
13a30 61 6d 70 6c 65 5b 5d 20 6f 66 20 74 65 73 74 20  ample[] of test 
13a40 73 61 6d 70 6c 65 20 2a 2f 0a 20 20 20 20 69 6e  sample */.    in
13a50 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
13a60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
13a70 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20  umber of fields 
13a80 69 6e 20 74 65 73 74 20 73 61 6d 70 6c 65 20 2a  in test sample *
13a90 2f 0a 0a 20 20 20 20 69 54 65 73 74 20 3d 20 28  /..    iTest = (
13aa0 69 4d 69 6e 2b 69 53 61 6d 70 6c 65 29 2f 32 3b  iMin+iSample)/2;
13ab0 0a 20 20 20 20 69 53 61 6d 70 20 3d 20 69 54 65  .    iSamp = iTe
13ac0 73 74 20 2f 20 6e 46 69 65 6c 64 3b 0a 20 20 20  st / nField;.   
13ad0 20 69 66 28 20 69 53 61 6d 70 3e 30 20 29 7b 0a   if( iSamp>0 ){.
13ae0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 6f        /* The pro
13af0 70 6f 73 65 64 20 65 66 66 65 63 74 69 76 65 20  posed effective 
13b00 73 61 6d 70 6c 65 20 69 73 20 61 20 70 72 65 66  sample is a pref
13b10 69 78 20 6f 66 20 73 61 6d 70 6c 65 20 61 53 61  ix of sample aSa
13b20 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 0a 20 20 20  mple[iSamp]..   
13b30 20 20 20 2a 2a 20 53 70 65 63 69 66 69 63 61 6c     ** Specifical
13b40 6c 79 2c 20 74 68 65 20 73 68 6f 72 74 65 73 74  ly, the shortest
13b50 20 70 72 65 66 69 78 20 6f 66 20 61 74 20 6c 65   prefix of at le
13b60 61 73 74 20 28 31 20 2b 20 69 54 65 73 74 25 6e  ast (1 + iTest%n
13b70 46 69 65 6c 64 29 20 0a 20 20 20 20 20 20 2a 2a  Field) .      **
13b80 20 66 69 65 6c 64 73 20 74 68 61 74 20 69 73 20   fields that is 
13b90 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
13ba0 20 70 72 65 76 69 6f 75 73 20 65 66 66 65 63 74   previous effect
13bb0 69 76 65 20 73 61 6d 70 6c 65 2e 20 20 2a 2f 0a  ive sample.  */.
13bc0 20 20 20 20 20 20 66 6f 72 28 6e 3d 28 69 54 65        for(n=(iTe
13bd0 73 74 20 25 20 6e 46 69 65 6c 64 29 20 2b 20 31  st % nField) + 1
13be0 3b 20 6e 3c 6e 46 69 65 6c 64 3b 20 6e 2b 2b 29  ; n<nField; n++)
13bf0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 53  {.        if( aS
13c00 61 6d 70 6c 65 5b 69 53 61 6d 70 2d 31 5d 2e 61  ample[iSamp-1].a
13c10 6e 4c 74 5b 6e 2d 31 5d 21 3d 61 53 61 6d 70 6c  nLt[n-1]!=aSampl
13c20 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d  e[iSamp].anLt[n-
13c30 31 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  1] ) break;.    
13c40 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
13c50 20 20 20 20 20 6e 20 3d 20 69 54 65 73 74 20 2b       n = iTest +
13c60 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70   1;.    }..    p
13c70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 3b  Rec->nField = n;
13c80 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74  .    res = sqlit
13c90 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
13ca0 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 53 61 6d  are(aSample[iSam
13cb0 70 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 53  p].n, aSample[iS
13cc0 61 6d 70 5d 2e 70 2c 20 70 52 65 63 29 3b 0a 20  amp].p, pRec);. 
13cd0 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a     if( res<0 ){.
13ce0 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61        iLower = a
13cf0 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e  Sample[iSamp].an
13d00 4c 74 5b 6e 2d 31 5d 20 2b 20 61 53 61 6d 70 6c  Lt[n-1] + aSampl
13d10 65 5b 69 53 61 6d 70 5d 2e 61 6e 45 71 5b 6e 2d  e[iSamp].anEq[n-
13d20 31 5d 3b 0a 20 20 20 20 20 20 69 4d 69 6e 20 3d  1];.      iMin =
13d30 20 69 54 65 73 74 2b 31 3b 0a 20 20 20 20 7d 65   iTest+1;.    }e
13d40 6c 73 65 20 69 66 28 20 72 65 73 3d 3d 30 20 26  lse if( res==0 &
13d50 26 20 6e 3c 6e 46 69 65 6c 64 20 29 7b 0a 20 20  & n<nField ){.  
13d60 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 53 61      iLower = aSa
13d70 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74  mple[iSamp].anLt
13d80 5b 6e 2d 31 5d 3b 0a 20 20 20 20 20 20 69 4d 69  [n-1];.      iMi
13d90 6e 20 3d 20 69 54 65 73 74 2b 31 3b 0a 20 20 20  n = iTest+1;.   
13da0 20 20 20 72 65 73 20 3d 20 2d 31 3b 0a 20 20 20     res = -1;.   
13db0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 53   }else{.      iS
13dc0 61 6d 70 6c 65 20 3d 20 69 54 65 73 74 3b 0a 20  ample = iTest;. 
13dd0 20 20 20 20 20 69 43 6f 6c 20 3d 20 6e 2d 31 3b       iCol = n-1;
13de0 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
13df0 20 72 65 73 20 26 26 20 69 4d 69 6e 3c 69 53 61   res && iMin<iSa
13e00 6d 70 6c 65 20 29 3b 0a 20 20 69 20 3d 20 69 53  mple );.  i = iS
13e10 61 6d 70 6c 65 20 2f 20 6e 46 69 65 6c 64 3b 0a  ample / nField;.
13e20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
13e30 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 66 6f  EBUG.  /* The fo
13e40 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73  llowing assert s
13e50 74 61 74 65 6d 65 6e 74 73 20 63 68 65 63 6b 20  tatements check 
13e60 74 68 61 74 20 74 68 65 20 62 69 6e 61 72 79 20  that the binary 
13e70 73 65 61 72 63 68 20 63 6f 64 65 0a 20 20 2a 2a  search code.  **
13e80 20 61 62 6f 76 65 20 66 6f 75 6e 64 20 74 68 65   above found the
13e90 20 72 69 67 68 74 20 61 6e 73 77 65 72 2e 20 54   right answer. T
13ea0 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73  his block serves
13eb0 20 6e 6f 20 70 75 72 70 6f 73 65 20 6f 74 68 65   no purpose othe
13ec0 72 0a 20 20 2a 2a 20 74 68 61 6e 20 74 6f 20 69  r.  ** than to i
13ed0 6e 76 6f 6b 65 20 74 68 65 20 61 73 73 65 72 74  nvoke the assert
13ee0 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  s.  */.  if( pPa
13ef0 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
13f00 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ailed==0 ){.    
13f10 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20  if( res==0 ){.  
13f20 20 20 20 20 2f 2a 20 49 66 20 28 72 65 73 3d 3d      /* If (res==
13f30 30 29 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  0) is true, then
13f40 20 70 52 65 63 20 6d 75 73 74 20 62 65 20 65 71   pRec must be eq
13f50 75 61 6c 20 74 6f 20 73 61 6d 70 6c 65 20 69 2e  ual to sample i.
13f60 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
13f70 28 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c  ( i<pIdx->nSampl
13f80 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
13f90 74 28 20 69 43 6f 6c 3d 3d 6e 46 69 65 6c 64 2d  t( iCol==nField-
13fa0 31 20 29 3b 0a 20 20 20 20 20 20 70 52 65 63 2d  1 );.      pRec-
13fb0 3e 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64  >nField = nField
13fc0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
13fd0 30 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 52 65  0==sqlite3VdbeRe
13fe0 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d  cordCompare(aSam
13ff0 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c  ple[i].n, aSampl
14000 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29 20 0a 20  e[i].p, pRec) . 
14010 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
14020 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
14030 61 69 6c 65 64 20 0a 20 20 20 20 20 20 29 3b 0a  ailed .      );.
14040 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14050 20 2f 2a 20 55 6e 6c 65 73 73 20 69 3d 3d 70 49   /* Unless i==pI
14060 64 78 2d 3e 6e 53 61 6d 70 6c 65 2c 20 69 6e 64  dx->nSample, ind
14070 69 63 61 74 69 6e 67 20 74 68 61 74 20 70 52 65  icating that pRe
14080 63 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  c is larger than
14090 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 73 61  .      ** all sa
140a0 6d 70 6c 65 73 20 69 6e 20 74 68 65 20 61 53 61  mples in the aSa
140b0 6d 70 6c 65 5b 5d 20 61 72 72 61 79 2c 20 70 52  mple[] array, pR
140c0 65 63 20 6d 75 73 74 20 62 65 20 73 6d 61 6c 6c  ec must be small
140d0 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20 20 20  er than the.    
140e0 20 20 2a 2a 20 28 69 43 6f 6c 2b 31 29 20 66 69    ** (iCol+1) fi
140f0 65 6c 64 20 70 72 65 66 69 78 20 6f 66 20 73 61  eld prefix of sa
14100 6d 70 6c 65 20 69 2e 20 20 2a 2f 0a 20 20 20 20  mple i.  */.    
14110 20 20 61 73 73 65 72 74 28 20 69 3c 3d 70 49 64    assert( i<=pId
14120 78 2d 3e 6e 53 61 6d 70 6c 65 20 26 26 20 69 3e  x->nSample && i>
14130 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 52 65 63  =0 );.      pRec
14140 2d 3e 6e 46 69 65 6c 64 20 3d 20 69 43 6f 6c 2b  ->nField = iCol+
14150 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  1;.      assert(
14160 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c   i==pIdx->nSampl
14170 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  e .           ||
14180 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
14190 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c  rdCompare(aSampl
141a0 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b  e[i].n, aSample[
141b0 69 5d 2e 70 2c 20 70 52 65 63 29 3e 30 0a 20 20  i].p, pRec)>0.  
141c0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72           || pPar
141d0 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
141e0 69 6c 65 64 20 29 3b 0a 0a 20 20 20 20 20 20 2f  iled );..      /
141f0 2a 20 69 66 20 69 3d 3d 30 20 61 6e 64 20 69 43  * if i==0 and iC
14200 6f 6c 3d 3d 30 2c 20 74 68 65 6e 20 72 65 63 6f  ol==0, then reco
14210 72 64 20 70 52 65 63 20 69 73 20 73 6d 61 6c 6c  rd pRec is small
14220 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 6d 70  er than all samp
14230 6c 65 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20  les.      ** in 
14240 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72  the aSample[] ar
14250 72 61 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ray. Otherwise, 
14260 69 66 20 28 69 43 6f 6c 3e 30 29 20 74 68 65 6e  if (iCol>0) then
14270 20 70 52 65 63 20 6d 75 73 74 0a 20 20 20 20 20   pRec must.     
14280 20 2a 2a 20 62 65 20 67 72 65 61 74 65 72 20 74   ** be greater t
14290 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
142a0 74 68 65 20 28 69 43 6f 6c 29 20 66 69 65 6c 64  the (iCol) field
142b0 20 70 72 65 66 69 78 20 6f 66 20 73 61 6d 70 6c   prefix of sampl
142c0 65 20 69 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66  e i..      ** If
142d0 20 28 69 3e 30 29 2c 20 74 68 65 6e 20 70 52 65   (i>0), then pRe
142e0 63 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 67  c must also be g
142f0 72 65 61 74 65 72 20 74 68 61 6e 20 73 61 6d 70  reater than samp
14300 6c 65 20 28 69 2d 31 29 2e 20 20 2a 2f 0a 20 20  le (i-1).  */.  
14310 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 30 20 29      if( iCol>0 )
14320 7b 0a 20 20 20 20 20 20 20 20 70 52 65 63 2d 3e  {.        pRec->
14330 6e 46 69 65 6c 64 20 3d 20 69 43 6f 6c 3b 0a 20  nField = iCol;. 
14340 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
14350 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
14360 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b  Compare(aSample[
14370 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d  i].n, aSample[i]
14380 2e 70 2c 20 70 52 65 63 29 3c 3d 30 0a 20 20 20  .p, pRec)<=0.   
14390 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
143a0 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
143b0 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 7d  ailed );.      }
143c0 0a 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29  .      if( i>0 )
143d0 7b 0a 20 20 20 20 20 20 20 20 70 52 65 63 2d 3e  {.        pRec->
143e0 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64 3b  nField = nField;
143f0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
14400 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
14410 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c  rdCompare(aSampl
14420 65 5b 69 2d 31 5d 2e 6e 2c 20 61 53 61 6d 70 6c  e[i-1].n, aSampl
14430 65 5b 69 2d 31 5d 2e 70 2c 20 70 52 65 63 29 3c  e[i-1].p, pRec)<
14440 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  0.             |
14450 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
14460 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
14470 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
14480 23 65 6e 64 69 66 20 2f 2a 20 69 66 64 65 66 20  #endif /* ifdef 
14490 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a  SQLITE_DEBUG */.
144a0 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b  .  if( res==0 ){
144b0 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 70  .    /* Record p
144c0 52 65 63 20 69 73 20 65 71 75 61 6c 20 74 6f 20  Rec is equal to 
144d0 73 61 6d 70 6c 65 20 69 20 2a 2f 0a 20 20 20 20  sample i */.    
144e0 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 6e 46  assert( iCol==nF
144f0 69 65 6c 64 2d 31 20 29 3b 0a 20 20 20 20 61 53  ield-1 );.    aS
14500 74 61 74 5b 30 5d 20 3d 20 61 53 61 6d 70 6c 65  tat[0] = aSample
14510 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a  [i].anLt[iCol];.
14520 20 20 20 20 61 53 74 61 74 5b 31 5d 20 3d 20 61      aStat[1] = a
14530 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 45 71 5b 69  Sample[i].anEq[i
14540 43 6f 6c 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Col];.  }else{. 
14550 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
14560 69 6e 74 2c 20 74 68 65 20 28 69 43 6f 6c 2b 31  int, the (iCol+1
14570 29 20 66 69 65 6c 64 20 70 72 65 66 69 78 20 6f  ) field prefix o
14580 66 20 61 53 61 6d 70 6c 65 5b 69 5d 20 69 73 20  f aSample[i] is 
14590 74 68 65 20 66 69 72 73 74 20 0a 20 20 20 20 2a  the first .    *
145a0 2a 20 73 61 6d 70 6c 65 20 74 68 61 74 20 69 73  * sample that is
145b0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 70 52   greater than pR
145c0 65 63 2e 20 4f 72 2c 20 69 66 20 69 3d 3d 70 49  ec. Or, if i==pI
145d0 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 74 68 65 6e  dx->nSample then
145e0 20 70 52 65 63 0a 20 20 20 20 2a 2a 20 69 73 20   pRec.    ** is 
145f0 6c 61 72 67 65 72 20 74 68 61 6e 20 61 6c 6c 20  larger than all 
14600 73 61 6d 70 6c 65 73 20 69 6e 20 74 68 65 20 61  samples in the a
14610 72 72 61 79 2e 20 2a 2f 0a 20 20 20 20 74 52 6f  rray. */.    tRo
14620 77 63 6e 74 20 69 55 70 70 65 72 2c 20 69 47 61  wcnt iUpper, iGa
14630 70 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d 70 49  p;.    if( i>=pI
14640 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 7b 0a 20  dx->nSample ){. 
14650 20 20 20 20 20 69 55 70 70 65 72 20 3d 20 73 71       iUpper = sq
14660 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74  lite3LogEstToInt
14670 28 70 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45  (pIdx->aiRowLogE
14680 73 74 5b 30 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  st[0]);.    }els
14690 65 7b 0a 20 20 20 20 20 20 69 55 70 70 65 72 20  e{.      iUpper 
146a0 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c  = aSample[i].anL
146b0 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 0a  t[iCol];.    }..
146c0 20 20 20 20 69 66 28 20 69 4c 6f 77 65 72 3e 3d      if( iLower>=
146d0 69 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20 20  iUpper ){.      
146e0 69 47 61 70 20 3d 20 30 3b 0a 20 20 20 20 7d 65  iGap = 0;.    }e
146f0 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20  lse{.      iGap 
14700 3d 20 69 55 70 70 65 72 20 2d 20 69 4c 6f 77 65  = iUpper - iLowe
14710 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  r;.    }.    if(
14720 20 72 6f 75 6e 64 55 70 20 29 7b 0a 20 20 20 20   roundUp ){.    
14730 20 20 69 47 61 70 20 3d 20 28 69 47 61 70 2a 32    iGap = (iGap*2
14740 29 2f 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  )/3;.    }else{.
14750 20 20 20 20 20 20 69 47 61 70 20 3d 20 69 47 61        iGap = iGa
14760 70 2f 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  p/3;.    }.    a
14770 53 74 61 74 5b 30 5d 20 3d 20 69 4c 6f 77 65 72  Stat[0] = iLower
14780 20 2b 20 69 47 61 70 3b 0a 20 20 20 20 61 53 74   + iGap;.    aSt
14790 61 74 5b 31 5d 20 3d 20 70 49 64 78 2d 3e 61 41  at[1] = pIdx->aA
147a0 76 67 45 71 5b 69 43 6f 6c 5d 3b 0a 20 20 7d 0a  vgEq[iCol];.  }.
147b0 0a 20 20 2f 2a 20 52 65 73 74 6f 72 65 20 74 68  .  /* Restore th
147c0 65 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 76  e pRec->nField v
147d0 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74 75  alue before retu
147e0 72 6e 69 6e 67 2e 20 20 2a 2f 0a 20 20 70 52 65  rning.  */.  pRe
147f0 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65  c->nField = nFie
14800 6c 64 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a  ld;.  return i;.
14810 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
14820 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
14830 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a  OR_STAT4 */../*.
14840 2a 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  ** If it is not 
14850 4e 55 4c 4c 2c 20 70 54 65 72 6d 20 69 73 20 61  NULL, pTerm is a
14860 20 74 65 72 6d 20 74 68 61 74 20 70 72 6f 76 69   term that provi
14870 64 65 73 20 61 6e 20 75 70 70 65 72 20 6f 72 20  des an upper or 
14880 6c 6f 77 65 72 0a 2a 2a 20 62 6f 75 6e 64 20 6f  lower.** bound o
14890 6e 20 61 20 72 61 6e 67 65 20 73 63 61 6e 2e 20  n a range scan. 
148a0 57 69 74 68 6f 75 74 20 63 6f 6e 73 69 64 65 72  Without consider
148b0 69 6e 67 20 70 54 65 72 6d 2c 20 69 74 20 69 73  ing pTerm, it is
148c0 20 65 73 74 69 6d 61 74 65 64 20 0a 2a 2a 20 74   estimated .** t
148d0 68 61 74 20 74 68 65 20 73 63 61 6e 20 77 69 6c  hat the scan wil
148e0 6c 20 76 69 73 69 74 20 6e 4e 65 77 20 72 6f 77  l visit nNew row
148f0 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  s. This function
14900 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
14910 62 65 72 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64  ber.** estimated
14920 20 74 6f 20 62 65 20 76 69 73 69 74 65 64 20 61   to be visited a
14930 66 74 65 72 20 74 61 6b 69 6e 67 20 70 54 65 72  fter taking pTer
14940 6d 20 69 6e 74 6f 20 61 63 63 6f 75 6e 74 2e 0a  m into account..
14950 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 75 73 65  **.** If the use
14960 72 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65  r explicitly spe
14970 63 69 66 69 65 64 20 61 20 6c 69 6b 65 6c 69 68  cified a likelih
14980 6f 6f 64 28 29 20 76 61 6c 75 65 20 66 6f 72 20  ood() value for 
14990 74 68 69 73 20 74 65 72 6d 2c 0a 2a 2a 20 74 68  this term,.** th
149a0 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  en the return va
149b0 6c 75 65 20 69 73 20 74 68 65 20 6c 69 6b 65 6c  lue is the likel
149c0 69 68 6f 6f 64 20 6d 75 6c 74 69 70 6c 69 65 64  ihood multiplied
149d0 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   by the number o
149e0 66 0a 2a 2a 20 69 6e 70 75 74 20 72 6f 77 73 2e  f.** input rows.
149f0 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 69 73   Otherwise, this
14a00 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
14a10 73 20 74 68 61 74 20 61 6e 20 22 49 53 20 4e 4f  s that an "IS NO
14a20 54 20 4e 55 4c 4c 22 20 74 65 72 6d 0a 2a 2a 20  T NULL" term.** 
14a30 68 61 73 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64  has a likelihood
14a40 20 6f 66 20 30 2e 35 30 2c 20 61 6e 64 20 61 6e   of 0.50, and an
14a50 79 20 6f 74 68 65 72 20 74 65 72 6d 20 61 20 6c  y other term a l
14a60 69 6b 65 6c 69 68 6f 6f 64 20 6f 66 20 30 2e 32  ikelihood of 0.2
14a70 35 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67  5..*/.static Log
14a80 45 73 74 20 77 68 65 72 65 52 61 6e 67 65 41 64  Est whereRangeAd
14a90 6a 75 73 74 28 57 68 65 72 65 54 65 72 6d 20 2a  just(WhereTerm *
14aa0 70 54 65 72 6d 2c 20 4c 6f 67 45 73 74 20 6e 4e  pTerm, LogEst nN
14ab0 65 77 29 7b 0a 20 20 4c 6f 67 45 73 74 20 6e 52  ew){.  LogEst nR
14ac0 65 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 69 66 28  et = nNew;.  if(
14ad0 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 69 66   pTerm ){.    if
14ae0 28 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72  ( pTerm->truthPr
14af0 6f 62 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  ob<=0 ){.      n
14b00 52 65 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72  Ret += pTerm->tr
14b10 75 74 68 50 72 6f 62 3b 0a 20 20 20 20 7d 65 6c  uthProb;.    }el
14b20 73 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 77  se if( (pTerm->w
14b30 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e  tFlags & TERM_VN
14b40 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ULL)==0 ){.     
14b50 20 6e 52 65 74 20 2d 3d 20 32 30 3b 20 20 20 20   nRet -= 20;    
14b60 20 20 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d      assert( 20==
14b70 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 34 29  sqlite3LogEst(4)
14b80 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   );.    }.  }.  
14b90 72 65 74 75 72 6e 20 6e 52 65 74 3b 0a 7d 0a 0a  return nRet;.}..
14ba0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
14bb0 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
14bc0 41 54 34 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20  AT4./* .** This 
14bd0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
14be0 65 64 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74  ed to estimate t
14bf0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
14c00 73 20 76 69 73 69 74 65 64 20 62 79 20 61 0a 2a  s visited by a.*
14c10 2a 20 72 61 6e 67 65 2d 73 63 61 6e 20 6f 6e 20  * range-scan on 
14c20 61 20 73 6b 69 70 2d 73 63 61 6e 20 69 6e 64 65  a skip-scan inde
14c30 78 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  x. For example:.
14c40 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 49  **.**   CREATE I
14c50 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61 2c  NDEX i1 ON t1(a,
14c60 20 62 2c 20 63 29 3b 0a 2a 2a 20 20 20 53 45 4c   b, c);.**   SEL
14c70 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
14c80 45 52 45 20 61 3d 3f 20 41 4e 44 20 63 20 42 45  ERE a=? AND c BE
14c90 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 3b 0a 2a  TWEEN ? AND ?;.*
14ca0 2a 0a 2a 2a 20 56 61 6c 75 65 20 70 4c 6f 6f 70  *.** Value pLoop
14cb0 2d 3e 6e 4f 75 74 20 69 73 20 63 75 72 72 65 6e  ->nOut is curren
14cc0 74 6c 79 20 73 65 74 20 74 6f 20 74 68 65 20 65  tly set to the e
14cd0 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20  stimated number 
14ce0 6f 66 20 72 6f 77 73 20 0a 2a 2a 20 76 69 73 69  of rows .** visi
14cf0 74 65 64 20 66 6f 72 20 73 63 61 6e 6e 69 6e 67  ted for scanning
14d00 20 28 61 3d 3f 20 41 4e 44 20 62 3d 3f 29 2e 20   (a=? AND b=?). 
14d10 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
14d20 64 75 63 65 73 20 74 68 61 74 20 65 73 74 69 6d  duces that estim
14d30 61 74 65 20 0a 2a 2a 20 62 79 20 73 6f 6d 65 20  ate .** by some 
14d40 66 61 63 74 6f 72 20 74 6f 20 61 63 63 6f 75 6e  factor to accoun
14d50 74 20 66 6f 72 20 74 68 65 20 28 63 20 42 45 54  t for the (c BET
14d60 57 45 45 4e 20 3f 20 41 4e 44 20 3f 29 20 65 78  WEEN ? AND ?) ex
14d70 70 72 65 73 73 69 6f 6e 20 62 61 73 65 64 0a 2a  pression based.*
14d80 2a 20 6f 6e 20 74 68 65 20 73 74 61 74 34 20 64  * on the stat4 d
14d90 61 74 61 20 66 6f 72 20 74 68 65 20 69 6e 64 65  ata for the inde
14da0 78 2e 20 74 68 69 73 20 73 63 61 6e 20 77 69 6c  x. this scan wil
14db0 6c 20 62 65 20 70 65 66 6f 72 6d 65 64 20 6d 75  l be peformed mu
14dc0 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73  ltiple .** times
14dd0 20 28 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20   (once for each 
14de0 28 61 2c 62 29 20 63 6f 6d 62 69 6e 61 74 69 6f  (a,b) combinatio
14df0 6e 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 61  n that matches a
14e00 3d 3f 29 20 69 73 20 64 65 61 6c 74 20 77 69 74  =?) is dealt wit
14e10 68 20 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c  h .** by the cal
14e20 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 64 6f  ler..**.** It do
14e30 65 73 20 74 68 69 73 20 62 79 20 73 63 61 6e 6e  es this by scann
14e40 69 6e 67 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  ing through all 
14e50 73 74 61 74 34 20 73 61 6d 70 6c 65 73 2c 20 63  stat4 samples, c
14e60 6f 6d 70 61 72 69 6e 67 20 76 61 6c 75 65 73 0a  omparing values.
14e70 2a 2a 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  ** extracted fro
14e80 6d 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70  m pLower and pUp
14e90 70 65 72 20 77 69 74 68 20 74 68 65 20 63 6f 72  per with the cor
14ea0 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d  responding colum
14eb0 6e 20 69 6e 20 65 61 63 68 0a 2a 2a 20 73 61 6d  n in each.** sam
14ec0 70 6c 65 2e 20 49 66 20 4c 20 61 6e 64 20 55 20  ple. If L and U 
14ed0 61 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  are the number o
14ee0 66 20 73 61 6d 70 6c 65 73 20 66 6f 75 6e 64 20  f samples found 
14ef0 74 6f 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20  to be less than 
14f00 6f 72 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 20 74  or.** equal to t
14f10 68 65 20 76 61 6c 75 65 73 20 65 78 74 72 61 63  he values extrac
14f20 74 65 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20  ted from pLower 
14f30 61 6e 64 20 70 55 70 70 65 72 20 72 65 73 70 65  and pUpper respe
14f40 63 74 69 76 65 6c 79 2c 20 61 6e 64 0a 2a 2a 20  ctively, and.** 
14f50 4e 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e  N is the total n
14f60 75 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c 65 73  umber of samples
14f70 2c 20 74 68 65 20 70 4c 6f 6f 70 2d 3e 6e 4f 75  , the pLoop->nOu
14f80 74 20 76 61 6c 75 65 20 69 73 20 61 64 6a 75 73  t value is adjus
14f90 74 65 64 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77  ted.** as follow
14fa0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6e 4f 75 74 20  s:.**.**   nOut 
14fb0 3d 20 6e 4f 75 74 20 2a 20 28 20 6d 69 6e 28 55  = nOut * ( min(U
14fc0 20 2d 20 4c 2c 20 31 29 20 2f 20 4e 20 29 0a 2a   - L, 1) / N ).*
14fd0 2a 0a 2a 2a 20 49 66 20 70 4c 6f 77 65 72 20 69  *.** If pLower i
14fe0 73 20 4e 55 4c 4c 2c 20 6f 72 20 61 20 76 61 6c  s NULL, or a val
14ff0 75 65 20 63 61 6e 6e 6f 74 20 62 65 20 65 78 74  ue cannot be ext
15000 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20  racted from the 
15010 74 65 72 6d 2c 20 4c 20 69 73 0a 2a 2a 20 73 65  term, L is.** se
15020 74 20 74 6f 20 7a 65 72 6f 2e 20 49 66 20 70 55  t to zero. If pU
15030 70 70 65 72 20 69 73 20 4e 55 4c 4c 2c 20 6f 72  pper is NULL, or
15040 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20   a value cannot 
15050 62 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  be extracted fro
15060 6d 20 69 74 2c 0a 2a 2a 20 55 20 69 73 20 73 65  m it,.** U is se
15070 74 20 74 6f 20 4e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  t to N..**.** No
15080 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e  rmally, this fun
15090 63 74 69 6f 6e 20 73 65 74 73 20 2a 70 62 44 6f  ction sets *pbDo
150a0 6e 65 20 74 6f 20 31 20 62 65 66 6f 72 65 20 72  ne to 1 before r
150b0 65 74 75 72 6e 69 6e 67 2e 20 48 6f 77 65 76 65  eturning. Howeve
150c0 72 2c 0a 2a 2a 20 69 66 20 6e 6f 20 76 61 6c 75  r,.** if no valu
150d0 65 20 63 61 6e 20 62 65 20 65 78 74 72 61 63 74  e can be extract
150e0 65 64 20 66 72 6f 6d 20 65 69 74 68 65 72 20 70  ed from either p
150f0 4c 6f 77 65 72 20 6f 72 20 70 55 70 70 65 72 20  Lower or pUpper 
15100 28 61 6e 64 20 73 6f 20 74 68 65 0a 2a 2a 20 65  (and so the.** e
15110 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e  stimate of the n
15120 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 64 65  umber of rows de
15130 6c 69 76 65 72 65 64 20 72 65 6d 61 69 6e 73 20  livered remains 
15140 75 6e 63 68 61 6e 67 65 64 29 2c 20 2a 70 62 44  unchanged), *pbD
15150 6f 6e 65 0a 2a 2a 20 69 73 20 6c 65 66 74 20 61  one.** is left a
15160 73 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  s is..**.** If a
15170 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
15180 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
15190 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
151a0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a  . Otherwise, .**
151b0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
151c0 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 52  tatic int whereR
151d0 61 6e 67 65 53 6b 69 70 53 63 61 6e 45 73 74 28  angeSkipScanEst(
151e0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
151f0 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
15200 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61  ng & code genera
15210 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
15220 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f    WhereTerm *pLo
15230 77 65 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20  wer,   /* Lower 
15240 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e  bound on the ran
15250 67 65 2e 20 65 78 3a 20 22 78 3e 31 32 33 22 20  ge. ex: "x>123" 
15260 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
15270 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 55  .  WhereTerm *pU
15280 70 70 65 72 2c 20 20 20 2f 2a 20 55 70 70 65 72  pper,   /* Upper
15290 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61   bound on the ra
152a0 6e 67 65 2e 20 65 78 3a 20 22 78 3c 34 35 35 22  nge. ex: "x<455"
152b0 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
152c0 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
152d0 4c 6f 6f 70 2c 20 20 20 20 2f 2a 20 55 70 64 61  Loop,    /* Upda
152e0 74 65 20 74 68 65 20 2e 6e 4f 75 74 20 76 61 6c  te the .nOut val
152f0 75 65 20 6f 66 20 74 68 69 73 20 6c 6f 6f 70 20  ue of this loop 
15300 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 44 6f 6e 65  */.  int *pbDone
15310 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
15320 20 74 6f 20 74 72 75 65 20 69 66 20 61 74 20 6c   to true if at l
15330 65 61 73 74 20 6f 6e 65 20 65 78 70 72 2e 20 76  east one expr. v
15340 61 6c 75 65 20 65 78 74 72 61 63 74 65 64 20 2a  alue extracted *
15350 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20  /.){.  Index *p 
15360 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
15370 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e  .pIndex;.  int n
15380 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  Eq = pLoop->u.bt
15390 72 65 65 2e 6e 45 71 3b 0a 20 20 73 71 6c 69 74  ree.nEq;.  sqlit
153a0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
153b0 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 4c 6f 77 65  >db;.  int nLowe
153c0 72 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 6e 55  r = -1;.  int nU
153d0 70 70 65 72 20 3d 20 70 2d 3e 6e 53 61 6d 70 6c  pper = p->nSampl
153e0 65 2b 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  e+1;.  int rc = 
153f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
15400 20 69 43 6f 6c 20 3d 20 70 2d 3e 61 69 43 6f 6c   iCol = p->aiCol
15410 75 6d 6e 5b 6e 45 71 5d 3b 0a 20 20 75 38 20 61  umn[nEq];.  u8 a
15420 66 66 20 3d 20 69 43 6f 6c 3e 3d 30 20 3f 20 70  ff = iCol>=0 ? p
15430 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69  ->pTable->aCol[i
15440 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 20 3a 20  Col].affinity : 
15450 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
15460 45 52 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  ER;.  CollSeq *p
15470 43 6f 6c 6c 3b 0a 20 20 0a 20 20 73 71 6c 69 74  Coll;.  .  sqlit
15480 65 33 5f 76 61 6c 75 65 20 2a 70 31 20 3d 20 30  e3_value *p1 = 0
15490 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61  ;          /* Va
154a0 6c 75 65 20 65 78 74 72 61 63 74 65 64 20 66 72  lue extracted fr
154b0 6f 6d 20 70 4c 6f 77 65 72 20 2a 2f 0a 20 20 73  om pLower */.  s
154c0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 32  qlite3_value *p2
154d0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
154e0 2a 20 56 61 6c 75 65 20 65 78 74 72 61 63 74 65  * Value extracte
154f0 64 20 66 72 6f 6d 20 70 55 70 70 65 72 20 2a 2f  d from pUpper */
15500 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
15510 20 2a 70 56 61 6c 20 3d 20 30 3b 20 20 20 20 20   *pVal = 0;     
15520 20 20 20 2f 2a 20 56 61 6c 75 65 20 65 78 74 72     /* Value extr
15530 61 63 74 65 64 20 66 72 6f 6d 20 72 65 63 6f 72  acted from recor
15540 64 20 2a 2f 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20  d */..  pColl = 
15550 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c  sqlite3LocateCol
15560 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e  lSeq(pParse, p->
15570 61 7a 43 6f 6c 6c 5b 6e 45 71 5d 29 3b 0a 20 20  azColl[nEq]);.  
15580 69 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20  if( pLower ){.  
15590 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74    rc = sqlite3St
155a0 61 74 34 56 61 6c 75 65 46 72 6f 6d 45 78 70 72  at4ValueFromExpr
155b0 28 70 50 61 72 73 65 2c 20 70 4c 6f 77 65 72 2d  (pParse, pLower-
155c0 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20  >pExpr->pRight, 
155d0 61 66 66 2c 20 26 70 31 29 3b 0a 20 20 20 20 6e  aff, &p1);.    n
155e0 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 7d 0a 20  Lower = 0;.  }. 
155f0 20 69 66 28 20 70 55 70 70 65 72 20 26 26 20 72   if( pUpper && r
15600 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
15610 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
15620 53 74 61 74 34 56 61 6c 75 65 46 72 6f 6d 45 78  Stat4ValueFromEx
15630 70 72 28 70 50 61 72 73 65 2c 20 70 55 70 70 65  pr(pParse, pUppe
15640 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  r->pExpr->pRight
15650 2c 20 61 66 66 2c 20 26 70 32 29 3b 0a 20 20 20  , aff, &p2);.   
15660 20 6e 55 70 70 65 72 20 3d 20 70 32 20 3f 20 30   nUpper = p2 ? 0
15670 20 3a 20 70 2d 3e 6e 53 61 6d 70 6c 65 3b 0a 20   : p->nSample;. 
15680 20 7d 0a 0a 20 20 69 66 28 20 70 31 20 7c 7c 20   }..  if( p1 || 
15690 70 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  p2 ){.    int i;
156a0 0a 20 20 20 20 69 6e 74 20 6e 44 69 66 66 3b 0a  .    int nDiff;.
156b0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
156c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
156d0 70 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29  p->nSample; i++)
156e0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
156f0 69 74 65 33 53 74 61 74 34 43 6f 6c 75 6d 6e 28  ite3Stat4Column(
15700 64 62 2c 20 70 2d 3e 61 53 61 6d 70 6c 65 5b 69  db, p->aSample[i
15710 5d 2e 70 2c 20 70 2d 3e 61 53 61 6d 70 6c 65 5b  ].p, p->aSample[
15720 69 5d 2e 6e 2c 20 6e 45 71 2c 20 26 70 56 61 6c  i].n, nEq, &pVal
15730 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
15740 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 31  =SQLITE_OK && p1
15750 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
15760 72 65 73 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d  res = sqlite3Mem
15770 43 6f 6d 70 61 72 65 28 70 31 2c 20 70 56 61 6c  Compare(p1, pVal
15780 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20  , pColl);.      
15790 20 20 69 66 28 20 72 65 73 3e 3d 30 20 29 20 6e    if( res>=0 ) n
157a0 4c 6f 77 65 72 2b 2b 3b 0a 20 20 20 20 20 20 7d  Lower++;.      }
157b0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
157c0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 32 20 29  QLITE_OK && p2 )
157d0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65  {.        int re
157e0 73 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f  s = sqlite3MemCo
157f0 6d 70 61 72 65 28 70 32 2c 20 70 56 61 6c 2c 20  mpare(p2, pVal, 
15800 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  pColl);.        
15810 69 66 28 20 72 65 73 3e 3d 30 20 29 20 6e 55 70  if( res>=0 ) nUp
15820 70 65 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  per++;.      }. 
15830 20 20 20 7d 0a 20 20 20 20 6e 44 69 66 66 20 3d     }.    nDiff =
15840 20 28 6e 55 70 70 65 72 20 2d 20 6e 4c 6f 77 65   (nUpper - nLowe
15850 72 29 3b 0a 20 20 20 20 69 66 28 20 6e 44 69 66  r);.    if( nDif
15860 66 3c 3d 30 20 29 20 6e 44 69 66 66 20 3d 20 31  f<=0 ) nDiff = 1
15870 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
15880 72 65 20 69 73 20 62 6f 74 68 20 61 6e 20 75 70  re is both an up
15890 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f  per and lower bo
158a0 75 6e 64 20 73 70 65 63 69 66 69 65 64 2c 20 61  und specified, a
158b0 6e 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63  nd the .    ** c
158c0 6f 6d 70 61 72 69 73 6f 6e 73 20 69 6e 64 69 63  omparisons indic
158d0 61 74 65 20 74 68 61 74 20 74 68 65 79 20 61 72  ate that they ar
158e0 65 20 63 6c 6f 73 65 20 74 6f 67 65 74 68 65 72  e close together
158f0 2c 20 75 73 65 20 74 68 65 20 66 61 6c 6c 62 61  , use the fallba
15900 63 6b 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64  ck.    ** method
15910 20 28 61 73 73 75 6d 65 20 74 68 61 74 20 74 68   (assume that th
15920 65 20 73 63 61 6e 20 76 69 73 69 74 73 20 31 2f  e scan visits 1/
15930 36 34 20 6f 66 20 74 68 65 20 72 6f 77 73 29 20  64 of the rows) 
15940 66 6f 72 20 65 73 74 69 6d 61 74 69 6e 67 0a 20  for estimating. 
15950 20 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72     ** the number
15960 20 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65 64   of rows visited
15970 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 65 73 74  . Otherwise, est
15980 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  imate the number
15990 20 6f 66 20 72 6f 77 73 0a 20 20 20 20 2a 2a 20   of rows.    ** 
159a0 75 73 69 6e 67 20 74 68 65 20 6d 65 74 68 6f 64  using the method
159b0 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68   described in th
159c0 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74  e header comment
159d0 20 66 6f 72 20 74 68 69 73 20 66 75 6e 63 74 69   for this functi
159e0 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e  on. */.    if( n
159f0 44 69 66 66 21 3d 31 20 7c 7c 20 70 55 70 70 65  Diff!=1 || pUppe
15a00 72 3d 3d 30 20 7c 7c 20 70 4c 6f 77 65 72 3d 3d  r==0 || pLower==
15a10 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  0 ){.      int n
15a20 41 64 6a 75 73 74 20 3d 20 28 73 71 6c 69 74 65  Adjust = (sqlite
15a30 33 4c 6f 67 45 73 74 28 70 2d 3e 6e 53 61 6d 70  3LogEst(p->nSamp
15a40 6c 65 29 20 2d 20 73 71 6c 69 74 65 33 4c 6f 67  le) - sqlite3Log
15a50 45 73 74 28 6e 44 69 66 66 29 29 3b 0a 20 20 20  Est(nDiff));.   
15a60 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2d     pLoop->nOut -
15a70 3d 20 6e 41 64 6a 75 73 74 3b 0a 20 20 20 20 20  = nAdjust;.     
15a80 20 2a 70 62 44 6f 6e 65 20 3d 20 31 3b 0a 20 20   *pbDone = 1;.  
15a90 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
15aa0 78 31 30 2c 20 28 22 72 61 6e 67 65 20 73 6b 69  x10, ("range ski
15ab0 70 2d 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20  p-scan regions: 
15ac0 25 75 2e 2e 25 75 20 20 61 64 6a 75 73 74 3d 25  %u..%u  adjust=%
15ad0 64 20 65 73 74 3d 25 64 5c 6e 22 2c 0a 20 20 20  d est=%d\n",.   
15ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15af0 20 20 20 20 20 20 20 20 6e 4c 6f 77 65 72 2c 20          nLower, 
15b00 6e 55 70 70 65 72 2c 20 6e 41 64 6a 75 73 74 2a  nUpper, nAdjust*
15b10 2d 31 2c 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 29  -1, pLoop->nOut)
15b20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73  );.    }..  }els
15b30 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a  e{.    assert( *
15b40 70 62 44 6f 6e 65 3d 3d 30 20 29 3b 0a 20 20 7d  pbDone==0 );.  }
15b50 0a 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ..  sqlite3Value
15b60 46 72 65 65 28 70 31 29 3b 0a 20 20 73 71 6c 69  Free(p1);.  sqli
15b70 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 32 29  te3ValueFree(p2)
15b80 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ;.  sqlite3Value
15b90 46 72 65 65 28 70 56 61 6c 29 3b 0a 0a 20 20 72  Free(pVal);..  r
15ba0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
15bb0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
15bc0 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
15bd0 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  T4 */../*.** Thi
15be0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
15bf0 65 64 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74  ed to estimate t
15c00 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
15c10 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 76  s that will be v
15c20 69 73 69 74 65 64 0a 2a 2a 20 62 79 20 73 63 61  isited.** by sca
15c30 6e 6e 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 66  nning an index f
15c40 6f 72 20 61 20 72 61 6e 67 65 20 6f 66 20 76 61  or a range of va
15c50 6c 75 65 73 2e 20 54 68 65 20 72 61 6e 67 65 20  lues. The range 
15c60 6d 61 79 20 68 61 76 65 20 61 6e 20 75 70 70 65  may have an uppe
15c70 72 0a 2a 2a 20 62 6f 75 6e 64 2c 20 61 20 6c 6f  r.** bound, a lo
15c80 77 65 72 20 62 6f 75 6e 64 2c 20 6f 72 20 62 6f  wer bound, or bo
15c90 74 68 2e 20 54 68 65 20 57 48 45 52 45 20 63 6c  th. The WHERE cl
15ca0 61 75 73 65 20 74 65 72 6d 73 20 74 68 61 74 20  ause terms that 
15cb0 73 65 74 20 74 68 65 20 75 70 70 65 72 0a 2a 2a  set the upper.**
15cc0 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f 75 6e 64   and lower bound
15cd0 73 20 61 72 65 20 72 65 70 72 65 73 65 6e 74 65  s are represente
15ce0 64 20 62 79 20 70 4c 6f 77 65 72 20 61 6e 64 20  d by pLower and 
15cf0 70 55 70 70 65 72 20 72 65 73 70 65 63 74 69 76  pUpper respectiv
15d00 65 6c 79 2e 20 46 6f 72 0a 2a 2a 20 65 78 61 6d  ely. For.** exam
15d10 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20 74 68  ple, assuming th
15d20 61 74 20 69 6e 64 65 78 20 70 20 69 73 20 6f 6e  at index p is on
15d30 20 74 31 28 61 29 3a 0a 2a 2a 0a 2a 2a 20 20 20   t1(a):.**.**   
15d40 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52  ... FROM t1 WHER
15d50 45 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20  E a > ? AND a < 
15d60 3f 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20  ? ....**        
15d70 20 20 20 20 20 20 20 20 20 20 20 20 7c 5f 5f 5f              |___
15d80 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a  __|   |_____|.**
15d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15da0 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20         |        
15db0 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
15dc0 20 20 20 20 20 20 20 20 20 20 70 4c 6f 77 65 72            pLower
15dd0 20 20 20 20 70 55 70 70 65 72 0a 2a 2a 0a 2a 2a      pUpper.**.**
15de0 20 49 66 20 65 69 74 68 65 72 20 6f 66 20 74 68   If either of th
15df0 65 20 75 70 70 65 72 20 6f 72 20 6c 6f 77 65 72  e upper or lower
15e00 20 62 6f 75 6e 64 20 69 73 20 6e 6f 74 20 70 72   bound is not pr
15e10 65 73 65 6e 74 2c 20 74 68 65 6e 20 4e 55 4c 4c  esent, then NULL
15e20 20 69 73 20 70 61 73 73 65 64 20 69 6e 0a 2a 2a   is passed in.**
15e30 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20 63 6f   place of the co
15e40 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68 65 72  rresponding Wher
15e50 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  eTerm..**.** The
15e60 20 76 61 6c 75 65 20 69 6e 20 28 70 42 75 69 6c   value in (pBuil
15e70 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72  der->pNew->u.btr
15e80 65 65 2e 6e 45 71 29 20 69 73 20 74 68 65 20 6e  ee.nEq) is the n
15e90 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64  umber of the ind
15ea0 65 78 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 73 75 62  ex.** column sub
15eb0 6a 65 63 74 20 74 6f 20 74 68 65 20 72 61 6e 67  ject to the rang
15ec0 65 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 4f 72  e constraint. Or
15ed0 2c 20 65 71 75 69 76 61 6c 65 6e 74 6c 79 2c 20  , equivalently, 
15ee0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
15ef0 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
15f00 61 69 6e 74 73 20 6f 70 74 69 6d 69 7a 65 64 20  aints optimized 
15f10 62 79 20 74 68 65 20 70 72 6f 70 6f 73 65 64 20  by the proposed 
15f20 69 6e 64 65 78 20 73 63 61 6e 2e 20 46 6f 72 20  index scan. For 
15f30 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 61 73 73 75  example,.** assu
15f40 6d 69 6e 67 20 69 6e 64 65 78 20 70 20 69 73 20  ming index p is 
15f50 6f 6e 20 74 31 28 61 2c 20 62 29 2c 20 61 6e 64  on t1(a, b), and
15f60 20 74 68 65 20 53 51 4c 20 71 75 65 72 79 20 69   the SQL query i
15f70 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46  s:.**.**   ... F
15f80 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3d  ROM t1 WHERE a =
15f90 20 3f 20 41 4e 44 20 62 20 3e 20 3f 20 41 4e 44   ? AND b > ? AND
15fa0 20 62 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a   b < ? ....**.**
15fb0 20 74 68 65 6e 20 6e 45 71 20 69 73 20 73 65 74   then nEq is set
15fc0 20 74 6f 20 31 20 28 61 73 20 74 68 65 20 72 61   to 1 (as the ra
15fd0 6e 67 65 20 72 65 73 74 72 69 63 74 65 64 20 63  nge restricted c
15fe0 6f 6c 75 6d 6e 2c 20 62 2c 20 69 73 20 74 68 65  olumn, b, is the
15ff0 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 6c 65 66 74   second .** left
16000 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20  -most column of 
16010 74 68 65 20 69 6e 64 65 78 29 2e 20 4f 72 2c 20  the index). Or, 
16020 69 66 20 74 68 65 20 71 75 65 72 79 20 69 73 3a  if the query is:
16030 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f  .**.**   ... FRO
16040 4d 20 74 31 20 57 48 45 52 45 20 61 20 3e 20 3f  M t1 WHERE a > ?
16050 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a   AND a < ? ....*
16060 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 69 73  *.** then nEq is
16070 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a   set to 0..**.**
16080 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   When this funct
16090 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a  ion is called, *
160a0 70 6e 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  pnOut is set to 
160b0 74 68 65 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  the sqlite3LogEs
160c0 74 28 29 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75  t() of the.** nu
160d0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61  mber of rows tha
160e0 74 20 74 68 65 20 69 6e 64 65 78 20 73 63 61 6e  t the index scan
160f0 20 69 73 20 65 78 70 65 63 74 65 64 20 74 6f 20   is expected to 
16100 76 69 73 69 74 20 77 69 74 68 6f 75 74 20 0a 2a  visit without .*
16110 2a 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 74 68  * considering th
16120 65 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  e range constrai
16130 6e 74 73 2e 20 49 66 20 6e 45 71 20 69 73 20 30  nts. If nEq is 0
16140 2c 20 74 68 65 6e 20 2a 70 6e 4f 75 74 20 69 73  , then *pnOut is
16150 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a   the number of .
16160 2a 2a 20 72 6f 77 73 20 69 6e 20 74 68 65 20 69  ** rows in the i
16170 6e 64 65 78 2e 20 41 73 73 75 6d 69 6e 67 20 6e  ndex. Assuming n
16180 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
16190 2a 70 6e 4f 75 74 20 69 73 20 61 64 6a 75 73 74  *pnOut is adjust
161a0 65 64 20 28 72 65 64 75 63 65 64 29 0a 2a 2a 20  ed (reduced).** 
161b0 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74  to account for t
161c0 68 65 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  he range constra
161d0 69 6e 74 73 20 70 4c 6f 77 65 72 20 61 6e 64 20  ints pLower and 
161e0 70 55 70 70 65 72 2e 0a 2a 2a 20 0a 2a 2a 20 49  pUpper..** .** I
161f0 6e 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66  n the absence of
16200 20 73 71 6c 69 74 65 5f 73 74 61 74 34 20 41 4e   sqlite_stat4 AN
16210 41 4c 59 5a 45 20 64 61 74 61 2c 20 6f 72 20 69  ALYZE data, or i
16220 66 20 73 75 63 68 20 64 61 74 61 20 63 61 6e 6e  f such data cann
16230 6f 74 20 62 65 0a 2a 2a 20 75 73 65 64 2c 20 61  ot be.** used, a
16240 20 73 69 6e 67 6c 65 20 72 61 6e 67 65 20 69 6e   single range in
16250 65 71 75 61 6c 69 74 79 20 72 65 64 75 63 65 73  equality reduces
16260 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63   the search spac
16270 65 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66  e by a factor of
16280 20 34 2e 20 0a 2a 2a 20 61 6e 64 20 61 20 70 61   4. .** and a pa
16290 69 72 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74  ir of constraint
162a0 73 20 28 78 3e 3f 20 41 4e 44 20 78 3c 3f 29 20  s (x>? AND x<?) 
162b0 72 65 64 75 63 65 73 20 74 68 65 20 65 78 70 65  reduces the expe
162c0 63 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 0a 2a  cted number of.*
162d0 2a 20 72 6f 77 73 20 76 69 73 69 74 65 64 20 62  * rows visited b
162e0 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20 36 34  y a factor of 64
162f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16300 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73  whereRangeScanEs
16310 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
16320 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
16330 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65  sing & code gene
16340 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
16350 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  /.  WhereLoopBui
16360 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a  lder *pBuilder,.
16370 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f    WhereTerm *pLo
16380 77 65 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20  wer,   /* Lower 
16390 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e  bound on the ran
163a0 67 65 2e 20 65 78 3a 20 22 78 3e 31 32 33 22 20  ge. ex: "x>123" 
163b0 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
163c0 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 55  .  WhereTerm *pU
163d0 70 70 65 72 2c 20 20 20 2f 2a 20 55 70 70 65 72  pper,   /* Upper
163e0 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61   bound on the ra
163f0 6e 67 65 2e 20 65 78 3a 20 22 78 3c 34 35 35 22  nge. ex: "x<455"
16400 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
16410 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
16420 4c 6f 6f 70 20 20 20 20 20 2f 2a 20 4d 6f 64 69  Loop     /* Modi
16430 66 79 20 74 68 65 20 2e 6e 4f 75 74 20 61 6e 64  fy the .nOut and
16440 20 6d 61 79 62 65 20 2e 72 52 75 6e 20 66 69 65   maybe .rRun fie
16450 6c 64 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lds */.){.  int 
16460 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
16470 20 20 69 6e 74 20 6e 4f 75 74 20 3d 20 70 4c 6f    int nOut = pLo
16480 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 4c 6f 67 45  op->nOut;.  LogE
16490 73 74 20 6e 4e 65 77 3b 0a 0a 23 69 66 64 65 66  st nNew;..#ifdef
164a0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
164b0 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
164c0 49 6e 64 65 78 20 2a 70 20 3d 20 70 4c 6f 6f 70  Index *p = pLoop
164d0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
164e0 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c  ;.  int nEq = pL
164f0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
16500 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 53 61 6d  ;..  if( p->nSam
16510 70 6c 65 3e 30 20 26 26 20 6e 45 71 3c 70 2d 3e  ple>0 && nEq<p->
16520 6e 53 61 6d 70 6c 65 43 6f 6c 20 29 7b 0a 20 20  nSampleCol ){.  
16530 20 20 69 66 28 20 6e 45 71 3d 3d 70 42 75 69 6c    if( nEq==pBuil
16540 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 29  der->nRecValid )
16550 7b 0a 20 20 20 20 20 20 55 6e 70 61 63 6b 65 64  {.      Unpacked
16560 52 65 63 6f 72 64 20 2a 70 52 65 63 20 3d 20 70  Record *pRec = p
16570 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20  Builder->pRec;. 
16580 20 20 20 20 20 74 52 6f 77 63 6e 74 20 61 5b 32       tRowcnt a[2
16590 5d 3b 0a 20 20 20 20 20 20 75 38 20 61 66 66 3b  ];.      u8 aff;
165a0 0a 0a 20 20 20 20 20 20 2f 2a 20 56 61 72 69 61  ..      /* Varia
165b0 62 6c 65 20 69 4c 6f 77 65 72 20 77 69 6c 6c 20  ble iLower will 
165c0 62 65 20 73 65 74 20 74 6f 20 74 68 65 20 65 73  be set to the es
165d0 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75  timate of the nu
165e0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
165f0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 69 6e  .      ** the in
16600 64 65 78 20 74 68 61 74 20 61 72 65 20 6c 65 73  dex that are les
16610 73 20 74 68 61 6e 20 74 68 65 20 6c 6f 77 65 72  s than the lower
16620 20 62 6f 75 6e 64 20 6f 66 20 74 68 65 20 72 61   bound of the ra
16630 6e 67 65 20 71 75 65 72 79 2e 20 54 68 65 0a 20  nge query. The. 
16640 20 20 20 20 20 2a 2a 20 6c 6f 77 65 72 20 62 6f       ** lower bo
16650 75 6e 64 20 62 65 69 6e 67 20 74 68 65 20 63 6f  und being the co
16660 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f 66 20 24  ncatenation of $
16670 50 20 61 6e 64 20 24 4c 2c 20 77 68 65 72 65 20  P and $L, where 
16680 24 50 20 69 73 20 74 68 65 0a 20 20 20 20 20 20  $P is the.      
16690 2a 2a 20 6b 65 79 2d 70 72 65 66 69 78 20 66 6f  ** key-prefix fo
166a0 72 6d 65 64 20 62 79 20 74 68 65 20 6e 45 71 20  rmed by the nEq 
166b0 76 61 6c 75 65 73 20 6d 61 74 63 68 65 64 20 61  values matched a
166c0 67 61 69 6e 73 74 20 74 68 65 20 6e 45 71 20 6c  gainst the nEq l
166d0 65 66 74 2d 6d 6f 73 74 0a 20 20 20 20 20 20 2a  eft-most.      *
166e0 2a 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  * columns of the
166f0 20 69 6e 64 65 78 2c 20 61 6e 64 20 24 4c 20 69   index, and $L i
16700 73 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70  s the value in p
16710 4c 6f 77 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a  Lower..      **.
16720 20 20 20 20 20 20 2a 2a 20 4f 72 2c 20 69 66 20        ** Or, if 
16730 70 4c 6f 77 65 72 20 69 73 20 4e 55 4c 4c 20 6f  pLower is NULL o
16740 72 20 24 4c 20 63 61 6e 6e 6f 74 20 62 65 20 65  r $L cannot be e
16750 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69 74  xtracted from it
16760 20 28 62 65 63 61 75 73 65 20 69 74 0a 20 20 20   (because it.   
16770 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 20 73     ** is not a s
16780 69 6d 70 6c 65 20 76 61 72 69 61 62 6c 65 20 6f  imple variable o
16790 72 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 29  r literal value)
167a0 2c 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e  , the lower boun
167b0 64 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a  d of the.      *
167c0 2a 20 72 61 6e 67 65 20 69 73 20 24 50 2e 20 44  * range is $P. D
167d0 75 65 20 74 6f 20 61 20 71 75 69 72 6b 20 69 6e  ue to a quirk in
167e0 20 74 68 65 20 77 61 79 20 77 68 65 72 65 4b 65   the way whereKe
167f0 79 53 74 61 74 73 28 29 20 77 6f 72 6b 73 2c 20  yStats() works, 
16800 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 69 66  even.      ** if
16810 20 24 4c 20 69 73 20 61 76 61 69 6c 61 62 6c 65   $L is available
16820 2c 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28  , whereKeyStats(
16830 29 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20  ) is called for 
16840 62 6f 74 68 20 28 24 50 29 20 61 6e 64 20 0a 20  both ($P) and . 
16850 20 20 20 20 20 2a 2a 20 28 24 50 3a 24 4c 29 20       ** ($P:$L) 
16860 61 6e 64 20 74 68 65 20 6c 61 72 67 65 72 20 6f  and the larger o
16870 66 20 74 68 65 20 74 77 6f 20 72 65 74 75 72 6e  f the two return
16880 65 64 20 76 61 6c 75 65 73 20 69 73 20 75 73 65  ed values is use
16890 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  d..      **.    
168a0 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20    ** Similarly, 
168b0 69 55 70 70 65 72 20 69 73 20 74 6f 20 62 65 20  iUpper is to be 
168c0 73 65 74 20 74 6f 20 74 68 65 20 65 73 74 69 6d  set to the estim
168d0 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ate of the numbe
168e0 72 20 6f 66 20 72 6f 77 73 0a 20 20 20 20 20 20  r of rows.      
168f0 2a 2a 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  ** less than the
16900 20 75 70 70 65 72 20 62 6f 75 6e 64 20 6f 66 20   upper bound of 
16910 74 68 65 20 72 61 6e 67 65 20 71 75 65 72 79 2e  the range query.
16920 20 57 68 65 72 65 20 74 68 65 20 75 70 70 65 72   Where the upper
16930 20 62 6f 75 6e 64 0a 20 20 20 20 20 20 2a 2a 20   bound.      ** 
16940 69 73 20 65 69 74 68 65 72 20 28 24 50 29 20 6f  is either ($P) o
16950 72 20 28 24 50 3a 24 55 29 2e 20 41 67 61 69 6e  r ($P:$U). Again
16960 2c 20 65 76 65 6e 20 69 66 20 24 55 20 69 73 20  , even if $U is 
16970 61 76 61 69 6c 61 62 6c 65 2c 20 62 6f 74 68 20  available, both 
16980 76 61 6c 75 65 73 0a 20 20 20 20 20 20 2a 2a 20  values.      ** 
16990 6f 66 20 69 55 70 70 65 72 20 61 72 65 20 72 65  of iUpper are re
169a0 71 75 65 73 74 65 64 20 6f 66 20 77 68 65 72 65  quested of where
169b0 4b 65 79 53 74 61 74 73 28 29 20 61 6e 64 20 74  KeyStats() and t
169c0 68 65 20 73 6d 61 6c 6c 65 72 20 75 73 65 64 2e  he smaller used.
169d0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
169e0 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** The number of
169f0 20 72 6f 77 73 20 62 65 74 77 65 65 6e 20 74 68   rows between th
16a00 65 20 74 77 6f 20 62 6f 75 6e 64 73 20 69 73 20  e two bounds is 
16a10 74 68 65 6e 20 6a 75 73 74 20 69 55 70 70 65 72  then just iUpper
16a20 2d 69 4c 6f 77 65 72 2e 0a 20 20 20 20 20 20 2a  -iLower..      *
16a30 2f 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20  /.      tRowcnt 
16a40 69 4c 6f 77 65 72 3b 20 20 20 20 20 2f 2a 20 52  iLower;     /* R
16a50 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68  ows less than th
16a60 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 2a 2f  e lower bound */
16a70 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69  .      tRowcnt i
16a80 55 70 70 65 72 3b 20 20 20 20 20 2f 2a 20 52 6f  Upper;     /* Ro
16a90 77 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  ws less than the
16aa0 20 75 70 70 65 72 20 62 6f 75 6e 64 20 2a 2f 0a   upper bound */.
16ab0 20 20 20 20 20 20 69 6e 74 20 69 4c 77 72 49 64        int iLwrId
16ac0 78 20 3d 20 2d 32 3b 20 20 20 2f 2a 20 61 53 61  x = -2;   /* aSa
16ad0 6d 70 6c 65 5b 5d 20 66 6f 72 20 74 68 65 20 6c  mple[] for the l
16ae0 6f 77 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 20 20  ower bound */.  
16af0 20 20 20 20 69 6e 74 20 69 55 70 72 49 64 78 20      int iUprIdx 
16b00 3d 20 2d 31 3b 20 20 20 2f 2a 20 61 53 61 6d 70  = -1;   /* aSamp
16b10 6c 65 5b 5d 20 66 6f 72 20 74 68 65 20 75 70 70  le[] for the upp
16b20 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 0a 20 20 20  er bound */..   
16b30 20 20 20 69 66 28 20 70 52 65 63 20 29 7b 0a 20     if( pRec ){. 
16b40 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
16b50 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 21 3d 70   pRec->nField!=p
16b60 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
16b70 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20 70 52  id );.        pR
16b80 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 42 75  ec->nField = pBu
16b90 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
16ba0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
16bb0 69 66 28 20 6e 45 71 3d 3d 70 2d 3e 6e 4b 65 79  if( nEq==p->nKey
16bc0 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 61  Col ){.        a
16bd0 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
16be0 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 7d  INTEGER;.      }
16bf0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 66  else{.        af
16c00 66 20 3d 20 70 2d 3e 70 54 61 62 6c 65 2d 3e 61  f = p->pTable->a
16c10 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Col[p->aiColumn[
16c20 6e 45 71 5d 5d 2e 61 66 66 69 6e 69 74 79 3b 0a  nEq]].affinity;.
16c30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
16c40 20 44 65 74 65 72 6d 69 6e 65 20 69 4c 6f 77 65   Determine iLowe
16c50 72 20 61 6e 64 20 69 55 70 70 65 72 20 75 73 69  r and iUpper usi
16c60 6e 67 20 28 24 50 29 20 6f 6e 6c 79 2e 20 2a 2f  ng ($P) only. */
16c70 0a 20 20 20 20 20 20 69 66 28 20 6e 45 71 3d 3d  .      if( nEq==
16c80 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 6f  0 ){.        iLo
16c90 77 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  wer = 0;.       
16ca0 20 69 55 70 70 65 72 20 3d 20 70 2d 3e 6e 52 6f   iUpper = p->nRo
16cb0 77 45 73 74 30 3b 0a 20 20 20 20 20 20 7d 65 6c  wEst0;.      }el
16cc0 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e  se{.        /* N
16cd0 6f 74 65 3a 20 74 68 69 73 20 63 61 6c 6c 20 63  ote: this call c
16ce0 6f 75 6c 64 20 62 65 20 6f 70 74 69 6d 69 7a 65  ould be optimize
16cf0 64 20 61 77 61 79 20 2d 20 73 69 6e 63 65 20 74  d away - since t
16d00 68 65 20 73 61 6d 65 20 76 61 6c 75 65 73 20 6d  he same values m
16d10 75 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ust .        ** 
16d20 68 61 76 65 20 62 65 65 6e 20 72 65 71 75 65 73  have been reques
16d30 74 65 64 20 77 68 65 6e 20 74 65 73 74 69 6e 67  ted when testing
16d40 20 6b 65 79 20 24 50 20 69 6e 20 77 68 65 72 65   key $P in where
16d50 45 71 75 61 6c 53 63 61 6e 45 73 74 28 29 2e 20  EqualScanEst(). 
16d60 20 2a 2f 0a 20 20 20 20 20 20 20 20 77 68 65 72   */.        wher
16d70 65 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65  eKeyStats(pParse
16d80 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29  , p, pRec, 0, a)
16d90 3b 0a 20 20 20 20 20 20 20 20 69 4c 6f 77 65 72  ;.        iLower
16da0 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20 20   = a[0];.       
16db0 20 69 55 70 70 65 72 20 3d 20 61 5b 30 5d 20 2b   iUpper = a[0] +
16dc0 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 0a 0a   a[1];.      }..
16dd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
16de0 6f 77 65 72 3d 3d 30 20 7c 7c 20 28 70 4c 6f 77  ower==0 || (pLow
16df0 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  er->eOperator & 
16e00 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 29 21 3d  (WO_GT|WO_GE))!=
16e10 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
16e20 74 28 20 70 55 70 70 65 72 3d 3d 30 20 7c 7c 20  t( pUpper==0 || 
16e30 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74  (pUpper->eOperat
16e40 6f 72 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c  or & (WO_LT|WO_L
16e50 45 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  E))!=0 );.      
16e60 61 73 73 65 72 74 28 20 70 2d 3e 61 53 6f 72 74  assert( p->aSort
16e70 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 20 20  Order!=0 );.    
16e80 20 20 69 66 28 20 70 2d 3e 61 53 6f 72 74 4f 72    if( p->aSortOr
16e90 64 65 72 5b 6e 45 71 5d 20 29 7b 0a 20 20 20 20  der[nEq] ){.    
16ea0 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 65 73      /* The roles
16eb0 20 6f 66 20 70 4c 6f 77 65 72 20 61 6e 64 20 70   of pLower and p
16ec0 55 70 70 65 72 20 61 72 65 20 73 77 61 70 70 65  Upper are swappe
16ed0 64 20 66 6f 72 20 61 20 44 45 53 43 20 69 6e 64  d for a DESC ind
16ee0 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 57  ex */.        SW
16ef0 41 50 28 57 68 65 72 65 54 65 72 6d 2a 2c 20 70  AP(WhereTerm*, p
16f00 4c 6f 77 65 72 2c 20 70 55 70 70 65 72 29 3b 0a  Lower, pUpper);.
16f10 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
16f20 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69  * If possible, i
16f30 6d 70 72 6f 76 65 20 6f 6e 20 74 68 65 20 69 4c  mprove on the iL
16f40 6f 77 65 72 20 65 73 74 69 6d 61 74 65 20 75 73  ower estimate us
16f50 69 6e 67 20 28 24 50 3a 24 4c 29 2e 20 2a 2f 0a  ing ($P:$L). */.
16f60 20 20 20 20 20 20 69 66 28 20 70 4c 6f 77 65 72        if( pLower
16f70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
16f80 62 4f 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  bOk;            
16f90 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
16fa0 69 66 20 76 61 6c 75 65 20 69 73 20 65 78 74 72  if value is extr
16fb0 61 63 74 65 64 20 66 72 6f 6d 20 70 45 78 70 72  acted from pExpr
16fc0 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72   */.        Expr
16fd0 20 2a 70 45 78 70 72 20 3d 20 70 4c 6f 77 65 72   *pExpr = pLower
16fe0 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  ->pExpr->pRight;
16ff0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
17000 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 53  lite3Stat4ProbeS
17010 65 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20  etValue(pParse, 
17020 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70 72 2c  p, &pRec, pExpr,
17030 20 61 66 66 2c 20 6e 45 71 2c 20 26 62 4f 6b 29   aff, nEq, &bOk)
17040 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
17050 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
17060 4f 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Ok ){.          
17070 74 52 6f 77 63 6e 74 20 69 4e 65 77 3b 0a 20 20  tRowcnt iNew;.  
17080 20 20 20 20 20 20 20 20 69 4c 77 72 49 64 78 20          iLwrIdx 
17090 3d 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28  = whereKeyStats(
170a0 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c  pParse, p, pRec,
170b0 20 30 2c 20 61 29 3b 0a 20 20 20 20 20 20 20 20   0, a);.        
170c0 20 20 69 4e 65 77 20 3d 20 61 5b 30 5d 20 2b 20    iNew = a[0] + 
170d0 28 28 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61  ((pLower->eOpera
170e0 74 6f 72 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f  tor & (WO_GT|WO_
170f0 4c 45 29 29 20 3f 20 61 5b 31 5d 20 3a 20 30 29  LE)) ? a[1] : 0)
17100 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
17110 69 4e 65 77 3e 69 4c 6f 77 65 72 20 29 20 69 4c  iNew>iLower ) iL
17120 6f 77 65 72 20 3d 20 69 4e 65 77 3b 0a 20 20 20  ower = iNew;.   
17130 20 20 20 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20         nOut--;. 
17140 20 20 20 20 20 20 20 20 20 70 4c 6f 77 65 72 20           pLower 
17150 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
17160 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
17170 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 6d   If possible, im
17180 70 72 6f 76 65 20 6f 6e 20 74 68 65 20 69 55 70  prove on the iUp
17190 70 65 72 20 65 73 74 69 6d 61 74 65 20 75 73 69  per estimate usi
171a0 6e 67 20 28 24 50 3a 24 55 29 2e 20 2a 2f 0a 20  ng ($P:$U). */. 
171b0 20 20 20 20 20 69 66 28 20 70 55 70 70 65 72 20       if( pUpper 
171c0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62  ){.        int b
171d0 4f 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Ok;             
171e0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
171f0 66 20 76 61 6c 75 65 20 69 73 20 65 78 74 72 61  f value is extra
17200 63 74 65 64 20 66 72 6f 6d 20 70 45 78 70 72 20  cted from pExpr 
17210 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  */.        Expr 
17220 2a 70 45 78 70 72 20 3d 20 70 55 70 70 65 72 2d  *pExpr = pUpper-
17230 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  >pExpr->pRight;.
17240 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
17250 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 53 65  ite3Stat4ProbeSe
17260 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20 70  tValue(pParse, p
17270 2c 20 26 70 52 65 63 2c 20 70 45 78 70 72 2c 20  , &pRec, pExpr, 
17280 61 66 66 2c 20 6e 45 71 2c 20 26 62 4f 6b 29 3b  aff, nEq, &bOk);
17290 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
172a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 4f  =SQLITE_OK && bO
172b0 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  k ){.          t
172c0 52 6f 77 63 6e 74 20 69 4e 65 77 3b 0a 20 20 20  Rowcnt iNew;.   
172d0 20 20 20 20 20 20 20 69 55 70 72 49 64 78 20 3d         iUprIdx =
172e0 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 70   whereKeyStats(p
172f0 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20  Parse, p, pRec, 
17300 31 2c 20 61 29 3b 0a 20 20 20 20 20 20 20 20 20  1, a);.         
17310 20 69 4e 65 77 20 3d 20 61 5b 30 5d 20 2b 20 28   iNew = a[0] + (
17320 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74  (pUpper->eOperat
17330 6f 72 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 4c  or & (WO_GT|WO_L
17340 45 29 29 20 3f 20 61 5b 31 5d 20 3a 20 30 29 3b  E)) ? a[1] : 0);
17350 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
17360 4e 65 77 3c 69 55 70 70 65 72 20 29 20 69 55 70  New<iUpper ) iUp
17370 70 65 72 20 3d 20 69 4e 65 77 3b 0a 20 20 20 20  per = iNew;.    
17380 20 20 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20        nOut--;.  
17390 20 20 20 20 20 20 20 20 70 55 70 70 65 72 20 3d          pUpper =
173a0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
173b0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 42 75      }..      pBu
173c0 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20 70 52  ilder->pRec = pR
173d0 65 63 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ec;.      if( rc
173e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
173f0 20 20 20 20 20 20 20 69 66 28 20 69 55 70 70 65         if( iUppe
17400 72 3e 69 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20  r>iLower ){.    
17410 20 20 20 20 20 20 6e 4e 65 77 20 3d 20 73 71 6c        nNew = sql
17420 69 74 65 33 4c 6f 67 45 73 74 28 69 55 70 70 65  ite3LogEst(iUppe
17430 72 20 2d 20 69 4c 6f 77 65 72 29 3b 0a 20 20 20  r - iLower);.   
17440 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47         /* TUNING
17450 3a 20 20 49 66 20 62 6f 74 68 20 69 55 70 70 65  :  If both iUppe
17460 72 20 61 6e 64 20 69 4c 6f 77 65 72 20 61 72 65  r and iLower are
17470 20 64 65 72 69 76 65 64 20 66 72 6f 6d 20 74 68   derived from th
17480 65 20 73 61 6d 65 0a 20 20 20 20 20 20 20 20 20  e same.         
17490 20 2a 2a 20 73 61 6d 70 6c 65 2c 20 74 68 65 6e   ** sample, then
174a0 20 61 73 73 75 6d 65 20 74 68 65 79 20 61 72 65   assume they are
174b0 20 34 78 20 6d 6f 72 65 20 73 65 6c 65 63 74 69   4x more selecti
174c0 76 65 2e 20 20 54 68 69 73 20 62 72 69 6e 67 73  ve.  This brings
174d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68  .          ** th
174e0 65 20 65 73 74 69 6d 61 74 65 64 20 73 65 6c 65  e estimated sele
174f0 63 74 69 76 69 74 79 20 6d 6f 72 65 20 69 6e 20  ctivity more in 
17500 6c 69 6e 65 20 77 69 74 68 20 77 68 61 74 20 69  line with what i
17510 74 20 77 6f 75 6c 64 20 62 65 0a 20 20 20 20 20  t would be.     
17520 20 20 20 20 20 2a 2a 20 69 66 20 65 73 74 69 6d       ** if estim
17530 61 74 65 64 20 77 69 74 68 6f 75 74 20 74 68 65  ated without the
17540 20 75 73 65 20 6f 66 20 53 54 41 54 33 2f 34 20   use of STAT3/4 
17550 74 61 62 6c 65 73 2e 20 2a 2f 0a 20 20 20 20 20  tables. */.     
17560 20 20 20 20 20 69 66 28 20 69 4c 77 72 49 64 78       if( iLwrIdx
17570 3d 3d 69 55 70 72 49 64 78 20 29 20 6e 4e 65 77  ==iUprIdx ) nNew
17580 20 2d 3d 20 32 30 3b 20 20 61 73 73 65 72 74 28   -= 20;  assert(
17590 20 32 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   20==sqlite3LogE
175a0 73 74 28 34 29 20 29 3b 0a 20 20 20 20 20 20 20  st(4) );.       
175b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
175c0 20 20 6e 4e 65 77 20 3d 20 31 30 3b 20 20 20 20    nNew = 10;    
175d0 20 20 20 20 61 73 73 65 72 74 28 20 31 30 3d 3d      assert( 10==
175e0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 29  sqlite3LogEst(2)
175f0 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
17600 20 20 20 20 20 20 69 66 28 20 6e 4e 65 77 3c 6e        if( nNew<n
17610 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Out ){.         
17620 20 6e 4f 75 74 20 3d 20 6e 4e 65 77 3b 0a 20 20   nOut = nNew;.  
17630 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17640 57 48 45 52 45 54 52 41 43 45 28 30 78 31 30 2c  WHERETRACE(0x10,
17650 20 28 22 53 54 41 54 34 20 72 61 6e 67 65 20 73   ("STAT4 range s
17660 63 61 6e 3a 20 25 75 2e 2e 25 75 20 20 65 73 74  can: %u..%u  est
17670 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
17680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17690 20 20 20 28 75 33 32 29 69 4c 6f 77 65 72 2c 20     (u32)iLower, 
176a0 28 75 33 32 29 69 55 70 70 65 72 2c 20 6e 4f 75  (u32)iUpper, nOu
176b0 74 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  t));.      }.   
176c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
176d0 74 20 62 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20  t bDone = 0;.   
176e0 20 20 20 72 63 20 3d 20 77 68 65 72 65 52 61 6e     rc = whereRan
176f0 67 65 53 6b 69 70 53 63 61 6e 45 73 74 28 70 50  geSkipScanEst(pP
17700 61 72 73 65 2c 20 70 4c 6f 77 65 72 2c 20 70 55  arse, pLower, pU
17710 70 70 65 72 2c 20 70 4c 6f 6f 70 2c 20 26 62 44  pper, pLoop, &bD
17720 6f 6e 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  one);.      if( 
17730 62 44 6f 6e 65 20 29 20 72 65 74 75 72 6e 20 72  bDone ) return r
17740 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c  c;.    }.  }.#el
17750 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  se.  UNUSED_PARA
17760 4d 45 54 45 52 28 70 50 61 72 73 65 29 3b 0a 20  METER(pParse);. 
17770 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
17780 52 28 70 42 75 69 6c 64 65 72 29 3b 0a 20 20 61  R(pBuilder);.  a
17790 73 73 65 72 74 28 20 70 4c 6f 77 65 72 20 7c 7c  ssert( pLower ||
177a0 20 70 55 70 70 65 72 20 29 3b 0a 23 65 6e 64 69   pUpper );.#endi
177b0 66 0a 20 20 61 73 73 65 72 74 28 20 70 55 70 70  f.  assert( pUpp
177c0 65 72 3d 3d 30 20 7c 7c 20 28 70 55 70 70 65 72  er==0 || (pUpper
177d0 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
177e0 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20 20  _VNULL)==0 );.  
177f0 6e 4e 65 77 20 3d 20 77 68 65 72 65 52 61 6e 67  nNew = whereRang
17800 65 41 64 6a 75 73 74 28 70 4c 6f 77 65 72 2c 20  eAdjust(pLower, 
17810 6e 4f 75 74 29 3b 0a 20 20 6e 4e 65 77 20 3d 20  nOut);.  nNew = 
17820 77 68 65 72 65 52 61 6e 67 65 41 64 6a 75 73 74  whereRangeAdjust
17830 28 70 55 70 70 65 72 2c 20 6e 4e 65 77 29 3b 0a  (pUpper, nNew);.
17840 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 49 66  .  /* TUNING: If
17850 20 74 68 65 72 65 20 69 73 20 62 6f 74 68 20 61   there is both a
17860 6e 20 75 70 70 65 72 20 61 6e 64 20 6c 6f 77 65  n upper and lowe
17870 72 20 6c 69 6d 69 74 20 61 6e 64 20 6e 65 69 74  r limit and neit
17880 68 65 72 20 6c 69 6d 69 74 0a 20 20 2a 2a 20 68  her limit.  ** h
17890 61 73 20 61 6e 20 61 70 70 6c 69 63 61 74 69 6f  as an applicatio
178a0 6e 2d 64 65 66 69 6e 65 64 20 6c 69 6b 65 6c 69  n-defined likeli
178b0 68 6f 6f 64 28 29 2c 20 61 73 73 75 6d 65 20 74  hood(), assume t
178c0 68 65 20 72 61 6e 67 65 20 69 73 0a 20 20 2a 2a  he range is.  **
178d0 20 72 65 64 75 63 65 64 20 62 79 20 61 6e 20 61   reduced by an a
178e0 64 64 69 74 69 6f 6e 61 6c 20 37 35 25 2e 20 54  dditional 75%. T
178f0 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 2c 20  his means that, 
17900 62 79 20 64 65 66 61 75 6c 74 2c 20 61 6e 20 6f  by default, an o
17910 70 65 6e 2d 65 6e 64 65 64 0a 20 20 2a 2a 20 72  pen-ended.  ** r
17920 61 6e 67 65 20 71 75 65 72 79 20 28 65 2e 67 2e  ange query (e.g.
17930 20 63 6f 6c 20 3e 20 3f 29 20 69 73 20 61 73 73   col > ?) is ass
17940 75 6d 65 64 20 74 6f 20 6d 61 74 63 68 20 31 2f  umed to match 1/
17950 34 20 6f 66 20 74 68 65 20 72 6f 77 73 20 69 6e  4 of the rows in
17960 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 2e   the.  ** index.
17970 20 57 68 69 6c 65 20 61 20 63 6c 6f 73 65 64 20   While a closed 
17980 72 61 6e 67 65 20 28 65 2e 67 2e 20 63 6f 6c 20  range (e.g. col 
17990 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 29  BETWEEN ? AND ?)
179a0 20 69 73 20 65 73 74 69 6d 61 74 65 64 20 74 6f   is estimated to
179b0 0a 20 20 2a 2a 20 6d 61 74 63 68 20 31 2f 36 34  .  ** match 1/64
179c0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 2a   of the index. *
179d0 2f 20 0a 20 20 69 66 28 20 70 4c 6f 77 65 72 20  / .  if( pLower 
179e0 26 26 20 70 4c 6f 77 65 72 2d 3e 74 72 75 74 68  && pLower->truth
179f0 50 72 6f 62 3e 30 20 26 26 20 70 55 70 70 65 72  Prob>0 && pUpper
17a00 20 26 26 20 70 55 70 70 65 72 2d 3e 74 72 75 74   && pUpper->trut
17a10 68 50 72 6f 62 3e 30 20 29 7b 0a 20 20 20 20 6e  hProb>0 ){.    n
17a20 4e 65 77 20 2d 3d 20 32 30 3b 0a 20 20 7d 0a 0a  New -= 20;.  }..
17a30 20 20 6e 4f 75 74 20 2d 3d 20 28 70 4c 6f 77 65    nOut -= (pLowe
17a40 72 21 3d 30 29 20 2b 20 28 70 55 70 70 65 72 21  r!=0) + (pUpper!
17a50 3d 30 29 3b 0a 20 20 69 66 28 20 6e 4e 65 77 3c  =0);.  if( nNew<
17a60 31 30 20 29 20 6e 4e 65 77 20 3d 20 31 30 3b 0a  10 ) nNew = 10;.
17a70 20 20 69 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20    if( nNew<nOut 
17a80 29 20 6e 4f 75 74 20 3d 20 6e 4e 65 77 3b 0a 23  ) nOut = nNew;.#
17a90 69 66 20 64 65 66 69 6e 65 64 28 57 48 45 52 45  if defined(WHERE
17aa0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 29 0a 20  TRACE_ENABLED). 
17ab0 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74   if( pLoop->nOut
17ac0 3e 6e 4f 75 74 20 29 7b 0a 20 20 20 20 57 48 45  >nOut ){.    WHE
17ad0 52 45 54 52 41 43 45 28 30 78 31 30 2c 28 22 52  RETRACE(0x10,("R
17ae0 61 6e 67 65 20 73 63 61 6e 20 6c 6f 77 65 72 73  ange scan lowers
17af0 20 6e 4f 75 74 20 66 72 6f 6d 20 25 64 20 74 6f   nOut from %d to
17b00 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %d\n",.        
17b10 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f              pLoo
17b20 70 2d 3e 6e 4f 75 74 2c 20 6e 4f 75 74 29 29 3b  p->nOut, nOut));
17b30 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 4c  .  }.#endif.  pL
17b40 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c 6f 67  oop->nOut = (Log
17b50 45 73 74 29 6e 4f 75 74 3b 0a 20 20 72 65 74 75  Est)nOut;.  retu
17b60 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66  rn rc;.}..#ifdef
17b70 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
17b80 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a  TAT3_OR_STAT4./*
17b90 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65  .** Estimate the
17ba0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
17bb0 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74  that will be ret
17bc0 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a  urned based on.*
17bd0 2a 20 61 6e 20 65 71 75 61 6c 69 74 79 20 63 6f  * an equality co
17be0 6e 73 74 72 61 69 6e 74 20 78 3d 56 41 4c 55 45  nstraint x=VALUE
17bf0 20 61 6e 64 20 77 68 65 72 65 20 74 68 61 74 20   and where that 
17c00 56 41 4c 55 45 20 6f 63 63 75 72 73 20 69 6e 0a  VALUE occurs in.
17c10 2a 2a 20 74 68 65 20 68 69 73 74 6f 67 72 61 6d  ** the histogram
17c20 20 64 61 74 61 2e 20 20 54 68 69 73 20 6f 6e 6c   data.  This onl
17c30 79 20 77 6f 72 6b 73 20 77 68 65 6e 20 78 20 69  y works when x i
17c40 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a  s the left-most.
17c50 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20  ** column of an 
17c60 69 6e 64 65 78 20 61 6e 64 20 73 71 6c 69 74 65  index and sqlite
17c70 5f 73 74 61 74 33 20 68 69 73 74 6f 67 72 61 6d  _stat3 histogram
17c80 20 64 61 74 61 20 69 73 20 61 76 61 69 6c 61 62   data is availab
17c90 6c 65 0a 2a 2a 20 66 6f 72 20 74 68 61 74 20 69  le.** for that i
17ca0 6e 64 65 78 2e 20 20 57 68 65 6e 20 70 45 78 70  ndex.  When pExp
17cb0 72 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61  r==NULL that mea
17cc0 6e 73 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  ns the constrain
17cd0 74 20 69 73 0a 2a 2a 20 22 78 20 49 53 20 4e 55  t is.** "x IS NU
17ce0 4c 4c 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22  LL" instead of "
17cf0 78 3d 56 41 4c 55 45 22 2e 0a 2a 2a 0a 2a 2a 20  x=VALUE"..**.** 
17d00 57 72 69 74 65 20 74 68 65 20 65 73 74 69 6d 61  Write the estima
17d10 74 65 64 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e  ted row count in
17d20 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65  to *pnRow and re
17d30 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
17d40 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f  .** If unable to
17d50 20 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d 61 74   make an estimat
17d60 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20  e, leave *pnRow 
17d70 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 72 65  unchanged and re
17d80 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  turn.** non-zero
17d90 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
17da0 74 69 6e 65 20 63 61 6e 20 66 61 69 6c 20 69 66  tine can fail if
17db0 20 69 74 20 69 73 20 75 6e 61 62 6c 65 20 74 6f   it is unable to
17dc0 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e   load a collatin
17dd0 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65  g sequence.** re
17de0 71 75 69 72 65 64 20 66 6f 72 20 73 74 72 69 6e  quired for strin
17df0 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72  g comparison, or
17e00 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c   if unable to al
17e10 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a  locate memory.**
17e20 20 66 6f 72 20 61 20 55 54 46 20 63 6f 6e 76 65   for a UTF conve
17e30 72 73 69 6f 6e 20 72 65 71 75 69 72 65 64 20 66  rsion required f
17e40 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20  or comparison.  
17e50 54 68 65 20 65 72 72 6f 72 20 69 73 20 73 74 6f  The error is sto
17e60 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50  red.** in the pP
17e70 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a  arse structure..
17e80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
17e90 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28  ereEqualScanEst(
17ea0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
17eb0 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
17ec0 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61  ng & code genera
17ed0 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
17ee0 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
17ef0 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20  er *pBuilder,.  
17f00 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
17f10 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
17f20 6f 6e 20 66 6f 72 20 56 41 4c 55 45 20 69 6e 20  on for VALUE in 
17f30 74 68 65 20 78 3d 56 41 4c 55 45 20 63 6f 6e 73  the x=VALUE cons
17f40 74 72 61 69 6e 74 20 2a 2f 0a 20 20 74 52 6f 77  traint */.  tRow
17f50 63 6e 74 20 2a 70 6e 52 6f 77 20 20 20 20 20 20  cnt *pnRow      
17f60 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 65   /* Write the re
17f70 76 69 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61  vised row estima
17f80 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  te here */.){.  
17f90 49 6e 64 65 78 20 2a 70 20 3d 20 70 42 75 69 6c  Index *p = pBuil
17fa0 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72  der->pNew->u.btr
17fb0 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74  ee.pIndex;.  int
17fc0 20 6e 45 71 20 3d 20 70 42 75 69 6c 64 65 72 2d   nEq = pBuilder-
17fd0 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e  >pNew->u.btree.n
17fe0 45 71 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65  Eq;.  UnpackedRe
17ff0 63 6f 72 64 20 2a 70 52 65 63 20 3d 20 70 42 75  cord *pRec = pBu
18000 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20 75  ilder->pRec;.  u
18010 38 20 61 66 66 3b 20 20 20 20 20 20 20 20 20 20  8 aff;          
18020 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
18030 6d 6e 20 61 66 66 69 6e 69 74 79 20 2a 2f 0a 20  mn affinity */. 
18040 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
18050 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75             /* Su
18060 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e  bfunction return
18070 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f 77 63   code */.  tRowc
18080 6e 74 20 61 5b 32 5d 3b 20 20 20 20 20 20 20 20  nt a[2];        
18090 20 20 20 20 20 2f 2a 20 53 74 61 74 69 73 74 69       /* Statisti
180a0 63 73 20 2a 2f 0a 20 20 69 6e 74 20 62 4f 6b 3b  cs */.  int bOk;
180b0 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 45 71 3e  ..  assert( nEq>
180c0 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
180d0 6e 45 71 3c 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 20  nEq<=p->nColumn 
180e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
180f0 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20  aSample!=0 );.  
18100 61 73 73 65 72 74 28 20 70 2d 3e 6e 53 61 6d 70  assert( p->nSamp
18110 6c 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  le>0 );.  assert
18120 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63  ( pBuilder->nRec
18130 56 61 6c 69 64 3c 6e 45 71 20 29 3b 0a 0a 20 20  Valid<nEq );..  
18140 2f 2a 20 49 66 20 76 61 6c 75 65 73 20 61 72 65  /* If values are
18150 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 66   not available f
18160 6f 72 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66  or all fields of
18170 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20 74 68   the index to th
18180 65 20 6c 65 66 74 0a 20 20 2a 2a 20 6f 66 20 74  e left.  ** of t
18190 68 69 73 20 6f 6e 65 2c 20 6e 6f 20 65 73 74 69  his one, no esti
181a0 6d 61 74 65 20 63 61 6e 20 62 65 20 6d 61 64 65  mate can be made
181b0 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
181c0 4e 4f 54 46 4f 55 4e 44 2e 20 2a 2f 0a 20 20 69  NOTFOUND. */.  i
181d0 66 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65  f( pBuilder->nRe
181e0 63 56 61 6c 69 64 3c 28 6e 45 71 2d 31 29 20 29  cValid<(nEq-1) )
181f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
18200 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20  ITE_NOTFOUND;.  
18210 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20  }..  /* This is 
18220 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  an optimization 
18230 6f 6e 6c 79 2e 20 54 68 65 20 63 61 6c 6c 20 74  only. The call t
18240 6f 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72  o sqlite3Stat4Pr
18250 6f 62 65 53 65 74 56 61 6c 75 65 28 29 0a 20 20  obeSetValue().  
18260 2a 2a 20 62 65 6c 6f 77 20 77 6f 75 6c 64 20 72  ** below would r
18270 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20 76  eturn the same v
18280 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20  alue.  */.  if( 
18290 6e 45 71 3e 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 20  nEq>=p->nColumn 
182a0 29 7b 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20  ){.    *pnRow = 
182b0 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  1;.    return SQ
182c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
182d0 61 66 66 20 3d 20 70 2d 3e 70 54 61 62 6c 65 2d  aff = p->pTable-
182e0 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c 75 6d  >aCol[p->aiColum
182f0 6e 5b 6e 45 71 2d 31 5d 5d 2e 61 66 66 69 6e 69  n[nEq-1]].affini
18300 74 79 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ty;.  rc = sqlit
18310 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56  e3Stat4ProbeSetV
18320 61 6c 75 65 28 70 50 61 72 73 65 2c 20 70 2c 20  alue(pParse, p, 
18330 26 70 52 65 63 2c 20 70 45 78 70 72 2c 20 61 66  &pRec, pExpr, af
18340 66 2c 20 6e 45 71 2d 31 2c 20 26 62 4f 6b 29 3b  f, nEq-1, &bOk);
18350 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65  .  pBuilder->pRe
18360 63 20 3d 20 70 52 65 63 3b 0a 20 20 69 66 28 20  c = pRec;.  if( 
18370 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
18380 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28  return rc;.  if(
18390 20 62 4f 6b 3d 3d 30 20 29 20 72 65 74 75 72 6e   bOk==0 ) return
183a0 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
183b0 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52  ;.  pBuilder->nR
183c0 65 63 56 61 6c 69 64 20 3d 20 6e 45 71 3b 0a 0a  ecValid = nEq;..
183d0 20 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28    whereKeyStats(
183e0 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c  pParse, p, pRec,
183f0 20 30 2c 20 61 29 3b 0a 20 20 57 48 45 52 45 54   0, a);.  WHERET
18400 52 41 43 45 28 30 78 31 30 2c 28 22 65 71 75 61  RACE(0x10,("equa
18410 6c 69 74 79 20 73 63 61 6e 20 72 65 67 69 6f 6e  lity scan region
18420 73 3a 20 25 64 5c 6e 22 2c 20 28 69 6e 74 29 61  s: %d\n", (int)a
18430 5b 31 5d 29 29 3b 0a 20 20 2a 70 6e 52 6f 77 20  [1]));.  *pnRow 
18440 3d 20 61 5b 31 5d 3b 0a 20 20 0a 20 20 72 65 74  = a[1];.  .  ret
18450 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
18460 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
18470 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
18480 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
18490 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
184a0 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45  OR_STAT4./*.** E
184b0 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62  stimate the numb
184c0 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  er of rows that 
184d0 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
184e0 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20   based on.** an 
184f0 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20 77 68  IN constraint wh
18500 65 72 65 20 74 68 65 20 72 69 67 68 74 2d 68 61  ere the right-ha
18510 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 49  nd side of the I
18520 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73  N operator.** is
18530 20 61 20 6c 69 73 74 20 6f 66 20 76 61 6c 75 65   a list of value
18540 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  s.  Example:.**.
18550 2a 2a 20 20 20 20 20 20 20 20 57 48 45 52 45 20  **        WHERE 
18560 78 20 49 4e 20 28 31 2c 32 2c 33 2c 34 29 0a 2a  x IN (1,2,3,4).*
18570 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 65  *.** Write the e
18580 73 74 69 6d 61 74 65 64 20 72 6f 77 20 63 6f 75  stimated row cou
18590 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61  nt into *pnRow a
185a0 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
185b0 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62  _OK. .** If unab
185c0 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73  le to make an es
185d0 74 69 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a 70  timate, leave *p
185e0 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65 64 20 61  nRow unchanged a
185f0 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e  nd return.** non
18600 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  -zero..**.** Thi
18610 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 66 61  s routine can fa
18620 69 6c 20 69 66 20 69 74 20 69 73 20 75 6e 61 62  il if it is unab
18630 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c  le to load a col
18640 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0a  lating sequence.
18650 2a 2a 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  ** required for 
18660 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f  string compariso
18670 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62 6c 65 20  n, or if unable 
18680 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  to allocate memo
18690 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 20  ry.** for a UTF 
186a0 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65 71 75 69  conversion requi
186b0 72 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 73  red for comparis
186c0 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f 72 20 69  on.  The error i
186d0 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74  s stored.** in t
186e0 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74  he pParse struct
186f0 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ure..*/.static i
18700 6e 74 20 77 68 65 72 65 49 6e 53 63 61 6e 45 73  nt whereInScanEs
18710 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
18720 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
18730 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65  sing & code gene
18740 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
18750 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  /.  WhereLoopBui
18760 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a  lder *pBuilder,.
18770 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
18780 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61  t,     /* The va
18790 6c 75 65 20 6c 69 73 74 20 6f 6e 20 74 68 65 20  lue list on the 
187a0 52 48 53 20 6f 66 20 22 78 20 49 4e 20 28 76 31  RHS of "x IN (v1
187b0 2c 76 32 2c 76 33 2c 2e 2e 2e 29 22 20 2a 2f 0a  ,v2,v3,...)" */.
187c0 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e 52 6f 77    tRowcnt *pnRow
187d0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
187e0 74 68 65 20 72 65 76 69 73 65 64 20 72 6f 77 20  the revised row 
187f0 65 73 74 69 6d 61 74 65 20 68 65 72 65 20 2a 2f  estimate here */
18800 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d  .){.  Index *p =
18810 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d   pBuilder->pNew-
18820 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
18830 0a 20 20 69 36 34 20 6e 52 6f 77 30 20 3d 20 73  .  i64 nRow0 = s
18840 71 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e  qlite3LogEstToIn
18850 74 28 70 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  t(p->aiRowLogEst
18860 5b 30 5d 29 3b 0a 20 20 69 6e 74 20 6e 52 65 63  [0]);.  int nRec
18870 56 61 6c 69 64 20 3d 20 70 42 75 69 6c 64 65 72  Valid = pBuilder
18880 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 69  ->nRecValid;.  i
18890 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
188a0 4b 3b 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e  K;     /* Subfun
188b0 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64  ction return cod
188c0 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e  e */.  tRowcnt n
188d0 45 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Est;           /
188e0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * Number of rows
188f0 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74 65   for a single te
18900 72 6d 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  rm */.  tRowcnt 
18910 6e 52 6f 77 45 73 74 20 3d 20 30 3b 20 20 20 20  nRowEst = 0;    
18920 2f 2a 20 4e 65 77 20 65 73 74 69 6d 61 74 65 20  /* New estimate 
18930 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
18940 20 72 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20 69   rows */.  int i
18950 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18960 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
18970 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  er */..  assert(
18980 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29   p->aSample!=0 )
18990 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d  ;.  for(i=0; rc=
189a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
189b0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
189c0 2b 29 7b 0a 20 20 20 20 6e 45 73 74 20 3d 20 6e  +){.    nEst = n
189d0 52 6f 77 30 3b 0a 20 20 20 20 72 63 20 3d 20 77  Row0;.    rc = w
189e0 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74  hereEqualScanEst
189f0 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65  (pParse, pBuilde
18a00 72 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  r, pList->a[i].p
18a10 45 78 70 72 2c 20 26 6e 45 73 74 29 3b 0a 20 20  Expr, &nEst);.  
18a20 20 20 6e 52 6f 77 45 73 74 20 2b 3d 20 6e 45 73    nRowEst += nEs
18a30 74 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d  t;.    pBuilder-
18a40 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e 52 65  >nRecValid = nRe
18a50 63 56 61 6c 69 64 3b 0a 20 20 7d 0a 0a 20 20 69  cValid;.  }..  i
18a60 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
18a70 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 52 6f 77   ){.    if( nRow
18a80 45 73 74 20 3e 20 6e 52 6f 77 30 20 29 20 6e 52  Est > nRow0 ) nR
18a90 6f 77 45 73 74 20 3d 20 6e 52 6f 77 30 3b 0a 20  owEst = nRow0;. 
18aa0 20 20 20 2a 70 6e 52 6f 77 20 3d 20 6e 52 6f 77     *pnRow = nRow
18ab0 45 73 74 3b 0a 20 20 20 20 57 48 45 52 45 54 52  Est;.    WHERETR
18ac0 41 43 45 28 30 78 31 30 2c 28 22 49 4e 20 72 6f  ACE(0x10,("IN ro
18ad0 77 20 65 73 74 69 6d 61 74 65 3a 20 65 73 74 3d  w estimate: est=
18ae0 25 64 5c 6e 22 2c 20 6e 52 6f 77 45 73 74 29 29  %d\n", nRowEst))
18af0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
18b00 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
18b10 6c 69 64 3d 3d 6e 52 65 63 56 61 6c 69 64 20 29  lid==nRecValid )
18b20 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
18b30 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
18b40 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
18b50 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a  R_STAT4 */../*.*
18b60 2a 20 44 69 73 61 62 6c 65 20 61 20 74 65 72 6d  * Disable a term
18b70 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
18b80 61 75 73 65 2e 20 20 45 78 63 65 70 74 2c 20 64  ause.  Except, d
18b90 6f 20 6e 6f 74 20 64 69 73 61 62 6c 65 20 74 68  o not disable th
18ba0 65 20 74 65 72 6d 0a 2a 2a 20 69 66 20 69 74 20  e term.** if it 
18bb0 63 6f 6e 74 72 6f 6c 73 20 61 20 4c 45 46 54 20  controls a LEFT 
18bc0 4f 55 54 45 52 20 4a 4f 49 4e 20 61 6e 64 20 69  OUTER JOIN and i
18bd0 74 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e  t did not origin
18be0 61 74 65 20 69 6e 20 74 68 65 20 4f 4e 0a 2a 2a  ate in the ON.**
18bf0 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
18c00 20 6f 66 20 74 68 61 74 20 6a 6f 69 6e 2e 0a 2a   of that join..*
18c10 2a 0a 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74 68  *.** Consider th
18c20 65 20 74 65 72 6d 20 74 32 2e 7a 3d 27 6f 6b 27  e term t2.z='ok'
18c30 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
18c40 67 20 71 75 65 72 69 65 73 3a 0a 2a 2a 0a 2a 2a  g queries:.**.**
18c50 20 20 20 28 31 29 20 20 53 45 4c 45 43 54 20 2a     (1)  SELECT *
18c60 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f   FROM t1 LEFT JO
18c70 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32  IN t2 ON t1.a=t2
18c80 2e 78 20 57 48 45 52 45 20 74 32 2e 7a 3d 27 6f  .x WHERE t2.z='o
18c90 6b 27 0a 2a 2a 20 20 20 28 32 29 20 20 53 45 4c  k'.**   (2)  SEL
18ca0 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45  ECT * FROM t1 LE
18cb0 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31  FT JOIN t2 ON t1
18cc0 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a  .a=t2.x AND t2.z
18cd0 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 33 29 20 20  ='ok'.**   (3)  
18ce0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
18cf0 2c 20 74 32 20 57 48 45 52 45 20 74 31 2e 61 3d  , t2 WHERE t1.a=
18d00 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f  t2.x AND t2.z='o
18d10 6b 27 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 32 2e  k'.**.** The t2.
18d20 7a 3d 27 6f 6b 27 20 69 73 20 64 69 73 61 62 6c  z='ok' is disabl
18d30 65 64 20 69 6e 20 74 68 65 20 69 6e 20 28 32 29  ed in the in (2)
18d40 20 62 65 63 61 75 73 65 20 69 74 20 6f 72 69 67   because it orig
18d50 69 6e 61 74 65 73 0a 2a 2a 20 69 6e 20 74 68 65  inates.** in the
18d60 20 4f 4e 20 63 6c 61 75 73 65 2e 20 20 54 68 65   ON clause.  The
18d70 20 74 65 72 6d 20 69 73 20 64 69 73 61 62 6c 65   term is disable
18d80 64 20 69 6e 20 28 33 29 20 62 65 63 61 75 73 65  d in (3) because
18d90 20 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74 0a   it is not part.
18da0 2a 2a 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54  ** of a LEFT OUT
18db0 45 52 20 4a 4f 49 4e 2e 20 20 49 6e 20 28 31 29  ER JOIN.  In (1)
18dc0 2c 20 74 68 65 20 74 65 72 6d 20 69 73 20 6e 6f  , the term is no
18dd0 74 20 64 69 73 61 62 6c 65 64 2e 0a 2a 2a 0a 2a  t disabled..**.*
18de0 2a 20 44 69 73 61 62 6c 69 6e 67 20 61 20 74 65  * Disabling a te
18df0 72 6d 20 63 61 75 73 65 73 20 74 68 61 74 20 74  rm causes that t
18e00 65 72 6d 20 74 6f 20 6e 6f 74 20 62 65 20 74 65  erm to not be te
18e10 73 74 65 64 20 69 6e 20 74 68 65 20 69 6e 6e 65  sted in the inne
18e20 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 74 68 65  r loop.** of the
18e30 20 6a 6f 69 6e 2e 20 20 44 69 73 61 62 6c 69 6e   join.  Disablin
18e40 67 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  g is an optimiza
18e50 74 69 6f 6e 2e 20 20 57 68 65 6e 20 74 65 72 6d  tion.  When term
18e60 73 20 61 72 65 20 73 61 74 69 73 66 69 65 64 0a  s are satisfied.
18e70 2a 2a 20 62 79 20 69 6e 64 69 63 65 73 2c 20 77  ** by indices, w
18e80 65 20 64 69 73 61 62 6c 65 20 74 68 65 6d 20 74  e disable them t
18e90 6f 20 70 72 65 76 65 6e 74 20 72 65 64 75 6e 64  o prevent redund
18ea0 61 6e 74 20 74 65 73 74 73 20 69 6e 20 74 68 65  ant tests in the
18eb0 20 69 6e 6e 65 72 0a 2a 2a 20 6c 6f 6f 70 2e 20   inner.** loop. 
18ec0 20 57 65 20 77 6f 75 6c 64 20 67 65 74 20 74 68   We would get th
18ed0 65 20 63 6f 72 72 65 63 74 20 72 65 73 75 6c 74  e correct result
18ee0 73 20 69 66 20 6e 6f 74 68 69 6e 67 20 77 65 72  s if nothing wer
18ef0 65 20 65 76 65 72 20 64 69 73 61 62 6c 65 64 2c  e ever disabled,
18f00 0a 2a 2a 20 62 75 74 20 6a 6f 69 6e 73 20 6d 69  .** but joins mi
18f10 67 68 74 20 72 75 6e 20 61 20 6c 69 74 74 6c 65  ght run a little
18f20 20 73 6c 6f 77 65 72 2e 20 20 54 68 65 20 74 72   slower.  The tr
18f30 69 63 6b 20 69 73 20 74 6f 20 64 69 73 61 62 6c  ick is to disabl
18f40 65 20 61 73 20 6d 75 63 68 0a 2a 2a 20 61 73 20  e as much.** as 
18f50 77 65 20 63 61 6e 20 77 69 74 68 6f 75 74 20 64  we can without d
18f60 69 73 61 62 6c 69 6e 67 20 74 6f 6f 20 6d 75 63  isabling too muc
18f70 68 2e 20 20 49 66 20 77 65 20 64 69 73 61 62 6c  h.  If we disabl
18f80 65 64 20 69 6e 20 28 31 29 2c 20 77 65 27 64 20  ed in (1), we'd 
18f90 67 65 74 0a 2a 2a 20 74 68 65 20 77 72 6f 6e 67  get.** the wrong
18fa0 20 61 6e 73 77 65 72 2e 20 20 53 65 65 20 74 69   answer.  See ti
18fb0 63 6b 65 74 20 23 38 31 33 2e 0a 2a 2a 0a 2a 2a  cket #813..**.**
18fc0 20 49 66 20 61 6c 6c 20 74 68 65 20 63 68 69 6c   If all the chil
18fd0 64 72 65 6e 20 6f 66 20 61 20 74 65 72 6d 20 61  dren of a term a
18fe0 72 65 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65  re disabled, the
18ff0 6e 20 74 68 61 74 20 74 65 72 6d 20 69 73 20 61  n that term is a
19000 6c 73 6f 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63  lso.** automatic
19010 61 6c 6c 79 20 64 69 73 61 62 6c 65 64 2e 20 20  ally disabled.  
19020 49 6e 20 74 68 69 73 20 77 61 79 2c 20 74 65 72  In this way, ter
19030 6d 73 20 67 65 74 20 64 69 73 61 62 6c 65 64 20  ms get disabled 
19040 69 66 20 64 65 72 69 76 65 64 0a 2a 2a 20 76 69  if derived.** vi
19050 72 74 75 61 6c 20 74 65 72 6d 73 20 61 72 65 20  rtual terms are 
19060 74 65 73 74 65 64 20 66 69 72 73 74 2e 20 20 46  tested first.  F
19070 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
19080 2a 20 20 20 20 20 20 78 20 47 4c 4f 42 20 27 61  *      x GLOB 'a
19090 62 63 2a 27 20 41 4e 44 20 78 3e 3d 27 61 62 63  bc*' AND x>='abc
190a0 27 20 41 4e 44 20 78 3c 27 61 63 64 27 0a 2a 2a  ' AND x<'acd'.**
190b0 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f        \_________
190c0 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 2f  __/     \______/
190d0 20 20 20 20 20 5c 5f 5f 5f 5f 5f 2f 0a 2a 2a 20       \_____/.** 
190e0 20 20 20 20 20 20 20 20 70 61 72 65 6e 74 20 20          parent  
190f0 20 20 20 20 20 20 20 20 63 68 69 6c 64 31 20 20          child1  
19100 20 20 20 20 20 63 68 69 6c 64 32 0a 2a 2a 0a 2a       child2.**.*
19110 2a 20 4f 6e 6c 79 20 74 68 65 20 70 61 72 65 6e  * Only the paren
19120 74 20 74 65 72 6d 20 77 61 73 20 69 6e 20 74 68  t term was in th
19130 65 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45  e original WHERE
19140 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 63 68   clause.  The ch
19150 69 6c 64 31 0a 2a 2a 20 61 6e 64 20 63 68 69 6c  ild1.** and chil
19160 64 32 20 74 65 72 6d 73 20 77 65 72 65 20 61 64  d2 terms were ad
19170 64 65 64 20 62 79 20 74 68 65 20 4c 49 4b 45 20  ded by the LIKE 
19180 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49  optimization.  I
19190 66 20 62 6f 74 68 20 6f 66 0a 2a 2a 20 74 68 65  f both of.** the
191a0 20 76 69 72 74 75 61 6c 20 63 68 69 6c 64 20 74   virtual child t
191b0 65 72 6d 73 20 61 72 65 20 76 61 6c 69 64 2c 20  erms are valid, 
191c0 74 68 65 6e 20 74 65 73 74 69 6e 67 20 6f 66 20  then testing of 
191d0 74 68 65 20 70 61 72 65 6e 74 20 63 61 6e 20 62  the parent can b
191e0 65 20 0a 2a 2a 20 73 6b 69 70 70 65 64 2e 0a 2a  e .** skipped..*
191f0 2a 0a 2a 2a 20 55 73 75 61 6c 6c 79 20 74 68 65  *.** Usually the
19200 20 70 61 72 65 6e 74 20 74 65 72 6d 20 69 73 20   parent term is 
19210 6d 61 72 6b 65 64 20 61 73 20 54 45 52 4d 5f 43  marked as TERM_C
19220 4f 44 45 44 2e 20 20 42 75 74 20 69 66 20 74 68  ODED.  But if th
19230 65 20 70 61 72 65 6e 74 0a 2a 2a 20 74 65 72 6d  e parent.** term
19240 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20   was originally 
19250 54 45 52 4d 5f 4c 49 4b 45 2c 20 74 68 65 6e 20  TERM_LIKE, then 
19260 74 68 65 20 70 61 72 65 6e 74 20 67 65 74 73 20  the parent gets 
19270 54 45 52 4d 5f 4c 49 4b 45 43 4f 4e 44 20 69 6e  TERM_LIKECOND in
19280 73 74 65 61 64 2e 0a 2a 2a 20 54 68 65 20 54 45  stead..** The TE
19290 52 4d 5f 4c 49 4b 45 43 4f 4e 44 20 6d 61 72 6b  RM_LIKECOND mark
192a0 69 6e 67 20 69 6e 64 69 63 61 74 65 73 20 74 68  ing indicates th
192b0 61 74 20 74 68 65 20 74 65 72 6d 20 73 68 6f 75  at the term shou
192c0 6c 64 20 62 65 20 63 6f 64 65 64 20 69 6e 73 69  ld be coded insi
192d0 64 65 0a 2a 2a 20 61 20 63 6f 6e 64 69 74 69 6f  de.** a conditio
192e0 6e 61 6c 20 73 75 63 68 20 74 68 61 74 20 69 73  nal such that is
192f0 20 6f 6e 6c 79 20 65 76 61 6c 75 61 74 65 64 20   only evaluated 
19300 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  on the second pa
19310 73 73 20 6f 66 20 61 0a 2a 2a 20 4c 49 4b 45 2d  ss of a.** LIKE-
19320 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6c 6f 6f  optimization loo
19330 70 2c 20 77 68 65 6e 20 73 63 61 6e 6e 69 6e 67  p, when scanning
19340 20 42 4c 4f 42 73 20 69 6e 73 74 65 61 64 20 6f   BLOBs instead o
19350 66 20 73 74 72 69 6e 67 73 2e 0a 2a 2f 0a 73 74  f strings..*/.st
19360 61 74 69 63 20 76 6f 69 64 20 64 69 73 61 62 6c  atic void disabl
19370 65 54 65 72 6d 28 57 68 65 72 65 4c 65 76 65 6c  eTerm(WhereLevel
19380 20 2a 70 4c 65 76 65 6c 2c 20 57 68 65 72 65 54   *pLevel, WhereT
19390 65 72 6d 20 2a 70 54 65 72 6d 29 7b 0a 20 20 69  erm *pTerm){.  i
193a0 6e 74 20 6e 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20  nt nLoop = 0;.  
193b0 77 68 69 6c 65 28 20 70 54 65 72 6d 0a 20 20 20  while( pTerm.   
193c0 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 77 74     && (pTerm->wt
193d0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44  Flags & TERM_COD
193e0 45 44 29 3d 3d 30 0a 20 20 20 20 20 20 26 26 20  ED)==0.      && 
193f0 28 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f  (pLevel->iLeftJo
19400 69 6e 3d 3d 30 20 7c 7c 20 45 78 70 72 48 61 73  in==0 || ExprHas
19410 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e  Property(pTerm->
19420 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
19430 69 6e 29 29 0a 20 20 20 20 20 20 26 26 20 28 70  in)).      && (p
19440 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 20  Level->notReady 
19450 26 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41  & pTerm->prereqA
19460 6c 6c 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20  ll)==0.  ){.    
19470 69 66 28 20 6e 4c 6f 6f 70 20 26 26 20 28 70 54  if( nLoop && (pT
19480 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
19490 45 52 4d 5f 4c 49 4b 45 29 21 3d 30 20 29 7b 0a  ERM_LIKE)!=0 ){.
194a0 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46        pTerm->wtF
194b0 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4c 49 4b  lags |= TERM_LIK
194c0 45 43 4f 4e 44 3b 0a 20 20 20 20 7d 65 6c 73 65  ECOND;.    }else
194d0 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77  {.      pTerm->w
194e0 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
194f0 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ODED;.    }.    
19500 69 66 28 20 70 54 65 72 6d 2d 3e 69 50 61 72 65  if( pTerm->iPare
19510 6e 74 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  nt<0 ) break;.  
19520 20 20 70 54 65 72 6d 20 3d 20 26 70 54 65 72 6d    pTerm = &pTerm
19530 2d 3e 70 57 43 2d 3e 61 5b 70 54 65 72 6d 2d 3e  ->pWC->a[pTerm->
19540 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20 70 54  iParent];.    pT
19550 65 72 6d 2d 3e 6e 43 68 69 6c 64 2d 2d 3b 0a 20  erm->nChild--;. 
19560 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6e 43     if( pTerm->nC
19570 68 69 6c 64 21 3d 30 20 29 20 62 72 65 61 6b 3b  hild!=0 ) break;
19580 0a 20 20 20 20 6e 4c 6f 6f 70 2b 2b 3b 0a 20 20  .    nLoop++;.  
19590 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20  }.}../*.** Code 
195a0 61 6e 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f  an OP_Affinity o
195b0 70 63 6f 64 65 20 74 6f 20 61 70 70 6c 79 20 74  pcode to apply t
195c0 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69  he column affini
195d0 74 79 20 73 74 72 69 6e 67 20 7a 41 66 66 0a 2a  ty string zAff.*
195e0 2a 20 74 6f 20 74 68 65 20 6e 20 72 65 67 69 73  * to the n regis
195f0 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 61 74  ters starting at
19600 20 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 41 73   base. .**.** As
19610 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
19620 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  , SQLITE_AFF_NON
19630 45 20 65 6e 74 72 69 65 73 20 28 77 68 69 63 68  E entries (which
19640 20 61 72 65 20 6e 6f 2d 6f 70 73 29 20 61 74 20   are no-ops) at 
19650 74 68 65 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e 67  the.** beginning
19660 20 61 6e 64 20 65 6e 64 20 6f 66 20 7a 41 66 66   and end of zAff
19670 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 20 20 49   are ignored.  I
19680 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e  f all entries in
19690 20 7a 41 66 66 20 61 72 65 0a 2a 2a 20 53 51 4c   zAff are.** SQL
196a0 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2c 20 74 68  ITE_AFF_NONE, th
196b0 65 6e 20 6e 6f 20 63 6f 64 65 20 67 65 74 73 20  en no code gets 
196c0 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  generated..**.**
196d0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
196e0 6b 65 73 20 69 74 73 20 6f 77 6e 20 63 6f 70 79  kes its own copy
196f0 20 6f 66 20 7a 41 66 66 20 73 6f 20 74 68 61 74   of zAff so that
19700 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 66   the caller is f
19710 72 65 65 0a 2a 2a 20 74 6f 20 6d 6f 64 69 66 79  ree.** to modify
19720 20 7a 41 66 66 20 61 66 74 65 72 20 74 68 69 73   zAff after this
19730 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
19740 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
19750 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69   codeApplyAffini
19760 74 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ty(Parse *pParse
19770 2c 20 69 6e 74 20 62 61 73 65 2c 20 69 6e 74 20  , int base, int 
19780 6e 2c 20 63 68 61 72 20 2a 7a 41 66 66 29 7b 0a  n, char *zAff){.
19790 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
197a0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28  se->pVdbe;.  if(
197b0 20 7a 41 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20   zAff==0 ){.    
197c0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
197d0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
197e0 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   );.    return;.
197f0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 76 21    }.  assert( v!
19800 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 6a 75  =0 );..  /* Adju
19810 73 74 20 62 61 73 65 20 61 6e 64 20 6e 20 74 6f  st base and n to
19820 20 73 6b 69 70 20 6f 76 65 72 20 53 51 4c 49 54   skip over SQLIT
19830 45 5f 41 46 46 5f 4e 4f 4e 45 20 65 6e 74 72 69  E_AFF_NONE entri
19840 65 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  es at the beginn
19850 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 65 6e 64  ing.  ** and end
19860 20 6f 66 20 74 68 65 20 61 66 66 69 6e 69 74 79   of the affinity
19870 20 73 74 72 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20   string..  */.  
19880 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a 41  while( n>0 && zA
19890 66 66 5b 30 5d 3d 3d 53 51 4c 49 54 45 5f 41 46  ff[0]==SQLITE_AF
198a0 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 6e 2d  F_NONE ){.    n-
198b0 2d 3b 0a 20 20 20 20 62 61 73 65 2b 2b 3b 0a 20  -;.    base++;. 
198c0 20 20 20 7a 41 66 66 2b 2b 3b 0a 20 20 7d 0a 20     zAff++;.  }. 
198d0 20 77 68 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a   while( n>1 && z
198e0 41 66 66 5b 6e 2d 31 5d 3d 3d 53 51 4c 49 54 45  Aff[n-1]==SQLITE
198f0 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  _AFF_NONE ){.   
19900 20 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   n--;.  }..  /* 
19910 43 6f 64 65 20 74 68 65 20 4f 50 5f 41 66 66 69  Code the OP_Affi
19920 6e 69 74 79 20 6f 70 63 6f 64 65 20 69 66 20 74  nity opcode if t
19930 68 65 72 65 20 69 73 20 61 6e 79 74 68 69 6e 67  here is anything
19940 20 6c 65 66 74 20 74 6f 20 64 6f 2e 20 2a 2f 0a   left to do. */.
19950 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20    if( n>0 ){.   
19960 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19970 70 32 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74  p2(v, OP_Affinit
19980 79 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20 20  y, base, n);.   
19990 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
199a0 67 65 50 34 28 76 2c 20 2d 31 2c 20 7a 41 66 66  geP4(v, -1, zAff
199b0 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , n);.    sqlite
199c0 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
199d0 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
199e0 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20 7d 0a 7d   base, n);.  }.}
199f0 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
19a00 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73 69 6e  e code for a sin
19a10 67 6c 65 20 65 71 75 61 6c 69 74 79 20 74 65 72  gle equality ter
19a20 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  m of the WHERE c
19a30 6c 61 75 73 65 2e 20 20 41 6e 20 65 71 75 61 6c  lause.  An equal
19a40 69 74 79 0a 2a 2a 20 74 65 72 6d 20 63 61 6e 20  ity.** term can 
19a50 62 65 20 65 69 74 68 65 72 20 58 3d 65 78 70 72  be either X=expr
19a60 20 6f 72 20 58 20 49 4e 20 28 2e 2e 2e 29 2e 20   or X IN (...). 
19a70 20 20 70 54 65 72 6d 20 69 73 20 74 68 65 20 74    pTerm is the t
19a80 65 72 6d 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f  erm to be .** co
19a90 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ded..**.** The c
19aa0 75 72 72 65 6e 74 20 76 61 6c 75 65 20 66 6f 72  urrent value for
19ab0 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
19ac0 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67 69 73  is left in regis
19ad0 74 65 72 20 69 52 65 67 2e 0a 2a 2a 0a 2a 2a 20  ter iReg..**.** 
19ae0 46 6f 72 20 61 20 63 6f 6e 73 74 72 61 69 6e 74  For a constraint
19af0 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 3d 65   of the form X=e
19b00 78 70 72 2c 20 74 68 65 20 65 78 70 72 65 73 73  xpr, the express
19b10 69 6f 6e 20 69 73 20 65 76 61 6c 75 61 74 65 64  ion is evaluated
19b20 20 61 6e 64 20 69 74 73 0a 2a 2a 20 72 65 73 75   and its.** resu
19b30 6c 74 20 69 73 20 6c 65 66 74 20 6f 6e 20 74 68  lt is left on th
19b40 65 20 73 74 61 63 6b 2e 20 20 46 6f 72 20 63 6f  e stack.  For co
19b50 6e 73 74 72 61 69 6e 74 73 20 6f 66 20 74 68 65  nstraints of the
19b60 20 66 6f 72 6d 20 58 20 49 4e 20 28 2e 2e 2e 29   form X IN (...)
19b70 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
19b80 20 73 65 74 73 20 75 70 20 61 20 6c 6f 6f 70 20   sets up a loop 
19b90 74 68 61 74 20 77 69 6c 6c 20 69 74 65 72 61 74  that will iterat
19ba0 65 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c 75 65  e over all value
19bb0 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73 74 61 74 69  s of X..*/.stati
19bc0 63 20 69 6e 74 20 63 6f 64 65 45 71 75 61 6c 69  c int codeEquali
19bd0 74 79 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20  tyTerm(.  Parse 
19be0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
19bf0 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
19c00 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54  text */.  WhereT
19c10 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20 2f 2a  erm *pTerm,   /*
19c20 20 54 68 65 20 74 65 72 6d 20 6f 66 20 74 68 65   The term of the
19c30 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
19c40 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57   be coded */.  W
19c50 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
19c60 6c 2c 20 2f 2a 20 54 68 65 20 6c 65 76 65 6c 20  l, /* The level 
19c70 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
19c80 73 65 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e  se we are workin
19c90 67 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 45  g on */.  int iE
19ca0 71 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  q,            /*
19cb0 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 65 71   Index of the eq
19cc0 75 61 6c 69 74 79 20 74 65 72 6d 20 77 69 74 68  uality term with
19cd0 69 6e 20 74 68 69 73 20 6c 65 76 65 6c 20 2a 2f  in this level */
19ce0 0a 20 20 69 6e 74 20 62 52 65 76 2c 20 20 20 20  .  int bRev,    
19cf0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
19d00 6f 72 20 72 65 76 65 72 73 65 2d 6f 72 64 65 72  or reverse-order
19d10 20 49 4e 20 6f 70 65 72 61 74 69 6f 6e 73 20 2a   IN operations *
19d20 2f 0a 20 20 69 6e 74 20 69 54 61 72 67 65 74 20  /.  int iTarget 
19d30 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 65 6d          /* Attem
19d40 70 74 20 74 6f 20 6c 65 61 76 65 20 72 65 73 75  pt to leave resu
19d50 6c 74 73 20 69 6e 20 74 68 69 73 20 72 65 67 69  lts in this regi
19d60 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  ster */.){.  Exp
19d70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70  r *pX = pTerm->p
19d80 45 78 70 72 3b 0a 20 20 56 64 62 65 20 2a 76 20  Expr;.  Vdbe *v 
19d90 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
19da0 0a 20 20 69 6e 74 20 69 52 65 67 3b 20 20 20 20  .  int iReg;    
19db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19dc0 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
19dd0 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a 20 20  g results */..  
19de0 61 73 73 65 72 74 28 20 69 54 61 72 67 65 74 3e  assert( iTarget>
19df0 30 20 29 3b 0a 20 20 69 66 28 20 70 58 2d 3e 6f  0 );.  if( pX->o
19e00 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70 58 2d 3e  p==TK_EQ || pX->
19e10 6f 70 3d 3d 54 4b 5f 49 53 20 29 7b 0a 20 20 20  op==TK_IS ){.   
19e20 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45   iReg = sqlite3E
19e30 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
19e40 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74  arse, pX->pRight
19e50 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20 7d 65  , iTarget);.  }e
19e60 6c 73 65 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d  lse if( pX->op==
19e70 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20  TK_ISNULL ){.   
19e80 20 69 52 65 67 20 3d 20 69 54 61 72 67 65 74 3b   iReg = iTarget;
19e90 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
19ea0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
19eb0 6c 2c 20 30 2c 20 69 52 65 67 29 3b 0a 23 69 66  l, 0, iReg);.#if
19ec0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
19ed0 5f 53 55 42 51 55 45 52 59 0a 20 20 7d 65 6c 73  _SUBQUERY.  }els
19ee0 65 7b 0a 20 20 20 20 69 6e 74 20 65 54 79 70 65  e{.    int eType
19ef0 3b 0a 20 20 20 20 69 6e 74 20 69 54 61 62 3b 0a  ;.    int iTab;.
19f00 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f      struct InLoo
19f10 70 20 2a 70 49 6e 3b 0a 20 20 20 20 57 68 65 72  p *pIn;.    Wher
19f20 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20 70  eLoop *pLoop = p
19f30 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 0a  Level->pWLoop;..
19f40 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e      if( (pLoop->
19f50 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
19f60 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30  VIRTUALTABLE)==0
19f70 0a 20 20 20 20 20 20 26 26 20 70 4c 6f 6f 70 2d  .      && pLoop-
19f80 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 21  >u.btree.pIndex!
19f90 3d 30 0a 20 20 20 20 20 20 26 26 20 70 4c 6f 6f  =0.      && pLoo
19fa0 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
19fb0 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 45  x->aSortOrder[iE
19fc0 71 5d 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  q].    ){.      
19fd0 74 65 73 74 63 61 73 65 28 20 69 45 71 3d 3d 30  testcase( iEq==0
19fe0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
19ff0 73 65 28 20 62 52 65 76 20 29 3b 0a 20 20 20 20  se( bRev );.    
1a000 20 20 62 52 65 76 20 3d 20 21 62 52 65 76 3b 0a    bRev = !bRev;.
1a010 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1a020 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20  ( pX->op==TK_IN 
1a030 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20 69 54  );.    iReg = iT
1a040 61 72 67 65 74 3b 0a 20 20 20 20 65 54 79 70 65  arget;.    eType
1a050 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
1a060 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 58  Index(pParse, pX
1a070 2c 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 2c  , IN_INDEX_LOOP,
1a080 20 30 29 3b 0a 20 20 20 20 69 66 28 20 65 54 79   0);.    if( eTy
1a090 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44  pe==IN_INDEX_IND
1a0a0 45 58 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 20  EX_DESC ){.     
1a0b0 20 74 65 73 74 63 61 73 65 28 20 62 52 65 76 20   testcase( bRev 
1a0c0 29 3b 0a 20 20 20 20 20 20 62 52 65 76 20 3d 20  );.      bRev = 
1a0d0 21 62 52 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20  !bRev;.    }.   
1a0e0 20 69 54 61 62 20 3d 20 70 58 2d 3e 69 54 61 62   iTab = pX->iTab
1a0f0 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  le;.    sqlite3V
1a100 64 62 65 41 64 64 4f 70 32 28 76 2c 20 62 52 65  dbeAddOp2(v, bRe
1a110 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50  v ? OP_Last : OP
1a120 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 30  _Rewind, iTab, 0
1a130 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
1a140 61 67 65 49 66 28 76 2c 20 62 52 65 76 29 3b 0a  ageIf(v, bRev);.
1a150 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1a160 49 66 28 76 2c 20 21 62 52 65 76 29 3b 0a 20 20  If(v, !bRev);.  
1a170 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70    assert( (pLoop
1a180 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
1a190 45 5f 4d 55 4c 54 49 5f 4f 52 29 3d 3d 30 20 29  E_MULTI_OR)==0 )
1a1a0 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46  ;.    pLoop->wsF
1a1b0 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 49 4e  lags |= WHERE_IN
1a1c0 5f 41 42 4c 45 3b 0a 20 20 20 20 69 66 28 20 70  _ABLE;.    if( p
1a1d0 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3d  Level->u.in.nIn=
1a1e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76  =0 ){.      pLev
1a1f0 65 6c 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73 71  el->addrNxt = sq
1a200 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
1a210 65 6c 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20  el(v);.    }.   
1a220 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49   pLevel->u.in.nI
1a230 6e 2b 2b 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  n++;.    pLevel-
1a240 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 20 3d 0a  >u.in.aInLoop =.
1a250 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
1a260 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 50  ReallocOrFree(pP
1a270 61 72 73 65 2d 3e 64 62 2c 20 70 4c 65 76 65 6c  arse->db, pLevel
1a280 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 2c 0a  ->u.in.aInLoop,.
1a290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
1a2b0 7a 65 6f 66 28 70 4c 65 76 65 6c 2d 3e 75 2e 69  zeof(pLevel->u.i
1a2c0 6e 2e 61 49 6e 4c 6f 6f 70 5b 30 5d 29 2a 70 4c  n.aInLoop[0])*pL
1a2d0 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 29 3b  evel->u.in.nIn);
1a2e0 0a 20 20 20 20 70 49 6e 20 3d 20 70 4c 65 76 65  .    pIn = pLeve
1a2f0 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 3b  l->u.in.aInLoop;
1a300 0a 20 20 20 20 69 66 28 20 70 49 6e 20 29 7b 0a  .    if( pIn ){.
1a310 20 20 20 20 20 20 70 49 6e 20 2b 3d 20 70 4c 65        pIn += pLe
1a320 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 2d 20  vel->u.in.nIn - 
1a330 31 3b 0a 20 20 20 20 20 20 70 49 6e 2d 3e 69 43  1;.      pIn->iC
1a340 75 72 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 20  ur = iTab;.     
1a350 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49   if( eType==IN_I
1a360 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20  NDEX_ROWID ){.  
1a370 20 20 20 20 20 20 70 49 6e 2d 3e 61 64 64 72 49        pIn->addrI
1a380 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  nTop = sqlite3Vd
1a390 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
1a3a0 6f 77 69 64 2c 20 69 54 61 62 2c 20 69 52 65 67  owid, iTab, iReg
1a3b0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1a3c0 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 61 64 64          pIn->add
1a3d0 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  rInTop = sqlite3
1a3e0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
1a3f0 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 30  _Column, iTab, 0
1a400 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 20 20 7d  , iReg);.      }
1a410 0a 20 20 20 20 20 20 70 49 6e 2d 3e 65 45 6e 64  .      pIn->eEnd
1a420 4c 6f 6f 70 4f 70 20 3d 20 62 52 65 76 20 3f 20  LoopOp = bRev ? 
1a430 4f 50 5f 50 72 65 76 49 66 4f 70 65 6e 20 3a 20  OP_PrevIfOpen : 
1a440 4f 50 5f 4e 65 78 74 49 66 4f 70 65 6e 3b 0a 20  OP_NextIfOpen;. 
1a450 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1a460 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e  AddOp1(v, OP_IsN
1a470 75 6c 6c 2c 20 69 52 65 67 29 3b 20 56 64 62 65  ull, iReg); Vdbe
1a480 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1a490 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c   }else{.      pL
1a4a0 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 3d  evel->u.in.nIn =
1a4b0 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   0;.    }.#endif
1a4c0 0a 20 20 7d 0a 20 20 64 69 73 61 62 6c 65 54 65  .  }.  disableTe
1a4d0 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d  rm(pLevel, pTerm
1a4e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67  );.  return iReg
1a4f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
1a500 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
1a510 6c 6c 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20  ll evaluate all 
1a520 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72  == and IN constr
1a530 61 69 6e 74 73 20 66 6f 72 20 61 6e 0a 2a 2a 20  aints for an.** 
1a540 69 6e 64 65 78 20 73 63 61 6e 2e 0a 2a 2a 0a 2a  index scan..**.*
1a550 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 63  * For example, c
1a560 6f 6e 73 69 64 65 72 20 74 61 62 6c 65 20 74 31  onsider table t1
1a570 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 77 69  (a,b,c,d,e,f) wi
1a580 74 68 20 69 6e 64 65 78 20 69 31 28 61 2c 62 2c  th index i1(a,b,
1a590 63 29 2e 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74  c)..** Suppose t
1a5a0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1a5b0 69 73 20 74 68 69 73 3a 20 20 61 3d 3d 35 20 41  is this:  a==5 A
1a5c0 4e 44 20 62 20 49 4e 20 28 31 2c 32 2c 33 29 20  ND b IN (1,2,3) 
1a5d0 41 4e 44 20 63 3e 35 20 41 4e 44 20 63 3c 31 30  AND c>5 AND c<10
1a5e0 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 68 61  .** The index ha
1a5f0 73 20 61 73 20 6d 61 6e 79 20 61 73 20 74 68 72  s as many as thr
1a600 65 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  ee equality cons
1a610 74 72 61 69 6e 74 73 2c 20 62 75 74 20 69 6e 20  traints, but in 
1a620 74 68 69 73 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c  this.** example,
1a630 20 74 68 65 20 74 68 69 72 64 20 22 63 22 20 76   the third "c" v
1a640 61 6c 75 65 20 69 73 20 61 6e 20 69 6e 65 71 75  alue is an inequ
1a650 61 6c 69 74 79 2e 20 20 53 6f 20 6f 6e 6c 79 20  ality.  So only 
1a660 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73 74 72 61 69  two .** constrai
1a670 6e 74 73 20 61 72 65 20 63 6f 64 65 64 2e 20 20  nts are coded.  
1a680 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
1a690 6c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20  l generate code 
1a6a0 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20 61  to evaluate.** a
1a6b0 3d 3d 35 20 61 6e 64 20 62 20 49 4e 20 28 31 2c  ==5 and b IN (1,
1a6c0 32 2c 33 29 2e 20 20 54 68 65 20 63 75 72 72 65  2,3).  The curre
1a6d0 6e 74 20 76 61 6c 75 65 73 20 66 6f 72 20 61 20  nt values for a 
1a6e0 61 6e 64 20 62 20 77 69 6c 6c 20 62 65 20 73 74  and b will be st
1a6f0 6f 72 65 64 0a 2a 2a 20 69 6e 20 63 6f 6e 73 65  ored.** in conse
1a700 63 75 74 69 76 65 20 72 65 67 69 73 74 65 72 73  cutive registers
1a710 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 6f   and the index o
1a720 66 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69  f the first regi
1a730 73 74 65 72 20 69 73 20 72 65 74 75 72 6e 65 64  ster is returned
1a740 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65  ..**.** In the e
1a750 78 61 6d 70 6c 65 20 61 62 6f 76 65 20 6e 45 71  xample above nEq
1a760 3d 3d 32 2e 20 20 42 75 74 20 74 68 69 73 20 73  ==2.  But this s
1a770 75 62 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20  ubroutine works 
1a780 66 6f 72 20 61 6e 79 20 76 61 6c 75 65 0a 2a 2a  for any value.**
1a790 20 6f 66 20 6e 45 71 20 69 6e 63 6c 75 64 69 6e   of nEq includin
1a7a0 67 20 30 2e 20 20 49 66 20 6e 45 71 3d 3d 30 2c  g 0.  If nEq==0,
1a7b0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1a7c0 20 6e 65 61 72 6c 79 20 61 20 6e 6f 2d 6f 70 2e   nearly a no-op.
1a7d0 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68 69  .** The only thi
1a7e0 6e 67 20 69 74 20 64 6f 65 73 20 69 73 20 61 6c  ng it does is al
1a7f0 6c 6f 63 61 74 65 20 74 68 65 20 70 4c 65 76 65  locate the pLeve
1a800 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f 72 79 20 63  l->iMem memory c
1a810 65 6c 6c 20 61 6e 64 0a 2a 2a 20 63 6f 6d 70 75  ell and.** compu
1a820 74 65 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  te the affinity 
1a830 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  string..**.** Th
1a840 65 20 6e 45 78 74 72 61 52 65 67 20 70 61 72 61  e nExtraReg para
1a850 6d 65 74 65 72 20 69 73 20 30 20 6f 72 20 31 2e  meter is 0 or 1.
1a860 20 20 49 74 20 69 73 20 30 20 69 66 20 61 6c 6c    It is 0 if all
1a870 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f   WHERE clause co
1a880 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 61 72 65  nstraints.** are
1a890 20 3d 3d 20 6f 72 20 49 4e 20 61 6e 64 20 61 72   == or IN and ar
1a8a0 65 20 63 6f 76 65 72 65 64 20 62 79 20 74 68 65  e covered by the
1a8b0 20 6e 45 71 2e 20 20 6e 45 78 74 72 61 52 65 67   nEq.  nExtraReg
1a8c0 20 69 73 20 31 20 69 66 20 74 68 65 72 65 20 69   is 1 if there i
1a8d0 73 0a 2a 2a 20 61 6e 20 69 6e 65 71 75 61 6c 69  s.** an inequali
1a8e0 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 73  ty constraint (s
1a8f0 75 63 68 20 61 73 20 74 68 65 20 22 63 3e 3d 35  uch as the "c>=5
1a900 20 41 4e 44 20 63 3c 31 30 22 20 69 6e 20 74 68   AND c<10" in th
1a910 65 20 65 78 61 6d 70 6c 65 29 20 74 68 61 74 0a  e example) that.
1a920 2a 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72 20  ** occurs after 
1a930 74 68 65 20 6e 45 71 20 71 75 61 6c 69 74 79 20  the nEq quality 
1a940 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 2a 2a 0a  constraints..**.
1a950 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1a960 61 6c 6c 6f 63 61 74 65 73 20 61 20 72 61 6e 67  allocates a rang
1a970 65 20 6f 66 20 6e 45 71 2b 6e 45 78 74 72 61 52  e of nEq+nExtraR
1a980 65 67 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  eg memory cells 
1a990 61 6e 64 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74  and returns.** t
1a9a0 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
1a9b0 66 69 72 73 74 20 6d 65 6d 6f 72 79 20 63 65 6c  first memory cel
1a9c0 6c 20 69 6e 20 74 68 61 74 20 72 61 6e 67 65 2e  l in that range.
1a9d0 20 54 68 65 20 63 6f 64 65 20 74 68 61 74 0a 2a   The code that.*
1a9e0 2a 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  * calls this rou
1a9f0 74 69 6e 65 20 77 69 6c 6c 20 75 73 65 20 74 68  tine will use th
1aa00 61 74 20 6d 65 6d 6f 72 79 20 72 61 6e 67 65 20  at memory range 
1aa10 74 6f 20 73 74 6f 72 65 20 6b 65 79 73 20 66 6f  to store keys fo
1aa20 72 0a 2a 2a 20 73 74 61 72 74 20 61 6e 64 20 74  r.** start and t
1aa30 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 6e 64 69  ermination condi
1aa40 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f  tions of the loo
1aa50 70 2e 0a 2a 2a 20 6b 65 79 20 76 61 6c 75 65 20  p..** key value 
1aa60 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 49 66  of the loop.  If
1aa70 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 49 4e 20   one or more IN 
1aa80 6f 70 65 72 61 74 6f 72 73 20 61 70 70 65 61 72  operators appear
1aa90 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72  , then.** this r
1aaa0 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73  outine allocates
1aab0 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e   an additional n
1aac0 45 71 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  Eq memory cells 
1aad0 66 6f 72 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20  for internal.** 
1aae0 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72  use..**.** Befor
1aaf0 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a  e returning, *pz
1ab00 41 66 66 20 69 73 20 73 65 74 20 74 6f 20 70 6f  Aff is set to po
1ab10 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
1ab20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20  containing a.** 
1ab30 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75  copy of the colu
1ab40 6d 6e 20 61 66 66 69 6e 69 74 79 20 73 74 72 69  mn affinity stri
1ab50 6e 67 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ng of the index 
1ab60 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 0a  allocated using.
1ab70 2a 2a 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  ** sqlite3DbMall
1ab80 6f 63 28 29 2e 20 45 78 63 65 70 74 2c 20 65 6e  oc(). Except, en
1ab90 74 72 69 65 73 20 69 6e 20 74 68 65 20 63 6f 70  tries in the cop
1aba0 79 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20  y of the string 
1abb0 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69  associated.** wi
1abc0 74 68 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  th equality cons
1abd0 74 72 61 69 6e 74 73 20 74 68 61 74 20 75 73 65  traints that use
1abe0 20 4e 4f 4e 45 20 61 66 66 69 6e 69 74 79 20 61   NONE affinity a
1abf0 72 65 20 73 65 74 20 74 6f 0a 2a 2a 20 53 51 4c  re set to.** SQL
1ac00 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 54 68  ITE_AFF_NONE. Th
1ac10 69 73 20 69 73 20 74 6f 20 64 65 61 6c 20 77 69  is is to deal wi
1ac20 74 68 20 53 51 4c 20 73 75 63 68 20 61 73 20 74  th SQL such as t
1ac30 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
1ac40 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42  .**   CREATE TAB
1ac50 4c 45 20 74 31 28 61 20 54 45 58 54 20 50 52 49  LE t1(a TEXT PRI
1ac60 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 2a 2a  MARY KEY, b);.**
1ac70 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52     SELECT ... FR
1ac80 4f 4d 20 74 31 20 41 53 20 74 32 2c 20 74 31 20  OM t1 AS t2, t1 
1ac90 57 48 45 52 45 20 74 31 2e 61 20 3d 20 74 32 2e  WHERE t1.a = t2.
1aca0 62 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  b;.**.** In the 
1acb0 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74  example above, t
1acc0 68 65 20 69 6e 64 65 78 20 6f 6e 20 74 31 28 61  he index on t1(a
1acd0 29 20 68 61 73 20 54 45 58 54 20 61 66 66 69 6e  ) has TEXT affin
1ace0 69 74 79 2e 20 42 75 74 20 73 69 6e 63 65 0a 2a  ity. But since.*
1acf0 2a 20 74 68 65 20 72 69 67 68 74 20 68 61 6e 64  * the right hand
1ad00 20 73 69 64 65 20 6f 66 20 74 68 65 20 65 71 75   side of the equ
1ad10 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
1ad20 20 28 74 32 2e 62 29 20 68 61 73 20 4e 4f 4e 45   (t2.b) has NONE
1ad30 20 61 66 66 69 6e 69 74 79 2c 0a 2a 2a 20 6e 6f   affinity,.** no
1ad40 20 63 6f 6e 76 65 72 73 69 6f 6e 20 73 68 6f 75   conversion shou
1ad50 6c 64 20 62 65 20 61 74 74 65 6d 70 74 65 64 20  ld be attempted 
1ad60 62 65 66 6f 72 65 20 75 73 69 6e 67 20 61 20 74  before using a t
1ad70 32 2e 62 20 76 61 6c 75 65 20 61 73 20 70 61 72  2.b value as par
1ad80 74 20 6f 66 0a 2a 2a 20 61 20 6b 65 79 20 74 6f  t of.** a key to
1ad90 20 73 65 61 72 63 68 20 74 68 65 20 69 6e 64 65   search the inde
1ada0 78 2e 20 48 65 6e 63 65 20 74 68 65 20 66 69 72  x. Hence the fir
1adb0 73 74 20 62 79 74 65 20 69 6e 20 74 68 65 20 72  st byte in the r
1adc0 65 74 75 72 6e 65 64 20 61 66 66 69 6e 69 74 79  eturned affinity
1add0 0a 2a 2a 20 73 74 72 69 6e 67 20 69 6e 20 74 68  .** string in th
1ade0 69 73 20 65 78 61 6d 70 6c 65 20 77 6f 75 6c 64  is example would
1adf0 20 62 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54   be set to SQLIT
1ae00 45 5f 41 46 46 5f 4e 4f 4e 45 2e 0a 2a 2f 0a 73  E_AFF_NONE..*/.s
1ae10 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 41 6c  tatic int codeAl
1ae20 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28 0a  lEqualityTerms(.
1ae30 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1ae40 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
1ae50 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1ae60 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
1ae70 65 6c 2c 20 20 20 2f 2a 20 57 68 69 63 68 20 6e  el,   /* Which n
1ae80 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68  ested loop of th
1ae90 65 20 46 52 4f 4d 20 77 65 20 61 72 65 20 63 6f  e FROM we are co
1aea0 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 62 52  ding */.  int bR
1aeb0 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ev,             
1aec0 2f 2a 20 52 65 76 65 72 73 65 20 74 68 65 20 6f  /* Reverse the o
1aed0 72 64 65 72 20 6f 66 20 49 4e 20 6f 70 65 72 61  rder of IN opera
1aee0 74 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  tors */.  int nE
1aef0 78 74 72 61 52 65 67 2c 20 20 20 20 20 20 20 20  xtraReg,        
1af00 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74  /* Number of ext
1af10 72 61 20 72 65 67 69 73 74 65 72 73 20 74 6f 20  ra registers to 
1af20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68  allocate */.  ch
1af30 61 72 20 2a 2a 70 7a 41 66 66 20 20 20 20 20 20  ar **pzAff      
1af40 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20      /* OUT: Set 
1af50 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 66 66 69  to point to affi
1af60 6e 69 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29  nity string */.)
1af70 7b 0a 20 20 75 31 36 20 6e 45 71 3b 20 20 20 20  {.  u16 nEq;    
1af80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af90 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
1afa0 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73  of == or IN cons
1afb0 74 72 61 69 6e 74 73 20 74 6f 20 63 6f 64 65 20  traints to code 
1afc0 2a 2f 0a 20 20 75 31 36 20 6e 53 6b 69 70 3b 20  */.  u16 nSkip; 
1afd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1afe0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1aff0 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  left-most column
1b000 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20 20 56  s to skip */.  V
1b010 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
1b020 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20  >pVdbe;      /* 
1b030 54 68 65 20 76 6d 20 75 6e 64 65 72 20 63 6f 6e  The vm under con
1b040 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 49  struction */.  I
1b050 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
1b060 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b070 54 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20  The index being 
1b080 75 73 65 64 20 66 6f 72 20 74 68 69 73 20 6c 6f  used for this lo
1b090 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  op */.  WhereTer
1b0a0 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20  m *pTerm;       
1b0b0 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
1b0c0 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72  e constraint ter
1b0d0 6d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  m */.  WhereLoop
1b0e0 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20   *pLoop;        
1b0f0 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72       /* The Wher
1b100 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a  eLoop object */.
1b110 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20    int j;        
1b120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b130 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
1b140 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65  */.  int regBase
1b150 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b160 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67 69 73     /* Base regis
1b170 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ter */.  int nRe
1b180 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
1b190 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1b1a0 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 74 6f   of registers to
1b1b0 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63   allocate */.  c
1b1c0 68 61 72 20 2a 7a 41 66 66 3b 20 20 20 20 20 20  har *zAff;      
1b1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b1e0 41 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20  Affinity string 
1b1f0 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20 20  to return */..  
1b200 2f 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65 20 69  /* This module i
1b210 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 6f 6e  s only called on
1b220 20 71 75 65 72 79 20 70 6c 61 6e 73 20 74 68 61   query plans tha
1b230 74 20 75 73 65 20 61 6e 20 69 6e 64 65 78 2e 20  t use an index. 
1b240 2a 2f 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65  */.  pLoop = pLe
1b250 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 61  vel->pWLoop;.  a
1b260 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77  ssert( (pLoop->w
1b270 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
1b280 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20  IRTUALTABLE)==0 
1b290 29 3b 0a 20 20 6e 45 71 20 3d 20 70 4c 6f 6f 70  );.  nEq = pLoop
1b2a0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20  ->u.btree.nEq;. 
1b2b0 20 6e 53 6b 69 70 20 3d 20 70 4c 6f 6f 70 2d 3e   nSkip = pLoop->
1b2c0 6e 53 6b 69 70 3b 0a 20 20 70 49 64 78 20 3d 20  nSkip;.  pIdx = 
1b2d0 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
1b2e0 49 6e 64 65 78 3b 0a 20 20 61 73 73 65 72 74 28  Index;.  assert(
1b2f0 20 70 49 64 78 21 3d 30 20 29 3b 0a 0a 20 20 2f   pIdx!=0 );..  /
1b300 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
1b310 20 6d 61 6e 79 20 6d 65 6d 6f 72 79 20 63 65 6c   many memory cel
1b320 6c 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20  ls we will need 
1b330 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 74 68  then allocate th
1b340 65 6d 2e 0a 20 20 2a 2f 0a 20 20 72 65 67 42 61  em..  */.  regBa
1b350 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  se = pParse->nMe
1b360 6d 20 2b 20 31 3b 0a 20 20 6e 52 65 67 20 3d 20  m + 1;.  nReg = 
1b370 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
1b380 45 71 20 2b 20 6e 45 78 74 72 61 52 65 67 3b 0a  Eq + nExtraReg;.
1b390 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
1b3a0 3d 20 6e 52 65 67 3b 0a 0a 20 20 7a 41 66 66 20  = nReg;..  zAff 
1b3b0 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
1b3c0 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 71  p(pParse->db, sq
1b3d0 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
1b3e0 74 79 53 74 72 28 76 2c 20 70 49 64 78 29 29 3b  tyStr(v, pIdx));
1b3f0 0a 20 20 69 66 28 20 21 7a 41 66 66 20 29 7b 0a  .  if( !zAff ){.
1b400 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e      pParse->db->
1b410 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
1b420 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 53 6b  ;.  }..  if( nSk
1b430 69 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 49  ip ){.    int iI
1b440 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e  dxCur = pLevel->
1b450 69 49 64 78 43 75 72 3b 0a 20 20 20 20 73 71 6c  iIdxCur;.    sql
1b460 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
1b470 2c 20 28 62 52 65 76 3f 4f 50 5f 4c 61 73 74 3a  , (bRev?OP_Last:
1b480 4f 50 5f 52 65 77 69 6e 64 29 2c 20 69 49 64 78  OP_Rewind), iIdx
1b490 43 75 72 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  Cur);.    VdbeCo
1b4a0 76 65 72 61 67 65 49 66 28 76 2c 20 62 52 65 76  verageIf(v, bRev
1b4b0 3d 3d 30 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  ==0);.    VdbeCo
1b4c0 76 65 72 61 67 65 49 66 28 76 2c 20 62 52 65 76  verageIf(v, bRev
1b4d0 21 3d 30 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  !=0);.    VdbeCo
1b4e0 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67 69 6e  mment((v, "begin
1b4f0 20 73 6b 69 70 2d 73 63 61 6e 20 6f 6e 20 25 73   skip-scan on %s
1b500 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29  ", pIdx->zName))
1b510 3b 0a 20 20 20 20 6a 20 3d 20 73 71 6c 69 74 65  ;.    j = sqlite
1b520 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
1b530 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 70 4c 65  P_Goto);.    pLe
1b540 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 20 3d 20  vel->addrSkip = 
1b550 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b560 34 49 6e 74 28 76 2c 20 28 62 52 65 76 3f 4f 50  4Int(v, (bRev?OP
1b570 5f 53 65 65 6b 4c 54 3a 4f 50 5f 53 65 65 6b 47  _SeekLT:OP_SeekG
1b580 54 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  T),.            
1b590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b5a0 69 49 64 78 43 75 72 2c 20 30 2c 20 72 65 67 42  iIdxCur, 0, regB
1b5b0 61 73 65 2c 20 6e 53 6b 69 70 29 3b 0a 20 20 20  ase, nSkip);.   
1b5c0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1b5d0 76 2c 20 62 52 65 76 3d 3d 30 29 3b 0a 20 20 20  v, bRev==0);.   
1b5e0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1b5f0 76 2c 20 62 52 65 76 21 3d 30 29 3b 0a 20 20 20  v, bRev!=0);.   
1b600 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
1b610 48 65 72 65 28 76 2c 20 6a 29 3b 0a 20 20 20 20  Here(v, j);.    
1b620 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53 6b 69 70  for(j=0; j<nSkip
1b630 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; j++){.      sq
1b640 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1b650 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49  v, OP_Column, iI
1b660 64 78 43 75 72 2c 20 6a 2c 20 72 65 67 42 61 73  dxCur, j, regBas
1b670 65 2b 6a 29 3b 0a 20 20 20 20 20 20 61 73 73 65  e+j);.      asse
1b680 72 74 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  rt( pIdx->aiColu
1b690 6d 6e 5b 6a 5d 3e 3d 30 20 29 3b 0a 20 20 20 20  mn[j]>=0 );.    
1b6a0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
1b6b0 2c 20 22 25 73 22 2c 20 70 49 64 78 2d 3e 70 54  , "%s", pIdx->pT
1b6c0 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 49 64 78 2d  able->aCol[pIdx-
1b6d0 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e  >aiColumn[j]].zN
1b6e0 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ame));.    }.  }
1b6f0 20 20 20 20 0a 0a 20 20 2f 2a 20 45 76 61 6c 75      ..  /* Evalu
1b700 61 74 65 20 74 68 65 20 65 71 75 61 6c 69 74 79  ate the equality
1b710 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a   constraints.  *
1b720 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 41 66 66  /.  assert( zAff
1b730 3d 3d 30 20 7c 7c 20 28 69 6e 74 29 73 74 72 6c  ==0 || (int)strl
1b740 65 6e 28 7a 41 66 66 29 3e 3d 6e 45 71 20 29 3b  en(zAff)>=nEq );
1b750 0a 20 20 66 6f 72 28 6a 3d 6e 53 6b 69 70 3b 20  .  for(j=nSkip; 
1b760 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20 20 20  j<nEq; j++){.   
1b770 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 70 54 65   int r1;.    pTe
1b780 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  rm = pLoop->aLTe
1b790 72 6d 5b 6a 5d 3b 0a 20 20 20 20 61 73 73 65 72  rm[j];.    asser
1b7a0 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20  t( pTerm!=0 );. 
1b7b0 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     /* The follow
1b7c0 69 6e 67 20 74 65 73 74 63 61 73 65 20 69 73 20  ing testcase is 
1b7d0 74 72 75 65 20 66 6f 72 20 69 6e 64 69 63 65 73  true for indices
1b7e0 20 77 69 74 68 20 72 65 64 75 6e 64 61 6e 74 20   with redundant 
1b7f0 63 6f 6c 75 6d 6e 73 2e 20 0a 20 20 20 20 2a 2a  columns. .    **
1b800 20 45 78 3a 20 43 52 45 41 54 45 20 49 4e 44 45   Ex: CREATE INDE
1b810 58 20 69 31 20 4f 4e 20 74 31 28 61 2c 62 2c 61  X i1 ON t1(a,b,a
1b820 29 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  ); SELECT * FROM
1b830 20 74 31 20 57 48 45 52 45 20 61 3d 30 20 41 4e   t1 WHERE a=0 AN
1b840 44 20 62 3d 30 3b 20 2a 2f 0a 20 20 20 20 74 65  D b=0; */.    te
1b850 73 74 63 61 73 65 28 20 28 70 54 65 72 6d 2d 3e  stcase( (pTerm->
1b860 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43  wtFlags & TERM_C
1b870 4f 44 45 44 29 21 3d 30 20 29 3b 0a 20 20 20 20  ODED)!=0 );.    
1b880 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
1b890 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
1b8a0 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 72  VIRTUAL );.    r
1b8b0 31 20 3d 20 63 6f 64 65 45 71 75 61 6c 69 74 79  1 = codeEquality
1b8c0 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65  Term(pParse, pTe
1b8d0 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 6a 2c 20 62  rm, pLevel, j, b
1b8e0 52 65 76 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b  Rev, regBase+j);
1b8f0 0a 20 20 20 20 69 66 28 20 72 31 21 3d 72 65 67  .    if( r1!=reg
1b900 42 61 73 65 2b 6a 20 29 7b 0a 20 20 20 20 20 20  Base+j ){.      
1b910 69 66 28 20 6e 52 65 67 3d 3d 31 20 29 7b 0a 20  if( nReg==1 ){. 
1b920 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
1b930 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1b940 72 73 65 2c 20 72 65 67 42 61 73 65 29 3b 0a 20  rse, regBase);. 
1b950 20 20 20 20 20 20 20 72 65 67 42 61 73 65 20 3d         regBase =
1b960 20 72 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   r1;.      }else
1b970 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1b980 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1b990 50 5f 53 43 6f 70 79 2c 20 72 31 2c 20 72 65 67  P_SCopy, r1, reg
1b9a0 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20 20 20 7d  Base+j);.      }
1b9b0 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63  .    }.    testc
1b9c0 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
1b9d0 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c  rator & WO_ISNUL
1b9e0 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  L );.    testcas
1b9f0 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
1ba00 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20  tor & WO_IN );. 
1ba10 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
1ba20 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49  Operator & (WO_I
1ba30 53 4e 55 4c 4c 7c 57 4f 5f 49 4e 29 29 3d 3d 30  SNULL|WO_IN))==0
1ba40 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
1ba50 70 52 69 67 68 74 20 3d 20 70 54 65 72 6d 2d 3e  pRight = pTerm->
1ba60 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
1ba70 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
1ba80 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
1ba90 49 53 29 3d 3d 30 20 26 26 20 73 71 6c 69 74 65  IS)==0 && sqlite
1baa0 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70  3ExprCanBeNull(p
1bab0 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20  Right) ){.      
1bac0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1bad0 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op2(v, OP_IsNull
1bae0 2c 20 72 65 67 42 61 73 65 2b 6a 2c 20 70 4c 65  , regBase+j, pLe
1baf0 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20  vel->addrBrk);. 
1bb00 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
1bb10 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a  age(v);.      }.
1bb20 20 20 20 20 20 20 69 66 28 20 7a 41 66 66 20 29        if( zAff )
1bb30 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
1bb40 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
1bb50 6e 69 74 79 28 70 52 69 67 68 74 2c 20 7a 41 66  nity(pRight, zAf
1bb60 66 5b 6a 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46  f[j])==SQLITE_AF
1bb70 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  F_NONE ){.      
1bb80 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51      zAff[j] = SQ
1bb90 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
1bba0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1bbb0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
1bbc0 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43  NeedsNoAffinityC
1bbd0 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20 7a 41  hange(pRight, zA
1bbe0 66 66 5b 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20  ff[j]) ){.      
1bbf0 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51      zAff[j] = SQ
1bc00 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
1bc10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1bc20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 7a  .    }.  }.  *pz
1bc30 41 66 66 20 3d 20 7a 41 66 66 3b 0a 20 20 72 65  Aff = zAff;.  re
1bc40 74 75 72 6e 20 72 65 67 42 61 73 65 3b 0a 7d 0a  turn regBase;.}.
1bc50 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1bc60 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a  OMIT_EXPLAIN./*.
1bc70 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1bc80 69 73 20 61 20 68 65 6c 70 65 72 20 66 6f 72 20  is a helper for 
1bc90 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67  explainIndexRang
1bca0 65 28 29 20 62 65 6c 6f 77 0a 2a 2a 0a 2a 2a 20  e() below.**.** 
1bcb0 70 53 74 72 20 68 6f 6c 64 73 20 74 68 65 20 74  pStr holds the t
1bcc0 65 78 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73  ext of an expres
1bcd0 73 69 6f 6e 20 74 68 61 74 20 77 65 20 61 72 65  sion that we are
1bce0 20 62 75 69 6c 64 69 6e 67 20 75 70 20 6f 6e 65   building up one
1bcf0 20 74 65 72 6d 0a 2a 2a 20 61 74 20 61 20 74 69   term.** at a ti
1bd00 6d 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  me.  This routin
1bd10 65 20 61 64 64 73 20 61 20 6e 65 77 20 74 65 72  e adds a new ter
1bd20 6d 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  m to the end of 
1bd30 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  the expression..
1bd40 2a 2a 20 54 65 72 6d 73 20 61 72 65 20 73 65 70  ** Terms are sep
1bd50 61 72 61 74 65 64 20 62 79 20 41 4e 44 20 73 6f  arated by AND so
1bd60 20 61 64 64 20 74 68 65 20 22 41 4e 44 22 20 74   add the "AND" t
1bd70 65 78 74 20 66 6f 72 20 73 65 63 6f 6e 64 20 61  ext for second a
1bd80 6e 64 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a  nd subsequent.**
1bd90 20 74 65 72 6d 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a   terms only..*/.
1bda0 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c  static void expl
1bdb0 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 0a 20  ainAppendTerm(. 
1bdc0 20 53 74 72 41 63 63 75 6d 20 2a 70 53 74 72 2c   StrAccum *pStr,
1bdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bde0 54 68 65 20 74 65 78 74 20 65 78 70 72 65 73 73  The text express
1bdf0 69 6f 6e 20 62 65 69 6e 67 20 62 75 69 6c 74 20  ion being built 
1be00 2a 2f 0a 20 20 69 6e 74 20 69 54 65 72 6d 2c 20  */.  int iTerm, 
1be10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 69   /* Index of thi
1be30 73 20 74 65 72 6d 2e 20 20 46 69 72 73 74 20 69  s term.  First i
1be40 73 20 7a 65 72 6f 20 2a 2f 0a 20 20 63 6f 6e 73  s zero */.  cons
1be50 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 2c  t char *zColumn,
1be60 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
1be70 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f  of the column */
1be80 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1be90 4f 70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  Op             /
1bea0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70  * Name of the op
1beb0 65 72 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69  erator */.){.  i
1bec0 66 28 20 69 54 65 72 6d 20 29 20 73 71 6c 69 74  f( iTerm ) sqlit
1bed0 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
1bee0 28 70 53 74 72 2c 20 22 20 41 4e 44 20 22 2c 20  (pStr, " AND ", 
1bef0 35 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72  5);.  sqlite3Str
1bf00 41 63 63 75 6d 41 70 70 65 6e 64 41 6c 6c 28 70  AccumAppendAll(p
1bf10 53 74 72 2c 20 7a 43 6f 6c 75 6d 6e 29 3b 0a 20  Str, zColumn);. 
1bf20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
1bf30 41 70 70 65 6e 64 28 70 53 74 72 2c 20 7a 4f 70  Append(pStr, zOp
1bf40 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  , 1);.  sqlite3S
1bf50 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53  trAccumAppend(pS
1bf60 74 72 2c 20 22 3f 22 2c 20 31 29 3b 0a 7d 0a 0a  tr, "?", 1);.}..
1bf70 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  /*.** Argument p
1bf80 4c 65 76 65 6c 20 64 65 73 63 72 69 62 65 73 20  Level describes 
1bf90 61 20 73 74 72 61 74 65 67 79 20 66 6f 72 20 73  a strategy for s
1bfa0 63 61 6e 6e 69 6e 67 20 74 61 62 6c 65 20 70 54  canning table pT
1bfb0 61 62 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e  ab. This .** fun
1bfc0 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 74 65  ction appends te
1bfd0 78 74 20 74 6f 20 70 53 74 72 20 74 68 61 74 20  xt to pStr that 
1bfe0 64 65 73 63 72 69 62 65 73 20 74 68 65 20 73 75  describes the su
1bff0 62 73 65 74 20 6f 66 20 74 61 62 6c 65 0a 2a 2a  bset of table.**
1c000 20 72 6f 77 73 20 73 63 61 6e 6e 65 64 20 62 79   rows scanned by
1c010 20 74 68 65 20 73 74 72 61 74 65 67 79 20 69 6e   the strategy in
1c020 20 74 68 65 20 66 6f 72 6d 20 6f 66 20 61 6e 20   the form of an 
1c030 53 51 4c 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  SQL expression..
1c040 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
1c050 65 2c 20 69 66 20 74 68 65 20 71 75 65 72 79 3a  e, if the query:
1c060 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  .**.**   SELECT 
1c070 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
1c080 61 3d 31 20 41 4e 44 20 62 3e 32 3b 0a 2a 2a 0a  a=1 AND b>2;.**.
1c090 2a 2a 20 69 73 20 72 75 6e 20 61 6e 64 20 74 68  ** is run and th
1c0a0 65 72 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20  ere is an index 
1c0b0 6f 6e 20 28 61 2c 20 62 29 2c 20 74 68 65 6e 20  on (a, b), then 
1c0c0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
1c0d0 74 75 72 6e 73 20 61 0a 2a 2a 20 73 74 72 69 6e  turns a.** strin
1c0e0 67 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a  g similar to:.**
1c0f0 0a 2a 2a 20 20 20 22 61 3d 3f 20 41 4e 44 20 62  .**   "a=? AND b
1c100 3e 3f 22 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  >?".*/.static vo
1c110 69 64 20 65 78 70 6c 61 69 6e 49 6e 64 65 78 52  id explainIndexR
1c120 61 6e 67 65 28 53 74 72 41 63 63 75 6d 20 2a 70  ange(StrAccum *p
1c130 53 74 72 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  Str, WhereLoop *
1c140 70 4c 6f 6f 70 2c 20 54 61 62 6c 65 20 2a 70 54  pLoop, Table *pT
1c150 61 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  ab){.  Index *pI
1c160 6e 64 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e  ndex = pLoop->u.
1c170 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
1c180 75 31 36 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d  u16 nEq = pLoop-
1c190 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20  >u.btree.nEq;.  
1c1a0 75 31 36 20 6e 53 6b 69 70 20 3d 20 70 4c 6f 6f  u16 nSkip = pLoo
1c1b0 70 2d 3e 6e 53 6b 69 70 3b 0a 20 20 69 6e 74 20  p->nSkip;.  int 
1c1c0 69 2c 20 6a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  i, j;.  Column *
1c1d0 61 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  aCol = pTab->aCo
1c1e0 6c 3b 0a 20 20 69 31 36 20 2a 61 69 43 6f 6c 75  l;.  i16 *aiColu
1c1f0 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43  mn = pIndex->aiC
1c200 6f 6c 75 6d 6e 3b 0a 0a 20 20 69 66 28 20 6e 45  olumn;..  if( nE
1c210 71 3d 3d 30 20 26 26 20 28 70 4c 6f 6f 70 2d 3e  q==0 && (pLoop->
1c220 77 73 46 6c 61 67 73 26 28 57 48 45 52 45 5f 42  wsFlags&(WHERE_B
1c230 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54  TM_LIMIT|WHERE_T
1c240 4f 50 5f 4c 49 4d 49 54 29 29 3d 3d 30 20 29 20  OP_LIMIT))==0 ) 
1c250 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
1c260 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28  3StrAccumAppend(
1c270 70 53 74 72 2c 20 22 20 28 22 2c 20 32 29 3b 0a  pStr, " (", 2);.
1c280 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 71    for(i=0; i<nEq
1c290 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72  ; i++){.    char
1c2a0 20 2a 7a 20 3d 20 61 69 43 6f 6c 75 6d 6e 5b 69   *z = aiColumn[i
1c2b0 5d 20 3c 20 30 20 3f 20 22 72 6f 77 69 64 22 20  ] < 0 ? "rowid" 
1c2c0 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b  : aCol[aiColumn[
1c2d0 69 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69  i]].zName;.    i
1c2e0 66 28 20 69 3e 3d 6e 53 6b 69 70 20 29 7b 0a 20  f( i>=nSkip ){. 
1c2f0 20 20 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65       explainAppe
1c300 6e 64 54 65 72 6d 28 70 53 74 72 2c 20 69 2c 20  ndTerm(pStr, i, 
1c310 7a 2c 20 22 3d 22 29 3b 0a 20 20 20 20 7d 65 6c  z, "=");.    }el
1c320 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 69 20  se{.      if( i 
1c330 29 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75  ) sqlite3StrAccu
1c340 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20 22 20  mAppend(pStr, " 
1c350 41 4e 44 20 22 2c 20 35 29 3b 0a 20 20 20 20 20  AND ", 5);.     
1c360 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28   sqlite3XPrintf(
1c370 70 53 74 72 2c 20 30 2c 20 22 41 4e 59 28 25 73  pStr, 0, "ANY(%s
1c380 29 22 2c 20 7a 29 3b 0a 20 20 20 20 7d 0a 20 20  )", z);.    }.  
1c390 7d 0a 0a 20 20 6a 20 3d 20 69 3b 0a 20 20 69 66  }..  j = i;.  if
1c3a0 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
1c3b0 26 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54  &WHERE_BTM_LIMIT
1c3c0 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20   ){.    char *z 
1c3d0 3d 20 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3c 20  = aiColumn[j] < 
1c3e0 30 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 61 43  0 ? "rowid" : aC
1c3f0 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e  ol[aiColumn[j]].
1c400 7a 4e 61 6d 65 3b 0a 20 20 20 20 65 78 70 6c 61  zName;.    expla
1c410 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 70 53 74  inAppendTerm(pSt
1c420 72 2c 20 69 2b 2b 2c 20 7a 2c 20 22 3e 22 29 3b  r, i++, z, ">");
1c430 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70  .  }.  if( pLoop
1c440 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f  ->wsFlags&WHERE_
1c450 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  TOP_LIMIT ){.   
1c460 20 63 68 61 72 20 2a 7a 20 3d 20 61 69 43 6f 6c   char *z = aiCol
1c470 75 6d 6e 5b 6a 5d 20 3c 20 30 20 3f 20 22 72 6f  umn[j] < 0 ? "ro
1c480 77 69 64 22 20 3a 20 61 43 6f 6c 5b 61 69 43 6f  wid" : aCol[aiCo
1c490 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a  lumn[j]].zName;.
1c4a0 20 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65 6e      explainAppen
1c4b0 64 54 65 72 6d 28 70 53 74 72 2c 20 69 2c 20 7a  dTerm(pStr, i, z
1c4c0 2c 20 22 3c 22 29 3b 0a 20 20 7d 0a 20 20 73 71  , "<");.  }.  sq
1c4d0 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
1c4e0 65 6e 64 28 70 53 74 72 2c 20 22 29 22 2c 20 31  end(pStr, ")", 1
1c4f0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
1c500 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
1c510 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 63 75 72 72  o-op unless curr
1c520 65 6e 74 6c 79 20 70 72 6f 63 65 73 73 69 6e 67  ently processing
1c530 20 61 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52   an EXPLAIN QUER
1c540 59 20 50 4c 41 4e 0a 2a 2a 20 63 6f 6d 6d 61 6e  Y PLAN.** comman
1c550 64 2c 20 6f 72 20 69 66 20 65 69 74 68 65 72 20  d, or if either 
1c560 53 51 4c 49 54 45 5f 44 45 42 55 47 20 6f 72 20  SQLITE_DEBUG or 
1c570 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
1c580 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 20 77 61  MT_SCANSTATUS wa
1c590 73 0a 2a 2a 20 64 65 66 69 6e 65 64 20 61 74 20  s.** defined at 
1c5a0 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 49 66  compile-time. If
1c5b0 20 69 74 20 69 73 20 6e 6f 74 20 61 20 6e 6f 2d   it is not a no-
1c5c0 6f 70 2c 20 61 20 73 69 6e 67 6c 65 20 4f 50 5f  op, a single OP_
1c5d0 45 78 70 6c 61 69 6e 20 6f 70 63 6f 64 65 20 0a  Explain opcode .
1c5e0 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ** is added to t
1c5f0 68 65 20 6f 75 74 70 75 74 20 74 6f 20 64 65 73  he output to des
1c600 63 72 69 62 65 20 74 68 65 20 74 61 62 6c 65 20  cribe the table 
1c610 73 63 61 6e 20 73 74 72 61 74 65 67 79 20 69 6e  scan strategy in
1c620 20 70 4c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 49   pLevel..**.** I
1c630 66 20 61 6e 20 4f 50 5f 45 78 70 6c 61 69 6e 20  f an OP_Explain 
1c640 6f 70 63 6f 64 65 20 69 73 20 61 64 64 65 64 20  opcode is added 
1c650 74 6f 20 74 68 65 20 56 4d 2c 20 69 74 73 20 61  to the VM, its a
1c660 64 64 72 65 73 73 20 69 73 20 72 65 74 75 72 6e  ddress is return
1c670 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  ed..** Otherwise
1c680 2c 20 69 66 20 6e 6f 20 4f 50 5f 45 78 70 6c 61  , if no OP_Expla
1c690 69 6e 20 69 73 20 63 6f 64 65 64 2c 20 7a 65 72  in is coded, zer
1c6a0 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  o is returned..*
1c6b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
1c6c0 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 50  lainOneScan(.  P
1c6d0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1c6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c6f0 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
1c700 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
1c710 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20  abList,         
1c720 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6c 69       /* Table li
1c730 73 74 20 74 68 69 73 20 6c 6f 6f 70 20 72 65 66  st this loop ref
1c740 65 72 73 20 74 6f 20 2a 2f 0a 20 20 57 68 65 72  ers to */.  Wher
1c750 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20  eLevel *pLevel, 
1c760 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1c770 63 61 6e 20 74 6f 20 77 72 69 74 65 20 4f 50 5f  can to write OP_
1c780 45 78 70 6c 61 69 6e 20 6f 70 63 6f 64 65 20 66  Explain opcode f
1c790 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76  or */.  int iLev
1c7a0 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  el,             
1c7b0 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
1c7c0 20 66 6f 72 20 22 6c 65 76 65 6c 22 20 63 6f 6c   for "level" col
1c7d0 75 6d 6e 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f  umn of output */
1c7e0 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20  .  int iFrom,   
1c7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c800 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20     /* Value for 
1c810 22 66 72 6f 6d 22 20 63 6f 6c 75 6d 6e 20 6f 66  "from" column of
1c820 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 75 31 36   output */.  u16
1c830 20 77 63 74 72 6c 46 6c 61 67 73 20 20 20 20 20   wctrlFlags     
1c840 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c850 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f 20  Flags passed to 
1c860 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
1c870 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  n() */.){.  int 
1c880 72 65 74 20 3d 20 30 3b 0a 23 69 66 20 21 64 65  ret = 0;.#if !de
1c890 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
1c8a0 55 47 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  UG) && !defined(
1c8b0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
1c8c0 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 29 0a 20  MT_SCANSTATUS). 
1c8d0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
1c8e0 6c 61 69 6e 3d 3d 32 20 29 0a 23 65 6e 64 69 66  lain==2 ).#endif
1c8f0 0a 20 20 7b 0a 20 20 20 20 73 74 72 75 63 74 20  .  {.    struct 
1c900 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
1c910 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
1c920 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
1c930 5d 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  ];.    Vdbe *v =
1c940 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
1c950 20 20 20 20 20 2f 2a 20 56 4d 20 62 65 69 6e 67       /* VM being
1c960 20 63 6f 6e 73 74 72 75 63 74 65 64 20 2a 2f 0a   constructed */.
1c970 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
1c980 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
1c990 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61    /* Database ha
1c9a0 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ndle */.    int 
1c9b0 69 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 53  iId = pParse->iS
1c9c0 65 6c 65 63 74 49 64 3b 20 20 2f 2a 20 53 65 6c  electId;  /* Sel
1c9d0 65 63 74 20 69 64 20 28 6c 65 66 74 2d 6d 6f 73  ect id (left-mos
1c9e0 74 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 29  t output column)
1c9f0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 53 65   */.    int isSe
1ca00 61 72 63 68 3b 20 20 20 20 20 20 20 20 20 20 20  arch;           
1ca10 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
1ca20 72 20 61 20 53 45 41 52 43 48 2e 20 46 61 6c 73  r a SEARCH. Fals
1ca30 65 20 66 6f 72 20 53 43 41 4e 2e 20 2a 2f 0a 20  e for SCAN. */. 
1ca40 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c     WhereLoop *pL
1ca50 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  oop;            
1ca60 20 2f 2a 20 54 68 65 20 63 6f 6e 74 72 6f 6c 6c   /* The controll
1ca70 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  ing WhereLoop ob
1ca80 6a 65 63 74 20 2a 2f 0a 20 20 20 20 75 33 32 20  ject */.    u32 
1ca90 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  flags;          
1caa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
1cab0 67 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65  gs that describe
1cac0 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20   this loop */.  
1cad0 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 20 20 20    char *zMsg;   
1cae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1caf0 2f 2a 20 54 65 78 74 20 74 6f 20 61 64 64 20 74  /* Text to add t
1cb00 6f 20 45 51 50 20 6f 75 74 70 75 74 20 2a 2f 0a  o EQP output */.
1cb10 20 20 20 20 53 74 72 41 63 63 75 6d 20 73 74 72      StrAccum str
1cb20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1cb30 20 20 2f 2a 20 45 51 50 20 6f 75 74 70 75 74 20    /* EQP output 
1cb40 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 63 68  string */.    ch
1cb50 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 20 20 20  ar zBuf[100];   
1cb60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1cb70 6e 69 74 69 61 6c 20 73 70 61 63 65 20 66 6f 72  nitial space for
1cb80 20 45 51 50 20 6f 75 74 70 75 74 20 73 74 72 69   EQP output stri
1cb90 6e 67 20 2a 2f 0a 0a 20 20 20 20 70 4c 6f 6f 70  ng */..    pLoop
1cba0 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
1cbb0 70 3b 0a 20 20 20 20 66 6c 61 67 73 20 3d 20 70  p;.    flags = p
1cbc0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20  Loop->wsFlags;. 
1cbd0 20 20 20 69 66 28 20 28 66 6c 61 67 73 26 57 48     if( (flags&WH
1cbe0 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 20 7c 7c  ERE_MULTI_OR) ||
1cbf0 20 28 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45   (wctrlFlags&WHE
1cc00 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
1cc10 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  ) ) return 0;.. 
1cc20 20 20 20 69 73 53 65 61 72 63 68 20 3d 20 28 66     isSearch = (f
1cc30 6c 61 67 73 26 28 57 48 45 52 45 5f 42 54 4d 5f  lags&(WHERE_BTM_
1cc40 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f  LIMIT|WHERE_TOP_
1cc50 4c 49 4d 49 54 29 29 21 3d 30 0a 20 20 20 20 20  LIMIT))!=0.     
1cc60 20 20 20 20 20 20 20 7c 7c 20 28 28 66 6c 61 67         || ((flag
1cc70 73 26 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  s&WHERE_VIRTUALT
1cc80 41 42 4c 45 29 3d 3d 30 20 26 26 20 28 70 4c 6f  ABLE)==0 && (pLo
1cc90 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3e  op->u.btree.nEq>
1cca0 30 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  0)).            
1ccb0 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73 26 28  || (wctrlFlags&(
1ccc0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
1ccd0 4e 7c 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  N|WHERE_ORDERBY_
1cce0 4d 41 58 29 29 3b 0a 0a 20 20 20 20 73 71 6c 69  MAX));..    sqli
1ccf0 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28  te3StrAccumInit(
1cd00 26 73 74 72 2c 20 64 62 2c 20 7a 42 75 66 2c 20  &str, db, zBuf, 
1cd10 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 53 51  sizeof(zBuf), SQ
1cd20 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 29  LITE_MAX_LENGTH)
1cd30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74 72  ;.    sqlite3Str
1cd40 41 63 63 75 6d 41 70 70 65 6e 64 41 6c 6c 28 26  AccumAppendAll(&
1cd50 73 74 72 2c 20 69 73 53 65 61 72 63 68 20 3f 20  str, isSearch ? 
1cd60 22 53 45 41 52 43 48 22 20 3a 20 22 53 43 41 4e  "SEARCH" : "SCAN
1cd70 22 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  ");.    if( pIte
1cd80 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  m->pSelect ){.  
1cd90 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
1cda0 74 66 28 26 73 74 72 2c 20 30 2c 20 22 20 53 55  tf(&str, 0, " SU
1cdb0 42 51 55 45 52 59 20 25 64 22 2c 20 70 49 74 65  BQUERY %d", pIte
1cdc0 6d 2d 3e 69 53 65 6c 65 63 74 49 64 29 3b 0a 20  m->iSelectId);. 
1cdd0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1cde0 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26  sqlite3XPrintf(&
1cdf0 73 74 72 2c 20 30 2c 20 22 20 54 41 42 4c 45 20  str, 0, " TABLE 
1ce00 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  %s", pItem->zNam
1ce10 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  e);.    }..    i
1ce20 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  f( pItem->zAlias
1ce30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1ce40 33 58 50 72 69 6e 74 66 28 26 73 74 72 2c 20 30  3XPrintf(&str, 0
1ce50 2c 20 22 20 41 53 20 25 73 22 2c 20 70 49 74 65  , " AS %s", pIte
1ce60 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20  m->zAlias);.    
1ce70 7d 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73  }.    if( (flags
1ce80 20 26 20 28 57 48 45 52 45 5f 49 50 4b 7c 57 48   & (WHERE_IPK|WH
1ce90 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
1cea0 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  ))==0 ){.      c
1ceb0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 20  onst char *zFmt 
1cec0 3d 20 30 3b 0a 20 20 20 20 20 20 49 6e 64 65 78  = 0;.      Index
1ced0 20 2a 70 49 64 78 3b 0a 0a 20 20 20 20 20 20 61   *pIdx;..      a
1cee0 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 75 2e  ssert( pLoop->u.
1cef0 62 74 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 20  btree.pIndex!=0 
1cf00 29 3b 0a 20 20 20 20 20 20 70 49 64 78 20 3d 20  );.      pIdx = 
1cf10 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
1cf20 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 61 73 73  Index;.      ass
1cf30 65 72 74 28 20 21 28 66 6c 61 67 73 26 57 48 45  ert( !(flags&WHE
1cf40 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 20 7c  RE_AUTO_INDEX) |
1cf50 7c 20 28 66 6c 61 67 73 26 57 48 45 52 45 5f 49  | (flags&WHERE_I
1cf60 44 58 5f 4f 4e 4c 59 29 20 29 3b 0a 20 20 20 20  DX_ONLY) );.    
1cf70 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28    if( !HasRowid(
1cf80 70 49 74 65 6d 2d 3e 70 54 61 62 29 20 26 26 20  pItem->pTab) && 
1cf90 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  IsPrimaryKeyInde
1cfa0 78 28 70 49 64 78 29 20 29 7b 0a 20 20 20 20 20  x(pIdx) ){.     
1cfb0 20 20 20 69 66 28 20 69 73 53 65 61 72 63 68 20     if( isSearch 
1cfc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 46 6d  ){.          zFm
1cfd0 74 20 3d 20 22 50 52 49 4d 41 52 59 20 4b 45 59  t = "PRIMARY KEY
1cfe0 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ";.        }.   
1cff0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61     }else if( fla
1d000 67 73 20 26 20 57 48 45 52 45 5f 50 41 52 54 49  gs & WHERE_PARTI
1d010 41 4c 49 44 58 20 29 7b 0a 20 20 20 20 20 20 20  ALIDX ){.       
1d020 20 7a 46 6d 74 20 3d 20 22 41 55 54 4f 4d 41 54   zFmt = "AUTOMAT
1d030 49 43 20 50 41 52 54 49 41 4c 20 43 4f 56 45 52  IC PARTIAL COVER
1d040 49 4e 47 20 49 4e 44 45 58 22 3b 0a 20 20 20 20  ING INDEX";.    
1d050 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
1d060 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49  s & WHERE_AUTO_I
1d070 4e 44 45 58 20 29 7b 0a 20 20 20 20 20 20 20 20  NDEX ){.        
1d080 7a 46 6d 74 20 3d 20 22 41 55 54 4f 4d 41 54 49  zFmt = "AUTOMATI
1d090 43 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58  C COVERING INDEX
1d0a0 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ";.      }else i
1d0b0 66 28 20 66 6c 61 67 73 20 26 20 57 48 45 52 45  f( flags & WHERE
1d0c0 5f 49 44 58 5f 4f 4e 4c 59 20 29 7b 0a 20 20 20  _IDX_ONLY ){.   
1d0d0 20 20 20 20 20 7a 46 6d 74 20 3d 20 22 43 4f 56       zFmt = "COV
1d0e0 45 52 49 4e 47 20 49 4e 44 45 58 20 25 73 22 3b  ERING INDEX %s";
1d0f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1d100 20 20 20 20 20 20 7a 46 6d 74 20 3d 20 22 49 4e        zFmt = "IN
1d110 44 45 58 20 25 73 22 3b 0a 20 20 20 20 20 20 7d  DEX %s";.      }
1d120 0a 20 20 20 20 20 20 69 66 28 20 7a 46 6d 74 20  .      if( zFmt 
1d130 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1d140 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
1d150 28 26 73 74 72 2c 20 22 20 55 53 49 4e 47 20 22  (&str, " USING "
1d160 2c 20 37 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 7);.        sq
1d170 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 73 74  lite3XPrintf(&st
1d180 72 2c 20 30 2c 20 7a 46 6d 74 2c 20 70 49 64 78  r, 0, zFmt, pIdx
1d190 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
1d1a0 20 20 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61    explainIndexRa
1d1b0 6e 67 65 28 26 73 74 72 2c 20 70 4c 6f 6f 70 2c  nge(&str, pLoop,
1d1c0 20 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20   pItem->pTab);. 
1d1d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
1d1e0 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 57 48   if( (flags & WH
1d1f0 45 52 45 5f 49 50 4b 29 21 3d 30 20 26 26 20 28  ERE_IPK)!=0 && (
1d200 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  flags & WHERE_CO
1d210 4e 53 54 52 41 49 4e 54 29 21 3d 30 20 29 7b 0a  NSTRAINT)!=0 ){.
1d220 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
1d230 20 2a 7a 52 61 6e 67 65 3b 0a 20 20 20 20 20 20   *zRange;.      
1d240 69 66 28 20 66 6c 61 67 73 26 28 57 48 45 52 45  if( flags&(WHERE
1d250 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45  _COLUMN_EQ|WHERE
1d260 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 20 29 7b 0a 20  _COLUMN_IN) ){. 
1d270 20 20 20 20 20 20 20 7a 52 61 6e 67 65 20 3d 20         zRange = 
1d280 22 28 72 6f 77 69 64 3d 3f 29 22 3b 0a 20 20 20  "(rowid=?)";.   
1d290 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c     }else if( (fl
1d2a0 61 67 73 26 57 48 45 52 45 5f 42 4f 54 48 5f 4c  ags&WHERE_BOTH_L
1d2b0 49 4d 49 54 29 3d 3d 57 48 45 52 45 5f 42 4f 54  IMIT)==WHERE_BOT
1d2c0 48 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20  H_LIMIT ){.     
1d2d0 20 20 20 7a 52 61 6e 67 65 20 3d 20 22 28 72 6f     zRange = "(ro
1d2e0 77 69 64 3e 3f 20 41 4e 44 20 72 6f 77 69 64 3c  wid>? AND rowid<
1d2f0 3f 29 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ?)";.      }else
1d300 20 69 66 28 20 66 6c 61 67 73 26 57 48 45 52 45   if( flags&WHERE
1d310 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  _BTM_LIMIT ){.  
1d320 20 20 20 20 20 20 7a 52 61 6e 67 65 20 3d 20 22        zRange = "
1d330 28 72 6f 77 69 64 3e 3f 29 22 3b 0a 20 20 20 20  (rowid>?)";.    
1d340 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1d350 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 26 57   assert( flags&W
1d360 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3b  HERE_TOP_LIMIT);
1d370 0a 20 20 20 20 20 20 20 20 7a 52 61 6e 67 65 20  .        zRange 
1d380 3d 20 22 28 72 6f 77 69 64 3c 3f 29 22 3b 0a 20  = "(rowid<?)";. 
1d390 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
1d3a0 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
1d3b0 6e 64 41 6c 6c 28 26 73 74 72 2c 20 22 20 55 53  ndAll(&str, " US
1d3c0 49 4e 47 20 49 4e 54 45 47 45 52 20 50 52 49 4d  ING INTEGER PRIM
1d3d0 41 52 59 20 4b 45 59 20 22 29 3b 0a 20 20 20 20  ARY KEY ");.    
1d3e0 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
1d3f0 6d 41 70 70 65 6e 64 41 6c 6c 28 26 73 74 72 2c  mAppendAll(&str,
1d400 20 7a 52 61 6e 67 65 29 3b 0a 20 20 20 20 7d 0a   zRange);.    }.
1d410 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1d420 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
1d430 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 28 66  .    else if( (f
1d440 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
1d450 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b  TUALTABLE)!=0 ){
1d460 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50  .      sqlite3XP
1d470 72 69 6e 74 66 28 26 73 74 72 2c 20 30 2c 20 22  rintf(&str, 0, "
1d480 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 49   VIRTUAL TABLE I
1d490 4e 44 45 58 20 25 64 3a 25 73 22 2c 0a 20 20 20  NDEX %d:%s",.   
1d4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1d4b0 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  Loop->u.vtab.idx
1d4c0 4e 75 6d 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74  Num, pLoop->u.vt
1d4d0 61 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20  ab.idxStr);.    
1d4e0 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  }.#endif.#ifdef 
1d4f0 53 51 4c 49 54 45 5f 45 58 50 4c 41 49 4e 5f 45  SQLITE_EXPLAIN_E
1d500 53 54 49 4d 41 54 45 44 5f 52 4f 57 53 0a 20 20  STIMATED_ROWS.  
1d510 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75    if( pLoop->nOu
1d520 74 3e 3d 31 30 20 29 7b 0a 20 20 20 20 20 20 73  t>=10 ){.      s
1d530 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 73  qlite3XPrintf(&s
1d540 74 72 2c 20 30 2c 20 22 20 28 7e 25 6c 6c 75 20  tr, 0, " (~%llu 
1d550 72 6f 77 73 29 22 2c 20 73 71 6c 69 74 65 33 4c  rows)", sqlite3L
1d560 6f 67 45 73 74 54 6f 49 6e 74 28 70 4c 6f 6f 70  ogEstToInt(pLoop
1d570 2d 3e 6e 4f 75 74 29 29 3b 0a 20 20 20 20 7d 65  ->nOut));.    }e
1d580 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
1d590 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
1d5a0 28 26 73 74 72 2c 20 22 20 28 7e 31 20 72 6f 77  (&str, " (~1 row
1d5b0 29 22 2c 20 39 29 3b 0a 20 20 20 20 7d 0a 23 65  )", 9);.    }.#e
1d5c0 6e 64 69 66 0a 20 20 20 20 7a 4d 73 67 20 3d 20  ndif.    zMsg = 
1d5d0 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46  sqlite3StrAccumF
1d5e0 69 6e 69 73 68 28 26 73 74 72 29 3b 0a 20 20 20  inish(&str);.   
1d5f0 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64   ret = sqlite3Vd
1d600 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45  beAddOp4(v, OP_E
1d610 78 70 6c 61 69 6e 2c 20 69 49 64 2c 20 69 4c 65  xplain, iId, iLe
1d620 76 65 6c 2c 20 69 46 72 6f 6d 2c 20 7a 4d 73 67  vel, iFrom, zMsg
1d630 2c 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ,P4_DYNAMIC);.  
1d640 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a  }.  return ret;.
1d650 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
1d660 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28   explainOneScan(
1d670 75 2c 76 2c 77 2c 78 2c 79 2c 7a 29 20 30 0a 23  u,v,w,x,y,z) 0.#
1d680 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1d690 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a  OMIT_EXPLAIN */.
1d6a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1d6b0 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53  NABLE_STMT_SCANS
1d6c0 54 41 54 55 53 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66  TATUS./*.** Conf
1d6d0 69 67 75 72 65 20 74 68 65 20 56 4d 20 70 61 73  igure the VM pas
1d6e0 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
1d6f0 20 61 72 67 75 6d 65 6e 74 20 77 69 74 68 20 61   argument with a
1d700 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 73 74 6d  n.** sqlite3_stm
1d710 74 5f 73 63 61 6e 73 74 61 74 75 73 28 29 20 65  t_scanstatus() e
1d720 6e 74 72 79 20 63 6f 72 72 65 73 70 6f 6e 64 69  ntry correspondi
1d730 6e 67 20 74 6f 20 74 68 65 20 73 63 61 6e 20 75  ng to the scan u
1d740 73 65 64 20 74 6f 20 0a 2a 2a 20 69 6d 70 6c 65  sed to .** imple
1d750 6d 65 6e 74 20 6c 65 76 65 6c 20 70 4c 76 6c 2e  ment level pLvl.
1d760 20 41 72 67 75 6d 65 6e 74 20 70 53 72 63 6c 69   Argument pSrcli
1d770 73 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  st is a pointer 
1d780 74 6f 20 74 68 65 20 46 52 4f 4d 20 0a 2a 2a 20  to the FROM .** 
1d790 63 6c 61 75 73 65 20 74 68 61 74 20 74 68 65 20  clause that the 
1d7a0 73 63 61 6e 20 72 65 61 64 73 20 64 61 74 61 20  scan reads data 
1d7b0 66 72 6f 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  from..**.** If a
1d7c0 72 67 75 6d 65 6e 74 20 61 64 64 72 45 78 70 6c  rgument addrExpl
1d7d0 61 69 6e 20 69 73 20 6e 6f 74 20 30 2c 20 69 74  ain is not 0, it
1d7e0 20 6d 75 73 74 20 62 65 20 74 68 65 20 61 64 64   must be the add
1d7f0 72 65 73 73 20 6f 66 20 61 6e 20 0a 2a 2a 20 4f  ress of an .** O
1d800 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75  P_Explain instru
1d810 63 74 69 6f 6e 20 74 68 61 74 20 64 65 73 63 72  ction that descr
1d820 69 62 65 73 20 74 68 65 20 73 61 6d 65 20 6c 6f  ibes the same lo
1d830 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
1d840 69 64 20 61 64 64 53 63 61 6e 53 74 61 74 75 73  id addScanStatus
1d850 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20  (.  Vdbe *v,    
1d860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d870 20 20 20 20 2f 2a 20 56 64 62 65 20 74 6f 20 61      /* Vdbe to a
1d880 64 64 20 73 63 61 6e 73 74 61 74 75 73 20 65 6e  dd scanstatus en
1d890 74 72 79 20 74 6f 20 2a 2f 0a 20 20 53 72 63 4c  try to */.  SrcL
1d8a0 69 73 74 20 2a 70 53 72 63 6c 69 73 74 2c 20 20  ist *pSrclist,  
1d8b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1d8c0 52 4f 4d 20 63 6c 61 75 73 65 20 70 4c 76 6c 20  ROM clause pLvl 
1d8d0 72 65 61 64 73 20 64 61 74 61 20 66 72 6f 6d 20  reads data from 
1d8e0 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
1d8f0 2a 70 4c 76 6c 2c 20 20 20 20 20 20 20 20 20 20  *pLvl,          
1d900 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 74 6f       /* Level to
1d910 20 61 64 64 20 73 63 61 6e 73 74 61 74 75 73 28   add scanstatus(
1d920 29 20 65 6e 74 72 79 20 66 6f 72 20 2a 2f 0a 20  ) entry for */. 
1d930 20 69 6e 74 20 61 64 64 72 45 78 70 6c 61 69 6e   int addrExplain
1d940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d950 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f   /* Address of O
1d960 50 5f 45 78 70 6c 61 69 6e 20 28 6f 72 20 30 29  P_Explain (or 0)
1d970 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63   */.){.  const c
1d980 68 61 72 20 2a 7a 4f 62 6a 20 3d 20 30 3b 0a 20  har *zObj = 0;. 
1d990 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
1d9a0 70 20 3d 20 70 4c 76 6c 2d 3e 70 57 4c 6f 6f 70  p = pLvl->pWLoop
1d9b0 3b 0a 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e  ;.  if( (pLoop->
1d9c0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1d9d0 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30  VIRTUALTABLE)==0
1d9e0 20 20 26 26 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62    &&  pLoop->u.b
1d9f0 74 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 20 29  tree.pIndex!=0 )
1da00 7b 0a 20 20 20 20 7a 4f 62 6a 20 3d 20 70 4c 6f  {.    zObj = pLo
1da10 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
1da20 65 78 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 7d 65 6c  ex->zName;.  }el
1da30 73 65 7b 0a 20 20 20 20 7a 4f 62 6a 20 3d 20 70  se{.    zObj = p
1da40 53 72 63 6c 69 73 74 2d 3e 61 5b 70 4c 76 6c 2d  Srclist->a[pLvl-
1da50 3e 69 46 72 6f 6d 5d 2e 7a 4e 61 6d 65 3b 0a 20  >iFrom].zName;. 
1da60 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
1da70 53 63 61 6e 53 74 61 74 75 73 28 0a 20 20 20 20  ScanStatus(.    
1da80 20 20 76 2c 20 61 64 64 72 45 78 70 6c 61 69 6e    v, addrExplain
1da90 2c 20 70 4c 76 6c 2d 3e 61 64 64 72 42 6f 64 79  , pLvl->addrBody
1daa0 2c 20 70 4c 76 6c 2d 3e 61 64 64 72 56 69 73 69  , pLvl->addrVisi
1dab0 74 2c 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 2c 20  t, pLoop->nOut, 
1dac0 7a 4f 62 6a 0a 20 20 29 3b 0a 7d 0a 23 65 6c 73  zObj.  );.}.#els
1dad0 65 0a 23 20 64 65 66 69 6e 65 20 61 64 64 53 63  e.# define addSc
1dae0 61 6e 53 74 61 74 75 73 28 61 2c 20 62 2c 20 63  anStatus(a, b, c
1daf0 2c 20 64 29 20 28 28 76 6f 69 64 29 64 29 0a 23  , d) ((void)d).#
1db00 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  endif../*.** If 
1db10 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
1db20 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74  y coded instruct
1db30 69 6f 6e 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  ion is a constan
1db40 74 20 72 61 6e 67 65 20 63 6f 6e 74 72 61 69 6e  t range contrain
1db50 74 0a 2a 2a 20 74 68 61 74 20 6f 72 69 67 69 6e  t.** that origin
1db60 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20 4c 49  ated from the LI
1db70 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c  KE optimization,
1db80 20 74 68 65 6e 20 63 68 61 6e 67 65 20 74 68 65   then change the
1db90 20 50 33 20 74 6f 20 62 65 0a 2a 2a 20 70 4c 6f   P3 to be.** pLo
1dba0 6f 70 2d 3e 69 4c 69 6b 65 52 65 70 43 6e 74 72  op->iLikeRepCntr
1dbb0 20 61 6e 64 20 73 65 74 20 50 35 2e 0a 2a 2a 0a   and set P5..**.
1dbc0 2a 2a 20 54 68 65 20 4c 49 4b 45 20 6f 70 74 69  ** The LIKE opti
1dbd0 6d 69 7a 61 74 69 6f 6e 20 74 72 79 73 20 74 6f  mization trys to
1dbe0 20 65 76 61 6c 75 61 74 65 20 22 78 20 4c 49 4b   evaluate "x LIK
1dbf0 45 20 27 61 62 63 25 27 22 20 61 73 20 61 20 72  E 'abc%'" as a r
1dc00 61 6e 67 65 0a 2a 2a 20 65 78 70 72 65 73 73 69  ange.** expressi
1dc10 6f 6e 3a 20 22 78 3e 3d 27 41 42 43 27 20 41 4e  on: "x>='ABC' AN
1dc20 44 20 78 3c 27 61 62 64 27 22 2e 20 20 42 75 74  D x<'abd'".  But
1dc30 20 74 68 69 73 20 72 65 71 75 69 72 65 73 20 74   this requires t
1dc40 68 61 74 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a  hat the range.**
1dc50 20 73 63 61 6e 20 6c 6f 6f 70 20 72 75 6e 20 74   scan loop run t
1dc60 77 69 63 65 2c 20 6f 6e 63 65 20 66 6f 72 20 73  wice, once for s
1dc70 74 72 69 6e 67 73 20 61 6e 64 20 61 20 73 65 63  trings and a sec
1dc80 6f 6e 64 20 74 69 6d 65 20 66 6f 72 20 42 4c 4f  ond time for BLO
1dc90 42 73 2e 0a 2a 2a 20 54 68 65 20 4f 50 5f 53 74  Bs..** The OP_St
1dca0 72 69 6e 67 20 6f 70 63 6f 64 65 73 20 6f 6e 20  ring opcodes on 
1dcb0 74 68 65 20 73 65 63 6f 6e 64 20 70 61 73 73 20  the second pass 
1dcc0 63 6f 6e 76 65 72 74 20 74 68 65 20 75 70 70 65  convert the uppe
1dcd0 72 20 61 6e 64 20 6c 6f 77 65 72 0a 2a 2a 20 62  r and lower.** b
1dce0 6f 75 6e 64 20 73 74 72 69 6e 67 20 63 6f 6e 74  ound string cont
1dcf0 61 6e 74 73 20 74 6f 20 62 6c 6f 62 73 2e 20 20  ants to blobs.  
1dd00 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b  This routine mak
1dd10 65 73 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  es the necessary
1dd20 20 63 68 61 6e 67 65 73 0a 2a 2a 20 74 6f 20 74   changes.** to t
1dd30 68 65 20 4f 50 5f 53 74 72 69 6e 67 20 6f 70 63  he OP_String opc
1dd40 6f 64 65 73 20 66 6f 72 20 74 68 61 74 20 74 6f  odes for that to
1dd50 20 68 61 70 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74   happen..*/.stat
1dd60 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 69 6b  ic void whereLik
1dd70 65 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 53 74 72  eOptimizationStr
1dd80 69 6e 67 46 69 78 75 70 28 0a 20 20 56 64 62 65  ingFixup(.  Vdbe
1dd90 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20 20   *v,            
1dda0 20 20 20 20 2f 2a 20 70 72 65 70 61 72 65 64 20      /* prepared 
1ddb0 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20  statement under 
1ddc0 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
1ddd0 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
1dde0 65 76 65 6c 2c 20 20 20 20 20 2f 2a 20 54 68 65  evel,     /* The
1ddf0 20 6c 6f 6f 70 20 74 68 61 74 20 63 6f 6e 74 61   loop that conta
1de00 69 6e 73 20 74 68 65 20 4c 49 4b 45 20 6f 70 65  ins the LIKE ope
1de10 72 61 74 6f 72 20 2a 2f 0a 20 20 57 68 65 72 65  rator */.  Where
1de20 54 65 72 6d 20 2a 70 54 65 72 6d 20 20 20 20 20  Term *pTerm     
1de30 20 20 20 2f 2a 20 54 68 65 20 75 70 70 65 72 20     /* The upper 
1de40 6f 72 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6a  or lower bound j
1de50 75 73 74 20 63 6f 64 65 64 20 2a 2f 0a 29 7b 0a  ust coded */.){.
1de60 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
1de70 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45  lags & TERM_LIKE
1de80 4f 50 54 20 29 7b 0a 20 20 20 20 56 64 62 65 4f  OPT ){.    VdbeO
1de90 70 20 2a 70 4f 70 3b 0a 20 20 20 20 61 73 73 65  p *pOp;.    asse
1dea0 72 74 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b  rt( pLevel->iLik
1deb0 65 52 65 70 43 6e 74 72 3e 30 20 29 3b 0a 20 20  eRepCntr>0 );.  
1dec0 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56    pOp = sqlite3V
1ded0 64 62 65 47 65 74 4f 70 28 76 2c 20 2d 31 29 3b  dbeGetOp(v, -1);
1dee0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70  .    assert( pOp
1def0 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
1df00 74 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  t( pOp->opcode==
1df10 4f 50 5f 53 74 72 69 6e 67 38 20 0a 20 20 20 20  OP_String8 .    
1df20 20 20 20 20 20 20 20 20 7c 7c 20 70 54 65 72 6d          || pTerm
1df30 2d 3e 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70  ->pWC->pWInfo->p
1df40 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
1df50 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 70  cFailed );.    p
1df60 4f 70 2d 3e 70 33 20 3d 20 70 4c 65 76 65 6c 2d  Op->p3 = pLevel-
1df70 3e 69 4c 69 6b 65 52 65 70 43 6e 74 72 3b 0a 20  >iLikeRepCntr;. 
1df80 20 20 20 70 4f 70 2d 3e 70 35 20 3d 20 31 3b 0a     pOp->p5 = 1;.
1df90 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
1dfa0 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
1dfb0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
1dfc0 69 4c 65 76 65 6c 2d 74 68 20 6c 6f 6f 70 20 69  iLevel-th loop i
1dfd0 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
1dfe0 73 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61  se.** implementa
1dff0 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 62  tion described b
1e000 79 20 70 57 49 6e 66 6f 2e 0a 2a 2f 0a 73 74 61  y pWInfo..*/.sta
1e010 74 69 63 20 42 69 74 6d 61 73 6b 20 63 6f 64 65  tic Bitmask code
1e020 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28 0a 20 20  OneLoopStart(.  
1e030 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
1e040 6f 2c 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65  o,   /* Complete
1e050 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
1e060 75 74 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  ut the WHERE cla
1e070 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  use */.  int iLe
1e080 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  vel,          /*
1e090 20 57 68 69 63 68 20 6c 65 76 65 6c 20 6f 66 20   Which level of 
1e0a0 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 73 68 6f 75  pWInfo->a[] shou
1e0b0 6c 64 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  ld be coded */. 
1e0c0 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
1e0d0 79 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 74  y     /* Which t
1e0e0 61 62 6c 65 73 20 61 72 65 20 63 75 72 72 65 6e  ables are curren
1e0f0 74 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f  tly available */
1e100 0a 29 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b 20  .){.  int j, k; 
1e110 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
1e120 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
1e130 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20   int iCur;      
1e140 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
1e150 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  E cursor for the
1e160 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
1e170 61 64 64 72 4e 78 74 3b 20 20 20 20 20 20 20 20  addrNxt;        
1e180 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a 75 6d   /* Where to jum
1e190 70 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69  p to continue wi
1e1a0 74 68 20 74 68 65 20 6e 65 78 74 20 49 4e 20 63  th the next IN c
1e1b0 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6d 69  ase */.  int omi
1e1c0 74 54 61 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a  tTable;       /*
1e1d0 20 54 72 75 65 20 69 66 20 77 65 20 75 73 65 20   True if we use 
1e1e0 74 68 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2a  the index only *
1e1f0 2f 0a 20 20 69 6e 74 20 62 52 65 76 3b 20 20 20  /.  int bRev;   
1e200 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1e210 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 73   if we need to s
1e220 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f  can in reverse o
1e230 72 64 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c  rder */.  WhereL
1e240 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 2f  evel *pLevel;  /
1e250 2a 20 54 68 65 20 77 68 65 72 65 20 6c 65 76 65  * The where leve
1e260 6c 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  l to be coded */
1e270 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
1e280 6f 6f 70 3b 20 20 20 20 2f 2a 20 54 68 65 20 57  oop;    /* The W
1e290 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20  hereLoop object 
1e2a0 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
1e2b0 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
1e2c0 43 3b 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f  C;    /* Decompo
1e2d0 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 6e  sition of the en
1e2e0 74 69 72 65 20 57 48 45 52 45 20 63 6c 61 75 73  tire WHERE claus
1e2f0 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  e */.  WhereTerm
1e300 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
1e310 20 20 20 20 20 20 20 2f 2a 20 41 20 57 48 45 52         /* A WHER
1e320 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f  E clause term */
1e330 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1e340 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e350 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
1e360 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74  ntext */.  sqlit
1e370 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
1e380 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
1e390 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1e3a0 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  n */.  Vdbe *v; 
1e3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e3c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72         /* The pr
1e3d0 65 70 61 72 65 64 20 73 74 6d 74 20 75 6e 64 65  epared stmt unde
1e3e0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 73 20  r constructions 
1e3f0 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
1e400 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74  ist_item *pTabIt
1e410 65 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61  em;  /* FROM cla
1e420 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20 63  use term being c
1e430 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64  oded */.  int ad
1e440 64 72 42 72 6b 3b 20 20 20 20 20 20 20 20 20 20  drBrk;          
1e450 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
1e460 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20  p here to break 
1e470 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  out of the loop 
1e480 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e  */.  int addrCon
1e490 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1e4a0 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
1e4b0 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69  e to continue wi
1e4c0 74 68 20 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f  th next cycle */
1e4d0 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 52 65 67  .  int iRowidReg
1e4e0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
1e4f0 52 6f 77 69 64 20 69 73 20 73 74 6f 72 65 64 20  Rowid is stored 
1e500 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72  in this register
1e510 2c 20 69 66 20 6e 6f 74 20 7a 65 72 6f 20 2a 2f  , if not zero */
1e520 0a 20 20 69 6e 74 20 69 52 65 6c 65 61 73 65 52  .  int iReleaseR
1e530 65 67 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  eg = 0;      /* 
1e540 54 65 6d 70 20 72 65 67 69 73 74 65 72 20 74 6f  Temp register to
1e550 20 66 72 65 65 20 62 65 66 6f 72 65 20 72 65 74   free before ret
1e560 75 72 6e 69 6e 67 20 2a 2f 0a 0a 20 20 70 50 61  urning */..  pPa
1e570 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  rse = pWInfo->pP
1e580 61 72 73 65 3b 0a 20 20 76 20 3d 20 70 50 61 72  arse;.  v = pPar
1e590 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 70 57 43  se->pVdbe;.  pWC
1e5a0 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b   = &pWInfo->sWC;
1e5b0 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
1e5c0 64 62 3b 0a 20 20 70 4c 65 76 65 6c 20 3d 20 26  db;.  pLevel = &
1e5d0 70 57 49 6e 66 6f 2d 3e 61 5b 69 4c 65 76 65 6c  pWInfo->a[iLevel
1e5e0 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65  ];.  pLoop = pLe
1e5f0 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 70  vel->pWLoop;.  p
1e600 54 61 62 49 74 65 6d 20 3d 20 26 70 57 49 6e 66  TabItem = &pWInf
1e610 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  o->pTabList->a[p
1e620 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20  Level->iFrom];. 
1e630 20 69 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d   iCur = pTabItem
1e640 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 4c 65  ->iCursor;.  pLe
1e650 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 20 3d 20  vel->notReady = 
1e660 6e 6f 74 52 65 61 64 79 20 26 20 7e 67 65 74 4d  notReady & ~getM
1e670 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  ask(&pWInfo->sMa
1e680 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a 20 20  skSet, iCur);.  
1e690 62 52 65 76 20 3d 20 28 70 57 49 6e 66 6f 2d 3e  bRev = (pWInfo->
1e6a0 72 65 76 4d 61 73 6b 3e 3e 69 4c 65 76 65 6c 29  revMask>>iLevel)
1e6b0 26 31 3b 0a 20 20 6f 6d 69 74 54 61 62 6c 65 20  &1;.  omitTable 
1e6c0 3d 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  = (pLoop->wsFlag
1e6d0 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
1e6e0 4c 59 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20  LY)!=0 .        
1e6f0 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77     && (pWInfo->w
1e700 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
1e710 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 29 3d 3d  E_FORCE_TABLE)==
1e720 30 3b 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65 43  0;.  VdbeModuleC
1e730 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69  omment((v, "Begi
1e740 6e 20 57 48 45 52 45 2d 6c 6f 6f 70 25 64 3a 20  n WHERE-loop%d: 
1e750 25 73 22 2c 69 4c 65 76 65 6c 2c 70 54 61 62 49  %s",iLevel,pTabI
1e760 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
1e770 29 29 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65  ));..  /* Create
1e780 20 6c 61 62 65 6c 73 20 66 6f 72 20 74 68 65 20   labels for the 
1e790 22 62 72 65 61 6b 22 20 61 6e 64 20 22 63 6f 6e  "break" and "con
1e7a0 74 69 6e 75 65 22 20 69 6e 73 74 72 75 63 74 69  tinue" instructi
1e7b0 6f 6e 73 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  ons.  ** for the
1e7c0 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 2e 20 20   current loop.  
1e7d0 4a 75 6d 70 20 74 6f 20 61 64 64 72 42 72 6b 20  Jump to addrBrk 
1e7e0 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20  to break out of 
1e7f0 61 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 4a 75 6d  a loop..  ** Jum
1e800 70 20 74 6f 20 63 6f 6e 74 20 74 6f 20 67 6f 20  p to cont to go 
1e810 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 74  immediately to t
1e820 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f  he next iteratio
1e830 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f  n of the.  ** lo
1e840 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  op..  **.  ** Wh
1e850 65 6e 20 74 68 65 72 65 20 69 73 20 61 6e 20 49  en there is an I
1e860 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77 65 20 61  N operator, we a
1e870 6c 73 6f 20 68 61 76 65 20 61 20 22 61 64 64 72  lso have a "addr
1e880 4e 78 74 22 20 6c 61 62 65 6c 20 74 68 61 74 0a  Nxt" label that.
1e890 20 20 2a 2a 20 6d 65 61 6e 73 20 74 6f 20 63 6f    ** means to co
1e8a0 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68 65 20  ntinue with the 
1e8b0 6e 65 78 74 20 49 4e 20 76 61 6c 75 65 20 63 6f  next IN value co
1e8c0 6d 62 69 6e 61 74 69 6f 6e 2e 20 20 57 68 65 6e  mbination.  When
1e8d0 0a 20 20 2a 2a 20 74 68 65 72 65 20 61 72 65 20  .  ** there are 
1e8e0 6e 6f 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20  no IN operators 
1e8f0 69 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  in the constrain
1e900 74 73 2c 20 74 68 65 20 22 61 64 64 72 4e 78 74  ts, the "addrNxt
1e910 22 20 6c 61 62 65 6c 0a 20 20 2a 2a 20 69 73 20  " label.  ** is 
1e920 74 68 65 20 73 61 6d 65 20 61 73 20 22 61 64 64  the same as "add
1e930 72 42 72 6b 22 2e 0a 20 20 2a 2f 0a 20 20 61 64  rBrk"..  */.  ad
1e940 64 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e  drBrk = pLevel->
1e950 61 64 64 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c  addrBrk = pLevel
1e960 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73 71 6c 69  ->addrNxt = sqli
1e970 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1e980 28 76 29 3b 0a 20 20 61 64 64 72 43 6f 6e 74 20  (v);.  addrCont 
1e990 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f  = pLevel->addrCo
1e9a0 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
1e9b0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20  MakeLabel(v);.. 
1e9c0 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   /* If this is t
1e9d0 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f  he right table o
1e9e0 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  f a LEFT OUTER J
1e9f0 4f 49 4e 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e  OIN, allocate an
1ea00 64 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a  d.  ** initializ
1ea10 65 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  e a memory cell 
1ea20 74 68 61 74 20 72 65 63 6f 72 64 73 20 69 66 20  that records if 
1ea30 74 68 69 73 20 74 61 62 6c 65 20 6d 61 74 63 68  this table match
1ea40 65 73 20 61 6e 79 0a 20 20 2a 2a 20 72 6f 77 20  es any.  ** row 
1ea50 6f 66 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c  of the left tabl
1ea60 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20  e of the join.. 
1ea70 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76 65 6c   */.  if( pLevel
1ea80 2d 3e 69 46 72 6f 6d 3e 30 20 26 26 20 28 70 54  ->iFrom>0 && (pT
1ea90 61 62 49 74 65 6d 5b 30 5d 2e 6a 6f 69 6e 74 79  abItem[0].jointy
1eaa0 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30  pe & JT_LEFT)!=0
1eab0 20 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e   ){.    pLevel->
1eac0 69 4c 65 66 74 4a 6f 69 6e 20 3d 20 2b 2b 70 50  iLeftJoin = ++pP
1ead0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
1eae0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1eaf0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
1eb00 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66   0, pLevel->iLef
1eb10 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62 65  tJoin);.    Vdbe
1eb20 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 69  Comment((v, "ini
1eb30 74 20 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f 2d 6d  t LEFT JOIN no-m
1eb40 61 74 63 68 20 66 6c 61 67 22 29 29 3b 0a 20 20  atch flag"));.  
1eb50 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20  }..  /* Special 
1eb60 63 61 73 65 20 6f 66 20 61 20 46 52 4f 4d 20 63  case of a FROM c
1eb70 6c 61 75 73 65 20 73 75 62 71 75 65 72 79 20 69  lause subquery i
1eb80 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20  mplemented as a 
1eb90 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  co-routine */.  
1eba0 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 76 69  if( pTabItem->vi
1ebb0 61 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20  aCoroutine ){.  
1ebc0 20 20 69 6e 74 20 72 65 67 59 69 65 6c 64 20 3d    int regYield =
1ebd0 20 70 54 61 62 49 74 65 6d 2d 3e 72 65 67 52 65   pTabItem->regRe
1ebe0 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  turn;.    sqlite
1ebf0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1ec00 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c  P_InitCoroutine,
1ec10 20 72 65 67 59 69 65 6c 64 2c 20 30 2c 20 70 54   regYield, 0, pT
1ec20 61 62 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c  abItem->addrFill
1ec30 53 75 62 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c  Sub);.    pLevel
1ec40 2d 3e 70 32 20 3d 20 20 73 71 6c 69 74 65 33 56  ->p2 =  sqlite3V
1ec50 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1ec60 59 69 65 6c 64 2c 20 72 65 67 59 69 65 6c 64 2c  Yield, regYield,
1ec70 20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 56   addrBrk);.    V
1ec80 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1ec90 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
1eca0 28 76 2c 20 22 6e 65 78 74 20 72 6f 77 20 6f 66  (v, "next row of
1ecb0 20 5c 22 25 73 5c 22 22 2c 20 70 54 61 62 49 74   \"%s\"", pTabIt
1ecc0 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
1ecd0 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  );.    pLevel->o
1ece0 70 20 3d 20 4f 50 5f 47 6f 74 6f 3b 0a 20 20 7d  p = OP_Goto;.  }
1ecf0 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51  else..#ifndef SQ
1ed00 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
1ed10 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 20 28 70  LTABLE.  if(  (p
1ed20 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
1ed30 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
1ed40 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  LE)!=0 ){.    /*
1ed50 20 43 61 73 65 20 31 3a 20 20 54 68 65 20 74 61   Case 1:  The ta
1ed60 62 6c 65 20 69 73 20 61 20 76 69 72 74 75 61 6c  ble is a virtual
1ed70 2d 74 61 62 6c 65 2e 20 20 55 73 65 20 74 68 65  -table.  Use the
1ed80 20 56 46 69 6c 74 65 72 20 61 6e 64 20 56 4e 65   VFilter and VNe
1ed90 78 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  xt.    **       
1eda0 20 20 20 74 6f 20 61 63 63 65 73 73 20 74 68 65     to access the
1edb0 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20   data..    */.  
1edc0 20 20 69 6e 74 20 69 52 65 67 3b 20 20 20 2f 2a    int iReg;   /*
1edd0 20 50 33 20 56 61 6c 75 65 20 66 6f 72 20 4f 50   P3 Value for OP
1ede0 5f 56 46 69 6c 74 65 72 20 2a 2f 0a 20 20 20 20  _VFilter */.    
1edf0 69 6e 74 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64  int addrNotFound
1ee00 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74  ;.    int nConst
1ee10 72 61 69 6e 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e  raint = pLoop->n
1ee20 4c 54 65 72 6d 3b 0a 0a 20 20 20 20 73 71 6c 69  LTerm;..    sqli
1ee30 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
1ee40 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 52  (pParse);.    iR
1ee50 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  eg = sqlite3GetT
1ee60 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
1ee70 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b   nConstraint+2);
1ee80 0a 20 20 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e  .    addrNotFoun
1ee90 64 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  d = pLevel->addr
1eea0 42 72 6b 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  Brk;.    for(j=0
1eeb0 3b 20 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  ; j<nConstraint;
1eec0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   j++){.      int
1eed0 20 69 54 61 72 67 65 74 20 3d 20 69 52 65 67 2b   iTarget = iReg+
1eee0 6a 2b 32 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  j+2;.      pTerm
1eef0 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d   = pLoop->aLTerm
1ef00 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  [j];.      if( p
1ef10 54 65 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  Term==0 ) contin
1ef20 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  ue;.      if( pT
1ef30 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
1ef40 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20   WO_IN ){.      
1ef50 20 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65    codeEqualityTe
1ef60 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d  rm(pParse, pTerm
1ef70 2c 20 70 4c 65 76 65 6c 2c 20 6a 2c 20 62 52 65  , pLevel, j, bRe
1ef80 76 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20 20  v, iTarget);.   
1ef90 20 20 20 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e       addrNotFoun
1efa0 64 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  d = pLevel->addr
1efb0 4e 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Nxt;.      }else
1efc0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1efd0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
1efe0 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  , pTerm->pExpr->
1eff0 70 52 69 67 68 74 2c 20 69 54 61 72 67 65 74 29  pRight, iTarget)
1f000 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1f010 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1f020 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
1f030 67 65 72 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74  ger, pLoop->u.vt
1f040 61 62 2e 69 64 78 4e 75 6d 2c 20 69 52 65 67 29  ab.idxNum, iReg)
1f050 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1f060 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
1f070 74 65 67 65 72 2c 20 6e 43 6f 6e 73 74 72 61 69  teger, nConstrai
1f080 6e 74 2c 20 69 52 65 67 2b 31 29 3b 0a 20 20 20  nt, iReg+1);.   
1f090 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1f0a0 70 34 28 76 2c 20 4f 50 5f 56 46 69 6c 74 65 72  p4(v, OP_VFilter
1f0b0 2c 20 69 43 75 72 2c 20 61 64 64 72 4e 6f 74 46  , iCur, addrNotF
1f0c0 6f 75 6e 64 2c 20 69 52 65 67 2c 0a 20 20 20 20  ound, iReg,.    
1f0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0e0 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e    pLoop->u.vtab.
1f0f0 69 64 78 53 74 72 2c 0a 20 20 20 20 20 20 20 20  idxStr,.        
1f100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
1f110 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  oop->u.vtab.need
1f120 46 72 65 65 20 3f 20 50 34 5f 4d 50 52 49 4e 54  Free ? P4_MPRINT
1f130 46 20 3a 20 50 34 5f 53 54 41 54 49 43 29 3b 0a  F : P4_STATIC);.
1f140 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1f150 28 76 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  (v);.    pLoop->
1f160 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
1f170 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  = 0;.    for(j=0
1f180 3b 20 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 20  ; j<nConstraint 
1f190 26 26 20 6a 3c 31 36 3b 20 6a 2b 2b 29 7b 0a 20  && j<16; j++){. 
1f1a0 20 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d       if( (pLoop-
1f1b0 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b  >u.vtab.omitMask
1f1c0 3e 3e 6a 29 26 31 20 29 7b 0a 20 20 20 20 20 20  >>j)&1 ){.      
1f1d0 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
1f1e0 65 76 65 6c 2c 20 70 4c 6f 6f 70 2d 3e 61 4c 54  evel, pLoop->aLT
1f1f0 65 72 6d 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 7d  erm[j]);.      }
1f200 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65  .    }.    pLeve
1f210 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 56 4e 65 78 74  l->op = OP_VNext
1f220 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31  ;.    pLevel->p1
1f230 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65   = iCur;.    pLe
1f240 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65  vel->p2 = sqlite
1f250 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
1f260 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
1f270 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
1f280 28 70 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e  (pParse, iReg, n
1f290 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20  Constraint+2);. 
1f2a0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1f2b0 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  chePop(pParse);.
1f2c0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f    }else.#endif /
1f2d0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
1f2e0 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20  RTUALTABLE */.. 
1f2f0 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
1f300 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b  lags & WHERE_IPK
1f310 29 21 3d 30 0a 20 20 20 26 26 20 28 70 4c 6f 6f  )!=0.   && (pLoo
1f320 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48  p->wsFlags & (WH
1f330 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48  ERE_COLUMN_IN|WH
1f340 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 29 21  ERE_COLUMN_EQ))!
1f350 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 43  =0.  ){.    /* C
1f360 61 73 65 20 32 3a 20 20 57 65 20 63 61 6e 20 64  ase 2:  We can d
1f370 69 72 65 63 74 6c 79 20 72 65 66 65 72 65 6e 63  irectly referenc
1f380 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 75  e a single row u
1f390 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 20  sing an.    **  
1f3a0 20 20 20 20 20 20 20 20 65 71 75 61 6c 69 74 79          equality
1f3b0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69   comparison agai
1f3c0 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20 66 69  nst the ROWID fi
1f3d0 65 6c 64 2e 20 20 4f 72 0a 20 20 20 20 2a 2a 20  eld.  Or.    ** 
1f3e0 20 20 20 20 20 20 20 20 20 77 65 20 72 65 66 65           we refe
1f3f0 72 65 6e 63 65 20 6d 75 6c 74 69 70 6c 65 20 72  rence multiple r
1f400 6f 77 73 20 75 73 69 6e 67 20 61 20 22 72 6f 77  ows using a "row
1f410 69 64 20 49 4e 20 28 2e 2e 2e 29 22 0a 20 20 20  id IN (...)".   
1f420 20 2a 2a 20 20 20 20 20 20 20 20 20 20 63 6f 6e   **          con
1f430 73 74 72 75 63 74 2e 0a 20 20 20 20 2a 2f 0a 20  struct..    */. 
1f440 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70     assert( pLoop
1f450 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3d 3d 31  ->u.btree.nEq==1
1f460 20 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20   );.    pTerm = 
1f470 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d  pLoop->aLTerm[0]
1f480 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
1f490 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  erm!=0 );.    as
1f4a0 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78  sert( pTerm->pEx
1f4b0 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  pr!=0 );.    ass
1f4c0 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d  ert( omitTable==
1f4d0 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  0 );.    testcas
1f4e0 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  e( pTerm->wtFlag
1f4f0 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
1f500 20 29 3b 0a 20 20 20 20 69 52 65 6c 65 61 73 65   );.    iRelease
1f510 52 65 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Reg = ++pParse->
1f520 6e 4d 65 6d 3b 0a 20 20 20 20 69 52 6f 77 69 64  nMem;.    iRowid
1f530 52 65 67 20 3d 20 63 6f 64 65 45 71 75 61 6c 69  Reg = codeEquali
1f540 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70  tyTerm(pParse, p
1f550 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 30 2c  Term, pLevel, 0,
1f560 20 62 52 65 76 2c 20 69 52 65 6c 65 61 73 65 52   bRev, iReleaseR
1f570 65 67 29 3b 0a 20 20 20 20 69 66 28 20 69 52 6f  eg);.    if( iRo
1f580 77 69 64 52 65 67 21 3d 69 52 65 6c 65 61 73 65  widReg!=iRelease
1f590 52 65 67 20 29 20 73 71 6c 69 74 65 33 52 65 6c  Reg ) sqlite3Rel
1f5a0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
1f5b0 73 65 2c 20 69 52 65 6c 65 61 73 65 52 65 67 29  se, iReleaseReg)
1f5c0 3b 0a 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20  ;.    addrNxt = 
1f5d0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b  pLevel->addrNxt;
1f5e0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1f5f0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73  AddOp2(v, OP_Mus
1f600 74 42 65 49 6e 74 2c 20 69 52 6f 77 69 64 52 65  tBeInt, iRowidRe
1f610 67 2c 20 61 64 64 72 4e 78 74 29 3b 20 56 64 62  g, addrNxt); Vdb
1f620 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1f630 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1f640 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69  Op3(v, OP_NotExi
1f650 73 74 73 2c 20 69 43 75 72 2c 20 61 64 64 72 4e  sts, iCur, addrN
1f660 78 74 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a  xt, iRowidReg);.
1f670 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1f680 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
1f690 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
1f6a0 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
1f6b0 69 52 6f 77 69 64 52 65 67 2c 20 31 29 3b 0a 20  iRowidReg, 1);. 
1f6c0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1f6d0 63 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c  cheStore(pParse,
1f6e0 20 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69   iCur, -1, iRowi
1f6f0 64 52 65 67 29 3b 0a 20 20 20 20 56 64 62 65 43  dReg);.    VdbeC
1f700 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29  omment((v, "pk")
1f710 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  );.    pLevel->o
1f720 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 7d  p = OP_Noop;.  }
1f730 65 6c 73 65 20 69 66 28 20 28 70 4c 6f 6f 70 2d  else if( (pLoop-
1f740 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
1f750 5f 49 50 4b 29 21 3d 30 0a 20 20 20 20 20 20 20  _IPK)!=0.       
1f760 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46    && (pLoop->wsF
1f770 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c  lags & WHERE_COL
1f780 55 4d 4e 5f 52 41 4e 47 45 29 21 3d 30 0a 20 20  UMN_RANGE)!=0.  
1f790 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 33  ){.    /* Case 3
1f7a0 3a 20 20 57 65 20 68 61 76 65 20 61 6e 20 69 6e  :  We have an in
1f7b0 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69  equality compari
1f7c0 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20  son against the 
1f7d0 52 4f 57 49 44 20 66 69 65 6c 64 2e 0a 20 20 20  ROWID field..   
1f7e0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 65 73 74   */.    int test
1f7f0 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  Op = OP_Noop;.  
1f800 20 20 69 6e 74 20 73 74 61 72 74 3b 0a 20 20 20    int start;.   
1f810 20 69 6e 74 20 6d 65 6d 45 6e 64 56 61 6c 75 65   int memEndValue
1f820 20 3d 20 30 3b 0a 20 20 20 20 57 68 65 72 65 54   = 0;.    WhereT
1f830 65 72 6d 20 2a 70 53 74 61 72 74 2c 20 2a 70 45  erm *pStart, *pE
1f840 6e 64 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  nd;..    assert(
1f850 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b   omitTable==0 );
1f860 0a 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20  .    j = 0;.    
1f870 70 53 74 61 72 74 20 3d 20 70 45 6e 64 20 3d 20  pStart = pEnd = 
1f880 30 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70  0;.    if( pLoop
1f890 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
1f8a0 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 20 70 53  E_BTM_LIMIT ) pS
1f8b0 74 61 72 74 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c  tart = pLoop->aL
1f8c0 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 69  Term[j++];.    i
1f8d0 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
1f8e0 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49  s & WHERE_TOP_LI
1f8f0 4d 49 54 20 29 20 70 45 6e 64 20 3d 20 70 4c 6f  MIT ) pEnd = pLo
1f900 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b  op->aLTerm[j++];
1f910 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74  .    assert( pSt
1f920 61 72 74 21 3d 30 20 7c 7c 20 70 45 6e 64 21 3d  art!=0 || pEnd!=
1f930 30 20 29 3b 0a 20 20 20 20 69 66 28 20 62 52 65  0 );.    if( bRe
1f940 76 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d  v ){.      pTerm
1f950 20 3d 20 70 53 74 61 72 74 3b 0a 20 20 20 20 20   = pStart;.     
1f960 20 70 53 74 61 72 74 20 3d 20 70 45 6e 64 3b 0a   pStart = pEnd;.
1f970 20 20 20 20 20 20 70 45 6e 64 20 3d 20 70 54 65        pEnd = pTe
1f980 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rm;.    }.    if
1f990 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20  ( pStart ){.    
1f9a0 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20    Expr *pX;     
1f9b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65          /* The e
1f9c0 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 64  xpression that d
1f9d0 65 66 69 6e 65 73 20 74 68 65 20 73 74 61 72 74  efines the start
1f9e0 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20   bound */.      
1f9f0 69 6e 74 20 72 31 2c 20 72 54 65 6d 70 3b 20 20  int r1, rTemp;  
1fa00 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
1fa10 72 73 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20 74  rs for holding t
1fa20 68 65 20 73 74 61 72 74 20 62 6f 75 6e 64 61 72  he start boundar
1fa30 79 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54  y */..      /* T
1fa40 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e  he following con
1fa50 73 74 61 6e 74 20 6d 61 70 73 20 54 4b 5f 78 78  stant maps TK_xx
1fa60 20 63 6f 64 65 73 20 69 6e 74 6f 20 63 6f 72 72   codes into corr
1fa70 65 73 70 6f 6e 64 69 6e 67 20 0a 20 20 20 20 20  esponding .     
1fa80 20 2a 2a 20 73 65 65 6b 20 6f 70 63 6f 64 65 73   ** seek opcodes
1fa90 2e 20 20 49 74 20 64 65 70 65 6e 64 73 20 6f 6e  .  It depends on
1faa0 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 6f 72   a particular or
1fab0 64 65 72 69 6e 67 20 6f 66 20 54 4b 5f 78 78 0a  dering of TK_xx.
1fac0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
1fad0 6f 6e 73 74 20 75 38 20 61 4d 6f 76 65 4f 70 5b  onst u8 aMoveOp[
1fae0 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ] = {.          
1faf0 20 2f 2a 20 54 4b 5f 47 54 20 2a 2f 20 20 4f 50   /* TK_GT */  OP
1fb00 5f 53 65 65 6b 47 54 2c 0a 20 20 20 20 20 20 20  _SeekGT,.       
1fb10 20 20 20 20 2f 2a 20 54 4b 5f 4c 45 20 2a 2f 20      /* TK_LE */ 
1fb20 20 4f 50 5f 53 65 65 6b 4c 45 2c 0a 20 20 20 20   OP_SeekLE,.    
1fb30 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 54 20         /* TK_LT 
1fb40 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 54 2c 0a 20  */  OP_SeekLT,. 
1fb50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f            /* TK_
1fb60 47 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 45  GE */  OP_SeekGE
1fb70 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20  .      };.      
1fb80 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 54  assert( TK_LE==T
1fb90 4b 5f 47 54 2b 31 20 29 3b 20 20 20 20 20 20 2f  K_GT+1 );      /
1fba0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
1fbb0 6f 72 64 65 72 69 6e 67 2e 2e 20 2a 2f 0a 20 20  ordering.. */.  
1fbc0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
1fbd0 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 20 20 20  T==TK_GT+2 );   
1fbe0 20 20 20 2f 2a 20 20 2e 2e 2e 20 6f 66 20 74 68     /*  ... of th
1fbf0 65 20 54 4b 5f 78 78 20 76 61 6c 75 65 73 2e 2e  e TK_xx values..
1fc00 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
1fc10 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 47 54 2b  t( TK_GE==TK_GT+
1fc20 33 20 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e  3 );      /*  ..
1fc30 2e 20 69 73 20 63 6f 72 72 65 63 63 74 2e 20 2a  . is correcct. *
1fc40 2f 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  /..      assert(
1fc50 20 28 70 53 74 61 72 74 2d 3e 77 74 46 6c 61 67   (pStart->wtFlag
1fc60 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d  s & TERM_VNULL)=
1fc70 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
1fc80 63 61 73 65 28 20 70 53 74 61 72 74 2d 3e 77 74  case( pStart->wt
1fc90 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
1fca0 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 70 58  TUAL );.      pX
1fcb0 20 3d 20 70 53 74 61 72 74 2d 3e 70 45 78 70 72   = pStart->pExpr
1fcc0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1fcd0 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  pX!=0 );.      t
1fce0 65 73 74 63 61 73 65 28 20 70 53 74 61 72 74 2d  estcase( pStart-
1fcf0 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75  >leftCursor!=iCu
1fd00 72 20 29 3b 20 2f 2a 20 74 72 61 6e 73 69 74 69  r ); /* transiti
1fd10 76 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  ve constraints *
1fd20 2f 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  /.      r1 = sql
1fd30 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1fd40 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69  (pParse, pX->pRi
1fd50 67 68 74 2c 20 26 72 54 65 6d 70 29 3b 0a 20 20  ght, &rTemp);.  
1fd60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1fd70 64 64 4f 70 33 28 76 2c 20 61 4d 6f 76 65 4f 70  ddOp3(v, aMoveOp
1fd80 5b 70 58 2d 3e 6f 70 2d 54 4b 5f 47 54 5d 2c 20  [pX->op-TK_GT], 
1fd90 69 43 75 72 2c 20 61 64 64 72 42 72 6b 2c 20 72  iCur, addrBrk, r
1fda0 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  1);.      VdbeCo
1fdb0 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29  mment((v, "pk"))
1fdc0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
1fdd0 72 61 67 65 49 66 28 76 2c 20 70 58 2d 3e 6f 70  rageIf(v, pX->op
1fde0 3d 3d 54 4b 5f 47 54 29 3b 0a 20 20 20 20 20 20  ==TK_GT);.      
1fdf0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1fe00 2c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 29  , pX->op==TK_LE)
1fe10 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
1fe20 72 61 67 65 49 66 28 76 2c 20 70 58 2d 3e 6f 70  rageIf(v, pX->op
1fe30 3d 3d 54 4b 5f 4c 54 29 3b 0a 20 20 20 20 20 20  ==TK_LT);.      
1fe40 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1fe50 2c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 29  , pX->op==TK_GE)
1fe60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1fe70 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
1fe80 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
1fe90 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, 1);.      sql
1fea0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1feb0 65 67 28 70 50 61 72 73 65 2c 20 72 54 65 6d 70  eg(pParse, rTemp
1fec0 29 3b 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65  );.      disable
1fed0 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 53 74  Term(pLevel, pSt
1fee0 61 72 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  art);.    }else{
1fef0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1ff00 62 65 41 64 64 4f 70 32 28 76 2c 20 62 52 65 76  beAddOp2(v, bRev
1ff10 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f   ? OP_Last : OP_
1ff20 52 65 77 69 6e 64 2c 20 69 43 75 72 2c 20 61 64  Rewind, iCur, ad
1ff30 64 72 42 72 6b 29 3b 0a 20 20 20 20 20 20 56 64  drBrk);.      Vd
1ff40 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1ff50 62 52 65 76 3d 3d 30 29 3b 0a 20 20 20 20 20 20  bRev==0);.      
1ff60 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1ff70 2c 20 62 52 65 76 21 3d 30 29 3b 0a 20 20 20 20  , bRev!=0);.    
1ff80 7d 0a 20 20 20 20 69 66 28 20 70 45 6e 64 20 29  }.    if( pEnd )
1ff90 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58  {.      Expr *pX
1ffa0 3b 0a 20 20 20 20 20 20 70 58 20 3d 20 70 45 6e  ;.      pX = pEn
1ffb0 64 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  d->pExpr;.      
1ffc0 61 73 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b  assert( pX!=0 );
1ffd0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
1ffe0 70 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20  pEnd->wtFlags & 
1fff0 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29  TERM_VNULL)==0 )
20000 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
20010 28 20 70 45 6e 64 2d 3e 6c 65 66 74 43 75 72 73  ( pEnd->leftCurs
20020 6f 72 21 3d 69 43 75 72 20 29 3b 20 2f 2a 20 54  or!=iCur ); /* T
20030 72 61 6e 73 69 74 69 76 65 20 63 6f 6e 73 74 72  ransitive constr
20040 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 74  aints */.      t
20050 65 73 74 63 61 73 65 28 20 70 45 6e 64 2d 3e 77  estcase( pEnd->w
20060 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
20070 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 6d  RTUAL );.      m
20080 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20 2b 2b 70  emEndValue = ++p
20090 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
200a0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
200b0 64 65 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  de(pParse, pX->p
200c0 52 69 67 68 74 2c 20 6d 65 6d 45 6e 64 56 61 6c  Right, memEndVal
200d0 75 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ue);.      if( p
200e0 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20  X->op==TK_LT || 
200f0 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b  pX->op==TK_GT ){
20100 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20  .        testOp 
20110 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 65 20 3a  = bRev ? OP_Le :
20120 20 4f 50 5f 47 65 3b 0a 20 20 20 20 20 20 7d 65   OP_Ge;.      }e
20130 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73  lse{.        tes
20140 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f  tOp = bRev ? OP_
20150 4c 74 20 3a 20 4f 50 5f 47 74 3b 0a 20 20 20 20  Lt : OP_Gt;.    
20160 20 20 7d 0a 20 20 20 20 20 20 64 69 73 61 62 6c    }.      disabl
20170 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 45  eTerm(pLevel, pE
20180 6e 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  nd);.    }.    s
20190 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
201a0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
201b0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70  ;.    pLevel->op
201c0 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65   = bRev ? OP_Pre
201d0 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20  v : OP_Next;.   
201e0 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43   pLevel->p1 = iC
201f0 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ur;.    pLevel->
20200 70 32 20 3d 20 73 74 61 72 74 3b 0a 20 20 20 20  p2 = start;.    
20210 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e  assert( pLevel->
20220 70 35 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  p5==0 );.    if(
20230 20 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70   testOp!=OP_Noop
20240 20 29 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64   ){.      iRowid
20250 52 65 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Reg = ++pParse->
20260 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69  nMem;.      sqli
20270 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
20280 20 4f 50 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c   OP_Rowid, iCur,
20290 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20   iRowidReg);.   
202a0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
202b0 63 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c  cheStore(pParse,
202c0 20 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69   iCur, -1, iRowi
202d0 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  dReg);.      sql
202e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
202f0 2c 20 74 65 73 74 4f 70 2c 20 6d 65 6d 45 6e 64  , testOp, memEnd
20300 56 61 6c 75 65 2c 20 61 64 64 72 42 72 6b 2c 20  Value, addrBrk, 
20310 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20  iRowidReg);.    
20320 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
20330 28 76 2c 20 74 65 73 74 4f 70 3d 3d 4f 50 5f 4c  (v, testOp==OP_L
20340 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  e);.      VdbeCo
20350 76 65 72 61 67 65 49 66 28 76 2c 20 74 65 73 74  verageIf(v, test
20360 4f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20  Op==OP_Lt);.    
20370 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
20380 28 76 2c 20 74 65 73 74 4f 70 3d 3d 4f 50 5f 47  (v, testOp==OP_G
20390 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  e);.      VdbeCo
203a0 76 65 72 61 67 65 49 66 28 76 2c 20 74 65 73 74  verageIf(v, test
203b0 4f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20  Op==OP_Gt);.    
203c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
203d0 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f  ngeP5(v, SQLITE_
203e0 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 20 53 51  AFF_NUMERIC | SQ
203f0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
20400 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
20410 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
20420 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
20430 45 44 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73  ED ){.    /* Cas
20440 65 20 34 3a 20 41 20 73 63 61 6e 20 75 73 69 6e  e 4: A scan usin
20450 67 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 20 20  g an index..    
20460 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
20470 20 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75    The WHERE clau
20480 73 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 7a  se may contain z
20490 65 72 6f 20 6f 72 20 6d 6f 72 65 20 65 71 75 61  ero or more equa
204a0 6c 69 74 79 20 0a 20 20 20 20 2a 2a 20 20 20 20  lity .    **    
204b0 20 20 20 20 20 74 65 72 6d 73 20 28 22 3d 3d 22       terms ("=="
204c0 20 6f 72 20 22 49 4e 22 20 6f 70 65 72 61 74 6f   or "IN" operato
204d0 72 73 29 20 74 68 61 74 20 72 65 66 65 72 20 74  rs) that refer t
204e0 6f 20 74 68 65 20 4e 0a 20 20 20 20 2a 2a 20 20  o the N.    **  
204f0 20 20 20 20 20 20 20 6c 65 66 74 2d 6d 6f 73 74         left-most
20500 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
20510 69 6e 64 65 78 2e 20 49 74 20 6d 61 79 20 61 6c  index. It may al
20520 73 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a  so contain.    *
20530 2a 20 20 20 20 20 20 20 20 20 69 6e 65 71 75 61  *         inequa
20540 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
20550 20 28 3e 2c 20 3c 2c 20 3e 3d 20 6f 72 20 3c 3d   (>, <, >= or <=
20560 29 20 6f 6e 20 74 68 65 20 69 6e 64 65 78 65 64  ) on the indexed
20570 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
20580 63 6f 6c 75 6d 6e 20 74 68 61 74 20 69 6d 6d 65  column that imme
20590 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 20  diately follows 
205a0 74 68 65 20 4e 20 65 71 75 61 6c 69 74 69 65 73  the N equalities
205b0 2e 20 4f 6e 6c 79 20 0a 20 20 20 20 2a 2a 20 20  . Only .    **  
205c0 20 20 20 20 20 20 20 74 68 65 20 72 69 67 68 74         the right
205d0 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 63 61 6e  -most column can
205e0 20 62 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74   be an inequalit
205f0 79 20 2d 20 74 68 65 20 72 65 73 74 20 6d 75 73  y - the rest mus
20600 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  t.    **        
20610 20 75 73 65 20 74 68 65 20 22 3d 3d 22 20 61 6e   use the "==" an
20620 64 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73  d "IN" operators
20630 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  . For example, i
20640 66 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 20 20  f the .    **   
20650 20 20 20 20 20 20 69 6e 64 65 78 20 69 73 20 6f        index is o
20660 6e 20 28 78 2c 79 2c 7a 29 2c 20 74 68 65 6e 20  n (x,y,z), then 
20670 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6c  the following cl
20680 61 75 73 65 73 20 61 72 65 20 61 6c 6c 20 0a 20  auses are all . 
20690 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6f 70     **         op
206a0 74 69 6d 69 7a 65 64 3a 0a 20 20 20 20 2a 2a 0a  timized:.    **.
206b0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
206c0 20 20 78 3d 35 0a 20 20 20 20 2a 2a 20 20 20 20    x=5.    **    
206d0 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20          x=5 AND 
206e0 79 3d 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20  y=10.    **     
206f0 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79         x=5 AND y
20700 3c 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  <10.    **      
20710 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3e        x=5 AND y>
20720 35 20 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a  5 AND y<10.    *
20730 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35  *            x=5
20740 20 41 4e 44 20 79 3d 35 20 41 4e 44 20 7a 3c 3d   AND y=5 AND z<=
20750 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  10.    **.    **
20760 20 20 20 20 20 20 20 20 20 54 68 65 20 7a 3c 31           The z<1
20770 30 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f  0 term of the fo
20780 6c 6c 6f 77 69 6e 67 20 63 61 6e 6e 6f 74 20 62  llowing cannot b
20790 65 20 75 73 65 64 2c 20 6f 6e 6c 79 0a 20 20 20  e used, only.   
207a0 20 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20   **         the 
207b0 78 3d 35 20 74 65 72 6d 3a 0a 20 20 20 20 2a 2a  x=5 term:.    **
207c0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
207d0 20 20 20 78 3d 35 20 41 4e 44 20 7a 3c 31 30 0a     x=5 AND z<10.
207e0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
207f0 20 20 20 20 20 20 4e 20 6d 61 79 20 62 65 20 7a        N may be z
20800 65 72 6f 20 69 66 20 74 68 65 72 65 20 61 72 65  ero if there are
20810 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
20820 74 72 61 69 6e 74 73 2e 0a 20 20 20 20 2a 2a 20  traints..    ** 
20830 20 20 20 20 20 20 20 20 49 66 20 74 68 65 72 65          If there
20840 20 61 72 65 20 6e 6f 20 69 6e 65 71 75 61 6c 69   are no inequali
20850 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20  ty constraints, 
20860 74 68 65 6e 20 4e 20 69 73 20 61 74 0a 20 20 20  then N is at.   
20870 20 2a 2a 20 20 20 20 20 20 20 20 20 6c 65 61 73   **         leas
20880 74 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  t one..    **.  
20890 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 69    **         Thi
208a0 73 20 63 61 73 65 20 69 73 20 61 6c 73 6f 20 75  s case is also u
208b0 73 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 61  sed when there a
208c0 72 65 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75  re no WHERE clau
208d0 73 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  se.    **       
208e0 20 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 75    constraints bu
208f0 74 20 61 6e 20 69 6e 64 65 78 20 69 73 20 73 65  t an index is se
20900 6c 65 63 74 65 64 20 61 6e 79 77 61 79 2c 20 69  lected anyway, i
20910 6e 20 6f 72 64 65 72 0a 20 20 20 20 2a 2a 20 20  n order.    **  
20920 20 20 20 20 20 20 20 74 6f 20 66 6f 72 63 65 20         to force 
20930 74 68 65 20 6f 75 74 70 75 74 20 6f 72 64 65 72  the output order
20940 20 74 6f 20 63 6f 6e 66 6f 72 6d 20 74 6f 20 61   to conform to a
20950 6e 20 4f 52 44 45 52 20 42 59 2e 0a 20 20 20 20  n ORDER BY..    
20960 2a 2f 20 20 0a 20 20 20 20 73 74 61 74 69 63 20  */  .    static 
20970 63 6f 6e 73 74 20 75 38 20 61 53 74 61 72 74 4f  const u8 aStartO
20980 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 30 2c  p[] = {.      0,
20990 0a 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20  .      0,.      
209a0 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 20  OP_Rewind,      
209b0 20 20 20 20 20 2f 2a 20 32 3a 20 28 21 73 74 61       /* 2: (!sta
209c0 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26  rt_constraints &
209d0 26 20 73 74 61 72 74 45 71 20 26 26 20 20 21 62  & startEq &&  !b
209e0 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  Rev) */.      OP
209f0 5f 4c 61 73 74 2c 20 20 20 20 20 20 20 20 20 20  _Last,          
20a00 20 20 20 2f 2a 20 33 3a 20 28 21 73 74 61 72 74     /* 3: (!start
20a10 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20  _constraints && 
20a20 73 74 61 72 74 45 71 20 26 26 20 20 20 62 52 65  startEq &&   bRe
20a30 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53  v) */.      OP_S
20a40 65 65 6b 47 54 2c 20 20 20 20 20 20 20 20 20 20  eekGT,          
20a50 20 2f 2a 20 34 3a 20 28 73 74 61 72 74 5f 63 6f   /* 4: (start_co
20a60 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 21 73  nstraints  && !s
20a70 74 61 72 74 45 71 20 26 26 20 21 62 52 65 76 29  tartEq && !bRev)
20a80 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65   */.      OP_See
20a90 6b 4c 54 2c 20 20 20 20 20 20 20 20 20 20 20 2f  kLT,           /
20aa0 2a 20 35 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73  * 5: (start_cons
20ab0 74 72 61 69 6e 74 73 20 20 26 26 20 21 73 74 61  traints  && !sta
20ac0 72 74 45 71 20 26 26 20 20 62 52 65 76 29 20 2a  rtEq &&  bRev) *
20ad0 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 47  /.      OP_SeekG
20ae0 45 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  E,           /* 
20af0 36 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72  6: (start_constr
20b00 61 69 6e 74 73 20 20 26 26 20 20 73 74 61 72 74  aints  &&  start
20b10 45 71 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a  Eq && !bRev) */.
20b20 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c 45 20        OP_SeekLE 
20b30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 37 3a             /* 7:
20b40 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69   (start_constrai
20b50 6e 74 73 20 20 26 26 20 20 73 74 61 72 74 45 71  nts  &&  startEq
20b60 20 26 26 20 20 62 52 65 76 29 20 2a 2f 0a 20 20   &&  bRev) */.  
20b70 20 20 7d 3b 0a 20 20 20 20 73 74 61 74 69 63 20    };.    static 
20b80 63 6f 6e 73 74 20 75 38 20 61 45 6e 64 4f 70 5b  const u8 aEndOp[
20b90 5d 20 3d 20 7b 0a 20 20 20 20 20 20 4f 50 5f 49  ] = {.      OP_I
20ba0 64 78 47 45 2c 20 20 20 20 20 20 20 20 20 20 20  dxGE,           
20bb0 20 2f 2a 20 30 3a 20 28 65 6e 64 5f 63 6f 6e 73   /* 0: (end_cons
20bc0 74 72 61 69 6e 74 73 20 26 26 20 21 62 52 65 76  traints && !bRev
20bd0 20 26 26 20 21 65 6e 64 45 71 29 20 2a 2f 0a 20   && !endEq) */. 
20be0 20 20 20 20 20 4f 50 5f 49 64 78 47 54 2c 20 20       OP_IdxGT,  
20bf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 3a 20            /* 1: 
20c00 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73  (end_constraints
20c10 20 26 26 20 21 62 52 65 76 20 26 26 20 20 65 6e   && !bRev &&  en
20c20 64 45 71 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  dEq) */.      OP
20c30 5f 49 64 78 4c 45 2c 20 20 20 20 20 20 20 20 20  _IdxLE,         
20c40 20 20 20 2f 2a 20 32 3a 20 28 65 6e 64 5f 63 6f     /* 2: (end_co
20c50 6e 73 74 72 61 69 6e 74 73 20 26 26 20 20 62 52  nstraints &&  bR
20c60 65 76 20 26 26 20 21 65 6e 64 45 71 29 20 2a 2f  ev && !endEq) */
20c70 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 4c 54 2c  .      OP_IdxLT,
20c80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 33              /* 3
20c90 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e  : (end_constrain
20ca0 74 73 20 26 26 20 20 62 52 65 76 20 26 26 20 20  ts &&  bRev &&  
20cb0 65 6e 64 45 71 29 20 2a 2f 0a 20 20 20 20 7d 3b  endEq) */.    };
20cc0 0a 20 20 20 20 75 31 36 20 6e 45 71 20 3d 20 70  .    u16 nEq = p
20cd0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
20ce0 71 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  q;     /* Number
20cf0 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 74 65 72   of == or IN ter
20d00 6d 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65  ms */.    int re
20d10 67 42 61 73 65 3b 20 20 20 20 20 20 20 20 20 20  gBase;          
20d20 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72         /* Base r
20d30 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
20d40 63 6f 6e 73 74 72 61 69 6e 74 20 76 61 6c 75 65  constraint value
20d50 73 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65  s */.    WhereTe
20d60 72 6d 20 2a 70 52 61 6e 67 65 53 74 61 72 74 20  rm *pRangeStart 
20d70 3d 20 30 3b 20 20 2f 2a 20 49 6e 65 71 75 61 6c  = 0;  /* Inequal
20d80 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61  ity constraint a
20d90 74 20 72 61 6e 67 65 20 73 74 61 72 74 20 2a 2f  t range start */
20da0 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
20db0 70 52 61 6e 67 65 45 6e 64 20 3d 20 30 3b 20 20  pRangeEnd = 0;  
20dc0 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79 20    /* Inequality 
20dd0 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 72 61  constraint at ra
20de0 6e 67 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20 69  nge end */.    i
20df0 6e 74 20 73 74 61 72 74 45 71 3b 20 20 20 20 20  nt startEq;     
20e00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
20e10 72 75 65 20 69 66 20 72 61 6e 67 65 20 73 74 61  rue if range sta
20e20 72 74 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f  rt uses ==, >= o
20e30 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20  r <= */.    int 
20e40 65 6e 64 45 71 3b 20 20 20 20 20 20 20 20 20 20  endEq;          
20e50 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
20e60 20 69 66 20 72 61 6e 67 65 20 65 6e 64 20 75 73   if range end us
20e70 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20  es ==, >= or <= 
20e80 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74  */.    int start
20e90 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3b 20 20 20  _constraints;   
20ea0 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20      /* Start of 
20eb0 72 61 6e 67 65 20 69 73 20 63 6f 6e 73 74 72 61  range is constra
20ec0 69 6e 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ined */.    int 
20ed0 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 20 20 20  nConstraint;    
20ee0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
20ef0 65 72 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74  er of constraint
20f00 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 49 6e   terms */.    In
20f10 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
20f20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
20f30 65 20 69 6e 64 65 78 20 77 65 20 77 69 6c 6c 20  e index we will 
20f40 62 65 20 75 73 69 6e 67 20 2a 2f 0a 20 20 20 20  be using */.    
20f50 69 6e 74 20 69 49 64 78 43 75 72 3b 20 20 20 20  int iIdxCur;    
20f60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20f70 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
20f80 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 2a 2f  for the index */
20f90 0a 20 20 20 20 69 6e 74 20 6e 45 78 74 72 61 52  .    int nExtraR
20fa0 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  eg = 0;         
20fb0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
20fc0 78 74 72 61 20 72 65 67 69 73 74 65 72 73 20 6e  xtra registers n
20fd0 65 65 64 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74  eeded */.    int
20fe0 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   op;            
20ff0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73            /* Ins
21000 74 72 75 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20  truction opcode 
21010 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74  */.    char *zSt
21020 61 72 74 41 66 66 3b 20 20 20 20 20 20 20 20 20  artAff;         
21030 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20      /* Affinity 
21040 66 6f 72 20 73 74 61 72 74 20 6f 66 20 72 61 6e  for start of ran
21050 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  ge constraint */
21060 0a 20 20 20 20 63 68 61 72 20 63 45 6e 64 41 66  .    char cEndAf
21070 66 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  f = 0;          
21080 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 66 6f    /* Affinity fo
21090 72 20 65 6e 64 20 6f 66 20 72 61 6e 67 65 20 63  r end of range c
210a0 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20  onstraint */.   
210b0 20 75 38 20 62 53 65 65 6b 50 61 73 74 4e 75 6c   u8 bSeekPastNul
210c0 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  l = 0;        /*
210d0 20 54 72 75 65 20 74 6f 20 73 65 65 6b 20 70 61   True to seek pa
210e0 73 74 20 69 6e 69 74 69 61 6c 20 6e 75 6c 6c 73  st initial nulls
210f0 20 2a 2f 0a 20 20 20 20 75 38 20 62 53 74 6f 70   */.    u8 bStop
21100 41 74 4e 75 6c 6c 20 3d 20 30 3b 20 20 20 20 20  AtNull = 0;     
21110 20 20 20 20 20 2f 2a 20 41 64 64 20 63 6f 6e 64       /* Add cond
21120 69 74 69 6f 6e 20 74 6f 20 74 65 72 6d 69 6e 61  ition to termina
21130 74 65 20 61 74 20 4e 55 4c 4c 73 20 2a 2f 0a 0a  te at NULLs */..
21140 20 20 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70      pIdx = pLoop
21150 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
21160 3b 0a 20 20 20 20 69 49 64 78 43 75 72 20 3d 20  ;.    iIdxCur = 
21170 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b  pLevel->iIdxCur;
21180 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 45 71  .    assert( nEq
21190 3e 3d 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 20 29  >=pLoop->nSkip )
211a0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ;..    /* If thi
211b0 73 20 6c 6f 6f 70 20 73 61 74 69 73 66 69 65 73  s loop satisfies
211c0 20 61 20 73 6f 72 74 20 6f 72 64 65 72 20 28 70   a sort order (p
211d0 4f 72 64 65 72 42 79 29 20 72 65 71 75 65 73 74  OrderBy) request
211e0 20 74 68 61 74 20 0a 20 20 20 20 2a 2a 20 77 61   that .    ** wa
211f0 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  s passed to this
21200 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6d 70   function to imp
21210 6c 65 6d 65 6e 74 20 61 20 22 53 45 4c 45 43 54  lement a "SELECT
21220 20 6d 69 6e 28 78 29 20 2e 2e 2e 22 20 0a 20 20   min(x) ..." .  
21230 20 20 2a 2a 20 71 75 65 72 79 2c 20 74 68 65 6e    ** query, then
21240 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   the caller will
21250 20 6f 6e 6c 79 20 61 6c 6c 6f 77 20 74 68 65 20   only allow the 
21260 6c 6f 6f 70 20 74 6f 20 72 75 6e 20 66 6f 72 0a  loop to run for.
21270 20 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20      ** a single 
21280 69 74 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20  iteration. This 
21290 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 66  means that the f
212a0 69 72 73 74 20 72 6f 77 20 72 65 74 75 72 6e 65  irst row returne
212b0 64 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20  d.    ** should 
212c0 6e 6f 74 20 68 61 76 65 20 61 20 4e 55 4c 4c 20  not have a NULL 
212d0 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
212e0 27 78 27 2e 20 49 66 20 63 6f 6c 75 6d 6e 20 27  'x'. If column '
212f0 78 27 20 69 73 0a 20 20 20 20 2a 2a 20 74 68 65  x' is.    ** the
21300 20 66 69 72 73 74 20 6f 6e 65 20 61 66 74 65 72   first one after
21310 20 74 68 65 20 6e 45 71 20 65 71 75 61 6c 69 74   the nEq equalit
21320 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e  y constraints in
21330 20 74 68 65 20 69 6e 64 65 78 2c 0a 20 20 20 20   the index,.    
21340 2a 2a 20 74 68 69 73 20 72 65 71 75 69 72 65 73  ** this requires
21350 20 73 6f 6d 65 20 73 70 65 63 69 61 6c 20 68 61   some special ha
21360 6e 64 6c 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20  ndling..    */. 
21370 20 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66     assert( pWInf
21380 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 0a 20  o->pOrderBy==0. 
21390 20 20 20 20 20 20 20 20 7c 7c 20 70 57 49 6e 66          || pWInf
213a0 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  o->pOrderBy->nEx
213b0 70 72 3d 3d 31 0a 20 20 20 20 20 20 20 20 20 7c  pr==1.         |
213c0 7c 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  | (pWInfo->wctrl
213d0 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45  Flags&WHERE_ORDE
213e0 52 42 59 5f 4d 49 4e 29 3d 3d 30 20 29 3b 0a 20  RBY_MIN)==0 );. 
213f0 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e     if( (pWInfo->
21400 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45  wctrlFlags&WHERE
21410 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 29 21 3d 30  _ORDERBY_MIN)!=0
21420 0a 20 20 20 20 20 26 26 20 70 57 49 6e 66 6f 2d  .     && pWInfo-
21430 3e 6e 4f 42 53 61 74 3e 30 0a 20 20 20 20 20 26  >nOBSat>0.     &
21440 26 20 28 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  & (pIdx->nKeyCol
21450 3e 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20  >nEq).    ){.   
21460 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70     assert( pLoop
21470 2d 3e 6e 53 6b 69 70 3d 3d 30 20 29 3b 0a 20 20  ->nSkip==0 );.  
21480 20 20 20 20 62 53 65 65 6b 50 61 73 74 4e 75 6c      bSeekPastNul
21490 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 6e 45 78  l = 1;.      nEx
214a0 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20  traReg = 1;.    
214b0 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 61  }..    /* Find a
214c0 6e 79 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  ny inequality co
214d0 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20 66  nstraint terms f
214e0 6f 72 20 74 68 65 20 73 74 61 72 74 20 61 6e 64  or the start and
214f0 20 65 6e 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20   end .    ** of 
21500 74 68 65 20 72 61 6e 67 65 2e 20 0a 20 20 20 20  the range. .    
21510 2a 2f 0a 20 20 20 20 6a 20 3d 20 6e 45 71 3b 0a  */.    j = nEq;.
21520 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
21530 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42  sFlags & WHERE_B
21540 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  TM_LIMIT ){.    
21550 20 20 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20    pRangeStart = 
21560 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b  pLoop->aLTerm[j+
21570 2b 5d 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61  +];.      nExtra
21580 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f  Reg = 1;.      /
21590 2a 20 4c 69 6b 65 20 6f 70 74 69 6d 69 7a 61 74  * Like optimizat
215a0 69 6f 6e 20 72 61 6e 67 65 20 63 6f 6e 73 74 72  ion range constr
215b0 61 69 6e 74 73 20 61 6c 77 61 79 73 20 6f 63 63  aints always occ
215c0 75 72 20 69 6e 20 70 61 69 72 73 20 2a 2f 0a 20  ur in pairs */. 
215d0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 52       assert( (pR
215e0 61 6e 67 65 53 74 61 72 74 2d 3e 77 74 46 6c 61  angeStart->wtFla
215f0 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50  gs & TERM_LIKEOP
21600 54 29 3d 3d 30 20 7c 7c 20 0a 20 20 20 20 20 20  T)==0 || .      
21610 20 20 20 20 20 20 20 20 28 70 4c 6f 6f 70 2d 3e          (pLoop->
21620 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
21630 54 4f 50 5f 4c 49 4d 49 54 29 21 3d 30 20 29 3b  TOP_LIMIT)!=0 );
21640 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
21650 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
21660 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20  WHERE_TOP_LIMIT 
21670 29 7b 0a 20 20 20 20 20 20 70 52 61 6e 67 65 45  ){.      pRangeE
21680 6e 64 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  nd = pLoop->aLTe
21690 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 20 20 6e  rm[j++];.      n
216a0 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20  ExtraReg = 1;.  
216b0 20 20 20 20 69 66 28 20 28 70 52 61 6e 67 65 45      if( (pRangeE
216c0 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  nd->wtFlags & TE
216d0 52 4d 5f 4c 49 4b 45 4f 50 54 29 21 3d 30 20 29  RM_LIKEOPT)!=0 )
216e0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
216f0 28 20 70 52 61 6e 67 65 53 74 61 72 74 21 3d 30  ( pRangeStart!=0
21700 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
21710 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4b 45 20          /* LIKE 
21720 6f 70 74 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  opt constraints 
21730 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
21740 74 28 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e  t( pRangeStart->
21750 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c  wtFlags & TERM_L
21760 49 4b 45 4f 50 54 20 29 3b 20 20 20 2f 2a 20 6f  IKEOPT );   /* o
21770 63 63 75 72 20 69 6e 20 70 61 69 72 73 20 2a 2f  ccur in pairs */
21780 0a 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  .        pLevel-
21790 3e 69 4c 69 6b 65 52 65 70 43 6e 74 72 20 3d 20  >iLikeRepCntr = 
217a0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
217b0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
217c0 28 20 62 52 65 76 20 29 3b 0a 20 20 20 20 20 20  ( bRev );.      
217d0 20 20 74 65 73 74 63 61 73 65 28 20 70 49 64 78    testcase( pIdx
217e0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71  ->aSortOrder[nEq
217f0 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53  ]==SQLITE_SO_DES
21800 43 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  C );.        sql
21810 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
21820 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 0a 20 20  , OP_Integer,.  
21830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21840 20 20 20 20 20 20 20 20 62 52 65 76 20 5e 20 28          bRev ^ (
21850 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
21860 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f  [nEq]==SQLITE_SO
21870 5f 44 45 53 43 29 2c 0a 20 20 20 20 20 20 20 20  _DESC),.        
21880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21890 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65 52    pLevel->iLikeR
218a0 65 70 43 6e 74 72 29 3b 0a 20 20 20 20 20 20 20  epCntr);.       
218b0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
218c0 20 22 4c 49 4b 45 20 6c 6f 6f 70 20 63 6f 75 6e   "LIKE loop coun
218d0 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20 20 20  ter"));.        
218e0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4c 69 6b 65  pLevel->addrLike
218f0 52 65 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Rep = sqlite3Vdb
21900 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
21910 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
21920 66 28 20 70 52 61 6e 67 65 53 74 61 72 74 3d 3d  f( pRangeStart==
21930 30 0a 20 20 20 20 20 20 20 26 26 20 28 6a 20 3d  0.       && (j =
21940 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
21950 6e 45 71 5d 29 3e 3d 30 20 0a 20 20 20 20 20 20  nEq])>=0 .      
21960 20 26 26 20 70 49 64 78 2d 3e 70 54 61 62 6c 65   && pIdx->pTable
21970 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c  ->aCol[j].notNul
21980 6c 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20  l==0.      ){.  
21990 20 20 20 20 20 20 62 53 65 65 6b 50 61 73 74 4e        bSeekPastN
219a0 75 6c 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ull = 1;.      }
219b0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
219c0 74 28 20 70 52 61 6e 67 65 45 6e 64 3d 3d 30 20  t( pRangeEnd==0 
219d0 7c 7c 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e 77  || (pRangeEnd->w
219e0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e  tFlags & TERM_VN
219f0 55 4c 4c 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20  ULL)==0 );..    
21a00 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
21a10 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6c 6c   to evaluate all
21a20 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d   constraint term
21a30 73 20 75 73 69 6e 67 20 3d 3d 20 6f 72 20 49 4e  s using == or IN
21a40 0a 20 20 20 20 2a 2a 20 61 6e 64 20 73 74 6f 72  .    ** and stor
21a50 65 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20  e the values of 
21a60 74 68 6f 73 65 20 74 65 72 6d 73 20 69 6e 20 61  those terms in a
21a70 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73  n array of regis
21a80 74 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61 72  ters.    ** star
21a90 74 69 6e 67 20 61 74 20 72 65 67 42 61 73 65 2e  ting at regBase.
21aa0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 67 42  .    */.    regB
21ab0 61 73 65 20 3d 20 63 6f 64 65 41 6c 6c 45 71 75  ase = codeAllEqu
21ac0 61 6c 69 74 79 54 65 72 6d 73 28 70 50 61 72 73  alityTerms(pPars
21ad0 65 2c 70 4c 65 76 65 6c 2c 62 52 65 76 2c 6e 45  e,pLevel,bRev,nE
21ae0 78 74 72 61 52 65 67 2c 26 7a 53 74 61 72 74 41  xtraReg,&zStartA
21af0 66 66 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ff);.    assert(
21b00 20 7a 53 74 61 72 74 41 66 66 3d 3d 30 20 7c 7c   zStartAff==0 ||
21b10 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
21b20 28 7a 53 74 61 72 74 41 66 66 29 3e 3d 6e 45 71  (zStartAff)>=nEq
21b30 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 74 61   );.    if( zSta
21b40 72 74 41 66 66 20 29 20 63 45 6e 64 41 66 66 20  rtAff ) cEndAff 
21b50 3d 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d  = zStartAff[nEq]
21b60 3b 0a 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20  ;.    addrNxt = 
21b70 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b  pLevel->addrNxt;
21b80 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61  ..    /* If we a
21b90 72 65 20 64 6f 69 6e 67 20 61 20 72 65 76 65 72  re doing a rever
21ba0 73 65 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e  se order scan on
21bb0 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e   an ascending in
21bc0 64 65 78 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61  dex, or.    ** a
21bd0 20 66 6f 72 77 61 72 64 20 6f 72 64 65 72 20 73   forward order s
21be0 63 61 6e 20 6f 6e 20 61 20 64 65 73 63 65 6e 64  can on a descend
21bf0 69 6e 67 20 69 6e 64 65 78 2c 20 69 6e 74 65 72  ing index, inter
21c00 63 68 61 6e 67 65 20 74 68 65 20 0a 20 20 20 20  change the .    
21c10 2a 2a 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64  ** start and end
21c20 20 74 65 72 6d 73 20 28 70 52 61 6e 67 65 53 74   terms (pRangeSt
21c30 61 72 74 20 61 6e 64 20 70 52 61 6e 67 65 45 6e  art and pRangeEn
21c40 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  d)..    */.    i
21c50 66 28 20 28 6e 45 71 3c 70 49 64 78 2d 3e 6e 4b  f( (nEq<pIdx->nK
21c60 65 79 43 6f 6c 20 26 26 20 62 52 65 76 3d 3d 28  eyCol && bRev==(
21c70 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
21c80 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f  [nEq]==SQLITE_SO
21c90 5f 41 53 43 29 29 0a 20 20 20 20 20 7c 7c 20 28  _ASC)).     || (
21ca0 62 52 65 76 20 26 26 20 70 49 64 78 2d 3e 6e 4b  bRev && pIdx->nK
21cb0 65 79 43 6f 6c 3d 3d 6e 45 71 29 0a 20 20 20 20  eyCol==nEq).    
21cc0 29 7b 0a 20 20 20 20 20 20 53 57 41 50 28 57 68  ){.      SWAP(Wh
21cd0 65 72 65 54 65 72 6d 20 2a 2c 20 70 52 61 6e 67  ereTerm *, pRang
21ce0 65 45 6e 64 2c 20 70 52 61 6e 67 65 53 74 61 72  eEnd, pRangeStar
21cf0 74 29 3b 0a 20 20 20 20 20 20 53 57 41 50 28 75  t);.      SWAP(u
21d00 38 2c 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c  8, bSeekPastNull
21d10 2c 20 62 53 74 6f 70 41 74 4e 75 6c 6c 29 3b 0a  , bStopAtNull);.
21d20 20 20 20 20 7d 0a 0a 20 20 20 20 74 65 73 74 63      }..    testc
21d30 61 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74  ase( pRangeStart
21d40 20 26 26 20 28 70 52 61 6e 67 65 53 74 61 72 74   && (pRangeStart
21d50 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
21d60 5f 4c 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 74  _LE)!=0 );.    t
21d70 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 53  estcase( pRangeS
21d80 74 61 72 74 20 26 26 20 28 70 52 61 6e 67 65 53  tart && (pRangeS
21d90 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20  tart->eOperator 
21da0 26 20 57 4f 5f 47 45 29 21 3d 30 20 29 3b 0a 20  & WO_GE)!=0 );. 
21db0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61     testcase( pRa
21dc0 6e 67 65 45 6e 64 20 26 26 20 28 70 52 61 6e 67  ngeEnd && (pRang
21dd0 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20  eEnd->eOperator 
21de0 26 20 57 4f 5f 4c 45 29 21 3d 30 20 29 3b 0a 20  & WO_LE)!=0 );. 
21df0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61     testcase( pRa
21e00 6e 67 65 45 6e 64 20 26 26 20 28 70 52 61 6e 67  ngeEnd && (pRang
21e10 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20  eEnd->eOperator 
21e20 26 20 57 4f 5f 47 45 29 21 3d 30 20 29 3b 0a 20  & WO_GE)!=0 );. 
21e30 20 20 20 73 74 61 72 74 45 71 20 3d 20 21 70 52     startEq = !pR
21e40 61 6e 67 65 53 74 61 72 74 20 7c 7c 20 70 52 61  angeStart || pRa
21e50 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61  ngeStart->eOpera
21e60 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f  tor & (WO_LE|WO_
21e70 47 45 29 3b 0a 20 20 20 20 65 6e 64 45 71 20 3d  GE);.    endEq =
21e80 20 20 20 21 70 52 61 6e 67 65 45 6e 64 20 7c 7c     !pRangeEnd ||
21e90 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65   pRangeEnd->eOpe
21ea0 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57  rator & (WO_LE|W
21eb0 4f 5f 47 45 29 3b 0a 20 20 20 20 73 74 61 72 74  O_GE);.    start
21ec0 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20 70  _constraints = p
21ed0 52 61 6e 67 65 53 74 61 72 74 20 7c 7c 20 6e 45  RangeStart || nE
21ee0 71 3e 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65  q>0;..    /* See
21ef0 6b 20 74 68 65 20 69 6e 64 65 78 20 63 75 72 73  k the index curs
21f00 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  or to the start 
21f10 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f  of the range. */
21f20 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74  .    nConstraint
21f30 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20   = nEq;.    if( 
21f40 70 52 61 6e 67 65 53 74 61 72 74 20 29 7b 0a 20  pRangeStart ){. 
21f50 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68       Expr *pRigh
21f60 74 20 3d 20 70 52 61 6e 67 65 53 74 61 72 74 2d  t = pRangeStart-
21f70 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  >pExpr->pRight;.
21f80 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
21f90 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52  rCode(pParse, pR
21fa0 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45  ight, regBase+nE
21fb0 71 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c  q);.      whereL
21fc0 69 6b 65 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 53  ikeOptimizationS
21fd0 74 72 69 6e 67 46 69 78 75 70 28 76 2c 20 70 4c  tringFixup(v, pL
21fe0 65 76 65 6c 2c 20 70 52 61 6e 67 65 53 74 61 72  evel, pRangeStar
21ff0 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  t);.      if( (p
22000 52 61 6e 67 65 53 74 61 72 74 2d 3e 77 74 46 6c  RangeStart->wtFl
22010 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
22020 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 73  )==0.       && s
22030 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e  qlite3ExprCanBeN
22040 75 6c 6c 28 70 52 69 67 68 74 29 0a 20 20 20 20  ull(pRight).    
22050 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c    ){.        sql
22060 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
22070 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67  , OP_IsNull, reg
22080 42 61 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78  Base+nEq, addrNx
22090 74 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  t);.        Vdbe
220a0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
220b0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a     }.      if( z
220c0 53 74 61 72 74 41 66 66 20 29 7b 0a 20 20 20 20  StartAff ){.    
220d0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43      if( sqlite3C
220e0 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
220f0 52 69 67 68 74 2c 20 7a 53 74 61 72 74 41 66 66  Right, zStartAff
22100 5b 6e 45 71 5d 29 3d 3d 53 51 4c 49 54 45 5f 41  [nEq])==SQLITE_A
22110 46 46 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20 20 20  FF_NONE){.      
22120 20 20 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65      /* Since the
22130 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74   comparison is t
22140 6f 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 77  o be performed w
22150 69 74 68 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f  ith no conversio
22160 6e 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ns.          ** 
22170 61 70 70 6c 69 65 64 20 74 6f 20 74 68 65 20 6f  applied to the o
22180 70 65 72 61 6e 64 73 2c 20 73 65 74 20 74 68 65  perands, set the
22190 20 61 66 66 69 6e 69 74 79 20 74 6f 20 61 70 70   affinity to app
221a0 6c 79 20 74 6f 20 70 52 69 67 68 74 20 74 6f 20  ly to pRight to 
221b0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51  .          ** SQ
221c0 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20  LITE_AFF_NONE.  
221d0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7a 53 74  */.          zSt
221e0 61 72 74 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51  artAff[nEq] = SQ
221f0 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
22200 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22210 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
22220 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43  NeedsNoAffinityC
22230 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20 7a 53  hange(pRight, zS
22240 74 61 72 74 41 66 66 5b 6e 45 71 5d 29 20 29 7b  tartAff[nEq]) ){
22250 0a 20 20 20 20 20 20 20 20 20 20 7a 53 74 61 72  .          zStar
22260 74 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49  tAff[nEq] = SQLI
22270 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20  TE_AFF_NONE;.   
22280 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 20       }.      }  
22290 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69  .      nConstrai
222a0 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 74 65 73 74  nt++;.      test
222b0 63 61 73 65 28 20 70 52 61 6e 67 65 53 74 61 72  case( pRangeStar
222c0 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  t->wtFlags & TER
222d0 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20  M_VIRTUAL );.   
222e0 20 7d 65 6c 73 65 20 69 66 28 20 62 53 65 65 6b   }else if( bSeek
222f0 50 61 73 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  PastNull ){.    
22300 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
22310 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
22320 30 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b  0, regBase+nEq);
22330 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69  .      nConstrai
22340 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 74 61 72  nt++;.      star
22350 74 45 71 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  tEq = 0;.      s
22360 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
22370 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
22380 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74  codeApplyAffinit
22390 79 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  y(pParse, regBas
223a0 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 2d  e, nConstraint -
223b0 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 2c 20   bSeekPastNull, 
223c0 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20  zStartAff);.    
223d0 6f 70 20 3d 20 61 53 74 61 72 74 4f 70 5b 28 73  op = aStartOp[(s
223e0 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
223f0 3c 3c 32 29 20 2b 20 28 73 74 61 72 74 45 71 3c  <<2) + (startEq<
22400 3c 31 29 20 2b 20 62 52 65 76 5d 3b 0a 20 20 20  <1) + bRev];.   
22410 20 61 73 73 65 72 74 28 20 6f 70 21 3d 30 20 29   assert( op!=0 )
22420 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
22430 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70  eAddOp4Int(v, op
22440 2c 20 69 49 64 78 43 75 72 2c 20 61 64 64 72 4e  , iIdxCur, addrN
22450 78 74 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f  xt, regBase, nCo
22460 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 20 20 56  nstraint);.    V
22470 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
22480 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
22490 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 52 65 77  If(v, op==OP_Rew
224a0 69 6e 64 29 3b 20 20 74 65 73 74 63 61 73 65 28  ind);  testcase(
224b0 20 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 20 29   op==OP_Rewind )
224c0 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
224d0 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4c  geIf(v, op==OP_L
224e0 61 73 74 29 3b 20 20 20 20 74 65 73 74 63 61 73  ast);    testcas
224f0 65 28 20 6f 70 3d 3d 4f 50 5f 4c 61 73 74 20 29  e( op==OP_Last )
22500 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
22510 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53  geIf(v, op==OP_S
22520 65 65 6b 47 54 29 3b 20 20 74 65 73 74 63 61 73  eekGT);  testcas
22530 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 54  e( op==OP_SeekGT
22540 20 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65   );.    VdbeCove
22550 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
22560 5f 53 65 65 6b 47 45 29 3b 20 20 74 65 73 74 63  _SeekGE);  testc
22570 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b  ase( op==OP_Seek
22580 47 45 20 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  GE );.    VdbeCo
22590 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
225a0 4f 50 5f 53 65 65 6b 4c 45 29 3b 20 20 74 65 73  OP_SeekLE);  tes
225b0 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65  tcase( op==OP_Se
225c0 65 6b 4c 45 20 29 3b 0a 20 20 20 20 56 64 62 65  ekLE );.    Vdbe
225d0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
225e0 3d 3d 4f 50 5f 53 65 65 6b 4c 54 29 3b 20 20 74  ==OP_SeekLT);  t
225f0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
22600 53 65 65 6b 4c 54 20 29 3b 0a 0a 20 20 20 20 2f  SeekLT );..    /
22610 2a 20 4c 6f 61 64 20 74 68 65 20 76 61 6c 75 65  * Load the value
22620 20 66 6f 72 20 74 68 65 20 69 6e 65 71 75 61 6c   for the inequal
22630 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61  ity constraint a
22640 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
22650 0a 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 28 69  .    ** range (i
22660 66 20 61 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a 20  f any)..    */. 
22670 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d     nConstraint =
22680 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70 52   nEq;.    if( pR
22690 61 6e 67 65 45 6e 64 20 29 7b 0a 20 20 20 20 20  angeEnd ){.     
226a0 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20   Expr *pRight = 
226b0 70 52 61 6e 67 65 45 6e 64 2d 3e 70 45 78 70 72  pRangeEnd->pExpr
226c0 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
226d0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
226e0 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 72  Remove(pParse, r
226f0 65 67 42 61 73 65 2b 6e 45 71 2c 20 31 29 3b 0a  egBase+nEq, 1);.
22700 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
22710 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52  rCode(pParse, pR
22720 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45  ight, regBase+nE
22730 71 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c  q);.      whereL
22740 69 6b 65 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 53  ikeOptimizationS
22750 74 72 69 6e 67 46 69 78 75 70 28 76 2c 20 70 4c  tringFixup(v, pL
22760 65 76 65 6c 2c 20 70 52 61 6e 67 65 45 6e 64 29  evel, pRangeEnd)
22770 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 52 61  ;.      if( (pRa
22780 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20  ngeEnd->wtFlags 
22790 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30  & TERM_VNULL)==0
227a0 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74  .       && sqlit
227b0 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28  e3ExprCanBeNull(
227c0 70 52 69 67 68 74 29 0a 20 20 20 20 20 20 29 7b  pRight).      ){
227d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
227e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
227f0 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 42 61 73 65  _IsNull, regBase
22800 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a  +nEq, addrNxt);.
22810 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
22820 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d  rage(v);.      }
22830 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
22840 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
22850 79 28 70 52 69 67 68 74 2c 20 63 45 6e 64 41 66  y(pRight, cEndAf
22860 66 29 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  f)!=SQLITE_AFF_N
22870 4f 4e 45 0a 20 20 20 20 20 20 20 26 26 20 21 73  ONE.       && !s
22880 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e  qlite3ExprNeedsN
22890 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  oAffinityChange(
228a0 70 52 69 67 68 74 2c 20 63 45 6e 64 41 66 66 29  pRight, cEndAff)
228b0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
228c0 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e    codeApplyAffin
228d0 69 74 79 28 70 50 61 72 73 65 2c 20 72 65 67 42  ity(pParse, regB
228e0 61 73 65 2b 6e 45 71 2c 20 31 2c 20 26 63 45 6e  ase+nEq, 1, &cEn
228f0 64 41 66 66 29 3b 0a 20 20 20 20 20 20 7d 0a 20  dAff);.      }. 
22900 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74       nConstraint
22910 2b 2b 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  ++;.      testca
22920 73 65 28 20 70 52 61 6e 67 65 45 6e 64 2d 3e 77  se( pRangeEnd->w
22930 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
22940 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 7d 65 6c  RTUAL );.    }el
22950 73 65 20 69 66 28 20 62 53 74 6f 70 41 74 4e 75  se if( bStopAtNu
22960 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ll ){.      sqli
22970 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
22980 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67   OP_Null, 0, reg
22990 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20  Base+nEq);.     
229a0 20 65 6e 64 45 71 20 3d 20 30 3b 0a 20 20 20 20   endEq = 0;.    
229b0 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b    nConstraint++;
229c0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
229d0 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74  e3DbFree(db, zSt
229e0 61 72 74 41 66 66 29 3b 0a 0a 20 20 20 20 2f 2a  artAff);..    /*
229f0 20 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70   Top of the loop
22a00 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20 70 4c 65   body */.    pLe
22a10 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65  vel->p2 = sqlite
22a20 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
22a30 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  (v);..    /* Che
22a40 63 6b 20 69 66 20 74 68 65 20 69 6e 64 65 78 20  ck if the index 
22a50 63 75 72 73 6f 72 20 69 73 20 70 61 73 74 20 74  cursor is past t
22a60 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72 61  he end of the ra
22a70 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  nge. */.    if( 
22a80 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 7b 0a 20  nConstraint ){. 
22a90 20 20 20 20 20 6f 70 20 3d 20 61 45 6e 64 4f 70       op = aEndOp
22aa0 5b 62 52 65 76 2a 32 20 2b 20 65 6e 64 45 71 5d  [bRev*2 + endEq]
22ab0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
22ac0 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
22ad0 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 61 64 64  op, iIdxCur, add
22ae0 72 4e 78 74 2c 20 72 65 67 42 61 73 65 2c 20 6e  rNxt, regBase, n
22af0 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 20  Constraint);.   
22b00 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
22b10 3d 4f 50 5f 49 64 78 47 54 20 29 3b 20 20 56 64  =OP_IdxGT );  Vd
22b20 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
22b30 6f 70 3d 3d 4f 50 5f 49 64 78 47 54 20 29 3b 0a  op==OP_IdxGT );.
22b40 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
22b50 6f 70 3d 3d 4f 50 5f 49 64 78 47 45 20 29 3b 20  op==OP_IdxGE ); 
22b60 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
22b70 76 2c 20 6f 70 3d 3d 4f 50 5f 49 64 78 47 45 20  v, op==OP_IdxGE 
22b80 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
22b90 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54 20  e( op==OP_IdxLT 
22ba0 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  );  VdbeCoverage
22bb0 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 49 64 78  If(v, op==OP_Idx
22bc0 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LT );.      test
22bd0 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78  case( op==OP_Idx
22be0 4c 45 20 29 3b 20 20 56 64 62 65 43 6f 76 65 72  LE );  VdbeCover
22bf0 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
22c00 49 64 78 4c 45 20 29 3b 0a 20 20 20 20 7d 0a 0a  IdxLE );.    }..
22c10 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68 65 20      /* Seek the 
22c20 74 61 62 6c 65 20 63 75 72 73 6f 72 2c 20 69 66  table cursor, if
22c30 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20   required */.   
22c40 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
22c50 76 65 6c 2c 20 70 52 61 6e 67 65 53 74 61 72 74  vel, pRangeStart
22c60 29 3b 0a 20 20 20 20 64 69 73 61 62 6c 65 54 65  );.    disableTe
22c70 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67  rm(pLevel, pRang
22c80 65 45 6e 64 29 3b 0a 20 20 20 20 69 66 28 20 6f  eEnd);.    if( o
22c90 6d 69 74 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  mitTable ){.    
22ca0 20 20 2f 2a 20 70 49 64 78 20 69 73 20 61 20 63    /* pIdx is a c
22cb0 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20  overing index.  
22cc0 4e 6f 20 6e 65 65 64 20 74 6f 20 61 63 63 65 73  No need to acces
22cd0 73 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65  s the main table
22ce0 2e 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69  . */.    }else i
22cf0 66 28 20 48 61 73 52 6f 77 69 64 28 70 49 64 78  f( HasRowid(pIdx
22d00 2d 3e 70 54 61 62 6c 65 29 20 29 7b 0a 20 20 20  ->pTable) ){.   
22d10 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20 2b     iRowidReg = +
22d20 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
22d30 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
22d40 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
22d50 52 6f 77 69 64 2c 20 69 49 64 78 43 75 72 2c 20  Rowid, iIdxCur, 
22d60 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20  iRowidReg);.    
22d70 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
22d80 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20  heStore(pParse, 
22d90 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64  iCur, -1, iRowid
22da0 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Reg);.      sqli
22db0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
22dc0 20 4f 50 5f 53 65 65 6b 2c 20 69 43 75 72 2c 20   OP_Seek, iCur, 
22dd0 69 52 6f 77 69 64 52 65 67 29 3b 20 20 2f 2a 20  iRowidReg);  /* 
22de0 44 65 66 65 72 72 65 64 20 73 65 65 6b 20 2a 2f  Deferred seek */
22df0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69  .    }else if( i
22e00 43 75 72 21 3d 69 49 64 78 43 75 72 20 29 7b 0a  Cur!=iIdxCur ){.
22e10 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 50 6b        Index *pPk
22e20 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72   = sqlite3Primar
22e30 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 2d 3e  yKeyIndex(pIdx->
22e40 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 69  pTable);.      i
22e50 52 6f 77 69 64 52 65 67 20 3d 20 73 71 6c 69 74  RowidReg = sqlit
22e60 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
22e70 50 61 72 73 65 2c 20 70 50 6b 2d 3e 6e 4b 65 79  Parse, pPk->nKey
22e80 43 6f 6c 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  Col);.      for(
22e90 6a 3d 30 3b 20 6a 3c 70 50 6b 2d 3e 6e 4b 65 79  j=0; j<pPk->nKey
22ea0 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
22eb0 20 20 20 6b 20 3d 20 73 71 6c 69 74 65 33 43 6f     k = sqlite3Co
22ec0 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49 64 78  lumnOfIndex(pIdx
22ed0 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  , pPk->aiColumn[
22ee0 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  j]);.        sql
22ef0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
22f00 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64  , OP_Column, iId
22f10 78 43 75 72 2c 20 6b 2c 20 69 52 6f 77 69 64 52  xCur, k, iRowidR
22f20 65 67 2b 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20  eg+j);.      }. 
22f30 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
22f40 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
22f50 4e 6f 74 46 6f 75 6e 64 2c 20 69 43 75 72 2c 20  NotFound, iCur, 
22f60 61 64 64 72 43 6f 6e 74 2c 0a 20 20 20 20 20 20  addrCont,.      
22f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f80 20 20 20 20 20 69 52 6f 77 69 64 52 65 67 2c 20       iRowidReg, 
22f90 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56  pPk->nKeyCol); V
22fa0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
22fb0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
22fc0 63 6f 72 64 20 74 68 65 20 69 6e 73 74 72 75 63  cord the instruc
22fd0 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 74 65 72  tion used to ter
22fe0 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e  minate the loop.
22ff0 20 44 69 73 61 62 6c 65 20 0a 20 20 20 20 2a 2a   Disable .    **
23000 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
23010 72 6d 73 20 6d 61 64 65 20 72 65 64 75 6e 64 61  rms made redunda
23020 6e 74 20 62 79 20 74 68 65 20 69 6e 64 65 78 20  nt by the index 
23030 72 61 6e 67 65 20 73 63 61 6e 2e 0a 20 20 20 20  range scan..    
23040 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70  */.    if( pLoop
23050 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
23060 45 5f 4f 4e 45 52 4f 57 20 29 7b 0a 20 20 20 20  E_ONEROW ){.    
23070 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f    pLevel->op = O
23080 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c 73  P_Noop;.    }els
23090 65 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20  e if( bRev ){.  
230a0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
230b0 20 4f 50 5f 50 72 65 76 3b 0a 20 20 20 20 7d 65   OP_Prev;.    }e
230c0 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  lse{.      pLeve
230d0 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78 74 3b  l->op = OP_Next;
230e0 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65  .    }.    pLeve
230f0 6c 2d 3e 70 31 20 3d 20 69 49 64 78 43 75 72 3b  l->p1 = iIdxCur;
23100 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 33 20  .    pLevel->p3 
23110 3d 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  = (pLoop->wsFlag
23120 73 26 57 48 45 52 45 5f 55 4e 51 5f 57 41 4e 54  s&WHERE_UNQ_WANT
23130 45 44 29 21 3d 30 20 3f 20 31 3a 30 3b 0a 20 20  ED)!=0 ? 1:0;.  
23140 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73    if( (pLoop->ws
23150 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  Flags & WHERE_CO
23160 4e 53 54 52 41 49 4e 54 29 3d 3d 30 20 29 7b 0a  NSTRAINT)==0 ){.
23170 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35        pLevel->p5
23180 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54   = SQLITE_STMTST
23190 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54  ATUS_FULLSCAN_ST
231a0 45 50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EP;.    }else{. 
231b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65       assert( pLe
231c0 76 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20  vel->p5==0 );.  
231d0 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66    }.  }else..#if
231e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
231f0 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  _OR_OPTIMIZATION
23200 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73  .  if( pLoop->ws
23210 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55  Flags & WHERE_MU
23220 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20 2f 2a  LTI_OR ){.    /*
23230 20 43 61 73 65 20 35 3a 20 20 54 77 6f 20 6f 72   Case 5:  Two or
23240 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 6c 79   more separately
23250 20 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63   indexed terms c
23260 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 0a 20  onnected by OR. 
23270 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61     **.    ** Exa
23280 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  mple:.    **.   
23290 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42   **   CREATE TAB
232a0 4c 45 20 74 31 28 61 2c 62 2c 63 2c 64 29 3b 0a  LE t1(a,b,c,d);.
232b0 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20      **   CREATE 
232c0 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61  INDEX i1 ON t1(a
232d0 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41  );.    **   CREA
232e0 54 45 20 49 4e 44 45 58 20 69 32 20 4f 4e 20 74  TE INDEX i2 ON t
232f0 31 28 62 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43  1(b);.    **   C
23300 52 45 41 54 45 20 49 4e 44 45 58 20 69 33 20 4f  REATE INDEX i3 O
23310 4e 20 74 31 28 63 29 3b 0a 20 20 20 20 2a 2a 0a  N t1(c);.    **.
23320 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
23330 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
23340 61 3d 35 20 4f 52 20 62 3d 37 20 4f 52 20 28 63  a=5 OR b=7 OR (c
23350 3d 31 31 20 41 4e 44 20 64 3d 31 33 29 0a 20 20  =11 AND d=13).  
23360 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 74    **.    ** In t
23370 68 65 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 72  he example, ther
23380 65 20 61 72 65 20 74 68 72 65 65 20 69 6e 64 65  e are three inde
23390 78 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63  xed terms connec
233a0 74 65 64 20 62 79 20 4f 52 2e 0a 20 20 20 20 2a  ted by OR..    *
233b0 2a 20 54 68 65 20 74 6f 70 20 6f 66 20 74 68 65  * The top of the
233c0 20 6c 6f 6f 70 20 6c 6f 6f 6b 73 20 6c 69 6b 65   loop looks like
233d0 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20   this:.    **.  
233e0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 4e 75    **          Nu
233f0 6c 6c 20 20 20 20 20 20 20 31 20 20 20 20 20 20  ll       1      
23400 20 20 20 20 20 20 20 20 20 20 23 20 5a 65 72 6f            # Zero
23410 20 74 68 65 20 72 6f 77 73 65 74 20 69 6e 20 72   the rowset in r
23420 65 67 20 31 0a 20 20 20 20 2a 2a 0a 20 20 20 20  eg 1.    **.    
23430 2a 2a 20 54 68 65 6e 2c 20 66 6f 72 20 65 61 63  ** Then, for eac
23440 68 20 69 6e 64 65 78 65 64 20 74 65 72 6d 2c 20  h indexed term, 
23450 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 2e 20 54  the following. T
23460 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a  he arguments to.
23470 20 20 20 20 2a 2a 20 52 6f 77 53 65 74 54 65 73      ** RowSetTes
23480 74 20 61 72 65 20 73 75 63 68 20 74 68 61 74 20  t are such that 
23490 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65  the rowid of the
234a0 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20   current row is 
234b0 69 6e 73 65 72 74 65 64 0a 20 20 20 20 2a 2a 20  inserted.    ** 
234c0 69 6e 74 6f 20 74 68 65 20 52 6f 77 53 65 74 2e  into the RowSet.
234d0 20 49 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   If it is alread
234e0 79 20 70 72 65 73 65 6e 74 2c 20 63 6f 6e 74 72  y present, contr
234f0 6f 6c 20 73 6b 69 70 73 20 74 68 65 0a 20 20 20  ol skips the.   
23500 20 2a 2a 20 47 6f 73 75 62 20 6f 70 63 6f 64 65   ** Gosub opcode
23510 20 61 6e 64 20 6a 75 6d 70 73 20 73 74 72 61 69   and jumps strai
23520 67 68 74 20 74 6f 20 74 68 65 20 63 6f 64 65 20  ght to the code 
23530 67 65 6e 65 72 61 74 65 64 20 62 79 20 57 68 65  generated by Whe
23540 72 65 45 6e 64 28 29 2e 0a 20 20 20 20 2a 2a 0a  reEnd()..    **.
23550 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 73 71      **        sq
23560 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
23570 3c 74 65 72 6d 3e 29 0a 20 20 20 20 2a 2a 20 20  <term>).    **  
23580 20 20 20 20 20 20 20 20 52 6f 77 53 65 74 54 65          RowSetTe
23590 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  st              
235a0 20 20 20 20 23 20 49 6e 73 65 72 74 20 72 6f 77      # Insert row
235b0 69 64 20 69 6e 74 6f 20 72 6f 77 73 65 74 0a 20  id into rowset. 
235c0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47     **          G
235d0 6f 73 75 62 20 20 20 20 20 20 32 20 41 0a 20 20  osub      2 A.  
235e0 20 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c 69    **        sqli
235f0 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 20 20  te3WhereEnd().  
23600 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 6c 6c    **.    ** Foll
23610 6f 77 69 6e 67 20 74 68 65 20 61 62 6f 76 65 2c  owing the above,
23620 20 63 6f 64 65 20 74 6f 20 74 65 72 6d 69 6e 61   code to termina
23630 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 4c 61 62  te the loop. Lab
23640 65 6c 20 41 2c 20 74 68 65 20 74 61 72 67 65 74  el A, the target
23650 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 47  .    ** of the G
23660 6f 73 75 62 20 61 62 6f 76 65 2c 20 6a 75 6d 70  osub above, jump
23670 73 20 74 6f 20 74 68 65 20 69 6e 73 74 72 75 63  s to the instruc
23680 74 69 6f 6e 20 72 69 67 68 74 20 61 66 74 65 72  tion right after
23690 20 74 68 65 20 47 6f 74 6f 2e 0a 20 20 20 20 2a   the Goto..    *
236a0 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
236b0 20 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20 20    Null       1  
236c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
236d0 5a 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74 20  Zero the rowset 
236e0 69 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a 20  in reg 1.    ** 
236f0 20 20 20 20 20 20 20 20 20 47 6f 74 6f 20 20 20           Goto   
23700 20 20 20 20 42 20 20 20 20 20 20 20 20 20 20 20      B           
23710 20 20 20 20 20 23 20 54 68 65 20 6c 6f 6f 70 20       # The loop 
23720 69 73 20 66 69 6e 69 73 68 65 64 2e 0a 20 20 20  is finished..   
23730 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
23740 20 41 3a 20 3c 6c 6f 6f 70 20 62 6f 64 79 3e 20   A: <loop body> 
23750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23760 23 20 52 65 74 75 72 6e 20 64 61 74 61 2c 20 77  # Return data, w
23770 68 61 74 65 76 65 72 2e 0a 20 20 20 20 2a 2a 0a  hatever..    **.
23780 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
23790 52 65 74 75 72 6e 20 20 20 20 20 32 20 20 20 20  Return     2    
237a0 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4a 75              # Ju
237b0 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20 47  mp back to the G
237c0 6f 73 75 62 0a 20 20 20 20 2a 2a 0a 20 20 20 20  osub.    **.    
237d0 2a 2a 20 20 20 20 20 20 20 42 3a 20 3c 61 66 74  **       B: <aft
237e0 65 72 20 74 68 65 20 6c 6f 6f 70 3e 0a 20 20 20  er the loop>.   
237f0 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 64 64 65 64   **.    ** Added
23800 20 32 30 31 34 2d 30 35 2d 32 36 3a 20 49 66 20   2014-05-26: If 
23810 74 68 65 20 74 61 62 6c 65 20 69 73 20 61 20 57  the table is a W
23820 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62  ITHOUT ROWID tab
23830 6c 65 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  le, then.    ** 
23840 75 73 65 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  use an ephemeral
23850 20 69 6e 64 65 78 20 69 6e 73 74 65 61 64 20 6f   index instead o
23860 66 20 61 20 52 6f 77 53 65 74 20 74 6f 20 72 65  f a RowSet to re
23870 63 6f 72 64 20 74 68 65 20 70 72 69 6d 61 72 79  cord the primary
23880 0a 20 20 20 20 2a 2a 20 6b 65 79 73 20 6f 66 20  .    ** keys of 
23890 74 68 65 20 72 6f 77 73 20 77 65 20 68 61 76 65  the rows we have
238a0 20 61 6c 72 65 61 64 79 20 73 65 65 6e 2e 0a 20   already seen.. 
238b0 20 20 20 2a 2a 0a 20 20 20 20 2a 2f 0a 20 20 20     **.    */.   
238c0 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 4f   WhereClause *pO
238d0 72 57 63 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f  rWc;    /* The O
238e0 52 2d 63 6c 61 75 73 65 20 62 72 6f 6b 65 6e 20  R-clause broken 
238f0 6f 75 74 20 69 6e 74 6f 20 73 75 62 74 65 72 6d  out into subterm
23900 73 20 2a 2f 0a 20 20 20 20 53 72 63 4c 69 73 74  s */.    SrcList
23910 20 2a 70 4f 72 54 61 62 3b 20 20 20 20 20 20 20   *pOrTab;       
23920 2f 2a 20 53 68 6f 72 74 65 6e 65 64 20 74 61 62  /* Shortened tab
23930 6c 65 20 6c 69 73 74 20 6f 72 20 4f 52 2d 63 6c  le list or OR-cl
23940 61 75 73 65 20 67 65 6e 65 72 61 74 69 6f 6e 20  ause generation 
23950 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 43  */.    Index *pC
23960 6f 76 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ov = 0;         
23970 20 20 20 20 2f 2a 20 50 6f 74 65 6e 74 69 61 6c      /* Potential
23980 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20   covering index 
23990 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 20  (or NULL) */.   
239a0 20 69 6e 74 20 69 43 6f 76 43 75 72 20 3d 20 70   int iCovCur = p
239b0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20  Parse->nTab++;  
239c0 2f 2a 20 43 75 72 73 6f 72 20 75 73 65 64 20 66  /* Cursor used f
239d0 6f 72 20 69 6e 64 65 78 20 73 63 61 6e 73 20 28  or index scans (
239e0 69 66 20 61 6e 79 29 20 2a 2f 0a 0a 20 20 20 20  if any) */..    
239f0 69 6e 74 20 72 65 67 52 65 74 75 72 6e 20 3d 20  int regReturn = 
23a00 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20  ++pParse->nMem; 
23a10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
23a20 69 73 74 65 72 20 75 73 65 64 20 77 69 74 68 20  ister used with 
23a30 4f 50 5f 47 6f 73 75 62 20 2a 2f 0a 20 20 20 20  OP_Gosub */.    
23a40 69 6e 74 20 72 65 67 52 6f 77 73 65 74 20 3d 20  int regRowset = 
23a50 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
23a60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
23a70 69 73 74 65 72 20 66 6f 72 20 52 6f 77 53 65 74  ister for RowSet
23a80 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 69   object */.    i
23a90 6e 74 20 72 65 67 52 6f 77 69 64 20 3d 20 30 3b  nt regRowid = 0;
23aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ab0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
23ac0 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72 6f 77  ster holding row
23ad0 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4c  id */.    int iL
23ae0 6f 6f 70 42 6f 64 79 20 3d 20 73 71 6c 69 74 65  oopBody = sqlite
23af0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
23b00 29 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20  );  /* Start of 
23b10 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20  loop body */.   
23b20 20 69 6e 74 20 69 52 65 74 49 6e 69 74 3b 20 20   int iRetInit;  
23b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
23b50 64 72 65 73 73 20 6f 66 20 72 65 67 52 65 74 75  dress of regRetu
23b60 72 6e 20 69 6e 69 74 20 2a 2f 0a 20 20 20 20 69  rn init */.    i
23b70 6e 74 20 75 6e 74 65 73 74 65 64 54 65 72 6d 73  nt untestedTerms
23b80 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
23b90 20 20 2f 2a 20 53 6f 6d 65 20 74 65 72 6d 73 20    /* Some terms 
23ba0 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 74  not completely t
23bb0 65 73 74 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74  ested */.    int
23bc0 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
23bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23be0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
23bf0 2a 2f 0a 20 20 20 20 75 31 36 20 77 63 74 72 6c  */.    u16 wctrl
23c00 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
23c10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
23c20 67 73 20 66 6f 72 20 73 75 62 2d 57 48 45 52 45  gs for sub-WHERE
23c30 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 45   clause */.    E
23c40 78 70 72 20 2a 70 41 6e 64 45 78 70 72 20 3d 20  xpr *pAndExpr = 
23c50 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
23c60 20 20 2f 2a 20 41 6e 20 22 2e 2e 20 41 4e 44 20    /* An ".. AND 
23c70 28 2e 2e 2e 29 22 20 65 78 70 72 65 73 73 69 6f  (...)" expressio
23c80 6e 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a  n */.    Table *
23c90 70 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d  pTab = pTabItem-
23ca0 3e 70 54 61 62 3b 0a 20 20 20 0a 20 20 20 20 70  >pTab;.   .    p
23cb0 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c  Term = pLoop->aL
23cc0 54 65 72 6d 5b 30 5d 3b 0a 20 20 20 20 61 73 73  Term[0];.    ass
23cd0 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b  ert( pTerm!=0 );
23ce0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
23cf0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
23d00 57 4f 5f 4f 52 20 29 3b 0a 20 20 20 20 61 73 73  WO_OR );.    ass
23d10 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 77 74 46  ert( (pTerm->wtF
23d20 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 49 4e  lags & TERM_ORIN
23d30 46 4f 29 21 3d 30 20 29 3b 0a 20 20 20 20 70 4f  FO)!=0 );.    pO
23d40 72 57 63 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e  rWc = &pTerm->u.
23d50 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20  pOrInfo->wc;.   
23d60 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
23d70 5f 52 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c 65  _Return;.    pLe
23d80 76 65 6c 2d 3e 70 31 20 3d 20 72 65 67 52 65 74  vel->p1 = regRet
23d90 75 72 6e 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74  urn;..    /* Set
23da0 20 75 70 20 61 20 6e 65 77 20 53 72 63 4c 69 73   up a new SrcLis
23db0 74 20 69 6e 20 70 4f 72 54 61 62 20 63 6f 6e 74  t in pOrTab cont
23dc0 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
23dd0 20 62 65 69 6e 67 20 73 63 61 6e 6e 65 64 0a 20   being scanned. 
23de0 20 20 20 2a 2a 20 62 79 20 74 68 69 73 20 6c 6f     ** by this lo
23df0 6f 70 20 69 6e 20 74 68 65 20 61 5b 30 5d 20 73  op in the a[0] s
23e00 6c 6f 74 20 61 6e 64 20 61 6c 6c 20 6e 6f 74 52  lot and all notR
23e10 65 61 64 79 20 74 61 62 6c 65 73 20 69 6e 20 61  eady tables in a
23e20 5b 31 2e 2e 5d 20 73 6c 6f 74 73 2e 0a 20 20 20  [1..] slots..   
23e30 20 2a 2a 20 54 68 69 73 20 62 65 63 6f 6d 65 73   ** This becomes
23e40 20 74 68 65 20 53 72 63 4c 69 73 74 20 69 6e 20   the SrcList in 
23e50 74 68 65 20 72 65 63 75 72 73 69 76 65 20 63 61  the recursive ca
23e60 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65  ll to sqlite3Whe
23e70 72 65 42 65 67 69 6e 28 29 2e 0a 20 20 20 20 2a  reBegin()..    *
23e80 2f 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  /.    if( pWInfo
23e90 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29 7b 0a 20 20  ->nLevel>1 ){.  
23ea0 20 20 20 20 69 6e 74 20 6e 4e 6f 74 52 65 61 64      int nNotRead
23eb0 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
23ec0 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72     /* The number
23ed0 20 6f 66 20 6e 6f 74 52 65 61 64 79 20 74 61 62   of notReady tab
23ee0 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 73 74 72  les */.      str
23ef0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
23f00 20 2a 6f 72 69 67 53 72 63 3b 20 20 20 20 20 2f   *origSrc;     /
23f10 2a 20 4f 72 69 67 69 6e 61 6c 20 6c 69 73 74 20  * Original list 
23f20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20  of tables */.   
23f30 20 20 20 6e 4e 6f 74 52 65 61 64 79 20 3d 20 70     nNotReady = p
23f40 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 2d 20  WInfo->nLevel - 
23f50 69 4c 65 76 65 6c 20 2d 20 31 3b 0a 20 20 20 20  iLevel - 1;.    
23f60 20 20 70 4f 72 54 61 62 20 3d 20 73 71 6c 69 74    pOrTab = sqlit
23f70 65 33 53 74 61 63 6b 41 6c 6c 6f 63 52 61 77 28  e3StackAllocRaw(
23f80 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  db,.            
23f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23fa0 73 69 7a 65 6f 66 28 2a 70 4f 72 54 61 62 29 2b  sizeof(*pOrTab)+
23fb0 20 6e 4e 6f 74 52 65 61 64 79 2a 73 69 7a 65 6f   nNotReady*sizeo
23fc0 66 28 70 4f 72 54 61 62 2d 3e 61 5b 30 5d 29 29  f(pOrTab->a[0]))
23fd0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54  ;.      if( pOrT
23fe0 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 6e  ab==0 ) return n
23ff0 6f 74 52 65 61 64 79 3b 0a 20 20 20 20 20 20 70  otReady;.      p
24000 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63 20 3d 20  OrTab->nAlloc = 
24010 28 75 38 29 28 6e 4e 6f 74 52 65 61 64 79 20 2b  (u8)(nNotReady +
24020 20 31 29 3b 0a 20 20 20 20 20 20 70 4f 72 54 61   1);.      pOrTa
24030 62 2d 3e 6e 53 72 63 20 3d 20 70 4f 72 54 61 62  b->nSrc = pOrTab
24040 2d 3e 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20  ->nAlloc;.      
24050 6d 65 6d 63 70 79 28 70 4f 72 54 61 62 2d 3e 61  memcpy(pOrTab->a
24060 2c 20 70 54 61 62 49 74 65 6d 2c 20 73 69 7a 65  , pTabItem, size
24070 6f 66 28 2a 70 54 61 62 49 74 65 6d 29 29 3b 0a  of(*pTabItem));.
24080 20 20 20 20 20 20 6f 72 69 67 53 72 63 20 3d 20        origSrc = 
24090 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
240a0 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b  ->a;.      for(k
240b0 3d 31 3b 20 6b 3c 3d 6e 4e 6f 74 52 65 61 64 79  =1; k<=nNotReady
240c0 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
240d0 6d 65 6d 63 70 79 28 26 70 4f 72 54 61 62 2d 3e  memcpy(&pOrTab->
240e0 61 5b 6b 5d 2c 20 26 6f 72 69 67 53 72 63 5b 70  a[k], &origSrc[p
240f0 4c 65 76 65 6c 5b 6b 5d 2e 69 46 72 6f 6d 5d 2c  Level[k].iFrom],
24100 20 73 69 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e   sizeof(pOrTab->
24110 61 5b 6b 5d 29 29 3b 0a 20 20 20 20 20 20 7d 0a  a[k]));.      }.
24120 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
24130 20 70 4f 72 54 61 62 20 3d 20 70 57 49 6e 66 6f   pOrTab = pWInfo
24140 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20  ->pTabList;.    
24150 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  }..    /* Initia
24160 6c 69 7a 65 20 74 68 65 20 72 6f 77 73 65 74 20  lize the rowset 
24170 72 65 67 69 73 74 65 72 20 74 6f 20 63 6f 6e 74  register to cont
24180 61 69 6e 20 4e 55 4c 4c 2e 20 41 6e 20 53 51 4c  ain NULL. An SQL
24190 20 4e 55 4c 4c 20 69 73 20 0a 20 20 20 20 2a 2a   NULL is .    **
241a0 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 61   equivalent to a
241b0 6e 20 65 6d 70 74 79 20 72 6f 77 73 65 74 2e 20  n empty rowset. 
241c0 20 4f 72 2c 20 63 72 65 61 74 65 20 61 6e 20 65   Or, create an e
241d0 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 0a 20  phemeral index. 
241e0 20 20 20 2a 2a 20 63 61 70 61 62 6c 65 20 6f 66     ** capable of
241f0 20 68 6f 6c 64 69 6e 67 20 70 72 69 6d 61 72 79   holding primary
24200 20 6b 65 79 73 20 69 6e 20 74 68 65 20 63 61 73   keys in the cas
24210 65 20 6f 66 20 61 20 57 49 54 48 4f 55 54 20 52  e of a WITHOUT R
24220 4f 57 49 44 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  OWID..    **.   
24230 20 2a 2a 20 41 6c 73 6f 20 69 6e 69 74 69 61 6c   ** Also initial
24240 69 7a 65 20 72 65 67 52 65 74 75 72 6e 20 74 6f  ize regReturn to
24250 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 61 64 64   contain the add
24260 72 65 73 73 20 6f 66 20 74 68 65 20 69 6e 73 74  ress of the inst
24270 72 75 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20  ruction .    ** 
24280 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
24290 6f 77 69 6e 67 20 74 68 65 20 4f 50 5f 52 65 74  owing the OP_Ret
242a0 75 72 6e 20 61 74 20 74 68 65 20 62 6f 74 74 6f  urn at the botto
242b0 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 54  m of the loop. T
242c0 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 72 65  his.    ** is re
242d0 71 75 69 72 65 64 20 69 6e 20 61 20 66 65 77 20  quired in a few 
242e0 6f 62 73 63 75 72 65 20 4c 45 46 54 20 4a 4f 49  obscure LEFT JOI
242f0 4e 20 63 61 73 65 73 20 77 68 65 72 65 20 63 6f  N cases where co
24300 6e 74 72 6f 6c 20 6a 75 6d 70 73 0a 20 20 20 20  ntrol jumps.    
24310 2a 2a 20 6f 76 65 72 20 74 68 65 20 74 6f 70 20  ** over the top 
24320 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 6e 74 6f  of the loop into
24330 20 74 68 65 20 62 6f 64 79 20 6f 66 20 69 74 2e   the body of it.
24340 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
24350 65 20 0a 20 20 20 20 2a 2a 20 63 6f 72 72 65 63  e .    ** correc
24360 74 20 72 65 73 70 6f 6e 73 65 20 66 6f 72 20 74  t response for t
24370 68 65 20 65 6e 64 2d 6f 66 2d 6c 6f 6f 70 20 63  he end-of-loop c
24380 6f 64 65 20 28 74 68 65 20 4f 50 5f 52 65 74 75  ode (the OP_Retu
24390 72 6e 29 20 69 73 20 74 6f 20 0a 20 20 20 20 2a  rn) is to .    *
243a0 2a 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74  * fall through t
243b0 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72  o the next instr
243c0 75 63 74 69 6f 6e 2c 20 6a 75 73 74 20 61 73 20  uction, just as 
243d0 61 6e 20 4f 50 5f 4e 65 78 74 20 64 6f 65 73 20  an OP_Next does 
243e0 69 66 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64  if.    ** called
243f0 20 6f 6e 20 61 6e 20 75 6e 69 6e 69 74 69 61 6c   on an uninitial
24400 69 7a 65 64 20 63 75 72 73 6f 72 2e 0a 20 20 20  ized cursor..   
24410 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 57 49   */.    if( (pWI
24420 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
24430 26 20 57 48 45 52 45 5f 44 55 50 4c 49 43 41 54  & WHERE_DUPLICAT
24440 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20  ES_OK)==0 ){.   
24450 20 20 20 69 66 28 20 48 61 73 52 6f 77 69 64 28     if( HasRowid(
24460 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20  pTab) ){.       
24470 20 72 65 67 52 6f 77 73 65 74 20 3d 20 2b 2b 70   regRowset = ++p
24480 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
24490 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
244a0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
244b0 6c 2c 20 30 2c 20 72 65 67 52 6f 77 73 65 74 29  l, 0, regRowset)
244c0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
244d0 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 50         Index *pP
244e0 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61  k = sqlite3Prima
244f0 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29  ryKeyIndex(pTab)
24500 3b 0a 20 20 20 20 20 20 20 20 72 65 67 52 6f 77  ;.        regRow
24510 73 65 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  set = pParse->nT
24520 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73 71  ab++;.        sq
24530 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
24540 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
24550 72 61 6c 2c 20 72 65 67 52 6f 77 73 65 74 2c 20  ral, regRowset, 
24560 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20  pPk->nKeyCol);. 
24570 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
24580 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70  beSetP4KeyInfo(p
24590 50 61 72 73 65 2c 20 70 50 6b 29 3b 0a 20 20 20  Parse, pPk);.   
245a0 20 20 20 7d 0a 20 20 20 20 20 20 72 65 67 52 6f     }.      regRo
245b0 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  wid = ++pParse->
245c0 6e 4d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nMem;.    }.    
245d0 69 52 65 74 49 6e 69 74 20 3d 20 73 71 6c 69 74  iRetInit = sqlit
245e0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
245f0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72  OP_Integer, 0, r
24600 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 20 20  egReturn);..    
24610 2f 2a 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e  /* If the origin
24620 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  al WHERE clause 
24630 69 73 20 7a 20 6f 66 20 74 68 65 20 66 6f 72 6d  is z of the form
24640 3a 20 20 28 78 31 20 4f 52 20 78 32 20 4f 52 20  :  (x1 OR x2 OR 
24650 2e 2e 2e 29 20 41 4e 44 20 79 0a 20 20 20 20 2a  ...) AND y.    *
24660 2a 20 54 68 65 6e 20 66 6f 72 20 65 76 65 72 79  * Then for every
24670 20 74 65 72 6d 20 78 4e 2c 20 65 76 61 6c 75 61   term xN, evalua
24680 74 65 20 61 73 20 74 68 65 20 73 75 62 65 78 70  te as the subexp
24690 72 65 73 73 69 6f 6e 3a 20 78 4e 20 41 4e 44 20  ression: xN AND 
246a0 7a 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 77 61  z.    ** That wa
246b0 79 2c 20 74 65 72 6d 73 20 69 6e 20 79 20 74 68  y, terms in y th
246c0 61 74 20 61 72 65 20 66 61 63 74 6f 72 65 64 20  at are factored 
246d0 69 6e 74 6f 20 74 68 65 20 64 69 73 6a 75 6e 63  into the disjunc
246e0 74 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  tion will.    **
246f0 20 62 65 20 70 69 63 6b 65 64 20 75 70 20 62 79   be picked up by
24700 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20 63   the recursive c
24710 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 57  alls to sqlite3W
24720 68 65 72 65 42 65 67 69 6e 28 29 20 62 65 6c 6f  hereBegin() belo
24730 77 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  w..    **.    **
24740 20 41 63 74 75 61 6c 6c 79 2c 20 65 61 63 68 20   Actually, each 
24750 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73  subexpression is
24760 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 22 78   converted to "x
24770 4e 20 41 4e 44 20 77 22 20 77 68 65 72 65 20 77  N AND w" where w
24780 20 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 22   is.    ** the "
24790 69 6e 74 65 72 65 73 74 69 6e 67 22 20 74 65 72  interesting" ter
247a0 6d 73 20 6f 66 20 7a 20 2d 20 74 65 72 6d 73 20  ms of z - terms 
247b0 74 68 61 74 20 64 69 64 20 6e 6f 74 20 6f 72 69  that did not ori
247c0 67 69 6e 61 74 65 20 69 6e 20 74 68 65 0a 20 20  ginate in the.  
247d0 20 20 2a 2a 20 4f 4e 20 6f 72 20 55 53 49 4e 47    ** ON or USING
247e0 20 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46   clause of a LEF
247f0 54 20 4a 4f 49 4e 2c 20 61 6e 64 20 74 65 72 6d  T JOIN, and term
24800 73 20 74 68 61 74 20 61 72 65 20 75 73 61 62 6c  s that are usabl
24810 65 20 61 73 20 0a 20 20 20 20 2a 2a 20 69 6e 64  e as .    ** ind
24820 69 63 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ices..    **.   
24830 20 2a 2a 20 54 68 69 73 20 6f 70 74 69 6d 69 7a   ** This optimiz
24840 61 74 69 6f 6e 20 61 6c 73 6f 20 6f 6e 6c 79 20  ation also only 
24850 61 70 70 6c 69 65 73 20 69 66 20 74 68 65 20 28  applies if the (
24860 78 31 20 4f 52 20 78 32 20 4f 52 20 2e 2e 2e 29  x1 OR x2 OR ...)
24870 20 74 65 72 6d 0a 20 20 20 20 2a 2a 20 69 73 20   term.    ** is 
24880 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  not contained in
24890 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f   the ON clause o
248a0 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 20  f a LEFT JOIN.. 
248b0 20 20 20 2a 2a 20 53 65 65 20 74 69 63 6b 65 74     ** See ticket
248c0 20 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69   http://www.sqli
248d0 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f  te.org/src/info/
248e0 66 32 33 36 39 33 30 34 65 34 0a 20 20 20 20 2a  f2369304e4.    *
248f0 2f 0a 20 20 20 20 69 66 28 20 70 57 43 2d 3e 6e  /.    if( pWC->n
24900 54 65 72 6d 3e 31 20 29 7b 0a 20 20 20 20 20 20  Term>1 ){.      
24910 69 6e 74 20 69 54 65 72 6d 3b 0a 20 20 20 20 20  int iTerm;.     
24920 20 66 6f 72 28 69 54 65 72 6d 3d 30 3b 20 69 54   for(iTerm=0; iT
24930 65 72 6d 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  erm<pWC->nTerm; 
24940 69 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  iTerm++){.      
24950 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
24960 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 70 45  pWC->a[iTerm].pE
24970 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28  xpr;.        if(
24980 20 26 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 20   &pWC->a[iTerm] 
24990 3d 3d 20 70 54 65 72 6d 20 29 20 63 6f 6e 74 69  == pTerm ) conti
249a0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
249b0 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
249c0 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
249d0 6f 69 6e 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  oin) ) continue;
249e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57  .        if( (pW
249f0 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 77 74 46 6c  C->a[iTerm].wtFl
24a00 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
24a10 41 4c 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  AL)!=0 ) continu
24a20 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  e;.        if( (
24a30 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 65 4f  pWC->a[iTerm].eO
24a40 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c  perator & WO_ALL
24a50 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )==0 ) continue;
24a60 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
24a70 65 28 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d  e( pWC->a[iTerm]
24a80 2e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  .wtFlags & TERM_
24a90 4f 52 49 4e 46 4f 20 29 3b 0a 20 20 20 20 20 20  ORINFO );.      
24aa0 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
24ab0 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78  3ExprDup(db, pEx
24ac0 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  pr, 0);.        
24ad0 70 41 6e 64 45 78 70 72 20 3d 20 73 71 6c 69 74  pAndExpr = sqlit
24ae0 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 41  e3ExprAnd(db, pA
24af0 6e 64 45 78 70 72 2c 20 70 45 78 70 72 29 3b 0a  ndExpr, pExpr);.
24b00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
24b10 28 20 70 41 6e 64 45 78 70 72 20 29 7b 0a 20 20  ( pAndExpr ){.  
24b20 20 20 20 20 20 20 70 41 6e 64 45 78 70 72 20 3d        pAndExpr =
24b30 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
24b40 61 72 73 65 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c  arse, TK_AND, 0,
24b50 20 70 41 6e 64 45 78 70 72 2c 20 30 29 3b 0a 20   pAndExpr, 0);. 
24b60 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
24b70 20 20 2f 2a 20 52 75 6e 20 61 20 73 65 70 61 72    /* Run a separ
24b80 61 74 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ate WHERE clause
24b90 20 66 6f 72 20 65 61 63 68 20 74 65 72 6d 20 6f   for each term o
24ba0 66 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 2e  f the OR clause.
24bb0 20 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 65    After.    ** e
24bc0 6c 69 6d 69 6e 61 74 69 6e 67 20 64 75 70 6c 69  liminating dupli
24bd0 63 61 74 65 73 20 66 72 6f 6d 20 6f 74 68 65 72  cates from other
24be0 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 2c 20   WHERE clauses, 
24bf0 74 68 65 20 61 63 74 69 6f 6e 20 66 6f 72 20 65  the action for e
24c00 61 63 68 0a 20 20 20 20 2a 2a 20 73 75 62 2d 57  ach.    ** sub-W
24c10 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 74  HERE clause is t
24c20 6f 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20  o to invoke the 
24c30 6d 61 69 6e 20 6c 6f 6f 70 20 62 6f 64 79 20 61  main loop body a
24c40 73 20 61 20 73 75 62 72 6f 75 74 69 6e 65 2e 0a  s a subroutine..
24c50 20 20 20 20 2a 2f 0a 20 20 20 20 77 63 74 72 6c      */.    wctrl
24c60 46 6c 61 67 73 20 3d 20 20 57 48 45 52 45 5f 4f  Flags =  WHERE_O
24c70 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 0a 20  MIT_OPEN_CLOSE. 
24c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
24c90 20 57 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42   WHERE_FORCE_TAB
24ca0 4c 45 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  LE.             
24cb0 20 20 20 7c 20 57 48 45 52 45 5f 4f 4e 45 54 41     | WHERE_ONETA
24cc0 42 4c 45 5f 4f 4e 4c 59 0a 20 20 20 20 20 20 20  BLE_ONLY.       
24cd0 20 20 20 20 20 20 20 20 20 7c 20 57 48 45 52 45           | WHERE
24ce0 5f 4e 4f 5f 41 55 54 4f 49 4e 44 45 58 3b 0a 20  _NO_AUTOINDEX;. 
24cf0 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
24d00 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3b 20 69 69  pOrWc->nTerm; ii
24d10 2b 2b 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65  ++){.      Where
24d20 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 20 3d 20  Term *pOrTerm = 
24d30 26 70 4f 72 57 63 2d 3e 61 5b 69 69 5d 3b 0a 20  &pOrWc->a[ii];. 
24d40 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d       if( pOrTerm
24d50 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
24d60 75 72 20 7c 7c 20 28 70 4f 72 54 65 72 6d 2d 3e  ur || (pOrTerm->
24d70 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41  eOperator & WO_A
24d80 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ND)!=0 ){.      
24d90 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 53 75    WhereInfo *pSu
24da0 62 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  bWInfo;         
24db0 20 20 2f 2a 20 49 6e 66 6f 20 66 6f 72 20 73 69    /* Info for si
24dc0 6e 67 6c 65 20 4f 52 2d 74 65 72 6d 20 73 63 61  ngle OR-term sca
24dd0 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70  n */.        Exp
24de0 72 20 2a 70 4f 72 45 78 70 72 20 3d 20 70 4f 72  r *pOrExpr = pOr
24df0 54 65 72 6d 2d 3e 70 45 78 70 72 3b 20 2f 2a 20  Term->pExpr; /* 
24e00 43 75 72 72 65 6e 74 20 4f 52 20 63 6c 61 75 73  Current OR claus
24e10 65 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 20 20  e term */.      
24e20 20 20 69 6e 74 20 6a 31 20 3d 20 30 3b 20 20 20    int j1 = 0;   
24e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e40 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
24e50 6a 75 6d 70 20 6f 70 65 72 61 74 69 6f 6e 20 2a  jump operation *
24e60 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 41  /.        if( pA
24e70 6e 64 45 78 70 72 20 26 26 20 21 45 78 70 72 48  ndExpr && !ExprH
24e80 61 73 50 72 6f 70 65 72 74 79 28 70 4f 72 45 78  asProperty(pOrEx
24e90 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
24ea0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 41   ){.          pA
24eb0 6e 64 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20  ndExpr->pLeft = 
24ec0 70 4f 72 45 78 70 72 3b 0a 20 20 20 20 20 20 20  pOrExpr;.       
24ed0 20 20 20 70 4f 72 45 78 70 72 20 3d 20 70 41 6e     pOrExpr = pAn
24ee0 64 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d  dExpr;.        }
24ef0 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70  .        /* Loop
24f00 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20 65   through table e
24f10 6e 74 72 69 65 73 20 74 68 61 74 20 6d 61 74 63  ntries that matc
24f20 68 20 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20  h term pOrTerm. 
24f30 2a 2f 0a 20 20 20 20 20 20 20 20 57 48 45 52 45  */.        WHERE
24f40 54 52 41 43 45 28 30 78 66 66 66 66 2c 20 28 22  TRACE(0xffff, ("
24f50 53 75 62 70 6c 61 6e 20 66 6f 72 20 4f 52 2d 63  Subplan for OR-c
24f60 6c 61 75 73 65 3a 5c 6e 22 29 29 3b 0a 20 20 20  lause:\n"));.   
24f70 20 20 20 20 20 70 53 75 62 57 49 6e 66 6f 20 3d       pSubWInfo =
24f80 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
24f90 69 6e 28 70 50 61 72 73 65 2c 20 70 4f 72 54 61  in(pParse, pOrTa
24fa0 62 2c 20 70 4f 72 45 78 70 72 2c 20 30 2c 20 30  b, pOrExpr, 0, 0
24fb0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
24fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24fd0 20 20 20 20 20 20 20 20 77 63 74 72 6c 46 6c 61          wctrlFla
24fe0 67 73 2c 20 69 43 6f 76 43 75 72 29 3b 0a 20 20  gs, iCovCur);.  
24ff0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
25000 75 62 57 49 6e 66 6f 20 7c 7c 20 70 50 61 72 73  ubWInfo || pPars
25010 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d  e->nErr || db->m
25020 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
25030 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62 57         if( pSubW
25040 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Info ){.        
25050 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 53 75    WhereLoop *pSu
25060 62 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 20  bLoop;.         
25070 20 69 6e 74 20 61 64 64 72 45 78 70 6c 61 69 6e   int addrExplain
25080 20 3d 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61   = explainOneSca
25090 6e 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n(.             
250a0 20 70 50 61 72 73 65 2c 20 70 4f 72 54 61 62 2c   pParse, pOrTab,
250b0 20 26 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30   &pSubWInfo->a[0
250c0 5d 2c 20 69 4c 65 76 65 6c 2c 20 70 4c 65 76 65  ], iLevel, pLeve
250d0 6c 2d 3e 69 46 72 6f 6d 2c 20 30 0a 20 20 20 20  l->iFrom, 0.    
250e0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
250f0 20 20 20 61 64 64 53 63 61 6e 53 74 61 74 75 73     addScanStatus
25100 28 76 2c 20 70 4f 72 54 61 62 2c 20 26 70 53 75  (v, pOrTab, &pSu
25110 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 61 64  bWInfo->a[0], ad
25120 64 72 45 78 70 6c 61 69 6e 29 3b 0a 0a 20 20 20  drExplain);..   
25130 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69         /* This i
25140 73 20 74 68 65 20 73 75 62 2d 57 48 45 52 45 20  s the sub-WHERE 
25150 63 6c 61 75 73 65 20 62 6f 64 79 2e 20 20 46 69  clause body.  Fi
25160 72 73 74 20 73 6b 69 70 20 6f 76 65 72 0a 20 20  rst skip over.  
25170 20 20 20 20 20 20 20 20 2a 2a 20 64 75 70 6c 69          ** dupli
25180 63 61 74 65 20 72 6f 77 73 20 66 72 6f 6d 20 70  cate rows from p
25190 72 69 6f 72 20 73 75 62 2d 57 48 45 52 45 20 63  rior sub-WHERE c
251a0 6c 61 75 73 65 73 2c 20 61 6e 64 20 72 65 63 6f  lauses, and reco
251b0 72 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  rd the.         
251c0 20 2a 2a 20 72 6f 77 69 64 20 28 6f 72 20 50 52   ** rowid (or PR
251d0 49 4d 41 52 59 20 4b 45 59 29 20 66 6f 72 20 74  IMARY KEY) for t
251e0 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 73  he current row s
251f0 6f 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 0a  o that the same.
25200 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77            ** row
25210 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64   will be skipped
25220 20 69 6e 20 73 75 62 73 65 71 75 65 6e 74 20 73   in subsequent s
25230 75 62 2d 57 48 45 52 45 20 63 6c 61 75 73 65 73  ub-WHERE clauses
25240 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
25250 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57           if( (pW
25260 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
25270 20 26 20 57 48 45 52 45 5f 44 55 50 4c 49 43 41   & WHERE_DUPLICA
25280 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20  TES_OK)==0 ){.  
25290 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 3b            int r;
252a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
252b0 20 69 53 65 74 20 3d 20 28 28 69 69 3d 3d 70 4f   iSet = ((ii==pO
252c0 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 29 3f 2d 31  rWc->nTerm-1)?-1
252d0 3a 69 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  :ii);.          
252e0 20 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70    if( HasRowid(p
252f0 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Tab) ){.        
25300 20 20 20 20 20 20 72 20 3d 20 73 71 6c 69 74 65        r = sqlite
25310 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
25320 6d 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  mn(pParse, pTab,
25330 20 2d 31 2c 20 69 43 75 72 2c 20 72 65 67 52 6f   -1, iCur, regRo
25340 77 69 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  wid, 0);.       
25350 20 20 20 20 20 20 20 6a 31 20 3d 20 73 71 6c 69         j1 = sqli
25360 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
25370 28 76 2c 20 4f 50 5f 52 6f 77 53 65 74 54 65 73  (v, OP_RowSetTes
25380 74 2c 20 72 65 67 52 6f 77 73 65 74 2c 20 30 2c  t, regRowset, 0,
25390 20 72 2c 69 53 65 74 29 3b 0a 20 20 20 20 20 20   r,iSet);.      
253a0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
253b0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
253c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
253d0 20 20 20 20 20 20 20 20 20 20 49 6e 64 65 78 20            Index 
253e0 2a 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72  *pPk = sqlite3Pr
253f0 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54  imaryKeyIndex(pT
25400 61 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ab);.           
25410 20 20 20 69 6e 74 20 6e 50 6b 20 3d 20 70 50 6b     int nPk = pPk
25420 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20  ->nKeyCol;.     
25430 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 50 6b           int iPk
25440 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
25450 20 2f 2a 20 52 65 61 64 20 74 68 65 20 50 4b 20   /* Read the PK 
25460 69 6e 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66  into an array of
25470 20 74 65 6d 70 20 72 65 67 69 73 74 65 72 73 2e   temp registers.
25480 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
25490 20 20 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74    r = sqlite3Get
254a0 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
254b0 2c 20 6e 50 6b 29 3b 0a 20 20 20 20 20 20 20 20  , nPk);.        
254c0 20 20 20 20 20 20 66 6f 72 28 69 50 6b 3d 30 3b        for(iPk=0;
254d0 20 69 50 6b 3c 6e 50 6b 3b 20 69 50 6b 2b 2b 29   iPk<nPk; iPk++)
254e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
254f0 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 50 6b    int iCol = pPk
25500 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 50 6b 5d 3b  ->aiColumn[iPk];
25510 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25520 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
25530 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  GetColumn(pParse
25540 2c 20 70 54 61 62 2c 20 69 43 6f 6c 2c 20 69 43  , pTab, iCol, iC
25550 75 72 2c 20 72 2b 69 50 6b 2c 20 30 29 3b 0a 20  ur, r+iPk, 0);. 
25560 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a               }..
25570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25580 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 74 65   Check if the te
25590 6d 70 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79  mp table already
255a0 20 63 6f 6e 74 61 69 6e 73 20 74 68 69 73 20 6b   contains this k
255b0 65 79 2e 20 49 66 20 73 6f 2c 0a 20 20 20 20 20  ey. If so,.     
255c0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
255d0 72 6f 77 20 68 61 73 20 61 6c 72 65 61 64 79 20  row has already 
255e0 62 65 65 6e 20 69 6e 63 6c 75 64 65 64 20 69 6e  been included in
255f0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
25600 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  and.            
25610 20 20 2a 2a 20 63 61 6e 20 62 65 20 69 67 6e 6f    ** can be igno
25620 72 65 64 20 28 62 79 20 6a 75 6d 70 69 6e 67 20  red (by jumping 
25630 70 61 73 74 20 74 68 65 20 47 6f 73 75 62 20 62  past the Gosub b
25640 65 6c 6f 77 29 2e 20 4f 74 68 65 72 77 69 73 65  elow). Otherwise
25650 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
25660 2a 2a 20 69 6e 73 65 72 74 20 74 68 65 20 6b 65  ** insert the ke
25670 79 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20  y into the temp 
25680 74 61 62 6c 65 20 61 6e 64 20 70 72 6f 63 65 65  table and procee
25690 64 20 77 69 74 68 20 70 72 6f 63 65 73 73 69 6e  d with processin
256a0 67 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g.              
256b0 2a 2a 20 74 68 65 20 72 6f 77 2e 0a 20 20 20 20  ** the row..    
256c0 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20            **.   
256d0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 55 73             ** Us
256e0 65 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 73 61  e some of the sa
256f0 6d 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  me optimizations
25700 20 61 73 20 4f 50 5f 52 6f 77 53 65 74 54 65 73   as OP_RowSetTes
25710 74 3a 20 49 66 20 69 53 65 74 0a 20 20 20 20 20  t: If iSet.     
25720 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 7a           ** is z
25730 65 72 6f 2c 20 61 73 73 75 6d 65 20 74 68 61 74  ero, assume that
25740 20 74 68 65 20 6b 65 79 20 63 61 6e 6e 6f 74 20   the key cannot 
25750 61 6c 72 65 61 64 79 20 62 65 20 70 72 65 73 65  already be prese
25760 6e 74 20 69 6e 0a 20 20 20 20 20 20 20 20 20 20  nt in.          
25770 20 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 20      ** the temp 
25780 74 61 62 6c 65 2e 20 41 6e 64 20 69 66 20 69 53  table. And if iS
25790 65 74 20 69 73 20 2d 31 2c 20 61 73 73 75 6d 65  et is -1, assume
257a0 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e   that there is n
257b0 6f 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o .             
257c0 20 2a 2a 20 6e 65 65 64 20 74 6f 20 69 6e 73 65   ** need to inse
257d0 72 74 20 74 68 65 20 6b 65 79 20 69 6e 74 6f 20  rt the key into 
257e0 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65 2c 20  the temp table, 
257f0 61 73 20 69 74 20 77 69 6c 6c 20 6e 65 76 65 72  as it will never
25800 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
25810 2a 2a 20 62 65 20 74 65 73 74 65 64 20 66 6f 72  ** be tested for
25820 2e 20 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 20  .  */ .         
25830 20 20 20 20 20 69 66 28 20 69 53 65 74 20 29 7b       if( iSet ){
25840 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25850 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j1 = sqlite3Vdb
25860 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
25870 5f 46 6f 75 6e 64 2c 20 72 65 67 52 6f 77 73 65  _Found, regRowse
25880 74 2c 20 30 2c 20 72 2c 20 6e 50 6b 29 3b 0a 20  t, 0, r, nPk);. 
25890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56                 V
258a0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
258b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
258c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
258d0 28 20 69 53 65 74 3e 3d 30 20 29 7b 0a 20 20 20  ( iSet>=0 ){.   
258e0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
258f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
25900 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
25910 20 72 2c 20 6e 50 6b 2c 20 72 65 67 52 6f 77 69   r, nPk, regRowi
25920 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
25930 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
25940 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp3(v, OP_IdxI
25950 6e 73 65 72 74 2c 20 72 65 67 52 6f 77 73 65 74  nsert, regRowset
25960 2c 20 72 65 67 52 6f 77 69 64 2c 20 30 29 3b 0a  , regRowid, 0);.
25970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25980 69 66 28 20 69 53 65 74 20 29 20 73 71 6c 69 74  if( iSet ) sqlit
25990 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
259a0 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b  , OPFLAG_USESEEK
259b0 52 45 53 55 4c 54 29 3b 0a 20 20 20 20 20 20 20  RESULT);.       
259c0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
259d0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6c 65 61          /* Relea
259e0 73 65 20 74 68 65 20 61 72 72 61 79 20 6f 66 20  se the array of 
259f0 74 65 6d 70 20 72 65 67 69 73 74 65 72 73 20 2a  temp registers *
25a00 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
25a10 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
25a20 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
25a30 72 2c 20 6e 50 6b 29 3b 0a 20 20 20 20 20 20 20  r, nPk);.       
25a40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
25a50 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   }..          /*
25a60 20 49 6e 76 6f 6b 65 20 74 68 65 20 6d 61 69 6e   Invoke the main
25a70 20 6c 6f 6f 70 20 62 6f 64 79 20 61 73 20 61 20   loop body as a 
25a80 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
25a90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
25aa0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
25ab0 47 6f 73 75 62 2c 20 72 65 67 52 65 74 75 72 6e  Gosub, regReturn
25ac0 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20  , iLoopBody);.. 
25ad0 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
25ae0 20 68 65 72 65 20 28 73 6b 69 70 70 69 6e 67 20   here (skipping 
25af0 74 68 65 20 6d 61 69 6e 20 6c 6f 6f 70 20 62 6f  the main loop bo
25b00 64 79 20 73 75 62 72 6f 75 74 69 6e 65 29 20 69  dy subroutine) i
25b10 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  f the.          
25b20 2a 2a 20 63 75 72 72 65 6e 74 20 73 75 62 2d 57  ** current sub-W
25b30 48 45 52 45 20 72 6f 77 20 69 73 20 61 20 64 75  HERE row is a du
25b40 70 6c 69 63 61 74 65 20 66 72 6f 6d 20 70 72 69  plicate from pri
25b50 6f 72 20 73 75 62 2d 57 48 45 52 45 73 2e 20 2a  or sub-WHEREs. *
25b60 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
25b70 6a 31 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  j1 ) sqlite3Vdbe
25b80 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b  JumpHere(v, j1);
25b90 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ..          /* T
25ba0 68 65 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e  he pSubWInfo->un
25bb0 74 65 73 74 65 64 54 65 72 6d 73 20 66 6c 61 67  testedTerms flag
25bc0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73   means that this
25bd0 20 4f 52 20 74 65 72 6d 0a 20 20 20 20 20 20 20   OR term.       
25be0 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20     ** contained 
25bf0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 41 4e 44 20  one or more AND 
25c00 74 65 72 6d 20 66 72 6f 6d 20 61 20 6e 6f 74 52  term from a notR
25c10 65 61 64 79 20 74 61 62 6c 65 2e 20 20 54 68 65  eady table.  The
25c20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65  .          ** te
25c30 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 6e 6f 74  rms from the not
25c40 52 65 61 64 79 20 74 61 62 6c 65 20 63 6f 75 6c  Ready table coul
25c50 64 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64 20  d not be tested 
25c60 61 6e 64 20 77 69 6c 6c 0a 20 20 20 20 20 20 20  and will.       
25c70 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65     ** need to be
25c80 20 74 65 73 74 65 64 20 6c 61 74 65 72 2e 0a 20   tested later.. 
25c90 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
25ca0 20 20 20 20 20 20 69 66 28 20 70 53 75 62 57 49        if( pSubWI
25cb0 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72  nfo->untestedTer
25cc0 6d 73 20 29 20 75 6e 74 65 73 74 65 64 54 65 72  ms ) untestedTer
25cd0 6d 73 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20  ms = 1;..       
25ce0 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 6f 66 20     /* If all of 
25cf0 74 68 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64  the OR-connected
25d00 20 74 65 72 6d 73 20 61 72 65 20 6f 70 74 69 6d   terms are optim
25d10 69 7a 65 64 20 75 73 69 6e 67 20 74 68 65 20 73  ized using the s
25d20 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ame.          **
25d30 20 69 6e 64 65 78 2c 20 61 6e 64 20 74 68 65 20   index, and the 
25d40 69 6e 64 65 78 20 69 73 20 6f 70 65 6e 65 64 20  index is opened 
25d50 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63  using the same c
25d60 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a 20 20 20  ursor number.   
25d70 20 20 20 20 20 20 20 2a 2a 20 62 79 20 65 61 63         ** by eac
25d80 68 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  h call to sqlite
25d90 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 6d 61  3WhereBegin() ma
25da0 64 65 20 62 79 20 74 68 69 73 20 6c 6f 6f 70 2c  de by this loop,
25db0 20 69 74 20 6d 61 79 0a 20 20 20 20 20 20 20 20   it may.        
25dc0 20 20 2a 2a 20 62 65 20 70 6f 73 73 69 62 6c 65    ** be possible
25dd0 20 74 6f 20 75 73 65 20 74 68 61 74 20 69 6e 64   to use that ind
25de0 65 78 20 61 73 20 61 20 63 6f 76 65 72 69 6e 67  ex as a covering
25df0 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20   index..        
25e00 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a    **.          *
25e10 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f  * If the call to
25e20 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
25e30 69 6e 28 29 20 61 62 6f 76 65 20 72 65 73 75 6c  in() above resul
25e40 74 65 64 20 69 6e 20 61 20 73 63 61 6e 20 74 68  ted in a scan th
25e50 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  at.          ** 
25e60 75 73 65 73 20 61 6e 20 69 6e 64 65 78 2c 20 61  uses an index, a
25e70 6e 64 20 74 68 69 73 20 69 73 20 65 69 74 68 65  nd this is eithe
25e80 72 20 74 68 65 20 66 69 72 73 74 20 4f 52 2d 63  r the first OR-c
25e90 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 0a 20 20  onnected term.  
25ea0 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
25eb0 73 73 65 64 20 6f 72 20 74 68 65 20 69 6e 64 65  ssed or the inde
25ec0 78 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  x is the same as
25ed0 20 74 68 61 74 20 75 73 65 64 20 62 79 20 61 6c   that used by al
25ee0 6c 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20  l previous.     
25ef0 20 20 20 20 20 2a 2a 20 74 65 72 6d 73 2c 20 73       ** terms, s
25f00 65 74 20 70 43 6f 76 20 74 6f 20 74 68 65 20 63  et pCov to the c
25f10 61 6e 64 69 64 61 74 65 20 63 6f 76 65 72 69 6e  andidate coverin
25f20 67 20 69 6e 64 65 78 2e 20 4f 74 68 65 72 77 69  g index. Otherwi
25f30 73 65 2c 20 73 65 74 20 0a 20 20 20 20 20 20 20  se, set .       
25f40 20 20 20 2a 2a 20 70 43 6f 76 20 74 6f 20 4e 55     ** pCov to NU
25f50 4c 4c 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  LL to indicate t
25f60 68 61 74 20 6e 6f 20 63 61 6e 64 69 64 61 74 65  hat no candidate
25f70 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20   covering index 
25f80 77 69 6c 6c 20 0a 20 20 20 20 20 20 20 20 20 20  will .          
25f90 2a 2a 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2e  ** be available.
25fa0 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
25fb0 20 20 20 20 20 20 20 20 70 53 75 62 4c 6f 6f 70          pSubLoop
25fc0 20 3d 20 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b   = pSubWInfo->a[
25fd0 30 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20  0].pWLoop;.     
25fe0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 53       assert( (pS
25ff0 75 62 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  ubLoop->wsFlags 
26000 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  & WHERE_AUTO_IND
26010 45 58 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  EX)==0 );.      
26020 20 20 20 20 69 66 28 20 28 70 53 75 62 4c 6f 6f      if( (pSubLoo
26030 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
26040 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20  RE_INDEXED)!=0. 
26050 20 20 20 20 20 20 20 20 20 20 26 26 20 28 69 69            && (ii
26060 3d 3d 30 20 7c 7c 20 70 53 75 62 4c 6f 6f 70 2d  ==0 || pSubLoop-
26070 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3d  >u.btree.pIndex=
26080 3d 70 43 6f 76 29 0a 20 20 20 20 20 20 20 20 20  =pCov).         
26090 20 20 26 26 20 28 48 61 73 52 6f 77 69 64 28 70    && (HasRowid(p
260a0 54 61 62 29 20 7c 7c 20 21 49 73 50 72 69 6d 61  Tab) || !IsPrima
260b0 72 79 4b 65 79 49 6e 64 65 78 28 70 53 75 62 4c  ryKeyIndex(pSubL
260c0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
260d0 64 65 78 29 29 0a 20 20 20 20 20 20 20 20 20 20  dex)).          
260e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
260f0 73 73 65 72 74 28 20 70 53 75 62 57 49 6e 66 6f  ssert( pSubWInfo
26100 2d 3e 61 5b 30 5d 2e 69 49 64 78 43 75 72 3d 3d  ->a[0].iIdxCur==
26110 69 43 6f 76 43 75 72 20 29 3b 0a 20 20 20 20 20  iCovCur );.     
26120 20 20 20 20 20 20 20 70 43 6f 76 20 3d 20 70 53         pCov = pS
26130 75 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e  ubLoop->u.btree.
26140 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 20 20  pIndex;.        
26150 20 20 20 20 77 63 74 72 6c 46 6c 61 67 73 20 7c      wctrlFlags |
26160 3d 20 57 48 45 52 45 5f 52 45 4f 50 45 4e 5f 49  = WHERE_REOPEN_I
26170 44 58 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  DX;.          }e
26180 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
26190 20 70 43 6f 76 20 3d 20 30 3b 0a 20 20 20 20 20   pCov = 0;.     
261a0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
261b0 20 20 2f 2a 20 46 69 6e 69 73 68 20 74 68 65 20    /* Finish the 
261c0 6c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 61 62  loop through tab
261d0 6c 65 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  le entries that 
261e0 6d 61 74 63 68 20 74 65 72 6d 20 70 4f 72 54 65  match term pOrTe
261f0 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  rm. */.         
26200 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
26210 28 70 53 75 62 57 49 6e 66 6f 29 3b 0a 20 20 20  (pSubWInfo);.   
26220 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
26230 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d     }.    pLevel-
26240 3e 75 2e 70 43 6f 76 69 64 78 20 3d 20 70 43 6f  >u.pCovidx = pCo
26250 76 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 76 20  v;.    if( pCov 
26260 29 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  ) pLevel->iIdxCu
26270 72 20 3d 20 69 43 6f 76 43 75 72 3b 0a 20 20 20  r = iCovCur;.   
26280 20 69 66 28 20 70 41 6e 64 45 78 70 72 20 29 7b   if( pAndExpr ){
26290 0a 20 20 20 20 20 20 70 41 6e 64 45 78 70 72 2d  .      pAndExpr-
262a0 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20 20  >pLeft = 0;.    
262b0 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
262c0 65 74 65 28 64 62 2c 20 70 41 6e 64 45 78 70 72  ete(db, pAndExpr
262d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
262e0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31  ite3VdbeChangeP1
262f0 28 76 2c 20 69 52 65 74 49 6e 69 74 2c 20 73 71  (v, iRetInit, sq
26300 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
26310 41 64 64 72 28 76 29 29 3b 0a 20 20 20 20 73 71  Addr(v));.    sq
26320 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
26330 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70  v, OP_Goto, 0, p
26340 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b  Level->addrBrk);
26350 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
26360 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
26370 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20  iLoopBody);..   
26380 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65   if( pWInfo->nLe
26390 76 65 6c 3e 31 20 29 20 73 71 6c 69 74 65 33 53  vel>1 ) sqlite3S
263a0 74 61 63 6b 46 72 65 65 28 64 62 2c 20 70 4f 72  tackFree(db, pOr
263b0 54 61 62 29 3b 0a 20 20 20 20 69 66 28 20 21 75  Tab);.    if( !u
263c0 6e 74 65 73 74 65 64 54 65 72 6d 73 20 29 20 64  ntestedTerms ) d
263d0 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
263e0 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20 7d 65 6c  l, pTerm);.  }el
263f0 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  se.#endif /* SQL
26400 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49  ITE_OMIT_OR_OPTI
26410 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 20 20 7b  MIZATION */..  {
26420 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 36 3a 20  .    /* Case 6: 
26430 20 54 68 65 72 65 20 69 73 20 6e 6f 20 75 73 61   There is no usa
26440 62 6c 65 20 69 6e 64 65 78 2e 20 20 57 65 20 6d  ble index.  We m
26450 75 73 74 20 64 6f 20 61 20 63 6f 6d 70 6c 65 74  ust do a complet
26460 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  e.    **        
26470 20 20 73 63 61 6e 20 6f 66 20 74 68 65 20 65 6e    scan of the en
26480 74 69 72 65 20 74 61 62 6c 65 2e 0a 20 20 20 20  tire table..    
26490 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  */.    static co
264a0 6e 73 74 20 75 38 20 61 53 74 65 70 5b 5d 20 3d  nst u8 aStep[] =
264b0 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 4f 50 5f 50   { OP_Next, OP_P
264c0 72 65 76 20 7d 3b 0a 20 20 20 20 73 74 61 74 69  rev };.    stati
264d0 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74 61 72  c const u8 aStar
264e0 74 5b 5d 20 3d 20 7b 20 4f 50 5f 52 65 77 69 6e  t[] = { OP_Rewin
264f0 64 2c 20 4f 50 5f 4c 61 73 74 20 7d 3b 0a 20 20  d, OP_Last };.  
26500 20 20 61 73 73 65 72 74 28 20 62 52 65 76 3d 3d    assert( bRev==
26510 30 20 7c 7c 20 62 52 65 76 3d 3d 31 20 29 3b 0a  0 || bRev==1 );.
26520 20 20 20 20 69 66 28 20 70 54 61 62 49 74 65 6d      if( pTabItem
26530 2d 3e 69 73 52 65 63 75 72 73 69 76 65 20 29 7b  ->isRecursive ){
26540 0a 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73  .      /* Tables
26550 20 6d 61 72 6b 65 64 20 69 73 52 65 63 75 72 73   marked isRecurs
26560 69 76 65 20 68 61 76 65 20 6f 6e 6c 79 20 61 20  ive have only a 
26570 73 69 6e 67 6c 65 20 72 6f 77 20 74 68 61 74 20  single row that 
26580 69 73 20 73 74 6f 72 65 64 20 69 6e 0a 20 20 20  is stored in.   
26590 20 20 20 2a 2a 20 61 20 70 73 65 75 64 6f 2d 63     ** a pseudo-c
265a0 75 72 73 6f 72 2e 20 20 4e 6f 20 6e 65 65 64 20  ursor.  No need 
265b0 74 6f 20 52 65 77 69 6e 64 20 6f 72 20 4e 65 78  to Rewind or Nex
265c0 74 20 73 75 63 68 20 63 75 72 73 6f 72 73 2e 20  t such cursors. 
265d0 2a 2f 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  */.      pLevel-
265e0 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20  >op = OP_Noop;. 
265f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26600 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 61 53 74  pLevel->op = aSt
26610 65 70 5b 62 52 65 76 5d 3b 0a 20 20 20 20 20 20  ep[bRev];.      
26620 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75  pLevel->p1 = iCu
26630 72 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  r;.      pLevel-
26640 3e 70 32 20 3d 20 31 20 2b 20 73 71 6c 69 74 65  >p2 = 1 + sqlite
26650 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 61  3VdbeAddOp2(v, a
26660 53 74 61 72 74 5b 62 52 65 76 5d 2c 20 69 43 75  Start[bRev], iCu
26670 72 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20  r, addrBrk);.   
26680 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
26690 66 28 76 2c 20 62 52 65 76 3d 3d 30 29 3b 0a 20  f(v, bRev==0);. 
266a0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
266b0 65 49 66 28 76 2c 20 62 52 65 76 21 3d 30 29 3b  eIf(v, bRev!=0);
266c0 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  .      pLevel->p
266d0 35 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53  5 = SQLITE_STMTS
266e0 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53  TATUS_FULLSCAN_S
266f0 54 45 50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  TEP;.    }.  }..
26700 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
26710 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54  ABLE_STMT_SCANST
26720 41 54 55 53 0a 20 20 70 4c 65 76 65 6c 2d 3e 61  ATUS.  pLevel->a
26730 64 64 72 56 69 73 69 74 20 3d 20 73 71 6c 69 74  ddrVisit = sqlit
26740 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
26750 72 28 76 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  r(v);.#endif..  
26760 2f 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20 74  /* Insert code t
26770 6f 20 74 65 73 74 20 65 76 65 72 79 20 73 75 62  o test every sub
26780 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
26790 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c  can be completel
267a0 79 0a 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20  y.  ** computed 
267b0 75 73 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  using the curren
267c0 74 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 2e  t set of tables.
267d0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65 72  .  */.  for(pTer
267e0 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d  m=pWC->a, j=pWC-
267f0 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d  >nTerm; j>0; j--
26800 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
26810 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 69 6e  Expr *pE;.    in
26820 74 20 73 6b 69 70 4c 69 6b 65 41 64 64 72 20 3d  t skipLikeAddr =
26830 20 30 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   0;.    testcase
26840 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
26850 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
26860 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
26870 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
26880 26 20 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a  & TERM_CODED );.
26890 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77      if( pTerm->w
268a0 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56  tFlags & (TERM_V
268b0 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45  IRTUAL|TERM_CODE
268c0 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  D) ) continue;. 
268d0 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70     if( (pTerm->p
268e0 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 65 76 65  rereqAll & pLeve
268f0 6c 2d 3e 6e 6f 74 52 65 61 64 79 29 21 3d 30 20  l->notReady)!=0 
26900 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
26910 65 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73  e( pWInfo->untes
26920 74 65 64 54 65 72 6d 73 3d 3d 30 0a 20 20 20 20  tedTerms==0.    
26930 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70             && (p
26940 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
26950 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42  s & WHERE_ONETAB
26960 4c 45 5f 4f 4e 4c 59 29 21 3d 30 20 29 3b 0a 20  LE_ONLY)!=0 );. 
26970 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 75 6e 74       pWInfo->unt
26980 65 73 74 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a  estedTerms = 1;.
26990 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
269a0 20 20 20 20 7d 0a 20 20 20 20 70 45 20 3d 20 70      }.    pE = p
269b0 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
269c0 20 61 73 73 65 72 74 28 20 70 45 21 3d 30 20 29   assert( pE!=0 )
269d0 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  ;.    if( pLevel
269e0 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 26 26 20 21  ->iLeftJoin && !
269f0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
26a00 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pE, EP_FromJoin)
26a10 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   ){.      contin
26a20 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ue;.    }.    if
26a30 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
26a40 20 26 20 54 45 52 4d 5f 4c 49 4b 45 43 4f 4e 44   & TERM_LIKECOND
26a50 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
26a60 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65 52  ( pLevel->iLikeR
26a70 65 70 43 6e 74 72 3e 30 20 29 3b 0a 20 20 20 20  epCntr>0 );.    
26a80 20 20 73 6b 69 70 4c 69 6b 65 41 64 64 72 20 3d    skipLikeAddr =
26a90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
26aa0 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p1(v, OP_IfNot, 
26ab0 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65 70  pLevel->iLikeRep
26ac0 43 6e 74 72 29 3b 0a 20 20 20 20 20 20 56 64 62  Cntr);.      Vdb
26ad0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
26ae0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
26af0 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
26b00 65 2c 20 70 45 2c 20 61 64 64 72 43 6f 6e 74 2c  e, pE, addrCont,
26b10 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
26b20 4c 4c 29 3b 0a 20 20 20 20 69 66 28 20 73 6b 69  LL);.    if( ski
26b30 70 4c 69 6b 65 41 64 64 72 20 29 20 73 71 6c 69  pLikeAddr ) sqli
26b40 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
26b50 76 2c 20 73 6b 69 70 4c 69 6b 65 41 64 64 72 29  v, skipLikeAddr)
26b60 3b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46  ;.    pTerm->wtF
26b70 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44  lags |= TERM_COD
26b80 45 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e  ED;.  }..  /* In
26b90 73 65 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73  sert code to tes
26ba0 74 20 66 6f 72 20 69 6d 70 6c 69 65 64 20 63 6f  t for implied co
26bb0 6e 73 74 72 61 69 6e 74 73 20 62 61 73 65 64 20  nstraints based 
26bc0 6f 6e 20 74 72 61 6e 73 69 74 69 76 69 74 79 0a  on transitivity.
26bd0 20 20 2a 2a 20 6f 66 20 74 68 65 20 22 3d 3d 22    ** of the "=="
26be0 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a   operator..  **.
26bf0 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 49 66    ** Example: If
26c00 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
26c10 65 20 63 6f 6e 74 61 69 6e 73 20 22 74 31 2e 61  e contains "t1.a
26c20 3d 74 32 2e 62 22 20 61 6e 64 20 22 74 32 2e 62  =t2.b" and "t2.b
26c30 3d 31 32 33 22 0a 20 20 2a 2a 20 61 6e 64 20 77  =123".  ** and w
26c40 65 20 61 72 65 20 63 6f 64 69 6e 67 20 74 68 65  e are coding the
26c50 20 74 31 20 6c 6f 6f 70 20 61 6e 64 20 74 68 65   t1 loop and the
26c60 20 74 32 20 6c 6f 6f 70 20 68 61 73 20 6e 6f 74   t2 loop has not
26c70 20 79 65 74 20 63 6f 64 65 64 2c 0a 20 20 2a 2a   yet coded,.  **
26c80 20 74 68 65 6e 20 77 65 20 63 61 6e 6e 6f 74 20   then we cannot 
26c90 75 73 65 20 74 68 65 20 22 74 31 2e 61 3d 74 32  use the "t1.a=t2
26ca0 2e 62 22 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20  .b" constraint, 
26cb0 62 75 74 20 77 65 20 63 61 6e 20 63 6f 64 65 0a  but we can code.
26cc0 20 20 2a 2a 20 74 68 65 20 69 6d 70 6c 69 65 64    ** the implied
26cd0 20 22 74 31 2e 61 3d 31 32 33 22 20 63 6f 6e 73   "t1.a=123" cons
26ce0 74 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66  traint..  */.  f
26cf0 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c  or(pTerm=pWC->a,
26d00 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a   j=pWC->nTerm; j
26d10 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b  >0; j--, pTerm++
26d20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 2c  ){.    Expr *pE,
26d30 20 2a 70 45 41 6c 74 3b 0a 20 20 20 20 57 68 65   *pEAlt;.    Whe
26d40 72 65 54 65 72 6d 20 2a 70 41 6c 74 3b 0a 20 20  reTerm *pAlt;.  
26d50 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
26d60 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52  lags & (TERM_VIR
26d70 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29  TUAL|TERM_CODED)
26d80 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
26d90 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
26da0 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c  erator & (WO_EQ|
26db0 57 4f 5f 49 53 29 29 3d 3d 30 20 29 20 63 6f 6e  WO_IS))==0 ) con
26dc0 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28  tinue;.    if( (
26dd0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
26de0 20 26 20 57 4f 5f 45 51 55 49 56 29 3d 3d 30 20   & WO_EQUIV)==0 
26df0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
26e00 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  if( pTerm->leftC
26e10 75 72 73 6f 72 21 3d 69 43 75 72 20 29 20 63 6f  ursor!=iCur ) co
26e20 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
26e30 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
26e40 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  n ) continue;.  
26e50 20 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45    pE = pTerm->pE
26e60 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  xpr;.    assert(
26e70 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
26e80 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  y(pE, EP_FromJoi
26e90 6e 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  n) );.    assert
26ea0 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
26eb0 52 69 67 68 74 20 26 20 70 4c 65 76 65 6c 2d 3e  Right & pLevel->
26ec0 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 3b 0a  notReady)!=0 );.
26ed0 20 20 20 20 70 41 6c 74 20 3d 20 66 69 6e 64 54      pAlt = findT
26ee0 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 70  erm(pWC, iCur, p
26ef0 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
26f00 6d 6e 2c 20 6e 6f 74 52 65 61 64 79 2c 0a 20 20  mn, notReady,.  
26f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f20 20 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f    WO_EQ|WO_IN|WO
26f30 5f 49 53 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  _IS, 0);.    if(
26f40 20 70 41 6c 74 3d 3d 30 20 29 20 63 6f 6e 74 69   pAlt==0 ) conti
26f50 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 41 6c  nue;.    if( pAl
26f60 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45  t->wtFlags & (TE
26f70 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74  RM_CODED) ) cont
26f80 69 6e 75 65 3b 0a 20 20 20 20 74 65 73 74 63 61  inue;.    testca
26f90 73 65 28 20 70 41 6c 74 2d 3e 65 4f 70 65 72 61  se( pAlt->eOpera
26fa0 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20  tor & WO_EQ );. 
26fb0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 41 6c     testcase( pAl
26fc0 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  t->eOperator & W
26fd0 4f 5f 49 53 20 29 3b 0a 20 20 20 20 74 65 73 74  O_IS );.    test
26fe0 63 61 73 65 28 20 70 41 6c 74 2d 3e 65 4f 70 65  case( pAlt->eOpe
26ff0 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b  rator & WO_IN );
27000 0a 20 20 20 20 56 64 62 65 4d 6f 64 75 6c 65 43  .    VdbeModuleC
27010 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67 69  omment((v, "begi
27020 6e 20 74 72 61 6e 73 69 74 69 76 65 20 63 6f 6e  n transitive con
27030 73 74 72 61 69 6e 74 22 29 29 3b 0a 20 20 20 20  straint"));.    
27040 70 45 41 6c 74 20 3d 20 73 71 6c 69 74 65 33 53  pEAlt = sqlite3S
27050 74 61 63 6b 41 6c 6c 6f 63 52 61 77 28 64 62 2c  tackAllocRaw(db,
27060 20 73 69 7a 65 6f 66 28 2a 70 45 41 6c 74 29 29   sizeof(*pEAlt))
27070 3b 0a 20 20 20 20 69 66 28 20 70 45 41 6c 74 20  ;.    if( pEAlt 
27080 29 7b 0a 20 20 20 20 20 20 2a 70 45 41 6c 74 20  ){.      *pEAlt 
27090 3d 20 2a 70 41 6c 74 2d 3e 70 45 78 70 72 3b 0a  = *pAlt->pExpr;.
270a0 20 20 20 20 20 20 70 45 41 6c 74 2d 3e 70 4c 65        pEAlt->pLe
270b0 66 74 20 3d 20 70 45 2d 3e 70 4c 65 66 74 3b 0a  ft = pE->pLeft;.
270c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
270d0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
270e0 20 70 45 41 6c 74 2c 20 61 64 64 72 43 6f 6e 74   pEAlt, addrCont
270f0 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
27100 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ULL);.      sqli
27110 74 65 33 53 74 61 63 6b 46 72 65 65 28 64 62 2c  te3StackFree(db,
27120 20 70 45 41 6c 74 29 3b 0a 20 20 20 20 7d 0a 20   pEAlt);.    }. 
27130 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 20 4c   }..  /* For a L
27140 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20  EFT OUTER JOIN, 
27150 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  generate code th
27160 61 74 20 77 69 6c 6c 20 72 65 63 6f 72 64 20 74  at will record t
27170 68 65 20 66 61 63 74 20 74 68 61 74 0a 20 20 2a  he fact that.  *
27180 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 72  * at least one r
27190 6f 77 20 6f 66 20 74 68 65 20 72 69 67 68 74 20  ow of the right 
271a0 74 61 62 6c 65 20 68 61 73 20 6d 61 74 63 68 65  table has matche
271b0 64 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65  d the left table
271c0 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  .  .  */.  if( p
271d0 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
271e0 20 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e   ){.    pLevel->
271f0 61 64 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69  addrFirst = sqli
27200 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
27210 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  dr(v);.    sqlit
27220 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
27230 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70  OP_Integer, 1, p
27240 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
27250 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
27260 6e 74 28 28 76 2c 20 22 72 65 63 6f 72 64 20 4c  nt((v, "record L
27270 45 46 54 20 4a 4f 49 4e 20 68 69 74 22 29 29 3b  EFT JOIN hit"));
27280 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
27290 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
272a0 65 29 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72  e);.    for(pTer
272b0 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 30 3b 20 6a  m=pWC->a, j=0; j
272c0 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b  <pWC->nTerm; j++
272d0 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
272e0 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
272f0 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
27300 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20  M_VIRTUAL );.   
27310 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
27320 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
27330 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20 20  RM_CODED );.    
27340 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
27350 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52  lags & (TERM_VIR
27360 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29  TUAL|TERM_CODED)
27370 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
27380 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70     if( (pTerm->p
27390 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 65 76 65  rereqAll & pLeve
273a0 6c 2d 3e 6e 6f 74 52 65 61 64 79 29 21 3d 30 20  l->notReady)!=0 
273b0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
273c0 74 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73  t( pWInfo->untes
273d0 74 65 64 54 65 72 6d 73 20 29 3b 0a 20 20 20 20  tedTerms );.    
273e0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
273f0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
27400 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  rt( pTerm->pExpr
27410 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
27420 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
27430 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70  rse, pTerm->pExp
27440 72 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c  r, addrCont, SQL
27450 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
27460 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74  .      pTerm->wt
27470 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
27480 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  DED;.    }.  }..
27490 20 20 72 65 74 75 72 6e 20 70 4c 65 76 65 6c 2d    return pLevel-
274a0 3e 6e 6f 74 52 65 61 64 79 3b 0a 7d 0a 0a 23 69  >notReady;.}..#i
274b0 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
274c0 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72  ENABLED./*.** Pr
274d0 69 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  int the content 
274e0 6f 66 20 61 20 57 68 65 72 65 54 65 72 6d 20 6f  of a WhereTerm o
274f0 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20  bject.*/.static 
27500 76 6f 69 64 20 77 68 65 72 65 54 65 72 6d 50 72  void whereTermPr
27510 69 6e 74 28 57 68 65 72 65 54 65 72 6d 20 2a 70  int(WhereTerm *p
27520 54 65 72 6d 2c 20 69 6e 74 20 69 54 65 72 6d 29  Term, int iTerm)
27530 7b 0a 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30  {.  if( pTerm==0
27540 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
27550 65 62 75 67 50 72 69 6e 74 66 28 22 54 45 52 4d  ebugPrintf("TERM
27560 2d 25 2d 33 64 20 4e 55 4c 4c 5c 6e 22 2c 20 69  -%-3d NULL\n", i
27570 54 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Term);.  }else{.
27580 20 20 20 20 63 68 61 72 20 7a 54 79 70 65 5b 34      char zType[4
27590 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 54  ];.    memcpy(zT
275a0 79 70 65 2c 20 22 2e 2e 2e 22 2c 20 34 29 3b 0a  ype, "...", 4);.
275b0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77      if( pTerm->w
275c0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
275d0 52 54 55 41 4c 20 29 20 7a 54 79 70 65 5b 30 5d  RTUAL ) zType[0]
275e0 20 3d 20 27 56 27 3b 0a 20 20 20 20 69 66 28 20   = 'V';.    if( 
275f0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
27600 20 26 20 57 4f 5f 45 51 55 49 56 20 20 29 20 7a   & WO_EQUIV  ) z
27610 54 79 70 65 5b 31 5d 20 3d 20 27 45 27 3b 0a 20  Type[1] = 'E';. 
27620 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
27630 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45  operty(pTerm->pE
27640 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
27650 29 20 29 20 7a 54 79 70 65 5b 32 5d 20 3d 20 27  ) ) zType[2] = '
27660 4c 27 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  L';.    sqlite3D
27670 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20  ebugPrintf(.    
27680 20 20 20 22 54 45 52 4d 2d 25 2d 33 64 20 25 70     "TERM-%-3d %p
27690 20 25 73 20 63 75 72 73 6f 72 3d 25 2d 33 64 20   %s cursor=%-3d 
276a0 70 72 6f 62 3d 25 2d 33 64 20 6f 70 3d 30 78 25  prob=%-3d op=0x%
276b0 30 33 78 20 77 74 46 6c 61 67 73 3d 30 78 25 30  03x wtFlags=0x%0
276c0 34 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 54  4x\n",.       iT
276d0 65 72 6d 2c 20 70 54 65 72 6d 2c 20 7a 54 79 70  erm, pTerm, zTyp
276e0 65 2c 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  e, pTerm->leftCu
276f0 72 73 6f 72 2c 20 70 54 65 72 6d 2d 3e 74 72 75  rsor, pTerm->tru
27700 74 68 50 72 6f 62 2c 0a 20 20 20 20 20 20 20 70  thProb,.       p
27710 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 2c  Term->eOperator,
27720 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 29   pTerm->wtFlags)
27730 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  ;.    sqlite3Tre
27740 65 56 69 65 77 45 78 70 72 28 30 2c 20 70 54 65  eViewExpr(0, pTe
27750 72 6d 2d 3e 70 45 78 70 72 2c 20 30 29 3b 0a 20  rm->pExpr, 0);. 
27760 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66   }.}.#endif..#if
27770 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
27780 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69  NABLED./*.** Pri
27790 6e 74 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f  nt a WhereLoop o
277a0 62 6a 65 63 74 20 66 6f 72 20 64 65 62 75 67 67  bject for debugg
277b0 69 6e 67 20 70 75 72 70 6f 73 65 73 0a 2a 2f 0a  ing purposes.*/.
277c0 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
277d0 65 4c 6f 6f 70 50 72 69 6e 74 28 57 68 65 72 65  eLoopPrint(Where
277e0 4c 6f 6f 70 20 2a 70 2c 20 57 68 65 72 65 43 6c  Loop *p, WhereCl
277f0 61 75 73 65 20 2a 70 57 43 29 7b 0a 20 20 57 68  ause *pWC){.  Wh
27800 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20  ereInfo *pWInfo 
27810 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20  = pWC->pWInfo;. 
27820 20 69 6e 74 20 6e 62 20 3d 20 31 2b 28 70 57 49   int nb = 1+(pWI
27830 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e  nfo->pTabList->n
27840 53 72 63 2b 37 29 2f 38 3b 0a 20 20 73 74 72 75  Src+7)/8;.  stru
27850 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
27860 2a 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d  *pItem = pWInfo-
27870 3e 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70  >pTabList->a + p
27880 2d 3e 69 54 61 62 3b 0a 20 20 54 61 62 6c 65 20  ->iTab;.  Table 
27890 2a 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70  *pTab = pItem->p
278a0 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  Tab;.  sqlite3De
278b0 62 75 67 50 72 69 6e 74 66 28 22 25 63 25 32 64  bugPrintf("%c%2d
278c0 2e 25 30 2a 6c 6c 78 2e 25 30 2a 6c 6c 78 22 2c  .%0*llx.%0*llx",
278d0 20 70 2d 3e 63 49 64 2c 0a 20 20 20 20 20 20 20   p->cId,.       
278e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
278f0 3e 69 54 61 62 2c 20 6e 62 2c 20 70 2d 3e 6d 61  >iTab, nb, p->ma
27900 73 6b 53 65 6c 66 2c 20 6e 62 2c 20 70 2d 3e 70  skSelf, nb, p->p
27910 72 65 72 65 71 29 3b 0a 20 20 73 71 6c 69 74 65  rereq);.  sqlite
27920 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 25  3DebugPrintf(" %
27930 31 32 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  12s",.          
27940 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
27950 2d 3e 7a 41 6c 69 61 73 20 3f 20 70 49 74 65 6d  ->zAlias ? pItem
27960 2d 3e 7a 41 6c 69 61 73 20 3a 20 70 54 61 62 2d  ->zAlias : pTab-
27970 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 28  >zName);.  if( (
27980 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
27990 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
279a0 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  ==0 ){.    const
279b0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
279c0 20 20 69 66 28 20 70 2d 3e 75 2e 62 74 72 65 65    if( p->u.btree
279d0 2e 70 49 6e 64 65 78 20 26 26 20 28 7a 4e 61 6d  .pIndex && (zNam
279e0 65 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70  e = p->u.btree.p
279f0 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 21 3d 30  Index->zName)!=0
27a00 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74   ){.      if( st
27a10 72 6e 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71  rncmp(zName, "sq
27a20 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22  lite_autoindex_"
27a30 2c 20 31 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , 17)==0 ){.    
27a40 20 20 20 20 69 6e 74 20 69 20 3d 20 73 71 6c 69      int i = sqli
27a50 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d  te3Strlen30(zNam
27a60 65 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20  e) - 1;.        
27a70 77 68 69 6c 65 28 20 7a 4e 61 6d 65 5b 69 5d 21  while( zName[i]!
27a80 3d 27 5f 27 20 29 20 69 2d 2d 3b 0a 20 20 20 20  ='_' ) i--;.    
27a90 20 20 20 20 7a 4e 61 6d 65 20 2b 3d 20 69 3b 0a      zName += i;.
27aa0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
27ab0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
27ac0 28 22 2e 25 2d 31 36 73 20 25 32 64 22 2c 20 7a  (".%-16s %2d", z
27ad0 4e 61 6d 65 2c 20 70 2d 3e 75 2e 62 74 72 65 65  Name, p->u.btree
27ae0 2e 6e 45 71 29 3b 0a 20 20 20 20 7d 65 6c 73 65  .nEq);.    }else
27af0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
27b00 65 62 75 67 50 72 69 6e 74 66 28 22 25 32 30 73  ebugPrintf("%20s
27b10 22 2c 22 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ","");.    }.  }
27b20 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a  else{.    char *
27b30 7a 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 2e  z;.    if( p->u.
27b40 76 74 61 62 2e 69 64 78 53 74 72 20 29 7b 0a 20  vtab.idxStr ){. 
27b50 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33       z = sqlite3
27b60 5f 6d 70 72 69 6e 74 66 28 22 28 25 64 2c 5c 22  _mprintf("(%d,\"
27b70 25 73 5c 22 2c 25 78 29 22 2c 0a 20 20 20 20 20  %s\",%x)",.     
27b80 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 75 2e             p->u.
27b90 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e  vtab.idxNum, p->
27ba0 75 2e 76 74 61 62 2e 69 64 78 53 74 72 2c 20 70  u.vtab.idxStr, p
27bb0 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73  ->u.vtab.omitMas
27bc0 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  k);.    }else{. 
27bd0 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33       z = sqlite3
27be0 5f 6d 70 72 69 6e 74 66 28 22 28 25 64 2c 25 78  _mprintf("(%d,%x
27bf0 29 22 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64  )", p->u.vtab.id
27c00 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e  xNum, p->u.vtab.
27c10 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d  omitMask);.    }
27c20 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
27c30 67 50 72 69 6e 74 66 28 22 20 25 2d 31 39 73 22  gPrintf(" %-19s"
27c40 2c 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , z);.    sqlite
27c50 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 20  3_free(z);.  }. 
27c60 20 69 66 28 20 70 2d 3e 77 73 46 6c 61 67 73 20   if( p->wsFlags 
27c70 26 20 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e  & WHERE_SKIPSCAN
27c80 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
27c90 65 62 75 67 50 72 69 6e 74 66 28 22 20 66 20 25  ebugPrintf(" f %
27ca0 30 35 78 20 25 64 2d 25 64 22 2c 20 70 2d 3e 77  05x %d-%d", p->w
27cb0 73 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72  sFlags, p->nLTer
27cc0 6d 2c 70 2d 3e 6e 53 6b 69 70 29 3b 0a 20 20 7d  m,p->nSkip);.  }
27cd0 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
27ce0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 66  3DebugPrintf(" f
27cf0 20 25 30 35 78 20 4e 20 25 64 22 2c 20 70 2d 3e   %05x N %d", p->
27d00 77 73 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54 65  wsFlags, p->nLTe
27d10 72 6d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  rm);.  }.  sqlit
27d20 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
27d30 63 6f 73 74 20 25 64 2c 25 64 2c 25 64 5c 6e 22  cost %d,%d,%d\n"
27d40 2c 20 70 2d 3e 72 53 65 74 75 70 2c 20 70 2d 3e  , p->rSetup, p->
27d50 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 29 3b 0a  rRun, p->nOut);.
27d60 20 20 69 66 28 20 70 2d 3e 6e 4c 54 65 72 6d 20    if( p->nLTerm 
27d70 26 26 20 28 73 71 6c 69 74 65 33 57 68 65 72 65  && (sqlite3Where
27d80 54 72 61 63 65 20 26 20 30 78 31 30 30 29 21 3d  Trace & 0x100)!=
27d90 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  0 ){.    int i;.
27da0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
27db0 2d 3e 6e 4c 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a  ->nLTerm; i++){.
27dc0 20 20 20 20 20 20 77 68 65 72 65 54 65 72 6d 50        whereTermP
27dd0 72 69 6e 74 28 70 2d 3e 61 4c 54 65 72 6d 5b 69  rint(p->aLTerm[i
27de0 5d 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ], i);.    }.  }
27df0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
27e00 20 43 6f 6e 76 65 72 74 20 62 75 6c 6b 20 6d 65   Convert bulk me
27e10 6d 6f 72 79 20 69 6e 74 6f 20 61 20 76 61 6c 69  mory into a vali
27e20 64 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74  d WhereLoop that
27e30 20 63 61 6e 20 62 65 20 70 61 73 73 65 64 0a 2a   can be passed.*
27e40 2a 20 74 6f 20 77 68 65 72 65 4c 6f 6f 70 43 6c  * to whereLoopCl
27e50 65 61 72 20 68 61 72 6d 6c 65 73 73 6c 79 2e 0a  ear harmlessly..
27e60 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
27e70 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 57 68 65  hereLoopInit(Whe
27e80 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 70 2d  reLoop *p){.  p-
27e90 3e 61 4c 54 65 72 6d 20 3d 20 70 2d 3e 61 4c 54  >aLTerm = p->aLT
27ea0 65 72 6d 53 70 61 63 65 3b 0a 20 20 70 2d 3e 6e  ermSpace;.  p->n
27eb0 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 2d 3e  LTerm = 0;.  p->
27ec0 6e 4c 53 6c 6f 74 20 3d 20 41 72 72 61 79 53 69  nLSlot = ArraySi
27ed0 7a 65 28 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63  ze(p->aLTermSpac
27ee0 65 29 3b 0a 20 20 70 2d 3e 77 73 46 6c 61 67 73  e);.  p->wsFlags
27ef0 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   = 0;.}../*.** C
27f00 6c 65 61 72 20 74 68 65 20 57 68 65 72 65 4c 6f  lear the WhereLo
27f10 6f 70 2e 75 20 75 6e 69 6f 6e 2e 20 20 4c 65 61  op.u union.  Lea
27f20 76 65 20 57 68 65 72 65 4c 6f 6f 70 2e 70 4c 54  ve WhereLoop.pLT
27f30 65 72 6d 20 69 6e 74 61 63 74 2e 0a 2a 2f 0a 73  erm intact..*/.s
27f40 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
27f50 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 73  LoopClearUnion(s
27f60 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
27f70 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28  eLoop *p){.  if(
27f80 20 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57   p->wsFlags & (W
27f90 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
27fa0 45 7c 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  E|WHERE_AUTO_IND
27fb0 45 58 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28  EX) ){.    if( (
27fc0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
27fd0 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
27fe0 21 3d 30 20 26 26 20 70 2d 3e 75 2e 76 74 61 62  !=0 && p->u.vtab
27ff0 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20  .needFree ){.   
28000 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
28010 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  p->u.vtab.idxStr
28020 29 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76 74  );.      p->u.vt
28030 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b  ab.needFree = 0;
28040 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62  .      p->u.vtab
28050 2e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20  .idxStr = 0;.   
28060 20 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 77   }else if( (p->w
28070 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41  sFlags & WHERE_A
28080 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 26 26  UTO_INDEX)!=0 &&
28090 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
280a0 65 78 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ex!=0 ){.      s
280b0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
280c0 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
280d0 65 78 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20  ex->zColAff);.  
280e0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
280f0 65 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65  e(db, p->u.btree
28100 2e 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  .pIndex);.      
28110 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
28120 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  x = 0;.    }.  }
28130 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f  .}../*.** Deallo
28140 63 61 74 65 20 69 6e 74 65 72 6e 61 6c 20 6d 65  cate internal me
28150 6d 6f 72 79 20 75 73 65 64 20 62 79 20 61 20 57  mory used by a W
28160 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a  hereLoop object.
28170 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
28180 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 73 71  hereLoopClear(sq
28190 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
281a0 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28 20  Loop *p){.  if( 
281b0 70 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c  p->aLTerm!=p->aL
281c0 54 65 72 6d 53 70 61 63 65 20 29 20 73 71 6c 69  TermSpace ) sqli
281d0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
281e0 3e 61 4c 54 65 72 6d 29 3b 0a 20 20 77 68 65 72  >aLTerm);.  wher
281f0 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28  eLoopClearUnion(
28200 64 62 2c 20 70 29 3b 0a 20 20 77 68 65 72 65 4c  db, p);.  whereL
28210 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 7d 0a 0a 2f  oopInit(p);.}../
28220 2a 0a 2a 2a 20 49 6e 63 72 65 61 73 65 20 74 68  *.** Increase th
28230 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
28240 69 6f 6e 20 66 6f 72 20 70 4c 6f 6f 70 2d 3e 61  ion for pLoop->a
28250 4c 54 65 72 6d 5b 5d 20 74 6f 20 62 65 20 61 74  LTerm[] to be at
28260 20 6c 65 61 73 74 20 6e 2e 0a 2a 2f 0a 73 74 61   least n..*/.sta
28270 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
28280 70 52 65 73 69 7a 65 28 73 71 6c 69 74 65 33 20  pResize(sqlite3 
28290 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  *db, WhereLoop *
282a0 70 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 57 68 65  p, int n){.  Whe
282b0 72 65 54 65 72 6d 20 2a 2a 70 61 4e 65 77 3b 0a  reTerm **paNew;.
282c0 20 20 69 66 28 20 70 2d 3e 6e 4c 53 6c 6f 74 3e    if( p->nLSlot>
282d0 3d 6e 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =n ) return SQLI
282e0 54 45 5f 4f 4b 3b 0a 20 20 6e 20 3d 20 28 6e 2b  TE_OK;.  n = (n+
282f0 37 29 26 7e 37 3b 0a 20 20 70 61 4e 65 77 20 3d  7)&~7;.  paNew =
28300 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
28310 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 70  Raw(db, sizeof(p
28320 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 6e 29 3b  ->aLTerm[0])*n);
28330 0a 20 20 69 66 28 20 70 61 4e 65 77 3d 3d 30 20  .  if( paNew==0 
28340 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
28350 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 63 70 79 28  NOMEM;.  memcpy(
28360 70 61 4e 65 77 2c 20 70 2d 3e 61 4c 54 65 72 6d  paNew, p->aLTerm
28370 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65  , sizeof(p->aLTe
28380 72 6d 5b 30 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f 74  rm[0])*p->nLSlot
28390 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54 65  );.  if( p->aLTe
283a0 72 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61  rm!=p->aLTermSpa
283b0 63 65 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  ce ) sqlite3DbFr
283c0 65 65 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d  ee(db, p->aLTerm
283d0 29 3b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d  );.  p->aLTerm =
283e0 20 70 61 4e 65 77 3b 0a 20 20 70 2d 3e 6e 4c 53   paNew;.  p->nLS
283f0 6c 6f 74 20 3d 20 6e 3b 0a 20 20 72 65 74 75 72  lot = n;.  retur
28400 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
28410 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 63  /*.** Transfer c
28420 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ontent from the 
28430 73 65 63 6f 6e 64 20 70 4c 6f 6f 70 20 69 6e 74  second pLoop int
28440 6f 20 74 68 65 20 66 69 72 73 74 2e 0a 2a 2f 0a  o the first..*/.
28450 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
28460 4c 6f 6f 70 58 66 65 72 28 73 71 6c 69 74 65 33  LoopXfer(sqlite3
28470 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20   *db, WhereLoop 
28480 2a 70 54 6f 2c 20 57 68 65 72 65 4c 6f 6f 70 20  *pTo, WhereLoop 
28490 2a 70 46 72 6f 6d 29 7b 0a 20 20 77 68 65 72 65  *pFrom){.  where
284a0 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64  LoopClearUnion(d
284b0 62 2c 20 70 54 6f 29 3b 0a 20 20 69 66 28 20 77  b, pTo);.  if( w
284c0 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64  hereLoopResize(d
284d0 62 2c 20 70 54 6f 2c 20 70 46 72 6f 6d 2d 3e 6e  b, pTo, pFrom->n
284e0 4c 54 65 72 6d 29 20 29 7b 0a 20 20 20 20 6d 65  LTerm) ){.    me
284f0 6d 73 65 74 28 26 70 54 6f 2d 3e 75 2c 20 30 2c  mset(&pTo->u, 0,
28500 20 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 75 29 29   sizeof(pTo->u))
28510 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
28520 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
28530 20 6d 65 6d 63 70 79 28 70 54 6f 2c 20 70 46 72   memcpy(pTo, pFr
28540 6f 6d 2c 20 57 48 45 52 45 5f 4c 4f 4f 50 5f 58  om, WHERE_LOOP_X
28550 46 45 52 5f 53 5a 29 3b 0a 20 20 6d 65 6d 63 70  FER_SZ);.  memcp
28560 79 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 2c 20 70  y(pTo->aLTerm, p
28570 46 72 6f 6d 2d 3e 61 4c 54 65 72 6d 2c 20 70 54  From->aLTerm, pT
28580 6f 2d 3e 6e 4c 54 65 72 6d 2a 73 69 7a 65 6f 66  o->nLTerm*sizeof
28590 28 70 54 6f 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29  (pTo->aLTerm[0])
285a0 29 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  );.  if( pFrom->
285b0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
285c0 56 49 52 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a  VIRTUALTABLE ){.
285d0 20 20 20 20 70 46 72 6f 6d 2d 3e 75 2e 76 74 61      pFrom->u.vta
285e0 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a  b.needFree = 0;.
285f0 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 46 72    }else if( (pFr
28600 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  om->wsFlags & WH
28610 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21  ERE_AUTO_INDEX)!
28620 3d 30 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d  =0 ){.    pFrom-
28630 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
28640 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
28650 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
28660 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 57  /*.** Delete a W
28670 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a  hereLoop object.
28680 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
28690 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 73  hereLoopDelete(s
286a0 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
286b0 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 77 68 65  eLoop *p){.  whe
286c0 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20  reLoopClear(db, 
286d0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  p);.  sqlite3DbF
286e0 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f  ree(db, p);.}../
286f0 2a 0a 2a 2a 20 46 72 65 65 20 61 20 57 68 65 72  *.** Free a Wher
28700 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a  eInfo structure.
28710 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
28720 68 65 72 65 49 6e 66 6f 46 72 65 65 28 73 71 6c  hereInfoFree(sql
28730 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 49  ite3 *db, WhereI
28740 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20  nfo *pWInfo){.  
28750 69 66 28 20 41 4c 57 41 59 53 28 70 57 49 6e 66  if( ALWAYS(pWInf
28760 6f 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  o) ){.    int i;
28770 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
28780 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20  pWInfo->nLevel; 
28790 69 2b 2b 29 7b 0a 20 20 20 20 20 20 57 68 65 72  i++){.      Wher
287a0 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 3d  eLevel *pLevel =
287b0 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a   &pWInfo->a[i];.
287c0 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c        if( pLevel
287d0 2d 3e 70 57 4c 6f 6f 70 20 26 26 20 28 70 4c 65  ->pWLoop && (pLe
287e0 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46  vel->pWLoop->wsF
287f0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 5f  lags & WHERE_IN_
28800 41 42 4c 45 29 20 29 7b 0a 20 20 20 20 20 20 20  ABLE) ){.       
28810 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
28820 62 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  b, pLevel->u.in.
28830 61 49 6e 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  aInLoop);.      
28840 7d 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 65 72  }.    }.    wher
28850 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26 70 57  eClauseClear(&pW
28860 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 20 20  Info->sWC);.    
28870 77 68 69 6c 65 28 20 70 57 49 6e 66 6f 2d 3e 70  while( pWInfo->p
28880 4c 6f 6f 70 73 20 29 7b 0a 20 20 20 20 20 20 57  Loops ){.      W
28890 68 65 72 65 4c 6f 6f 70 20 2a 70 20 3d 20 70 57  hereLoop *p = pW
288a0 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 0a 20 20  Info->pLoops;.  
288b0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f      pWInfo->pLoo
288c0 70 73 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f  ps = p->pNextLoo
288d0 70 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  p;.      whereLo
288e0 6f 70 44 65 6c 65 74 65 28 64 62 2c 20 70 29 3b  opDelete(db, p);
288f0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
28900 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 49  e3DbFree(db, pWI
28910 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  nfo);.  }.}../*.
28920 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
28930 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  f all of the fol
28940 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
28950 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 58 20  .**.**   (1)  X 
28960 68 61 73 20 74 68 65 20 73 61 6d 65 20 6f 72 20  has the same or 
28970 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61 74 20  lower cost that 
28980 59 0a 2a 2a 20 20 20 28 32 29 20 20 58 20 69 73  Y.**   (2)  X is
28990 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74   a proper subset
289a0 20 6f 66 20 59 0a 2a 2a 20 20 20 28 33 29 20 20   of Y.**   (3)  
289b0 58 20 73 6b 69 70 73 20 61 74 20 6c 65 61 73 74  X skips at least
289c0 20 61 73 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73   as many columns
289d0 20 61 73 20 59 0a 2a 2a 0a 2a 2a 20 42 79 20 22   as Y.**.** By "
289e0 70 72 6f 70 65 72 20 73 75 62 73 65 74 22 20 77  proper subset" w
289f0 65 20 6d 65 61 6e 20 74 68 61 74 20 58 20 75 73  e mean that X us
28a00 65 73 20 66 65 77 65 72 20 57 48 45 52 45 20 63  es fewer WHERE c
28a10 6c 61 75 73 65 20 74 65 72 6d 73 0a 2a 2a 20 74  lause terms.** t
28a20 68 61 6e 20 59 20 61 6e 64 20 74 68 61 74 20 65  han Y and that e
28a30 76 65 72 79 20 57 48 45 52 45 20 63 6c 61 75 73  very WHERE claus
28a40 65 20 74 65 72 6d 20 75 73 65 64 20 62 79 20 58  e term used by X
28a50 20 69 73 20 61 6c 73 6f 20 75 73 65 64 0a 2a 2a   is also used.**
28a60 20 62 79 20 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   by Y..**.** If 
28a70 58 20 69 73 20 61 20 70 72 6f 70 65 72 20 73 75  X is a proper su
28a80 62 73 65 74 20 6f 66 20 59 20 74 68 65 6e 20 59  bset of Y then Y
28a90 20 69 73 20 61 20 62 65 74 74 65 72 20 63 68 6f   is a better cho
28aa0 69 63 65 20 61 6e 64 20 6f 75 67 68 74 0a 2a 2a  ice and ought.**
28ab0 20 74 6f 20 68 61 76 65 20 61 20 6c 6f 77 65 72   to have a lower
28ac0 20 63 6f 73 74 2e 20 20 54 68 69 73 20 72 6f 75   cost.  This rou
28ad0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 54 52 55  tine returns TRU
28ae0 45 20 77 68 65 6e 20 74 68 61 74 20 63 6f 73 74  E when that cost
28af0 20 0a 2a 2a 20 72 65 6c 61 74 69 6f 6e 73 68 69   .** relationshi
28b00 70 20 69 73 20 69 6e 76 65 72 74 65 64 20 61 6e  p is inverted an
28b10 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 64  d needs to be ad
28b20 6a 75 73 74 65 64 2e 20 20 54 68 65 20 74 68 69  justed.  The thi
28b30 72 64 20 72 75 6c 65 0a 2a 2a 20 77 61 73 20 61  rd rule.** was a
28b40 64 64 65 64 20 62 65 63 61 75 73 65 20 69 66 20  dded because if 
28b50 58 20 75 73 65 73 20 73 6b 69 70 2d 73 63 61 6e  X uses skip-scan
28b60 20 6c 65 73 73 20 74 68 61 6e 20 59 20 69 74 20   less than Y it 
28b70 73 74 69 6c 6c 20 6d 69 67 68 74 0a 2a 2a 20 64  still might.** d
28b80 65 73 65 72 76 65 20 61 20 6c 6f 77 65 72 20 63  eserve a lower c
28b90 6f 73 74 20 65 76 65 6e 20 69 66 20 69 74 20 69  ost even if it i
28ba0 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65  s a proper subse
28bb0 74 20 6f 66 20 59 2e 0a 2a 2f 0a 73 74 61 74 69  t of Y..*/.stati
28bc0 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 43  c int whereLoopC
28bd0 68 65 61 70 65 72 50 72 6f 70 65 72 53 75 62 73  heaperProperSubs
28be0 65 74 28 0a 20 20 63 6f 6e 73 74 20 57 68 65 72  et(.  const Wher
28bf0 65 4c 6f 6f 70 20 2a 70 58 2c 20 20 20 20 20 20  eLoop *pX,      
28c00 20 2f 2a 20 46 69 72 73 74 20 57 68 65 72 65 4c   /* First WhereL
28c10 6f 6f 70 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a  oop to compare *
28c20 2f 0a 20 20 63 6f 6e 73 74 20 57 68 65 72 65 4c  /.  const WhereL
28c30 6f 6f 70 20 2a 70 59 20 20 20 20 20 20 20 20 2f  oop *pY        /
28c40 2a 20 43 6f 6d 70 61 72 65 20 61 67 61 69 6e 73  * Compare agains
28c50 74 20 74 68 69 73 20 57 68 65 72 65 4c 6f 6f 70  t this WhereLoop
28c60 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20   */.){.  int i, 
28c70 6a 3b 0a 20 20 69 66 28 20 70 58 2d 3e 6e 4c 54  j;.  if( pX->nLT
28c80 65 72 6d 2d 70 58 2d 3e 6e 53 6b 69 70 20 3e 3d  erm-pX->nSkip >=
28c90 20 70 59 2d 3e 6e 4c 54 65 72 6d 2d 70 59 2d 3e   pY->nLTerm-pY->
28ca0 6e 53 6b 69 70 20 29 7b 0a 20 20 20 20 72 65 74  nSkip ){.    ret
28cb0 75 72 6e 20 30 3b 20 2f 2a 20 58 20 69 73 20 6e  urn 0; /* X is n
28cc0 6f 74 20 61 20 73 75 62 73 65 74 20 6f 66 20 59  ot a subset of Y
28cd0 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 59   */.  }.  if( pY
28ce0 2d 3e 6e 53 6b 69 70 20 3e 20 70 58 2d 3e 6e 53  ->nSkip > pX->nS
28cf0 6b 69 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  kip ) return 0;.
28d00 20 20 69 66 28 20 70 58 2d 3e 72 52 75 6e 20 3e    if( pX->rRun >
28d10 3d 20 70 59 2d 3e 72 52 75 6e 20 29 7b 0a 20 20  = pY->rRun ){.  
28d20 20 20 69 66 28 20 70 58 2d 3e 72 52 75 6e 20 3e    if( pX->rRun >
28d30 20 70 59 2d 3e 72 52 75 6e 20 29 20 72 65 74 75   pY->rRun ) retu
28d40 72 6e 20 30 3b 20 20 20 20 2f 2a 20 58 20 63 6f  rn 0;    /* X co
28d50 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 59 20  sts more than Y 
28d60 2a 2f 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 6e  */.    if( pX->n
28d70 4f 75 74 20 3e 20 70 59 2d 3e 6e 4f 75 74 20 29  Out > pY->nOut )
28d80 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a   return 0;    /*
28d90 20 58 20 63 6f 73 74 73 20 6d 6f 72 65 20 74 68   X costs more th
28da0 61 6e 20 59 20 2a 2f 0a 20 20 7d 0a 20 20 66 6f  an Y */.  }.  fo
28db0 72 28 69 3d 70 58 2d 3e 6e 4c 54 65 72 6d 2d 31  r(i=pX->nLTerm-1
28dc0 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
28dd0 20 20 69 66 28 20 70 58 2d 3e 61 4c 54 65 72 6d    if( pX->aLTerm
28de0 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  [i]==0 ) continu
28df0 65 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 70 59 2d  e;.    for(j=pY-
28e00 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b  >nLTerm-1; j>=0;
28e10 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28   j--){.      if(
28e20 20 70 59 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3d 3d   pY->aLTerm[j]==
28e30 70 58 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 29 20  pX->aLTerm[i] ) 
28e40 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
28e50 20 69 66 28 20 6a 3c 30 20 29 20 72 65 74 75 72   if( j<0 ) retur
28e60 6e 20 30 3b 20 20 2f 2a 20 58 20 6e 6f 74 20 61  n 0;  /* X not a
28e70 20 73 75 62 73 65 74 20 6f 66 20 59 20 73 69 6e   subset of Y sin
28e80 63 65 20 74 65 72 6d 20 58 5b 69 5d 20 6e 6f 74  ce term X[i] not
28e90 20 75 73 65 64 20 62 79 20 59 20 2a 2f 0a 20 20   used by Y */.  
28ea0 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 20 20 2f  }.  return 1;  /
28eb0 2a 20 41 6c 6c 20 63 6f 6e 64 69 74 69 6f 6e 73  * All conditions
28ec0 20 6d 65 65 74 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a   meet */.}../*.*
28ed0 2a 20 54 72 79 20 74 6f 20 61 64 6a 75 73 74 20  * Try to adjust 
28ee0 74 68 65 20 63 6f 73 74 20 6f 66 20 57 68 65 72  the cost of Wher
28ef0 65 4c 6f 6f 70 20 70 54 65 6d 70 6c 61 74 65 20  eLoop pTemplate 
28f00 75 70 77 61 72 64 73 20 6f 72 20 64 6f 77 6e 77  upwards or downw
28f10 61 72 64 73 20 73 6f 0a 2a 2a 20 74 68 61 74 3a  ards so.** that:
28f20 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 70 54 65  .**.**   (1) pTe
28f30 6d 70 6c 61 74 65 20 63 6f 73 74 73 20 6c 65 73  mplate costs les
28f40 73 20 74 68 61 6e 20 61 6e 79 20 6f 74 68 65 72  s than any other
28f50 20 57 68 65 72 65 4c 6f 6f 70 73 20 74 68 61 74   WhereLoops that
28f60 20 61 72 65 20 61 20 70 72 6f 70 65 72 0a 2a 2a   are a proper.**
28f70 20 20 20 20 20 20 20 73 75 62 73 65 74 20 6f 66         subset of
28f80 20 70 54 65 6d 70 6c 61 74 65 0a 2a 2a 0a 2a 2a   pTemplate.**.**
28f90 20 20 20 28 32 29 20 70 54 65 6d 70 6c 61 74 65     (2) pTemplate
28fa0 20 63 6f 73 74 73 20 6d 6f 72 65 20 74 68 61 6e   costs more than
28fb0 20 61 6e 79 20 6f 74 68 65 72 20 57 68 65 72 65   any other Where
28fc0 4c 6f 6f 70 73 20 66 6f 72 20 77 68 69 63 68 20  Loops for which 
28fd0 70 54 65 6d 70 6c 61 74 65 0a 2a 2a 20 20 20 20  pTemplate.**    
28fe0 20 20 20 69 73 20 61 20 70 72 6f 70 65 72 20 73     is a proper s
28ff0 75 62 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ubset..**.** To 
29000 73 61 79 20 22 57 68 65 72 65 4c 6f 6f 70 20 58  say "WhereLoop X
29010 20 69 73 20 61 20 70 72 6f 70 65 72 20 73 75 62   is a proper sub
29020 73 65 74 20 6f 66 20 59 22 20 6d 65 61 6e 73 20  set of Y" means 
29030 74 68 61 74 20 58 20 75 73 65 73 20 66 65 77 65  that X uses fewe
29040 72 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  r.** WHERE claus
29050 65 20 74 65 72 6d 73 20 74 68 61 6e 20 59 20 61  e terms than Y a
29060 6e 64 20 74 68 61 74 20 65 76 65 72 79 20 57 48  nd that every WH
29070 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ERE clause term 
29080 75 73 65 64 20 62 79 20 58 20 69 73 0a 2a 2a 20  used by X is.** 
29090 61 6c 73 6f 20 75 73 65 64 20 62 79 20 59 2e 0a  also used by Y..
290a0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
290b0 68 65 72 65 4c 6f 6f 70 41 64 6a 75 73 74 43 6f  hereLoopAdjustCo
290c0 73 74 28 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f  st(const WhereLo
290d0 6f 70 20 2a 70 2c 20 57 68 65 72 65 4c 6f 6f 70  op *p, WhereLoop
290e0 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b 0a 20 20   *pTemplate){.  
290f0 69 66 28 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e  if( (pTemplate->
29100 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
29110 49 4e 44 45 58 45 44 29 3d 3d 30 20 29 20 72 65  INDEXED)==0 ) re
29120 74 75 72 6e 3b 0a 20 20 66 6f 72 28 3b 20 70 3b  turn;.  for(; p;
29130 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29   p=p->pNextLoop)
29140 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61  {.    if( p->iTa
29150 62 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54  b!=pTemplate->iT
29160 61 62 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ab ) continue;. 
29170 20 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61     if( (p->wsFla
29180 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
29190 45 44 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ED)==0 ) continu
291a0 65 3b 0a 20 20 20 20 69 66 28 20 77 68 65 72 65  e;.    if( where
291b0 4c 6f 6f 70 43 68 65 61 70 65 72 50 72 6f 70 65  LoopCheaperPrope
291c0 72 53 75 62 73 65 74 28 70 2c 20 70 54 65 6d 70  rSubset(p, pTemp
291d0 6c 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20 2f  late) ){.      /
291e0 2a 20 41 64 6a 75 73 74 20 70 54 65 6d 70 6c 61  * Adjust pTempla
291f0 74 65 20 63 6f 73 74 20 64 6f 77 6e 77 61 72 64  te cost downward
29200 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 63   so that it is c
29210 68 65 61 70 65 72 20 74 68 61 6e 20 69 74 73 20  heaper than its 
29220 0a 20 20 20 20 20 20 2a 2a 20 73 75 62 73 65 74  .      ** subset
29230 20 70 2e 20 2a 2f 0a 20 20 20 20 20 20 57 48 45   p. */.      WHE
29240 52 45 54 52 41 43 45 28 30 78 38 30 2c 28 22 73  RETRACE(0x80,("s
29250 75 62 73 65 74 20 63 6f 73 74 20 61 64 6a 75 73  ubset cost adjus
29260 74 6d 65 6e 74 20 25 64 2c 25 64 20 74 6f 20 25  tment %d,%d to %
29270 64 2c 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d,%d\n",.       
29280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29290 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c  pTemplate->rRun,
292a0 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74   pTemplate->nOut
292b0 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f  , p->rRun, p->nO
292c0 75 74 2d 31 29 29 3b 0a 20 20 20 20 20 20 70 54  ut-1));.      pT
292d0 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 3d 20  emplate->rRun = 
292e0 70 2d 3e 72 52 75 6e 3b 0a 20 20 20 20 20 20 70  p->rRun;.      p
292f0 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 3d  Template->nOut =
29300 20 70 2d 3e 6e 4f 75 74 20 2d 20 31 3b 0a 20 20   p->nOut - 1;.  
29310 20 20 7d 65 6c 73 65 20 69 66 28 20 77 68 65 72    }else if( wher
29320 65 4c 6f 6f 70 43 68 65 61 70 65 72 50 72 6f 70  eLoopCheaperProp
29330 65 72 53 75 62 73 65 74 28 70 54 65 6d 70 6c 61  erSubset(pTempla
29340 74 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 20 20  te, p) ){.      
29350 2f 2a 20 41 64 6a 75 73 74 20 70 54 65 6d 70 6c  /* Adjust pTempl
29360 61 74 65 20 63 6f 73 74 20 75 70 77 61 72 64 20  ate cost upward 
29370 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 63 6f  so that it is co
29380 73 74 6c 69 65 72 20 74 68 61 6e 20 70 20 73 69  stlier than p si
29390 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20 70 54 65  nce.      ** pTe
293a0 6d 70 6c 61 74 65 20 69 73 20 61 20 70 72 6f 70  mplate is a prop
293b0 65 72 20 73 75 62 73 65 74 20 6f 66 20 70 20 2a  er subset of p *
293c0 2f 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41  /.      WHERETRA
293d0 43 45 28 30 78 38 30 2c 28 22 73 75 62 73 65 74  CE(0x80,("subset
293e0 20 63 6f 73 74 20 61 64 6a 75 73 74 6d 65 6e 74   cost adjustment
293f0 20 25 64 2c 25 64 20 74 6f 20 25 64 2c 25 64 5c   %d,%d to %d,%d\
29400 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
29410 20 20 20 20 20 20 20 20 20 20 20 70 54 65 6d 70             pTemp
29420 6c 61 74 65 2d 3e 72 52 75 6e 2c 20 70 54 65 6d  late->rRun, pTem
29430 70 6c 61 74 65 2d 3e 6e 4f 75 74 2c 20 70 2d 3e  plate->nOut, p->
29440 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 2b 31 29  rRun, p->nOut+1)
29450 29 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61  );.      pTempla
29460 74 65 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e 72 52  te->rRun = p->rR
29470 75 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c  un;.      pTempl
29480 61 74 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e  ate->nOut = p->n
29490 4f 75 74 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20  Out + 1;.    }. 
294a0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72   }.}../*.** Sear
294b0 63 68 20 74 68 65 20 6c 69 73 74 20 6f 66 20 57  ch the list of W
294c0 68 65 72 65 4c 6f 6f 70 73 20 69 6e 20 2a 70 70  hereLoops in *pp
294d0 50 72 65 76 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  Prev looking for
294e0 20 6f 6e 65 20 74 68 61 74 20 63 61 6e 20 62 65   one that can be
294f0 0a 2a 2a 20 73 75 70 70 6c 61 6e 74 65 64 20 62  .** supplanted b
29500 79 20 70 54 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a  y pTemplate..**.
29510 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  ** Return NULL i
29520 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  f the WhereLoop 
29530 6c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e  list contains an
29540 20 65 6e 74 72 79 20 74 68 61 74 20 63 61 6e 20   entry that can 
29550 73 75 70 70 6c 61 6e 74 0a 2a 2a 20 70 54 65 6d  supplant.** pTem
29560 70 6c 61 74 65 2c 20 69 6e 20 6f 74 68 65 72 20  plate, in other 
29570 77 6f 72 64 73 20 69 66 20 70 54 65 6d 70 6c 61  words if pTempla
29580 74 65 20 64 6f 65 73 20 6e 6f 74 20 62 65 6c 6f  te does not belo
29590 6e 67 20 6f 6e 20 74 68 65 20 6c 69 73 74 2e 0a  ng on the list..
295a0 2a 2a 0a 2a 2a 20 49 66 20 70 58 20 69 73 20 61  **.** If pX is a
295b0 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20   WhereLoop that 
295c0 70 54 65 6d 70 6c 61 74 65 20 63 61 6e 20 73 75  pTemplate can su
295d0 70 70 6c 61 6e 74 2c 20 74 68 65 6e 20 72 65 74  pplant, then ret
295e0 75 72 6e 20 74 68 65 0a 2a 2a 20 6c 69 6e 6b 20  urn the.** link 
295f0 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 70  that points to p
29600 58 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 54 65 6d  X..**.** If pTem
29610 70 6c 61 74 65 20 63 61 6e 6e 6f 74 20 73 75 70  plate cannot sup
29620 70 6c 61 6e 74 20 61 6e 79 20 65 78 69 73 74 69  plant any existi
29630 6e 67 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  ng element of th
29640 65 20 6c 69 73 74 20 62 75 74 20 6e 65 65 64 73  e list but needs
29650 0a 2a 2a 20 74 6f 20 62 65 20 61 64 64 65 64 20  .** to be added 
29660 74 6f 20 74 68 65 20 6c 69 73 74 2c 20 74 68 65  to the list, the
29670 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  n return a point
29680 65 72 20 74 6f 20 74 68 65 20 74 61 69 6c 20 6f  er to the tail o
29690 66 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73  f the list..*/.s
296a0 74 61 74 69 63 20 57 68 65 72 65 4c 6f 6f 70 20  tatic WhereLoop 
296b0 2a 2a 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c  **whereLoopFindL
296c0 65 73 73 65 72 28 0a 20 20 57 68 65 72 65 4c 6f  esser(.  WhereLo
296d0 6f 70 20 2a 2a 70 70 50 72 65 76 2c 0a 20 20 63  op **ppPrev,.  c
296e0 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a  onst WhereLoop *
296f0 70 54 65 6d 70 6c 61 74 65 0a 29 7b 0a 20 20 57  pTemplate.){.  W
29700 68 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 66  hereLoop *p;.  f
29710 6f 72 28 70 3d 28 2a 70 70 50 72 65 76 29 3b 20  or(p=(*ppPrev); 
29720 70 3b 20 70 70 50 72 65 76 3d 26 70 2d 3e 70 4e  p; ppPrev=&p->pN
29730 65 78 74 4c 6f 6f 70 2c 20 70 3d 2a 70 70 50 72  extLoop, p=*ppPr
29740 65 76 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ev){.    if( p->
29750 69 54 61 62 21 3d 70 54 65 6d 70 6c 61 74 65 2d  iTab!=pTemplate-
29760 3e 69 54 61 62 20 7c 7c 20 70 2d 3e 69 53 6f 72  >iTab || p->iSor
29770 74 49 64 78 21 3d 70 54 65 6d 70 6c 61 74 65 2d  tIdx!=pTemplate-
29780 3e 69 53 6f 72 74 49 64 78 20 29 7b 0a 20 20 20  >iSortIdx ){.   
29790 20 20 20 2f 2a 20 49 66 20 65 69 74 68 65 72 20     /* If either 
297a0 74 68 65 20 69 54 61 62 20 6f 72 20 69 53 6f 72  the iTab or iSor
297b0 74 49 64 78 20 76 61 6c 75 65 73 20 66 6f 72 20  tIdx values for 
297c0 74 77 6f 20 57 68 65 72 65 4c 6f 6f 70 20 61 72  two WhereLoop ar
297d0 65 20 64 69 66 66 65 72 65 6e 74 0a 20 20 20 20  e different.    
297e0 20 20 2a 2a 20 74 68 65 6e 20 74 68 6f 73 65 20    ** then those 
297f0 57 68 65 72 65 4c 6f 6f 70 73 20 6e 65 65 64 20  WhereLoops need 
29800 74 6f 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64  to be considered
29810 20 73 65 70 61 72 61 74 65 6c 79 2e 20 20 4e 65   separately.  Ne
29820 69 74 68 65 72 20 69 73 0a 20 20 20 20 20 20 2a  ither is.      *
29830 2a 20 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f  * a candidate to
29840 20 72 65 70 6c 61 63 65 20 74 68 65 20 6f 74 68   replace the oth
29850 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e  er. */.      con
29860 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
29870 20 2f 2a 20 49 6e 20 74 68 65 20 63 75 72 72 65   /* In the curre
29880 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  nt implementatio
29890 6e 2c 20 74 68 65 20 72 53 65 74 75 70 20 76 61  n, the rSetup va
298a0 6c 75 65 20 69 73 20 65 69 74 68 65 72 20 7a 65  lue is either ze
298b0 72 6f 0a 20 20 20 20 2a 2a 20 6f 72 20 74 68 65  ro.    ** or the
298c0 20 63 6f 73 74 20 6f 66 20 62 75 69 6c 64 69 6e   cost of buildin
298d0 67 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69  g an automatic i
298e0 6e 64 65 78 20 28 4e 6c 6f 67 4e 29 20 61 6e 64  ndex (NlogN) and
298f0 20 74 68 65 20 4e 6c 6f 67 4e 0a 20 20 20 20 2a   the NlogN.    *
29900 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20 66 6f  * is the same fo
29910 72 20 63 6f 6d 70 61 74 69 62 6c 65 20 57 68 65  r compatible Whe
29920 72 65 4c 6f 6f 70 73 2e 20 2a 2f 0a 20 20 20 20  reLoops. */.    
29930 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75  assert( p->rSetu
29940 70 3d 3d 30 20 7c 7c 20 70 54 65 6d 70 6c 61 74  p==0 || pTemplat
29950 65 2d 3e 72 53 65 74 75 70 3d 3d 30 20 0a 20 20  e->rSetup==0 .  
29960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
29970 7c 20 70 2d 3e 72 53 65 74 75 70 3d 3d 70 54 65  | p->rSetup==pTe
29980 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29  mplate->rSetup )
29990 3b 0a 0a 20 20 20 20 2f 2a 20 77 68 65 72 65 4c  ;..    /* whereL
299a0 6f 6f 70 41 64 64 42 74 72 65 65 28 29 20 61 6c  oopAddBtree() al
299b0 77 61 79 73 20 67 65 6e 65 72 61 74 65 73 20 61  ways generates a
299c0 6e 64 20 69 6e 73 65 72 74 73 20 74 68 65 20 61  nd inserts the a
299d0 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a 20  utomatic index. 
299e0 20 20 20 2a 2a 20 63 61 73 65 20 66 69 72 73 74     ** case first
299f0 2e 20 20 48 65 6e 63 65 20 63 6f 6d 70 61 74 69  .  Hence compati
29a00 62 6c 65 20 63 61 6e 64 69 64 61 74 65 20 57 68  ble candidate Wh
29a10 65 72 65 4c 6f 6f 70 73 20 6e 65 76 65 72 20 68  ereLoops never h
29a20 61 76 65 20 61 20 6c 61 72 67 65 72 0a 20 20 20  ave a larger.   
29a30 20 2a 2a 20 72 53 65 74 75 70 2e 20 43 61 6c 6c   ** rSetup. Call
29a40 20 74 68 69 73 20 53 45 54 55 50 2d 49 4e 56 41   this SETUP-INVA
29a50 52 49 41 4e 54 20 2a 2f 0a 20 20 20 20 61 73 73  RIANT */.    ass
29a60 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d  ert( p->rSetup>=
29a70 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75  pTemplate->rSetu
29a80 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 6e 79  p );..    /* Any
29a90 20 6c 6f 6f 70 20 75 73 69 6e 67 20 61 6e 20 61   loop using an a
29aa0 70 70 6c 69 61 74 69 6f 6e 2d 64 65 66 69 6e 65  ppliation-define
29ab0 64 20 69 6e 64 65 78 20 28 6f 72 20 50 52 49 4d  d index (or PRIM
29ac0 41 52 59 20 4b 45 59 20 6f 72 0a 20 20 20 20 2a  ARY KEY or.    *
29ad0 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  * UNIQUE constra
29ae0 69 6e 74 29 20 77 69 74 68 20 6f 6e 65 20 6f 72  int) with one or
29af0 20 6d 6f 72 65 20 3d 3d 20 63 6f 6e 73 74 72 61   more == constra
29b00 69 6e 74 73 20 69 73 20 62 65 74 74 65 72 0a 20  ints is better. 
29b10 20 20 20 2a 2a 20 74 68 61 6e 20 61 6e 20 61 75     ** than an au
29b20 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 20 55  tomatic index. U
29b30 6e 6c 65 73 73 20 69 74 20 69 73 20 61 20 73 6b  nless it is a sk
29b40 69 70 2d 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20  ip-scan. */.    
29b50 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
29b60 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  & WHERE_AUTO_IND
29b70 45 58 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28  EX)!=0.     && (
29b80 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 53 6b 69 70  pTemplate->nSkip
29b90 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54  )==0.     && (pT
29ba0 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73  emplate->wsFlags
29bb0 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
29bc0 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54  )!=0.     && (pT
29bd0 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73  emplate->wsFlags
29be0 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   & WHERE_COLUMN_
29bf0 45 51 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28  EQ)!=0.     && (
29c00 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d  p->prereq & pTem
29c10 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d  plate->prereq)==
29c20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65  pTemplate->prere
29c30 71 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62  q.    ){.      b
29c40 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
29c50 20 2f 2a 20 49 66 20 65 78 69 73 74 69 6e 67 20   /* If existing 
29c60 57 68 65 72 65 4c 6f 6f 70 20 70 20 69 73 20 62  WhereLoop p is b
29c70 65 74 74 65 72 20 74 68 61 6e 20 70 54 65 6d 70  etter than pTemp
29c80 6c 61 74 65 2c 20 70 54 65 6d 70 6c 61 74 65 20  late, pTemplate 
29c90 63 61 6e 20 62 65 0a 20 20 20 20 2a 2a 20 64 69  can be.    ** di
29ca0 73 63 61 72 64 65 64 2e 20 20 57 68 65 72 65 4c  scarded.  WhereL
29cb0 6f 6f 70 20 70 20 69 73 20 62 65 74 74 65 72 20  oop p is better 
29cc0 69 66 3a 0a 20 20 20 20 2a 2a 20 20 20 28 31 29  if:.    **   (1)
29cd0 20 20 70 20 68 61 73 20 6e 6f 20 6d 6f 72 65 20    p has no more 
29ce0 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74 68 61  dependencies tha
29cf0 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20 61 6e 64  n pTemplate, and
29d00 0a 20 20 20 20 2a 2a 20 20 20 28 32 29 20 20 70  .    **   (2)  p
29d10 20 68 61 73 20 61 6e 20 65 71 75 61 6c 20 6f 72   has an equal or
29d20 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e   lower cost than
29d30 20 70 54 65 6d 70 6c 61 74 65 0a 20 20 20 20 2a   pTemplate.    *
29d40 2f 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72  /.    if( (p->pr
29d50 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65  ereq & pTemplate
29d60 2d 3e 70 72 65 72 65 71 29 3d 3d 70 2d 3e 70 72  ->prereq)==p->pr
29d70 65 72 65 71 20 20 20 20 2f 2a 20 28 31 29 20 20  ereq    /* (1)  
29d80 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 53  */.     && p->rS
29d90 65 74 75 70 3c 3d 70 54 65 6d 70 6c 61 74 65 2d  etup<=pTemplate-
29da0 3e 72 53 65 74 75 70 20 20 20 20 20 20 20 20 20  >rSetup         
29db0 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 61 29           /* (2a)
29dc0 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 72   */.     && p->r
29dd0 52 75 6e 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  Run<=pTemplate->
29de0 72 52 75 6e 20 20 20 20 20 20 20 20 20 20 20 20  rRun            
29df0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 62            /* (2b
29e00 29 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e  ) */.     && p->
29e10 6e 4f 75 74 3c 3d 70 54 65 6d 70 6c 61 74 65 2d  nOut<=pTemplate-
29e20 3e 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20 20  >nOut           
29e30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32             /* (2
29e40 63 29 20 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20  c) */.    ){.   
29e50 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a     return 0;  /*
29e60 20 44 69 73 63 61 72 64 20 70 54 65 6d 70 6c 61   Discard pTempla
29e70 74 65 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20  te */.    }..   
29e80 20 2f 2a 20 49 66 20 70 54 65 6d 70 6c 61 74 65   /* If pTemplate
29e90 20 69 73 20 61 6c 77 61 79 73 20 62 65 74 74 65   is always bette
29ea0 72 20 74 68 61 6e 20 70 2c 20 74 68 65 6e 20 63  r than p, then c
29eb0 61 75 73 65 20 70 20 74 6f 20 62 65 20 6f 76 65  ause p to be ove
29ec0 72 77 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20  rwritten.    ** 
29ed0 77 69 74 68 20 70 54 65 6d 70 6c 61 74 65 2e 20  with pTemplate. 
29ee0 20 70 54 65 6d 70 6c 61 74 65 20 69 73 20 62 65   pTemplate is be
29ef0 74 74 65 72 20 74 68 61 6e 20 70 20 69 66 3a 0a  tter than p if:.
29f00 20 20 20 20 2a 2a 20 20 20 28 31 29 20 20 70 54      **   (1)  pT
29f10 65 6d 70 6c 61 74 65 20 68 61 73 20 6e 6f 20 6d  emplate has no m
29f20 6f 72 65 20 64 65 70 65 6e 64 65 6e 63 65 73 20  ore dependences 
29f30 74 68 61 6e 20 70 2c 20 61 6e 64 0a 20 20 20 20  than p, and.    
29f40 2a 2a 20 20 20 28 32 29 20 20 70 54 65 6d 70 6c  **   (2)  pTempl
29f50 61 74 65 20 68 61 73 20 61 6e 20 65 71 75 61 6c  ate has an equal
29f60 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74 20 74   or lower cost t
29f70 68 61 6e 20 70 2e 0a 20 20 20 20 2a 2f 0a 20 20  han p..    */.  
29f80 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71    if( (p->prereq
29f90 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72   & pTemplate->pr
29fa0 65 72 65 71 29 3d 3d 70 54 65 6d 70 6c 61 74 65  ereq)==pTemplate
29fb0 2d 3e 70 72 65 72 65 71 20 20 20 2f 2a 20 28 31  ->prereq   /* (1
29fc0 29 20 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d  )  */.     && p-
29fd0 3e 72 52 75 6e 3e 3d 70 54 65 6d 70 6c 61 74 65  >rRun>=pTemplate
29fe0 2d 3e 72 52 75 6e 20 20 20 20 20 20 20 20 20 20  ->rRun          
29ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a000 20 20 20 2f 2a 20 28 32 61 29 20 2a 2f 0a 20 20     /* (2a) */.  
2a010 20 20 20 26 26 20 70 2d 3e 6e 4f 75 74 3e 3d 70     && p->nOut>=p
2a020 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 20  Template->nOut  
2a030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a040 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32             /* (2
2a050 62 29 20 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20  b) */.    ){.   
2a060 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53     assert( p->rS
2a070 65 74 75 70 3e 3d 70 54 65 6d 70 6c 61 74 65 2d  etup>=pTemplate-
2a080 3e 72 53 65 74 75 70 20 29 3b 20 2f 2a 20 53 45  >rSetup ); /* SE
2a090 54 55 50 2d 49 4e 56 41 52 49 41 4e 54 20 61 62  TUP-INVARIANT ab
2a0a0 6f 76 65 20 2a 2f 0a 20 20 20 20 20 20 62 72 65  ove */.      bre
2a0b0 61 6b 3b 20 20 20 2f 2a 20 43 61 75 73 65 20 70  ak;   /* Cause p
2a0c0 20 74 6f 20 62 65 20 6f 76 65 72 77 72 69 74 74   to be overwritt
2a0d0 65 6e 20 62 79 20 70 54 65 6d 70 6c 61 74 65 20  en by pTemplate 
2a0e0 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  */.    }.  }.  r
2a0f0 65 74 75 72 6e 20 70 70 50 72 65 76 3b 0a 7d 0a  eturn ppPrev;.}.
2a100 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72  ./*.** Insert or
2a110 20 72 65 70 6c 61 63 65 20 61 20 57 68 65 72 65   replace a Where
2a120 4c 6f 6f 70 20 65 6e 74 72 79 20 75 73 69 6e 67  Loop entry using
2a130 20 74 68 65 20 74 65 6d 70 6c 61 74 65 20 73 75   the template su
2a140 70 70 6c 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e  pplied..**.** An
2a150 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c   existing WhereL
2a160 6f 6f 70 20 65 6e 74 72 79 20 6d 69 67 68 74 20  oop entry might 
2a170 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 69  be overwritten i
2a180 66 20 74 68 65 20 6e 65 77 20 74 65 6d 70 6c 61  f the new templa
2a190 74 65 0a 2a 2a 20 69 73 20 62 65 74 74 65 72 20  te.** is better 
2a1a0 61 6e 64 20 68 61 73 20 66 65 77 65 72 20 64 65  and has fewer de
2a1b0 70 65 6e 64 65 6e 63 69 65 73 2e 20 20 4f 72 20  pendencies.  Or 
2a1c0 74 68 65 20 74 65 6d 70 6c 61 74 65 20 77 69 6c  the template wil
2a1d0 6c 20 62 65 20 69 67 6e 6f 72 65 64 0a 2a 2a 20  l be ignored.** 
2a1e0 61 6e 64 20 6e 6f 20 69 6e 73 65 72 74 20 77 69  and no insert wi
2a1f0 6c 6c 20 6f 63 63 75 72 20 69 66 20 61 6e 20 65  ll occur if an e
2a200 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f  xisting WhereLoo
2a210 70 20 69 73 20 66 61 73 74 65 72 20 61 6e 64 20  p is faster and 
2a220 68 61 73 0a 2a 2a 20 66 65 77 65 72 20 64 65 70  has.** fewer dep
2a230 65 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20 74  endencies than t
2a240 68 65 20 74 65 6d 70 6c 61 74 65 2e 20 20 4f 74  he template.  Ot
2a250 68 65 72 77 69 73 65 20 61 20 6e 65 77 20 57 68  herwise a new Wh
2a260 65 72 65 4c 6f 6f 70 20 69 73 0a 2a 2a 20 61 64  ereLoop is.** ad
2a270 64 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ded based on the
2a280 20 74 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a   template..**.**
2a290 20 49 66 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f   If pBuilder->pO
2a2a0 72 53 65 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  rSet is not NULL
2a2b0 20 74 68 65 6e 20 77 65 20 63 61 72 65 20 61 62   then we care ab
2a2c0 6f 75 74 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20  out only the.** 
2a2d0 70 72 65 72 65 71 75 69 73 69 74 65 73 20 61 6e  prerequisites an
2a2e0 64 20 72 52 75 6e 20 61 6e 64 20 6e 4f 75 74 20  d rRun and nOut 
2a2f0 63 6f 73 74 73 20 6f 66 20 74 68 65 20 4e 20 62  costs of the N b
2a300 65 73 74 20 6c 6f 6f 70 73 2e 20 20 54 68 61 74  est loops.  That
2a310 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** information 
2a320 69 73 20 67 61 74 68 65 72 65 64 20 69 6e 20 74  is gathered in t
2a330 68 65 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72  he pBuilder->pOr
2a340 53 65 74 20 6f 62 6a 65 63 74 2e 20 20 54 68 69  Set object.  Thi
2a350 73 20 73 70 65 63 69 61 6c 0a 2a 2a 20 70 72 6f  s special.** pro
2a360 63 65 73 73 69 6e 67 20 6d 6f 64 65 20 69 73 20  cessing mode is 
2a370 75 73 65 64 20 6f 6e 6c 79 20 66 6f 72 20 4f 52  used only for OR
2a380 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
2a390 6e 67 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61  ng..**.** When a
2a3a0 63 63 75 6d 75 6c 61 74 69 6e 67 20 6d 75 6c 74  ccumulating mult
2a3b0 69 70 6c 65 20 6c 6f 6f 70 73 20 28 77 68 65 6e  iple loops (when
2a3c0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65   pBuilder->pOrSe
2a3d0 74 20 69 73 20 4e 55 4c 4c 29 20 77 65 0a 2a 2a  t is NULL) we.**
2a3e0 20 73 74 69 6c 6c 20 6d 69 67 68 74 20 6f 76 65   still might ove
2a3f0 72 77 72 69 74 65 20 73 69 6d 69 6c 61 72 20 6c  rwrite similar l
2a400 6f 6f 70 73 20 77 69 74 68 20 74 68 65 20 6e 65  oops with the ne
2a410 77 20 74 65 6d 70 6c 61 74 65 20 69 66 20 74 68  w template if th
2a420 65 0a 2a 2a 20 6e 65 77 20 74 65 6d 70 6c 61 74  e.** new templat
2a430 65 20 69 73 20 62 65 74 74 65 72 2e 20 20 4c 6f  e is better.  Lo
2a440 6f 70 73 20 6d 61 79 20 62 65 20 6f 76 65 72 77  ops may be overw
2a450 72 69 74 74 65 6e 20 69 66 20 74 68 65 20 66 6f  ritten if the fo
2a460 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 63 6f 6e 64  llowing .** cond
2a470 69 74 69 6f 6e 73 20 61 72 65 20 6d 65 74 3a 0a  itions are met:.
2a480 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68  **.**    (1)  Th
2a490 65 79 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ey have the same
2a4a0 20 69 54 61 62 2e 0a 2a 2a 20 20 20 20 28 32 29   iTab..**    (2)
2a4b0 20 20 54 68 65 79 20 68 61 76 65 20 74 68 65 20    They have the 
2a4c0 73 61 6d 65 20 69 53 6f 72 74 49 64 78 2e 0a 2a  same iSortIdx..*
2a4d0 2a 20 20 20 20 28 33 29 20 20 54 68 65 20 74 65  *    (3)  The te
2a4e0 6d 70 6c 61 74 65 20 68 61 73 20 73 61 6d 65 20  mplate has same 
2a4f0 6f 72 20 66 65 77 65 72 20 64 65 70 65 6e 64 65  or fewer depende
2a500 6e 63 69 65 73 20 74 68 61 6e 20 74 68 65 20 63  ncies than the c
2a510 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2a 20 20  urrent loop.**  
2a520 20 20 28 34 29 20 20 54 68 65 20 74 65 6d 70 6c    (4)  The templ
2a530 61 74 65 20 68 61 73 20 74 68 65 20 73 61 6d 65  ate has the same
2a540 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74 20 74   or lower cost t
2a550 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
2a560 6c 6f 6f 70 0a 2a 2f 0a 73 74 61 74 69 63 20 69  loop.*/.static i
2a570 6e 74 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65  nt whereLoopInse
2a580 72 74 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  rt(WhereLoopBuil
2a590 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 57  der *pBuilder, W
2a5a0 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c  hereLoop *pTempl
2a5b0 61 74 65 29 7b 0a 20 20 57 68 65 72 65 4c 6f 6f  ate){.  WhereLoo
2a5c0 70 20 2a 2a 70 70 50 72 65 76 2c 20 2a 70 3b 0a  p **ppPrev, *p;.
2a5d0 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
2a5e0 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  nfo = pBuilder->
2a5f0 70 57 49 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65  pWInfo;.  sqlite
2a600 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e  3 *db = pWInfo->
2a610 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f  pParse->db;..  /
2a620 2a 20 49 66 20 70 42 75 69 6c 64 65 72 2d 3e 70  * If pBuilder->p
2a630 4f 72 53 65 74 20 69 73 20 64 65 66 69 6e 65 64  OrSet is defined
2a640 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 6b 65 65 70  , then only keep
2a650 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 63 6f   track of the co
2a660 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20 70 72 65  sts.  ** and pre
2a670 72 65 71 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  reqs..  */.  if(
2a680 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65   pBuilder->pOrSe
2a690 74 21 3d 30 20 29 7b 0a 23 69 66 20 57 48 45 52  t!=0 ){.#if WHER
2a6a0 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  ETRACE_ENABLED. 
2a6b0 20 20 20 75 31 36 20 6e 20 3d 20 70 42 75 69 6c     u16 n = pBuil
2a6c0 64 65 72 2d 3e 70 4f 72 53 65 74 2d 3e 6e 3b 0a  der->pOrSet->n;.
2a6d0 20 20 20 20 69 6e 74 20 78 20 3d 0a 23 65 6e 64      int x =.#end
2a6e0 69 66 0a 20 20 20 20 77 68 65 72 65 4f 72 49 6e  if.    whereOrIn
2a6f0 73 65 72 74 28 70 42 75 69 6c 64 65 72 2d 3e 70  sert(pBuilder->p
2a700 4f 72 53 65 74 2c 20 70 54 65 6d 70 6c 61 74 65  OrSet, pTemplate
2a710 2d 3e 70 72 65 72 65 71 2c 20 70 54 65 6d 70 6c  ->prereq, pTempl
2a720 61 74 65 2d 3e 72 52 75 6e 2c 0a 20 20 20 20 20  ate->rRun,.     
2a730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2a750 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 29 3b  Template->nOut);
2a760 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f  .#if WHERETRACE_
2a770 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a  ENABLED /* 0x8 *
2a780 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
2a790 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78  3WhereTrace & 0x
2a7a0 38 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  8 ){.      sqlit
2a7b0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 78 3f  e3DebugPrintf(x?
2a7c0 22 20 20 20 6f 72 2d 25 64 3a 20 20 22 3a 22 20  "   or-%d:  ":" 
2a7d0 20 20 6f 72 2d 58 3a 20 20 22 2c 20 6e 29 3b 0a    or-X:  ", n);.
2a7e0 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50        whereLoopP
2a7f0 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20  rint(pTemplate, 
2a800 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a  pBuilder->pWC);.
2a810 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
2a820 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2a830 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f  K;.  }..  /* Loo
2a840 6b 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  k for an existin
2a850 67 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 72  g WhereLoop to r
2a860 65 70 6c 61 63 65 20 77 69 74 68 20 70 54 65 6d  eplace with pTem
2a870 70 6c 61 74 65 0a 20 20 2a 2f 0a 20 20 77 68 65  plate.  */.  whe
2a880 72 65 4c 6f 6f 70 41 64 6a 75 73 74 43 6f 73 74  reLoopAdjustCost
2a890 28 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c  (pWInfo->pLoops,
2a8a0 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 70   pTemplate);.  p
2a8b0 70 50 72 65 76 20 3d 20 77 68 65 72 65 4c 6f 6f  pPrev = whereLoo
2a8c0 70 46 69 6e 64 4c 65 73 73 65 72 28 26 70 57 49  pFindLesser(&pWI
2a8d0 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 54 65  nfo->pLoops, pTe
2a8e0 6d 70 6c 61 74 65 29 3b 0a 0a 20 20 69 66 28 20  mplate);..  if( 
2a8f0 70 70 50 72 65 76 3d 3d 30 20 29 7b 0a 20 20 20  ppPrev==0 ){.   
2a900 20 2f 2a 20 54 68 65 72 65 20 61 6c 72 65 61 64   /* There alread
2a910 79 20 65 78 69 73 74 73 20 61 20 57 68 65 72 65  y exists a Where
2a920 4c 6f 6f 70 20 6f 6e 20 74 68 65 20 6c 69 73 74  Loop on the list
2a930 20 74 68 61 74 20 69 73 20 62 65 74 74 65 72 0a   that is better.
2a940 20 20 20 20 2a 2a 20 74 68 61 6e 20 70 54 65 6d      ** than pTem
2a950 70 6c 61 74 65 2c 20 73 6f 20 6a 75 73 74 20 69  plate, so just i
2a960 67 6e 6f 72 65 20 70 54 65 6d 70 6c 61 74 65 20  gnore pTemplate 
2a970 2a 2f 0a 23 69 66 20 57 48 45 52 45 54 52 41 43  */.#if WHERETRAC
2a980 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38  E_ENABLED /* 0x8
2a990 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
2a9a0 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20  te3WhereTrace & 
2a9b0 30 78 38 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  0x8 ){.      sql
2a9c0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
2a9d0 22 20 20 20 73 6b 69 70 3a 20 22 29 3b 0a 20 20  "   skip: ");.  
2a9e0 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69      whereLoopPri
2a9f0 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42  nt(pTemplate, pB
2aa00 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20  uilder->pWC);.  
2aa10 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72    }.#endif.    r
2aa20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2aa30 20 20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20    .  }else{.    
2aa40 70 20 3d 20 2a 70 70 50 72 65 76 3b 0a 20 20 7d  p = *ppPrev;.  }
2aa50 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61  ..  /* If we rea
2aa60 63 68 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74  ch this point it
2aa70 20 6d 65 61 6e 73 20 74 68 61 74 20 65 69 74 68   means that eith
2aa80 65 72 20 70 5b 5d 20 73 68 6f 75 6c 64 20 62 65  er p[] should be
2aa90 20 6f 76 65 72 77 72 69 74 74 65 6e 0a 20 20 2a   overwritten.  *
2aaa0 2a 20 77 69 74 68 20 70 54 65 6d 70 6c 61 74 65  * with pTemplate
2aab0 5b 5d 20 69 66 20 70 5b 5d 20 65 78 69 73 74 73  [] if p[] exists
2aac0 2c 20 6f 72 20 69 66 20 70 3d 3d 4e 55 4c 4c 20  , or if p==NULL 
2aad0 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61 20  then allocate a 
2aae0 6e 65 77 0a 20 20 2a 2a 20 57 68 65 72 65 4c 6f  new.  ** WhereLo
2aaf0 6f 70 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74  op and insert it
2ab00 2e 0a 20 20 2a 2f 0a 23 69 66 20 57 48 45 52 45  ..  */.#if WHERE
2ab10 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a  TRACE_ENABLED /*
2ab20 20 30 78 38 20 2a 2f 0a 20 20 69 66 28 20 73 71   0x8 */.  if( sq
2ab30 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
2ab40 26 20 30 78 38 20 29 7b 0a 20 20 20 20 69 66 28  & 0x8 ){.    if(
2ab50 20 70 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73   p!=0 ){.      s
2ab60 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
2ab70 66 28 22 72 65 70 6c 61 63 65 3a 20 22 29 3b 0a  f("replace: ");.
2ab80 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50        whereLoopP
2ab90 72 69 6e 74 28 70 2c 20 70 42 75 69 6c 64 65 72  rint(p, pBuilder
2aba0 2d 3e 70 57 43 29 3b 0a 20 20 20 20 7d 0a 20 20  ->pWC);.    }.  
2abb0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
2abc0 69 6e 74 66 28 22 20 20 20 20 61 64 64 3a 20 22  intf("    add: "
2abd0 29 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  );.    whereLoop
2abe0 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c  Print(pTemplate,
2abf0 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b   pBuilder->pWC);
2ac00 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
2ac10 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ( p==0 ){.    /*
2ac20 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
2ac30 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 61 64 64  WhereLoop to add
2ac40 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
2ac50 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 2a  he list */.    *
2ac60 70 70 50 72 65 76 20 3d 20 70 20 3d 20 73 71 6c  ppPrev = p = sql
2ac70 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
2ac80 64 62 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65  db, sizeof(Where
2ac90 4c 6f 6f 70 29 29 3b 0a 20 20 20 20 69 66 28 20  Loop));.    if( 
2aca0 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  p==0 ) return SQ
2acb0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
2acc0 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29  whereLoopInit(p)
2acd0 3b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 4c 6f  ;.    p->pNextLo
2ace0 6f 70 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  op = 0;.  }else{
2acf0 0a 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20  .    /* We will 
2ad00 62 65 20 6f 76 65 72 77 72 69 74 69 6e 67 20 57  be overwriting W
2ad10 68 65 72 65 4c 6f 6f 70 20 70 5b 5d 2e 20 20 42  hereLoop p[].  B
2ad20 75 74 20 62 65 66 6f 72 65 20 77 65 20 64 6f 2c  ut before we do,
2ad30 20 66 69 72 73 74 0a 20 20 20 20 2a 2a 20 67 6f   first.    ** go
2ad40 20 74 68 72 6f 75 67 68 20 74 68 65 20 72 65 73   through the res
2ad50 74 20 6f 66 20 74 68 65 20 6c 69 73 74 20 61 6e  t of the list an
2ad60 64 20 64 65 6c 65 74 65 20 61 6e 79 20 6f 74 68  d delete any oth
2ad70 65 72 20 65 6e 74 72 69 65 73 20 62 65 73 69 64  er entries besid
2ad80 65 73 0a 20 20 20 20 2a 2a 20 70 5b 5d 20 74 68  es.    ** p[] th
2ad90 61 74 20 61 72 65 20 61 6c 73 6f 20 73 75 70 70  at are also supp
2ada0 6c 61 74 65 64 20 62 79 20 70 54 65 6d 70 6c 61  lated by pTempla
2adb0 74 65 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 4c  te */.    WhereL
2adc0 6f 6f 70 20 2a 2a 70 70 54 61 69 6c 20 3d 20 26  oop **ppTail = &
2add0 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20  p->pNextLoop;.  
2ade0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 6f    WhereLoop *pTo
2adf0 44 65 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  Del;.    while( 
2ae00 2a 70 70 54 61 69 6c 20 29 7b 0a 20 20 20 20 20  *ppTail ){.     
2ae10 20 70 70 54 61 69 6c 20 3d 20 77 68 65 72 65 4c   ppTail = whereL
2ae20 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72 28 70 70  oopFindLesser(pp
2ae30 54 61 69 6c 2c 20 70 54 65 6d 70 6c 61 74 65 29  Tail, pTemplate)
2ae40 3b 0a 20 20 20 20 20 20 69 66 28 20 70 70 54 61  ;.      if( ppTa
2ae50 69 6c 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  il==0 ) break;. 
2ae60 20 20 20 20 20 70 54 6f 44 65 6c 20 3d 20 2a 70       pToDel = *p
2ae70 70 54 61 69 6c 3b 0a 20 20 20 20 20 20 69 66 28  pTail;.      if(
2ae80 20 70 54 6f 44 65 6c 3d 3d 30 20 29 20 62 72 65   pToDel==0 ) bre
2ae90 61 6b 3b 0a 20 20 20 20 20 20 2a 70 70 54 61 69  ak;.      *ppTai
2aea0 6c 20 3d 20 70 54 6f 44 65 6c 2d 3e 70 4e 65 78  l = pToDel->pNex
2aeb0 74 4c 6f 6f 70 3b 0a 23 69 66 20 57 48 45 52 45  tLoop;.#if WHERE
2aec0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a  TRACE_ENABLED /*
2aed0 20 30 78 38 20 2a 2f 0a 20 20 20 20 20 20 69 66   0x8 */.      if
2aee0 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  ( sqlite3WhereTr
2aef0 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20  ace & 0x8 ){.   
2af00 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
2af10 67 50 72 69 6e 74 66 28 22 20 64 65 6c 65 74 65  gPrintf(" delete
2af20 3a 20 22 29 3b 0a 20 20 20 20 20 20 20 20 77 68  : ");.        wh
2af30 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 6f  ereLoopPrint(pTo
2af40 44 65 6c 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  Del, pBuilder->p
2af50 57 43 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  WC);.      }.#en
2af60 64 69 66 0a 20 20 20 20 20 20 77 68 65 72 65 4c  dif.      whereL
2af70 6f 6f 70 44 65 6c 65 74 65 28 64 62 2c 20 70 54  oopDelete(db, pT
2af80 6f 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  oDel);.    }.  }
2af90 0a 20 20 77 68 65 72 65 4c 6f 6f 70 58 66 65 72  .  whereLoopXfer
2afa0 28 64 62 2c 20 70 2c 20 70 54 65 6d 70 6c 61 74  (db, p, pTemplat
2afb0 65 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 77 73  e);.  if( (p->ws
2afc0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
2afd0 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29  RTUALTABLE)==0 )
2afe0 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 6e  {.    Index *pIn
2aff0 64 65 78 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65  dex = p->u.btree
2b000 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28  .pIndex;.    if(
2b010 20 70 49 6e 64 65 78 20 26 26 20 70 49 6e 64 65   pIndex && pInde
2b020 78 2d 3e 74 6e 75 6d 3d 3d 30 20 29 7b 0a 20 20  x->tnum==0 ){.  
2b030 20 20 20 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70      p->u.btree.p
2b040 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d  Index = 0;.    }
2b050 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
2b060 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
2b070 2a 20 41 64 6a 75 73 74 20 74 68 65 20 57 68 65  * Adjust the Whe
2b080 72 65 4c 6f 6f 70 2e 6e 4f 75 74 20 76 61 6c 75  reLoop.nOut valu
2b090 65 20 64 6f 77 6e 77 61 72 64 20 74 6f 20 61 63  e downward to ac
2b0a0 63 6f 75 6e 74 20 66 6f 72 20 74 65 72 6d 73 20  count for terms 
2b0b0 6f 66 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20  of the.** WHERE 
2b0c0 63 6c 61 75 73 65 20 74 68 61 74 20 72 65 66 65  clause that refe
2b0d0 72 65 6e 63 65 20 74 68 65 20 6c 6f 6f 70 20 62  rence the loop b
2b0e0 75 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74  ut which are not
2b0f0 20 75 73 65 64 20 62 79 20 61 6e 0a 2a 2a 20 69   used by an.** i
2b100 6e 64 65 78 2e 0a 2a 0a 2a 2a 20 46 6f 72 20 65  ndex..*.** For e
2b110 76 65 72 79 20 57 48 45 52 45 20 63 6c 61 75 73  very WHERE claus
2b120 65 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 6e  e term that is n
2b130 6f 74 20 75 73 65 64 20 62 79 20 74 68 65 20 69  ot used by the i
2b140 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 77 68 69 63  ndex.** and whic
2b150 68 20 68 61 73 20 61 20 74 72 75 74 68 20 70 72  h has a truth pr
2b160 6f 62 61 62 69 6c 69 74 79 20 61 73 73 69 67 6e  obability assign
2b170 65 64 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65  ed by one of the
2b180 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 2c 0a 2a   likelihood(),.*
2b190 2a 20 6c 69 6b 65 6c 79 28 29 2c 20 6f 72 20 75  * likely(), or u
2b1a0 6e 6c 69 6b 65 6c 79 28 29 20 53 51 4c 20 66 75  nlikely() SQL fu
2b1b0 6e 63 74 69 6f 6e 73 2c 20 72 65 64 75 63 65 20  nctions, reduce 
2b1c0 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75  the estimated nu
2b1d0 6d 62 65 72 0a 2a 2a 20 6f 66 20 6f 75 74 70 75  mber.** of outpu
2b1e0 74 20 72 6f 77 73 20 62 79 20 74 68 65 20 70 72  t rows by the pr
2b1f0 6f 62 61 62 69 6c 69 74 79 20 73 70 65 63 69 66  obability specif
2b200 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 55 4e 49 4e  ied..**.** TUNIN
2b210 47 3a 20 20 46 6f 72 20 65 76 65 72 79 20 57 48  G:  For every WH
2b220 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ERE clause term 
2b230 74 68 61 74 20 69 73 20 6e 6f 74 20 75 73 65 64  that is not used
2b240 20 62 79 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a   by the index.**
2b250 20 61 6e 64 20 77 68 69 63 68 20 64 6f 65 73 20   and which does 
2b260 6e 6f 74 20 68 61 76 65 20 61 6e 20 61 73 73 69  not have an assi
2b270 67 6e 65 64 20 74 72 75 74 68 20 70 72 6f 62 61  gned truth proba
2b280 62 69 6c 69 74 79 2c 20 68 65 75 72 69 73 74 69  bility, heuristi
2b290 63 73 0a 2a 2a 20 64 65 73 63 72 69 62 65 64 20  cs.** described 
2b2a0 62 65 6c 6f 77 20 61 72 65 20 75 73 65 64 20 74  below are used t
2b2b0 6f 20 74 72 79 20 74 6f 20 65 73 74 69 6d 61 74  o try to estimat
2b2c0 65 20 74 68 65 20 74 72 75 74 68 20 70 72 6f 62  e the truth prob
2b2d0 61 62 69 6c 69 74 79 2e 0a 2a 2a 20 54 4f 44 4f  ability..** TODO
2b2e0 20 2d 2d 3e 20 50 65 72 68 61 70 73 20 74 68 69   --> Perhaps thi
2b2f0 73 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 74  s is something t
2b300 68 61 74 20 63 6f 75 6c 64 20 62 65 20 69 6d 70  hat could be imp
2b310 72 6f 76 65 64 20 62 79 20 62 65 74 74 65 72 0a  roved by better.
2b320 2a 2a 20 74 61 62 6c 65 20 73 74 61 74 69 73 74  ** table statist
2b330 69 63 73 2e 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69  ics..**.** Heuri
2b340 73 74 69 63 20 31 3a 20 20 45 73 74 69 6d 61 74  stic 1:  Estimat
2b350 65 20 74 68 65 20 74 72 75 74 68 20 70 72 6f 62  e the truth prob
2b360 61 62 69 6c 69 74 79 20 61 73 20 39 33 2e 37 35  ability as 93.75
2b370 25 2e 20 20 54 68 65 20 39 33 2e 37 35 25 0a 2a  %.  The 93.75%.*
2b380 2a 20 76 61 6c 75 65 20 63 6f 72 72 65 73 70 6f  * value correspo
2b390 6e 64 73 20 74 6f 20 2d 31 20 69 6e 20 4c 6f 67  nds to -1 in Log
2b3a0 45 73 74 20 6e 6f 74 61 74 69 6f 6e 2c 20 73 6f  Est notation, so
2b3b0 20 74 68 69 73 20 6d 65 61 6e 73 20 64 65 63 72   this means decr
2b3c0 65 6d 65 6e 74 0a 2a 2a 20 74 68 65 20 57 68 65  ement.** the Whe
2b3d0 72 65 4c 6f 6f 70 2e 6e 4f 75 74 20 66 69 65 6c  reLoop.nOut fiel
2b3e0 64 20 66 6f 72 20 65 76 65 72 79 20 73 75 63 68  d for every such
2b3f0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
2b400 72 6d 2e 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69 73  rm..**.** Heuris
2b410 74 69 63 20 32 3a 20 20 49 66 20 74 68 65 72 65  tic 2:  If there
2b420 20 65 78 69 73 74 73 20 6f 6e 65 20 6f 72 20 6d   exists one or m
2b430 6f 72 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ore WHERE clause
2b440 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a   terms of the.**
2b450 20 66 6f 72 6d 20 22 78 3d 3d 45 58 50 52 22 20   form "x==EXPR" 
2b460 61 6e 64 20 45 58 50 52 20 69 73 20 6e 6f 74 20  and EXPR is not 
2b470 61 20 63 6f 6e 73 74 61 6e 74 20 30 20 6f 72 20  a constant 0 or 
2b480 31 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72  1, then make sur
2b490 65 20 74 68 65 0a 2a 2a 20 66 69 6e 61 6c 20 6f  e the.** final o
2b4a0 75 74 70 75 74 20 72 6f 77 20 65 73 74 69 6d 61  utput row estima
2b4b0 74 65 20 69 73 20 6e 6f 20 67 72 65 61 74 65 72  te is no greater
2b4c0 20 74 68 61 6e 20 31 2f 34 20 6f 66 20 74 68 65   than 1/4 of the
2b4d0 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 0a 2a 2a   total number.**
2b4e0 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
2b4f0 74 61 62 6c 65 2e 20 20 49 6e 20 6f 74 68 65 72  table.  In other
2b500 20 77 6f 72 64 73 2c 20 61 73 73 75 6d 65 20 74   words, assume t
2b510 68 61 74 20 78 3d 3d 45 58 50 52 20 77 69 6c 6c  hat x==EXPR will
2b520 20 66 69 6c 74 65 72 0a 2a 2a 20 6f 75 74 20 61   filter.** out a
2b530 74 20 6c 65 61 73 74 20 33 20 6f 75 74 20 6f 66  t least 3 out of
2b540 20 34 20 72 6f 77 73 2e 20 20 49 66 20 45 58 50   4 rows.  If EXP
2b550 52 20 69 73 20 2d 31 20 6f 72 20 30 20 6f 72 20  R is -1 or 0 or 
2b560 31 2c 20 74 68 65 6e 20 6d 61 79 62 65 20 74 68  1, then maybe th
2b570 65 0a 2a 2a 20 22 78 22 20 63 6f 6c 75 6d 6e 20  e.** "x" column 
2b580 69 73 20 62 6f 6f 6c 65 61 6e 20 6f 72 20 65 6c  is boolean or el
2b590 73 65 20 2d 31 20 6f 72 20 30 20 6f 72 20 31 20  se -1 or 0 or 1 
2b5a0 69 73 20 61 20 63 6f 6d 6d 6f 6e 20 64 65 66 61  is a common defa
2b5b0 75 6c 74 20 76 61 6c 75 65 0a 2a 2a 20 6f 6e 20  ult value.** on 
2b5c0 74 68 65 20 22 78 22 20 63 6f 6c 75 6d 6e 20 61  the "x" column a
2b5d0 6e 64 20 73 6f 20 69 6e 20 74 68 61 74 20 63 61  nd so in that ca
2b5e0 73 65 20 6f 6e 6c 79 20 63 61 70 20 74 68 65 20  se only cap the 
2b5f0 6f 75 74 70 75 74 20 72 6f 77 20 65 73 74 69 6d  output row estim
2b600 61 74 65 0a 2a 2a 20 61 74 20 31 2f 32 20 69 6e  ate.** at 1/2 in
2b610 73 74 65 61 64 20 6f 66 20 31 2f 34 2e 0a 2a 2f  stead of 1/4..*/
2b620 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
2b630 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75  reLoopOutputAdju
2b640 73 74 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73  st(.  WhereClaus
2b650 65 20 2a 70 57 43 2c 20 20 20 20 20 20 2f 2a 20  e *pWC,      /* 
2b660 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
2b670 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
2b680 2a 70 4c 6f 6f 70 2c 20 20 20 20 20 20 2f 2a 20  *pLoop,      /* 
2b690 54 68 65 20 6c 6f 6f 70 20 74 6f 20 61 64 6a 75  The loop to adju
2b6a0 73 74 20 64 6f 77 6e 77 61 72 64 20 2a 2f 0a 20  st downward */. 
2b6b0 20 4c 6f 67 45 73 74 20 6e 52 6f 77 20 20 20 20   LogEst nRow    
2b6c0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2b6d0 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
2b6e0 20 65 6e 74 69 72 65 20 74 61 62 6c 65 20 2a 2f   entire table */
2b6f0 0a 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  .){.  WhereTerm 
2b700 2a 70 54 65 72 6d 2c 20 2a 70 58 3b 0a 20 20 42  *pTerm, *pX;.  B
2b710 69 74 6d 61 73 6b 20 6e 6f 74 41 6c 6c 6f 77 65  itmask notAllowe
2b720 64 20 3d 20 7e 28 70 4c 6f 6f 70 2d 3e 70 72 65  d = ~(pLoop->pre
2b730 72 65 71 7c 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53  req|pLoop->maskS
2b740 65 6c 66 29 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  elf);.  int i, j
2b750 2c 20 6b 3b 0a 20 20 4c 6f 67 45 73 74 20 69 52  , k;.  LogEst iR
2b760 65 64 75 63 65 20 3d 20 30 3b 20 20 20 20 2f 2a  educe = 0;    /*
2b770 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 73 68 6f   pLoop->nOut sho
2b780 75 6c 64 20 6e 6f 74 20 65 78 63 65 65 64 20 6e  uld not exceed n
2b790 52 6f 77 2d 69 52 65 64 75 63 65 20 2a 2f 0a 0a  Row-iReduce */..
2b7a0 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70    assert( (pLoop
2b7b0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
2b7c0 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 3d 3d 30  E_AUTO_INDEX)==0
2b7d0 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d   );.  for(i=pWC-
2b7e0 3e 6e 54 65 72 6d 2c 20 70 54 65 72 6d 3d 70 57  >nTerm, pTerm=pW
2b7f0 43 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  C->a; i>0; i--, 
2b800 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  pTerm++){.    if
2b810 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  ( (pTerm->wtFlag
2b820 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
2b830 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )!=0 ) break;.  
2b840 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
2b850 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d  ereqAll & pLoop-
2b860 3e 6d 61 73 6b 53 65 6c 66 29 3d 3d 30 20 29 20  >maskSelf)==0 ) 
2b870 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
2b880 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
2b890 41 6c 6c 20 26 20 6e 6f 74 41 6c 6c 6f 77 65 64  All & notAllowed
2b8a0 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
2b8b0 0a 20 20 20 20 66 6f 72 28 6a 3d 70 4c 6f 6f 70  .    for(j=pLoop
2b8c0 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30  ->nLTerm-1; j>=0
2b8d0 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 70 58  ; j--){.      pX
2b8e0 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d   = pLoop->aLTerm
2b8f0 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  [j];.      if( p
2b900 58 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  X==0 ) continue;
2b910 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70  .      if( pX==p
2b920 54 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20  Term ) break;.  
2b930 20 20 20 20 69 66 28 20 70 58 2d 3e 69 50 61 72      if( pX->iPar
2b940 65 6e 74 3e 3d 30 20 26 26 20 28 26 70 57 43 2d  ent>=0 && (&pWC-
2b950 3e 61 5b 70 58 2d 3e 69 50 61 72 65 6e 74 5d 29  >a[pX->iParent])
2b960 3d 3d 70 54 65 72 6d 20 29 20 62 72 65 61 6b 3b  ==pTerm ) break;
2b970 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a  .    }.    if( j
2b980 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  <0 ){.      if( 
2b990 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
2b9a0 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  <=0 ){.        /
2b9b0 2a 20 49 66 20 61 20 74 72 75 74 68 20 70 72 6f  * If a truth pro
2b9c0 62 61 62 69 6c 69 74 79 20 69 73 20 73 70 65 63  bability is spec
2b9d0 69 66 69 65 64 20 75 73 69 6e 67 20 74 68 65 20  ified using the 
2b9e0 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20 68 69 6e  likelihood() hin
2b9f0 74 73 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ts,.        ** t
2ba00 68 65 6e 20 75 73 65 20 74 68 65 20 70 72 6f 62  hen use the prob
2ba10 61 62 69 6c 69 74 79 20 70 72 6f 76 69 64 65 64  ability provided
2ba20 20 62 79 20 74 68 65 20 61 70 70 6c 69 63 61 74   by the applicat
2ba30 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ion. */.        
2ba40 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2b 3d 20 70  pLoop->nOut += p
2ba50 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b  Term->truthProb;
2ba60 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2ba70 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 20        /* In the 
2ba80 61 62 73 65 6e 63 65 20 6f 66 20 65 78 70 6c 69  absence of expli
2ba90 63 69 74 20 74 72 75 74 68 20 70 72 6f 62 61 62  cit truth probab
2baa0 69 6c 69 74 69 65 73 2c 20 75 73 65 20 68 65 75  ilities, use heu
2bab0 72 69 73 74 69 63 73 20 74 6f 0a 20 20 20 20 20  ristics to.     
2bac0 20 20 20 2a 2a 20 67 75 65 73 73 20 61 20 72 65     ** guess a re
2bad0 61 73 6f 6e 61 62 6c 65 20 74 72 75 74 68 20 70  asonable truth p
2bae0 72 6f 62 61 62 69 6c 69 74 79 2e 20 2a 2f 0a 20  robability. */. 
2baf0 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f         pLoop->nO
2bb00 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 69 66  ut--;.        if
2bb10 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
2bb20 6f 72 26 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29  or&(WO_EQ|WO_IS)
2bb30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78   ){.          Ex
2bb40 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 54 65  pr *pRight = pTe
2bb50 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rm->pExpr->pRigh
2bb60 74 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  t;.          tes
2bb70 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 70 45  tcase( pTerm->pE
2bb80 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29  xpr->op==TK_IS )
2bb90 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2bba0 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
2bbb0 65 67 65 72 28 70 52 69 67 68 74 2c 20 26 6b 29  eger(pRight, &k)
2bbc0 20 26 26 20 6b 3e 3d 28 2d 31 29 20 26 26 20 6b   && k>=(-1) && k
2bbd0 3c 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  <=1 ){.         
2bbe0 20 20 20 6b 20 3d 20 31 30 3b 0a 20 20 20 20 20     k = 10;.     
2bbf0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2bc00 20 20 20 20 20 20 20 20 6b 20 3d 20 32 30 3b 0a          k = 20;.
2bc10 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2bc20 20 20 20 20 20 20 69 66 28 20 69 52 65 64 75 63        if( iReduc
2bc30 65 3c 6b 20 29 20 69 52 65 64 75 63 65 20 3d 20  e<k ) iReduce = 
2bc40 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
2bc50 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
2bc60 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74   if( pLoop->nOut
2bc70 20 3e 20 6e 52 6f 77 2d 69 52 65 64 75 63 65 20   > nRow-iReduce 
2bc80 29 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d  )  pLoop->nOut =
2bc90 20 6e 52 6f 77 20 2d 20 69 52 65 64 75 63 65 3b   nRow - iReduce;
2bca0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74  .}../*.** Adjust
2bcb0 20 74 68 65 20 63 6f 73 74 20 43 20 62 79 20 74   the cost C by t
2bcc0 68 65 20 63 6f 73 74 4d 75 6c 74 20 66 61 63 74  he costMult fact
2bcd0 65 72 20 54 2e 20 20 54 68 69 73 20 6f 6e 6c 79  er T.  This only
2bce0 20 6f 63 63 75 72 73 20 69 66 0a 2a 2a 20 63 6f   occurs if.** co
2bcf0 6d 70 69 6c 65 64 20 77 69 74 68 20 2d 44 53 51  mpiled with -DSQ
2bd00 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 53 54  LITE_ENABLE_COST
2bd10 4d 55 4c 54 0a 2a 2f 0a 23 69 66 64 65 66 20 53  MULT.*/.#ifdef S
2bd20 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 53  QLITE_ENABLE_COS
2bd30 54 4d 55 4c 54 0a 23 20 64 65 66 69 6e 65 20 41  TMULT.# define A
2bd40 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69  pplyCostMultipli
2bd50 65 72 28 43 2c 54 29 20 20 43 20 2b 3d 20 54 0a  er(C,T)  C += T.
2bd60 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 41  #else.# define A
2bd70 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69  pplyCostMultipli
2bd80 65 72 28 43 2c 54 29 0a 23 65 6e 64 69 66 0a 0a  er(C,T).#endif..
2bd90 2f 2a 0a 2a 2a 20 57 65 20 68 61 76 65 20 73 6f  /*.** We have so
2bda0 20 66 61 72 20 6d 61 74 63 68 65 64 20 70 42 75   far matched pBu
2bdb0 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62  ilder->pNew->u.b
2bdc0 74 72 65 65 2e 6e 45 71 20 74 65 72 6d 73 20 6f  tree.nEq terms o
2bdd0 66 20 74 68 65 20 0a 2a 2a 20 69 6e 64 65 78 20  f the .** index 
2bde0 70 49 6e 64 65 78 2e 20 54 72 79 20 74 6f 20 6d  pIndex. Try to m
2bdf0 61 74 63 68 20 6f 6e 65 20 6d 6f 72 65 2e 0a 2a  atch one more..*
2be00 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66  *.** When this f
2be10 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
2be20 64 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65  d, pBuilder->pNe
2be30 77 2d 3e 6e 4f 75 74 20 63 6f 6e 74 61 69 6e 73  w->nOut contains
2be40 20 74 68 65 20 0a 2a 2a 20 6e 75 6d 62 65 72 20   the .** number 
2be50 6f 66 20 72 6f 77 73 20 65 78 70 65 63 74 65 64  of rows expected
2be60 20 74 6f 20 62 65 20 76 69 73 69 74 65 64 20 62   to be visited b
2be70 79 20 66 69 6c 74 65 72 69 6e 67 20 75 73 69 6e  y filtering usin
2be80 67 20 74 68 65 20 6e 45 71 20 0a 2a 2a 20 74 65  g the nEq .** te
2be90 72 6d 73 20 6f 6e 6c 79 2e 20 49 66 20 69 74 20  rms only. If it 
2bea0 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 74 68 69  is modified, thi
2beb0 73 20 76 61 6c 75 65 20 69 73 20 72 65 73 74 6f  s value is resto
2bec0 72 65 64 20 62 65 66 6f 72 65 20 74 68 69 73 20  red before this 
2bed0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  .** function ret
2bee0 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  urns..**.** If p
2bef0 50 72 6f 62 65 2d 3e 74 6e 75 6d 3d 3d 30 2c 20  Probe->tnum==0, 
2bf00 74 68 61 74 20 6d 65 61 6e 73 20 70 49 6e 64 65  that means pInde
2bf10 78 20 69 73 20 61 20 66 61 6b 65 20 69 6e 64 65  x is a fake inde
2bf20 78 20 75 73 65 64 20 66 6f 72 20 74 68 65 0a 2a  x used for the.*
2bf30 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  * INTEGER PRIMAR
2bf40 59 20 4b 45 59 2e 0a 2a 2f 0a 73 74 61 74 69 63  Y KEY..*/.static
2bf50 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64   int whereLoopAd
2bf60 64 42 74 72 65 65 49 6e 64 65 78 28 0a 20 20 57  dBtreeIndex(.  W
2bf70 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
2bf80 2a 70 42 75 69 6c 64 65 72 2c 20 20 20 20 20 2f  *pBuilder,     /
2bf90 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  * The WhereLoop 
2bfa0 66 61 63 74 6f 72 79 20 2a 2f 0a 20 20 73 74 72  factory */.  str
2bfb0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2bfc0 20 2a 70 53 72 63 2c 20 20 20 20 20 20 2f 2a 20   *pSrc,      /* 
2bfd0 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
2bfe0 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20   being analyzed 
2bff0 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f  */.  Index *pPro
2c000 62 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  be,             
2c010 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78       /* An index
2c020 20 6f 6e 20 70 53 72 63 20 2a 2f 0a 20 20 4c 6f   on pSrc */.  Lo
2c030 67 45 73 74 20 6e 49 6e 4d 75 6c 20 20 20 20 20  gEst nInMul     
2c040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c050 20 6c 6f 67 28 4e 75 6d 62 65 72 20 6f 66 20 69   log(Number of i
2c060 74 65 72 61 74 69 6f 6e 73 20 64 75 65 20 74 6f  terations due to
2c070 20 49 4e 29 20 2a 2f 0a 29 7b 0a 20 20 57 68 65   IN) */.){.  Whe
2c080 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d  reInfo *pWInfo =
2c090 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
2c0a0 6f 3b 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61  o;  /* WHERE ana
2c0b0 6c 79 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  lyse context */.
2c0c0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
2c0d0 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
2c0e0 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ;        /* Pars
2c0f0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
2c100 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
2c110 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20  Parse->db;      
2c120 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
2c130 6e 65 63 74 69 6f 6e 20 6d 61 6c 6c 6f 63 20 63  nection malloc c
2c140 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
2c150 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20  eLoop *pNew;    
2c160 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2c170 65 6d 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f  emplate WhereLoo
2c180 70 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  p under construc
2c190 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54  tion */.  WhereT
2c1a0 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
2c1b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57            /* A W
2c1c0 68 65 72 65 54 65 72 6d 20 75 6e 64 65 72 20 63  hereTerm under c
2c1d0 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a  onsideration */.
2c1e0 20 20 69 6e 74 20 6f 70 4d 61 73 6b 3b 20 20 20    int opMask;   
2c1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c200 20 20 2f 2a 20 56 61 6c 69 64 20 6f 70 65 72 61    /* Valid opera
2c210 74 6f 72 73 20 66 6f 72 20 63 6f 6e 73 74 72 61  tors for constra
2c220 69 6e 74 73 20 2a 2f 0a 20 20 57 68 65 72 65 53  ints */.  WhereS
2c230 63 61 6e 20 73 63 61 6e 3b 20 20 20 20 20 20 20  can scan;       
2c240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
2c250 72 61 74 6f 72 20 66 6f 72 20 57 48 45 52 45 20  rator for WHERE 
2c260 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61  terms */.  Bitma
2c270 73 6b 20 73 61 76 65 64 5f 70 72 65 72 65 71 3b  sk saved_prereq;
2c280 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72             /* Or
2c290 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20  iginal value of 
2c2a0 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 2a 2f 0a  pNew->prereq */.
2c2b0 20 20 75 31 36 20 73 61 76 65 64 5f 6e 4c 54 65    u16 saved_nLTe
2c2c0 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
2c2d0 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
2c2e0 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4c 54  lue of pNew->nLT
2c2f0 65 72 6d 20 2a 2f 0a 20 20 75 31 36 20 73 61 76  erm */.  u16 sav
2c300 65 64 5f 6e 45 71 3b 20 20 20 20 20 20 20 20 20  ed_nEq;         
2c310 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
2c320 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e  inal value of pN
2c330 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  ew->u.btree.nEq 
2c340 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e  */.  u16 saved_n
2c350 53 6b 69 70 3b 20 20 20 20 20 20 20 20 20 20 20  Skip;           
2c360 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
2c370 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
2c380 6e 53 6b 69 70 20 2a 2f 0a 20 20 75 33 32 20 73  nSkip */.  u32 s
2c390 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 20 20 20  aved_wsFlags;   
2c3a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72             /* Or
2c3b0 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20  iginal value of 
2c3c0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 2a 2f  pNew->wsFlags */
2c3d0 0a 20 20 4c 6f 67 45 73 74 20 73 61 76 65 64 5f  .  LogEst saved_
2c3e0 6e 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20  nOut;           
2c3f0 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76     /* Original v
2c400 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f  alue of pNew->nO
2c410 75 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  ut */.  int iCol
2c420 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2c430 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
2c440 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69   of the column i
2c450 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  n the table */. 
2c460 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2c470 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
2c480 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
2c490 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 69 7a  */.  LogEst rSiz
2c4a0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2c4b0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2c4c0 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  f rows in the ta
2c4d0 62 6c 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  ble */.  LogEst 
2c4e0 72 4c 6f 67 53 69 7a 65 3b 20 20 20 20 20 20 20  rLogSize;       
2c4f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67 61           /* Loga
2c500 72 69 74 68 6d 20 6f 66 20 74 61 62 6c 65 20 73  rithm of table s
2c510 69 7a 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ize */.  WhereTe
2c520 72 6d 20 2a 70 54 6f 70 20 3d 20 30 2c 20 2a 70  rm *pTop = 0, *p
2c530 42 74 6d 20 3d 20 30 3b 20 2f 2a 20 54 6f 70 20  Btm = 0; /* Top 
2c540 61 6e 64 20 62 6f 74 74 6f 6d 20 72 61 6e 67 65  and bottom range
2c550 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
2c560 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64  .  pNew = pBuild
2c570 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 69 66 28 20  er->pNew;.  if( 
2c580 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2c590 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2c5a0 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 61 73 73 65 72  _NOMEM;..  asser
2c5b0 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67  t( (pNew->wsFlag
2c5c0 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
2c5d0 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20  LTABLE)==0 );.  
2c5e0 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77  assert( (pNew->w
2c5f0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54  sFlags & WHERE_T
2c600 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 20 29 3b 0a  OP_LIMIT)==0 );.
2c610 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c    if( pNew->wsFl
2c620 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
2c630 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 6f 70 4d  LIMIT ){.    opM
2c640 61 73 6b 20 3d 20 57 4f 5f 4c 54 7c 57 4f 5f 4c  ask = WO_LT|WO_L
2c650 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 2f  E;.  }else if( /
2c660 2a 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30  *pProbe->tnum<=0
2c670 20 7c 7c 2a 2f 20 28 70 53 72 63 2d 3e 6a 6f 69   ||*/ (pSrc->joi
2c680 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29  ntype & JT_LEFT)
2c690 21 3d 30 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73  !=0 ){.    opMas
2c6a0 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c  k = WO_EQ|WO_IN|
2c6b0 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c  WO_GT|WO_GE|WO_L
2c6c0 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65  T|WO_LE;.  }else
2c6d0 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57  {.    opMask = W
2c6e0 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 47 54  O_EQ|WO_IN|WO_GT
2c6f0 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f  |WO_GE|WO_LT|WO_
2c700 4c 45 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f  LE|WO_ISNULL|WO_
2c710 49 53 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  IS;.  }.  if( pP
2c720 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64  robe->bUnordered
2c730 20 29 20 6f 70 4d 61 73 6b 20 26 3d 20 7e 28 57   ) opMask &= ~(W
2c740 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54  O_GT|WO_GE|WO_LT
2c750 7c 57 4f 5f 4c 45 29 3b 0a 0a 20 20 61 73 73 65  |WO_LE);..  asse
2c760 72 74 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65  rt( pNew->u.btre
2c770 65 2e 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43  e.nEq<pProbe->nC
2c780 6f 6c 75 6d 6e 20 29 3b 0a 20 20 69 43 6f 6c 20  olumn );.  iCol 
2c790 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75  = pProbe->aiColu
2c7a0 6d 6e 5b 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  mn[pNew->u.btree
2c7b0 2e 6e 45 71 5d 3b 0a 0a 20 20 70 54 65 72 6d 20  .nEq];..  pTerm 
2c7c0 3d 20 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28  = whereScanInit(
2c7d0 26 73 63 61 6e 2c 20 70 42 75 69 6c 64 65 72 2d  &scan, pBuilder-
2c7e0 3e 70 57 43 2c 20 70 53 72 63 2d 3e 69 43 75 72  >pWC, pSrc->iCur
2c7f0 73 6f 72 2c 20 69 43 6f 6c 2c 0a 20 20 20 20 20  sor, iCol,.     
2c800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c810 20 20 20 6f 70 4d 61 73 6b 2c 20 70 50 72 6f 62     opMask, pProb
2c820 65 29 3b 0a 20 20 73 61 76 65 64 5f 6e 45 71 20  e);.  saved_nEq 
2c830 3d 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  = pNew->u.btree.
2c840 6e 45 71 3b 0a 20 20 73 61 76 65 64 5f 6e 53 6b  nEq;.  saved_nSk
2c850 69 70 20 3d 20 70 4e 65 77 2d 3e 6e 53 6b 69 70  ip = pNew->nSkip
2c860 3b 0a 20 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d  ;.  saved_nLTerm
2c870 20 3d 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3b   = pNew->nLTerm;
2c880 0a 20 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73  .  saved_wsFlags
2c890 20 3d 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73   = pNew->wsFlags
2c8a0 3b 0a 20 20 73 61 76 65 64 5f 70 72 65 72 65 71  ;.  saved_prereq
2c8b0 20 3d 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 3b   = pNew->prereq;
2c8c0 0a 20 20 73 61 76 65 64 5f 6e 4f 75 74 20 3d 20  .  saved_nOut = 
2c8d0 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20 70 4e  pNew->nOut;.  pN
2c8e0 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a  ew->rSetup = 0;.
2c8f0 20 20 72 53 69 7a 65 20 3d 20 70 50 72 6f 62 65    rSize = pProbe
2c900 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d  ->aiRowLogEst[0]
2c910 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65  ;.  rLogSize = e
2c920 73 74 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 20 20  stLog(rSize);.  
2c930 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45  for(; rc==SQLITE
2c940 5f 4f 4b 20 26 26 20 70 54 65 72 6d 21 3d 30 3b  _OK && pTerm!=0;
2c950 20 70 54 65 72 6d 20 3d 20 77 68 65 72 65 53 63   pTerm = whereSc
2c960 61 6e 4e 65 78 74 28 26 73 63 61 6e 29 29 7b 0a  anNext(&scan)){.
2c970 20 20 20 20 75 31 36 20 65 4f 70 20 3d 20 70 54      u16 eOp = pT
2c980 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3b 20  erm->eOperator; 
2c990 20 20 2f 2a 20 53 68 6f 72 74 68 61 6e 64 20 66    /* Shorthand f
2c9a0 6f 72 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  or pTerm->eOpera
2c9b0 74 6f 72 20 2a 2f 0a 20 20 20 20 4c 6f 67 45 73  tor */.    LogEs
2c9c0 74 20 72 43 6f 73 74 49 64 78 3b 0a 20 20 20 20  t rCostIdx;.    
2c9d0 4c 6f 67 45 73 74 20 6e 4f 75 74 55 6e 61 64 6a  LogEst nOutUnadj
2c9e0 75 73 74 65 64 3b 20 20 20 20 20 20 20 20 2f 2a  usted;        /*
2c9f0 20 6e 4f 75 74 20 62 65 66 6f 72 65 20 49 4e 28   nOut before IN(
2ca00 29 20 61 6e 64 20 57 48 45 52 45 20 61 64 6a 75  ) and WHERE adju
2ca10 73 74 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 69  stments */.    i
2ca20 6e 74 20 6e 49 6e 20 3d 20 30 3b 0a 23 69 66 64  nt nIn = 0;.#ifd
2ca30 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
2ca40 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
2ca50 20 20 20 20 69 6e 74 20 6e 52 65 63 56 61 6c 69      int nRecVali
2ca60 64 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52  d = pBuilder->nR
2ca70 65 63 56 61 6c 69 64 3b 0a 23 65 6e 64 69 66 0a  ecValid;.#endif.
2ca80 20 20 20 20 69 66 28 20 28 65 4f 70 3d 3d 57 4f      if( (eOp==WO
2ca90 5f 49 53 4e 55 4c 4c 20 7c 7c 20 28 70 54 65 72  _ISNULL || (pTer
2caa0 6d 2d 3e 77 74 46 6c 61 67 73 26 54 45 52 4d 5f  m->wtFlags&TERM_
2cab0 56 4e 55 4c 4c 29 21 3d 30 29 0a 20 20 20 20 20  VNULL)!=0).     
2cac0 26 26 20 28 69 43 6f 6c 3c 30 20 7c 7c 20 70 53  && (iCol<0 || pS
2cad0 72 63 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  rc->pTab->aCol[i
2cae0 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 29 0a 20 20  Col].notNull).  
2caf0 20 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69    ){.      conti
2cb00 6e 75 65 3b 20 2f 2a 20 69 67 6e 6f 72 65 20 49  nue; /* ignore I
2cb10 53 20 5b 4e 4f 54 5d 20 4e 55 4c 4c 20 63 6f 6e  S [NOT] NULL con
2cb20 73 74 72 61 69 6e 74 73 20 6f 6e 20 4e 4f 54 20  straints on NOT 
2cb30 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  NULL columns */.
2cb40 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54      }.    if( pT
2cb50 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
2cb60 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c   & pNew->maskSel
2cb70 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20  f ) continue;.. 
2cb80 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c     /* Do not all
2cb90 6f 77 20 74 68 65 20 75 70 70 65 72 20 62 6f 75  ow the upper bou
2cba0 6e 64 20 6f 66 20 61 20 4c 49 4b 45 20 6f 70 74  nd of a LIKE opt
2cbb0 69 6d 69 7a 61 74 69 6f 6e 20 72 61 6e 67 65 20  imization range 
2cbc0 63 6f 6e 73 74 72 61 69 6e 74 0a 20 20 20 20 2a  constraint.    *
2cbd0 2a 20 74 6f 20 6d 69 78 20 77 69 74 68 20 61 20  * to mix with a 
2cbe0 6c 6f 77 65 72 20 72 61 6e 67 65 20 62 6f 75 6e  lower range boun
2cbf0 64 20 66 72 6f 6d 20 73 6f 6d 65 20 6f 74 68 65  d from some othe
2cc00 72 20 73 6f 75 72 63 65 20 2a 2f 0a 20 20 20 20  r source */.    
2cc10 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  if( pTerm->wtFla
2cc20 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50  gs & TERM_LIKEOP
2cc30 54 20 26 26 20 70 54 65 72 6d 2d 3e 65 4f 70 65  T && pTerm->eOpe
2cc40 72 61 74 6f 72 3d 3d 57 4f 5f 4c 54 20 29 20 63  rator==WO_LT ) c
2cc50 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 70 4e  ontinue;..    pN
2cc60 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61  ew->wsFlags = sa
2cc70 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 20  ved_wsFlags;.   
2cc80 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
2cc90 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a  Eq = saved_nEq;.
2cca0 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d      pNew->nLTerm
2ccb0 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b   = saved_nLTerm;
2ccc0 0a 20 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f  .    if( whereLo
2ccd0 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65  opResize(db, pNe
2cce0 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b  w, pNew->nLTerm+
2ccf0 31 29 20 29 20 62 72 65 61 6b 3b 20 2f 2a 20 4f  1) ) break; /* O
2cd00 4f 4d 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e  OM */.    pNew->
2cd10 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54  aLTerm[pNew->nLT
2cd20 65 72 6d 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a  erm++] = pTerm;.
2cd30 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
2cd40 20 3d 20 28 73 61 76 65 64 5f 70 72 65 72 65 71   = (saved_prereq
2cd50 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71   | pTerm->prereq
2cd60 52 69 67 68 74 29 20 26 20 7e 70 4e 65 77 2d 3e  Right) & ~pNew->
2cd70 6d 61 73 6b 53 65 6c 66 3b 0a 0a 20 20 20 20 61  maskSelf;..    a
2cd80 73 73 65 72 74 28 20 6e 49 6e 4d 75 6c 3d 3d 30  ssert( nInMul==0
2cd90 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4e 65  .        || (pNe
2cda0 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
2cdb0 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 29 21  RE_COLUMN_NULL)!
2cdc0 3d 30 20 0a 20 20 20 20 20 20 20 20 7c 7c 20 28  =0 .        || (
2cdd0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
2cde0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29  WHERE_COLUMN_IN)
2cdf0 21 3d 30 20 0a 20 20 20 20 20 20 20 20 7c 7c 20  !=0 .        || 
2ce00 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
2ce10 20 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 29   WHERE_SKIPSCAN)
2ce20 21 3d 30 20 0a 20 20 20 20 29 3b 0a 0a 20 20 20  !=0 .    );..   
2ce30 20 69 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 4e   if( eOp & WO_IN
2ce40 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
2ce50 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70  pExpr = pTerm->p
2ce60 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77  Expr;.      pNew
2ce70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
2ce80 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20  RE_COLUMN_IN;.  
2ce90 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
2cea0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
2ceb0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
2cec0 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20 49 4e          /* "x IN
2ced0 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 3a 20   (SELECT ...)": 
2cee0 20 54 55 4e 49 4e 47 3a 20 74 68 65 20 53 45 4c   TUNING: the SEL
2cef0 45 43 54 20 72 65 74 75 72 6e 73 20 32 35 20 72  ECT returns 25 r
2cf00 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e  ows */.        n
2cf10 49 6e 20 3d 20 34 36 3b 20 20 61 73 73 65 72 74  In = 46;  assert
2cf20 28 20 34 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  ( 46==sqlite3Log
2cf30 45 73 74 28 32 35 29 20 29 3b 0a 20 20 20 20 20  Est(25) );.     
2cf40 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59   }else if( ALWAY
2cf50 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  S(pExpr->x.pList
2cf60 20 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69   && pExpr->x.pLi
2cf70 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20  st->nExpr) ){.  
2cf80 20 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28        /* "x IN (
2cf90 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e  value, value, ..
2cfa0 2e 29 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e  .)" */.        n
2cfb0 49 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  In = sqlite3LogE
2cfc0 73 74 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  st(pExpr->x.pLis
2cfd0 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20  t->nExpr);.     
2cfe0 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
2cff0 20 6e 49 6e 3e 30 20 29 3b 20 20 2f 2a 20 52 48   nIn>0 );  /* RH
2d000 53 20 61 6c 77 61 79 73 20 68 61 73 20 32 20 6f  S always has 2 o
2d010 72 20 6d 6f 72 65 20 74 65 72 6d 73 2e 2e 2e 20  r more terms... 
2d020 20 54 68 65 20 70 61 72 73 65 72 0a 20 20 20 20   The parser.    
2d030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d040 20 20 20 20 2a 2a 20 63 68 61 6e 67 65 73 20 22      ** changes "
2d050 78 20 49 4e 20 28 3f 29 22 20 69 6e 74 6f 20 22  x IN (?)" into "
2d060 78 3d 3f 22 2e 20 2a 2f 0a 0a 20 20 20 20 7d 65  x=?". */..    }e
2d070 6c 73 65 20 69 66 28 20 65 4f 70 20 26 20 28 57  lse if( eOp & (W
2d080 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 29 7b 0a 20  O_EQ|WO_IS) ){. 
2d090 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
2d0a0 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
2d0b0 4d 4e 5f 45 51 3b 0a 20 20 20 20 20 20 69 66 28  MN_EQ;.      if(
2d0c0 20 69 43 6f 6c 3c 30 20 7c 7c 20 28 6e 49 6e 4d   iCol<0 || (nInM
2d0d0 75 6c 3d 3d 30 20 26 26 20 70 4e 65 77 2d 3e 75  ul==0 && pNew->u
2d0e0 2e 62 74 72 65 65 2e 6e 45 71 3d 3d 70 50 72 6f  .btree.nEq==pPro
2d0f0 62 65 2d 3e 6e 4b 65 79 43 6f 6c 2d 31 29 20 29  be->nKeyCol-1) )
2d100 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  {.        if( iC
2d110 6f 6c 3e 3d 30 20 26 26 20 70 50 72 6f 62 65 2d  ol>=0 && pProbe-
2d120 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 3d 3d 30 20  >uniqNotNull==0 
2d130 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  ){.          pNe
2d140 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
2d150 45 52 45 5f 55 4e 51 5f 57 41 4e 54 45 44 3b 0a  ERE_UNQ_WANTED;.
2d160 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2d170 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77           pNew->w
2d180 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
2d190 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 20 20 20 20  ONEROW;.        
2d1a0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  }.      }.    }e
2d1b0 6c 73 65 20 69 66 28 20 65 4f 70 20 26 20 57 4f  lse if( eOp & WO
2d1c0 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  _ISNULL ){.     
2d1d0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c   pNew->wsFlags |
2d1e0 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e  = WHERE_COLUMN_N
2d1f0 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ULL;.    }else i
2d200 66 28 20 65 4f 70 20 26 20 28 57 4f 5f 47 54 7c  f( eOp & (WO_GT|
2d210 57 4f 5f 47 45 29 20 29 7b 0a 20 20 20 20 20 20  WO_GE) ){.      
2d220 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20  testcase( eOp & 
2d230 57 4f 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74  WO_GT );.      t
2d240 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57  estcase( eOp & W
2d250 4f 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 70 4e  O_GE );.      pN
2d260 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
2d270 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
2d280 45 7c 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  E|WHERE_BTM_LIMI
2d290 54 3b 0a 20 20 20 20 20 20 70 42 74 6d 20 3d 20  T;.      pBtm = 
2d2a0 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 6f  pTerm;.      pTo
2d2b0 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  p = 0;.      if(
2d2c0 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
2d2d0 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 29  & TERM_LIKEOPT )
2d2e0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 61 6e  {.        /* Ran
2d2f0 67 65 20 63 6f 6e 74 72 61 69 6e 74 73 20 74 68  ge contraints th
2d300 61 74 20 63 6f 6d 65 20 66 72 6f 6d 20 74 68 65  at come from the
2d310 20 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69   LIKE optimizati
2d320 6f 6e 20 61 72 65 0a 20 20 20 20 20 20 20 20 2a  on are.        *
2d330 2a 20 61 6c 77 61 79 73 20 75 73 65 64 20 69 6e  * always used in
2d340 20 70 61 69 72 73 2e 20 2a 2f 0a 20 20 20 20 20   pairs. */.     
2d350 20 20 20 70 54 6f 70 20 3d 20 26 70 54 65 72 6d     pTop = &pTerm
2d360 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73  [1];.        ass
2d370 65 72 74 28 20 28 70 54 6f 70 2d 28 70 54 65 72  ert( (pTop-(pTer
2d380 6d 2d 3e 70 57 43 2d 3e 61 29 29 3c 70 54 65 72  m->pWC->a))<pTer
2d390 6d 2d 3e 70 57 43 2d 3e 6e 54 65 72 6d 20 29 3b  m->pWC->nTerm );
2d3a0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2d3b0 20 70 54 6f 70 2d 3e 77 74 46 6c 61 67 73 20 26   pTop->wtFlags &
2d3c0 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 29 3b   TERM_LIKEOPT );
2d3d0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2d3e0 20 70 54 6f 70 2d 3e 65 4f 70 65 72 61 74 6f 72   pTop->eOperator
2d3f0 3d 3d 57 4f 5f 4c 54 20 29 3b 0a 20 20 20 20 20  ==WO_LT );.     
2d400 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70     if( whereLoop
2d410 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c  Resize(db, pNew,
2d420 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29   pNew->nLTerm+1)
2d430 20 29 20 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d   ) break; /* OOM
2d440 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77   */.        pNew
2d450 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e  ->aLTerm[pNew->n
2d460 4c 54 65 72 6d 2b 2b 5d 20 3d 20 70 54 6f 70 3b  LTerm++] = pTop;
2d470 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  .        pNew->w
2d480 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
2d490 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20  TOP_LIMIT;.     
2d4a0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
2d4b0 20 20 20 20 61 73 73 65 72 74 28 20 65 4f 70 20      assert( eOp 
2d4c0 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 20  & (WO_LT|WO_LE) 
2d4d0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
2d4e0 65 28 20 65 4f 70 20 26 20 57 4f 5f 4c 54 20 29  e( eOp & WO_LT )
2d4f0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
2d500 28 20 65 4f 70 20 26 20 57 4f 5f 4c 45 20 29 3b  ( eOp & WO_LE );
2d510 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  .      pNew->wsF
2d520 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f  lags |= WHERE_CO
2d530 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45  LUMN_RANGE|WHERE
2d540 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20  _TOP_LIMIT;.    
2d550 20 20 70 54 6f 70 20 3d 20 70 54 65 72 6d 3b 0a    pTop = pTerm;.
2d560 20 20 20 20 20 20 70 42 74 6d 20 3d 20 28 70 4e        pBtm = (pN
2d570 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
2d580 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 29 21 3d  ERE_BTM_LIMIT)!=
2d590 30 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20  0 ?.            
2d5a0 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61           pNew->a
2d5b0 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65  LTerm[pNew->nLTe
2d5c0 72 6d 2d 32 5d 20 3a 20 30 3b 0a 20 20 20 20 7d  rm-2] : 0;.    }
2d5d0 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73  ..    /* At this
2d5e0 20 70 6f 69 6e 74 20 70 4e 65 77 2d 3e 6e 4f 75   point pNew->nOu
2d5f0 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
2d600 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 65  number of rows e
2d610 78 70 65 63 74 65 64 20 74 6f 0a 20 20 20 20 2a  xpected to.    *
2d620 2a 20 62 65 20 76 69 73 69 74 65 64 20 62 79 20  * be visited by 
2d630 74 68 65 20 69 6e 64 65 78 20 73 63 61 6e 20 62  the index scan b
2d640 65 66 6f 72 65 20 63 6f 6e 73 69 64 65 72 69 6e  efore considerin
2d650 67 20 74 65 72 6d 20 70 54 65 72 6d 2c 20 6f 72  g term pTerm, or
2d660 20 74 68 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75   the.    ** valu
2d670 65 73 20 6f 66 20 6e 49 6e 20 61 6e 64 20 6e 49  es of nIn and nI
2d680 6e 4d 75 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77  nMul. In other w
2d690 6f 72 64 73 2c 20 61 73 73 75 6d 69 6e 67 20 74  ords, assuming t
2d6a0 68 61 74 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20  hat all .    ** 
2d6b0 22 78 20 49 4e 28 2e 2e 2e 29 22 20 74 65 72 6d  "x IN(...)" term
2d6c0 73 20 61 72 65 20 72 65 70 6c 61 63 65 64 20 77  s are replaced w
2d6d0 69 74 68 20 22 78 20 3d 20 3f 22 2e 20 54 68 69  ith "x = ?". Thi
2d6e0 73 20 62 6c 6f 63 6b 20 75 70 64 61 74 65 73 0a  s block updates.
2d6f0 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65      ** the value
2d700 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 74   of pNew->nOut t
2d710 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 70 54  o account for pT
2d720 65 72 6d 20 28 62 75 74 20 6e 6f 74 20 6e 49 6e  erm (but not nIn
2d730 2f 6e 49 6e 4d 75 6c 29 2e 20 20 2a 2f 0a 20 20  /nInMul).  */.  
2d740 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
2d750 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74  nOut==saved_nOut
2d760 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77   );.    if( pNew
2d770 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
2d780 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29  E_COLUMN_RANGE )
2d790 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75 73  {.      /* Adjus
2d7a0 74 20 6e 4f 75 74 20 75 73 69 6e 67 20 73 74 61  t nOut using sta
2d7b0 74 33 2f 73 74 61 74 34 20 64 61 74 61 2e 20 4f  t3/stat4 data. O
2d7c0 72 2c 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  r, if there is n
2d7d0 6f 20 73 74 61 74 33 2f 73 74 61 74 34 0a 20 20  o stat3/stat4.  
2d7e0 20 20 20 20 2a 2a 20 64 61 74 61 2c 20 75 73 69      ** data, usi
2d7f0 6e 67 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 73  ng some other es
2d800 74 69 6d 61 74 65 2e 20 20 2a 2f 0a 20 20 20 20  timate.  */.    
2d810 20 20 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e    whereRangeScan
2d820 45 73 74 28 70 50 61 72 73 65 2c 20 70 42 75 69  Est(pParse, pBui
2d830 6c 64 65 72 2c 20 70 42 74 6d 2c 20 70 54 6f 70  lder, pBtm, pTop
2d840 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 7d 65 6c  , pNew);.    }el
2d850 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45  se{.      int nE
2d860 71 20 3d 20 2b 2b 70 4e 65 77 2d 3e 75 2e 62 74  q = ++pNew->u.bt
2d870 72 65 65 2e 6e 45 71 3b 0a 20 20 20 20 20 20 61  ree.nEq;.      a
2d880 73 73 65 72 74 28 20 65 4f 70 20 26 20 28 57 4f  ssert( eOp & (WO
2d890 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51 7c 57 4f  _ISNULL|WO_EQ|WO
2d8a0 5f 49 4e 7c 57 4f 5f 49 53 29 20 29 3b 0a 0a 20  _IN|WO_IS) );.. 
2d8b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65       assert( pNe
2d8c0 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e  w->nOut==saved_n
2d8d0 4f 75 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28  Out );.      if(
2d8e0 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f   pTerm->truthPro
2d8f0 62 3c 3d 30 20 26 26 20 69 43 6f 6c 3e 3d 30 20  b<=0 && iCol>=0 
2d900 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
2d910 74 28 20 28 65 4f 70 20 26 20 57 4f 5f 49 4e 29  t( (eOp & WO_IN)
2d920 20 7c 7c 20 6e 49 6e 3d 3d 30 20 29 3b 0a 20 20   || nIn==0 );.  
2d930 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2d940 65 4f 70 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20  eOp & WO_IN );. 
2d950 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75         pNew->nOu
2d960 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74  t += pTerm->trut
2d970 68 50 72 6f 62 3b 0a 20 20 20 20 20 20 20 20 70  hProb;.        p
2d980 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 6e  New->nOut -= nIn
2d990 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 23  ;.      }else{.#
2d9a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
2d9b0 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
2d9c0 54 34 0a 20 20 20 20 20 20 20 20 74 52 6f 77 63  T4.        tRowc
2d9d0 6e 74 20 6e 4f 75 74 20 3d 20 30 3b 0a 20 20 20  nt nOut = 0;.   
2d9e0 20 20 20 20 20 69 66 28 20 6e 49 6e 4d 75 6c 3d       if( nInMul=
2d9f0 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26 26 20  =0 .         && 
2da00 70 50 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 20  pProbe->nSample 
2da10 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 4e 65  .         && pNe
2da20 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 3d  w->u.btree.nEq<=
2da30 70 50 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 43  pProbe->nSampleC
2da40 6f 6c 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  ol.         && (
2da50 28 65 4f 70 20 26 20 57 4f 5f 49 4e 29 3d 3d 30  (eOp & WO_IN)==0
2da60 20 7c 7c 20 21 45 78 70 72 48 61 73 50 72 6f 70   || !ExprHasProp
2da70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70  erty(pTerm->pExp
2da80 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
2da90 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
2daa0 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78         Expr *pEx
2dab0 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pr = pTerm->pExp
2dac0 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  r;.          if(
2dad0 20 28 65 4f 70 20 26 20 28 57 4f 5f 45 51 7c 57   (eOp & (WO_EQ|W
2dae0 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53 29 29  O_ISNULL|WO_IS))
2daf0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
2db00 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70     testcase( eOp
2db10 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20   & WO_EQ );.    
2db20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2db30 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 20 29 3b  ( eOp & WO_IS );
2db40 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
2db50 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f  tcase( eOp & WO_
2db60 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  ISNULL );.      
2db70 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
2db80 45 71 75 61 6c 53 63 61 6e 45 73 74 28 70 50 61  EqualScanEst(pPa
2db90 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70  rse, pBuilder, p
2dba0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 6e  Expr->pRight, &n
2dbb0 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Out);.          
2dbc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2dbd0 20 20 20 72 63 20 3d 20 77 68 65 72 65 49 6e 53     rc = whereInS
2dbe0 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70  canEst(pParse, p
2dbf0 42 75 69 6c 64 65 72 2c 20 70 45 78 70 72 2d 3e  Builder, pExpr->
2dc00 78 2e 70 4c 69 73 74 2c 20 26 6e 4f 75 74 29 3b  x.pList, &nOut);
2dc10 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2dc20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
2dc30 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29  QLITE_NOTFOUND )
2dc40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2dc50 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
2dc60 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62  c!=SQLITE_OK ) b
2dc70 72 65 61 6b 3b 20 20 20 20 20 20 20 20 20 20 2f  reak;          /
2dc80 2a 20 4a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68  * Jump out of th
2dc90 65 20 70 54 65 72 6d 20 6c 6f 6f 70 20 2a 2f 0a  e pTerm loop */.
2dca0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f            if( nO
2dcb0 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ut ){.          
2dcc0 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73    pNew->nOut = s
2dcd0 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 6e 4f 75  qlite3LogEst(nOu
2dce0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
2dcf0 69 66 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3e 73  if( pNew->nOut>s
2dd00 61 76 65 64 5f 6e 4f 75 74 20 29 20 70 4e 65 77  aved_nOut ) pNew
2dd10 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e  ->nOut = saved_n
2dd20 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Out;.           
2dd30 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e   pNew->nOut -= n
2dd40 49 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  In;.          }.
2dd50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2dd60 20 20 69 66 28 20 6e 4f 75 74 3d 3d 30 20 29 0a    if( nOut==0 ).
2dd70 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b  #endif.        {
2dd80 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
2dd90 3e 6e 4f 75 74 20 2b 3d 20 28 70 50 72 6f 62 65  >nOut += (pProbe
2dda0 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 6e 45  ->aiRowLogEst[nE
2ddb0 71 5d 20 2d 20 70 50 72 6f 62 65 2d 3e 61 69 52  q] - pProbe->aiR
2ddc0 6f 77 4c 6f 67 45 73 74 5b 6e 45 71 2d 31 5d 29  owLogEst[nEq-1])
2ddd0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2dde0 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20  eOp & WO_ISNULL 
2ddf0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
2de00 2a 20 54 55 4e 49 4e 47 3a 20 49 66 20 74 68 65  * TUNING: If the
2de10 72 65 20 69 73 20 6e 6f 20 6c 69 6b 65 6c 69 68  re is no likelih
2de20 6f 6f 64 28 29 20 76 61 6c 75 65 2c 20 61 73 73  ood() value, ass
2de30 75 6d 65 20 74 68 61 74 20 61 20 0a 20 20 20 20  ume that a .    
2de40 20 20 20 20 20 20 20 20 2a 2a 20 22 63 6f 6c 20          ** "col 
2de50 49 53 20 4e 55 4c 4c 22 20 65 78 70 72 65 73 73  IS NULL" express
2de60 69 6f 6e 20 6d 61 74 63 68 65 73 20 74 77 69 63  ion matches twic
2de70 65 20 61 73 20 6d 61 6e 79 20 72 6f 77 73 20 0a  e as many rows .
2de80 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61              ** a
2de90 73 20 28 63 6f 6c 3d 3f 29 2e 20 2a 2f 0a 20 20  s (col=?). */.  
2dea0 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
2deb0 6e 4f 75 74 20 2b 3d 20 31 30 3b 0a 20 20 20 20  nOut += 10;.    
2dec0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2ded0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
2dee0 0a 20 20 20 20 2f 2a 20 53 65 74 20 72 43 6f 73  .    /* Set rCos
2def0 74 49 64 78 20 74 6f 20 74 68 65 20 63 6f 73 74  tIdx to the cost
2df00 20 6f 66 20 76 69 73 69 74 69 6e 67 20 73 65 6c   of visiting sel
2df10 65 63 74 65 64 20 72 6f 77 73 20 69 6e 20 69 6e  ected rows in in
2df20 64 65 78 2e 20 41 64 64 0a 20 20 20 20 2a 2a 20  dex. Add.    ** 
2df30 69 74 20 74 6f 20 70 4e 65 77 2d 3e 72 52 75 6e  it to pNew->rRun
2df40 2c 20 77 68 69 63 68 20 69 73 20 63 75 72 72 65  , which is curre
2df50 6e 74 6c 79 20 73 65 74 20 74 6f 20 74 68 65 20  ntly set to the 
2df60 63 6f 73 74 20 6f 66 20 74 68 65 20 69 6e 64 65  cost of the inde
2df70 78 0a 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f 6e  x.    ** seek on
2df80 6c 79 2e 20 54 68 65 6e 2c 20 69 66 20 74 68 69  ly. Then, if thi
2df90 73 20 69 73 20 61 20 6e 6f 6e 2d 63 6f 76 65 72  s is a non-cover
2dfa0 69 6e 67 20 69 6e 64 65 78 2c 20 61 64 64 20 74  ing index, add t
2dfb0 68 65 20 63 6f 73 74 20 6f 66 0a 20 20 20 20 2a  he cost of.    *
2dfc0 2a 20 76 69 73 69 74 69 6e 67 20 74 68 65 20 72  * visiting the r
2dfd0 6f 77 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  ows in the main 
2dfe0 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 72  table.  */.    r
2dff0 43 6f 73 74 49 64 78 20 3d 20 70 4e 65 77 2d 3e  CostIdx = pNew->
2e000 6e 4f 75 74 20 2b 20 31 20 2b 20 28 31 35 2a 70  nOut + 1 + (15*p
2e010 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 29  Probe->szIdxRow)
2e020 2f 70 53 72 63 2d 3e 70 54 61 62 2d 3e 73 7a 54  /pSrc->pTab->szT
2e030 61 62 52 6f 77 3b 0a 20 20 20 20 70 4e 65 77 2d  abRow;.    pNew-
2e040 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c  >rRun = sqlite3L
2e050 6f 67 45 73 74 41 64 64 28 72 4c 6f 67 53 69 7a  ogEstAdd(rLogSiz
2e060 65 2c 20 72 43 6f 73 74 49 64 78 29 3b 0a 20 20  e, rCostIdx);.  
2e070 20 20 69 66 28 20 28 70 4e 65 77 2d 3e 77 73 46    if( (pNew->wsF
2e080 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 49 44  lags & (WHERE_ID
2e090 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 50 4b  X_ONLY|WHERE_IPK
2e0a0 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ))==0 ){.      p
2e0b0 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69  New->rRun = sqli
2e0c0 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70 4e 65  te3LogEstAdd(pNe
2e0d0 77 2d 3e 72 52 75 6e 2c 20 70 4e 65 77 2d 3e 6e  w->rRun, pNew->n
2e0e0 4f 75 74 20 2b 20 31 36 29 3b 0a 20 20 20 20 7d  Out + 16);.    }
2e0f0 0a 20 20 20 20 41 70 70 6c 79 43 6f 73 74 4d 75  .    ApplyCostMu
2e100 6c 74 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72  ltiplier(pNew->r
2e110 52 75 6e 2c 20 70 50 72 6f 62 65 2d 3e 70 54 61  Run, pProbe->pTa
2e120 62 6c 65 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a  ble->costMult);.
2e130 0a 20 20 20 20 6e 4f 75 74 55 6e 61 64 6a 75 73  .    nOutUnadjus
2e140 74 65 64 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74  ted = pNew->nOut
2e150 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e  ;.    pNew->rRun
2e160 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e   += nInMul + nIn
2e170 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74  ;.    pNew->nOut
2e180 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e   += nInMul + nIn
2e190 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f  ;.    whereLoopO
2e1a0 75 74 70 75 74 41 64 6a 75 73 74 28 70 42 75 69  utputAdjust(pBui
2e1b0 6c 64 65 72 2d 3e 70 57 43 2c 20 70 4e 65 77 2c  lder->pWC, pNew,
2e1c0 20 72 53 69 7a 65 29 3b 0a 20 20 20 20 72 63 20   rSize);.    rc 
2e1d0 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72  = whereLoopInser
2e1e0 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77  t(pBuilder, pNew
2e1f0 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e 65 77  );..    if( pNew
2e200 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
2e210 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29  E_COLUMN_RANGE )
2e220 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f  {.      pNew->nO
2e230 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b  ut = saved_nOut;
2e240 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2e250 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e    pNew->nOut = n
2e260 4f 75 74 55 6e 61 64 6a 75 73 74 65 64 3b 0a 20  OutUnadjusted;. 
2e270 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70     }..    if( (p
2e280 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
2e290 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d  HERE_TOP_LIMIT)=
2e2a0 3d 30 0a 20 20 20 20 20 26 26 20 70 4e 65 77 2d  =0.     && pNew-
2e2b0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 70 50 72  >u.btree.nEq<pPr
2e2c0 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 0a 20 20 20  obe->nColumn.   
2e2d0 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4c   ){.      whereL
2e2e0 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65 78  oopAddBtreeIndex
2e2f0 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c  (pBuilder, pSrc,
2e300 20 70 50 72 6f 62 65 2c 20 6e 49 6e 4d 75 6c 2b   pProbe, nInMul+
2e310 6e 49 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nIn);.    }.    
2e320 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76  pNew->nOut = sav
2e330 65 64 5f 6e 4f 75 74 3b 0a 23 69 66 64 65 66 20  ed_nOut;.#ifdef 
2e340 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
2e350 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20  AT3_OR_STAT4.   
2e360 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56   pBuilder->nRecV
2e370 61 6c 69 64 20 3d 20 6e 52 65 63 56 61 6c 69 64  alid = nRecValid
2e380 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70  ;.#endif.  }.  p
2e390 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 73 61  New->prereq = sa
2e3a0 76 65 64 5f 70 72 65 72 65 71 3b 0a 20 20 70 4e  ved_prereq;.  pN
2e3b0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  ew->u.btree.nEq 
2e3c0 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 70  = saved_nEq;.  p
2e3d0 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 73 61 76  New->nSkip = sav
2e3e0 65 64 5f 6e 53 6b 69 70 3b 0a 20 20 70 4e 65 77  ed_nSkip;.  pNew
2e3f0 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65  ->wsFlags = save
2e400 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 70 4e 65  d_wsFlags;.  pNe
2e410 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f  w->nOut = saved_
2e420 6e 4f 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c  nOut;.  pNew->nL
2e430 54 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54  Term = saved_nLT
2e440 65 72 6d 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 69  erm;..  /* Consi
2e450 64 65 72 20 75 73 69 6e 67 20 61 20 73 6b 69 70  der using a skip
2e460 2d 73 63 61 6e 20 69 66 20 74 68 65 72 65 20 61  -scan if there a
2e470 72 65 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75  re no WHERE clau
2e480 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20  se constraints. 
2e490 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f   ** available fo
2e4a0 72 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  r the left-most 
2e4b0 74 65 72 6d 73 20 6f 66 20 74 68 65 20 69 6e 64  terms of the ind
2e4c0 65 78 2c 20 61 6e 64 20 69 66 20 74 68 65 20 61  ex, and if the a
2e4d0 76 65 72 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62  verage.  ** numb
2e4e0 65 72 20 6f 66 20 72 65 70 65 61 74 73 20 69 6e  er of repeats in
2e4f0 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74   the left-most t
2e500 65 72 6d 73 20 69 73 20 61 74 20 6c 65 61 73 74  erms is at least
2e510 20 31 38 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20   18. .  **.  ** 
2e520 54 68 65 20 6d 61 67 69 63 20 6e 75 6d 62 65 72  The magic number
2e530 20 31 38 20 69 73 20 73 65 6c 65 63 74 65 64 20   18 is selected 
2e540 6f 6e 20 74 68 65 20 62 61 73 69 73 20 74 68 61  on the basis tha
2e550 74 20 73 63 61 6e 6e 69 6e 67 20 31 37 20 72 6f  t scanning 17 ro
2e560 77 73 0a 20 20 2a 2a 20 69 73 20 61 6c 6d 6f 73  ws.  ** is almos
2e570 74 20 61 6c 77 61 79 73 20 71 75 69 63 6b 65 72  t always quicker
2e580 20 74 68 61 6e 20 61 6e 20 69 6e 64 65 78 20 73   than an index s
2e590 65 65 6b 20 28 65 76 65 6e 20 74 68 6f 75 67 68  eek (even though
2e5a0 20 69 66 20 74 68 65 20 69 6e 64 65 78 0a 20 20   if the index.  
2e5b0 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 66 65 77 65  ** contains fewe
2e5c0 72 20 74 68 61 6e 20 32 5e 31 37 20 72 6f 77 73  r than 2^17 rows
2e5d0 20 77 65 20 61 73 73 75 6d 65 20 6f 74 68 65 72   we assume other
2e5e0 77 69 73 65 20 69 6e 20 6f 74 68 65 72 20 70 61  wise in other pa
2e5f0 72 74 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  rts of.  ** the 
2e600 63 6f 64 65 29 2e 20 41 6e 64 2c 20 65 76 65 6e  code). And, even
2e610 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 69   if it is not, i
2e620 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  t should not be 
2e630 74 6f 6f 20 6d 75 63 68 20 73 6c 6f 77 65 72 2e  too much slower.
2e640 20 0a 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74   .  ** On the ot
2e650 68 65 72 20 68 61 6e 64 2c 20 74 68 65 20 65 78  her hand, the ex
2e660 74 72 61 20 73 65 65 6b 73 20 63 6f 75 6c 64 20  tra seeks could 
2e670 65 6e 64 20 75 70 20 62 65 69 6e 67 20 73 69 67  end up being sig
2e680 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20  nificantly.  ** 
2e690 6d 6f 72 65 20 65 78 70 65 6e 73 69 76 65 2e 20  more expensive. 
2e6a0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 34 32   */.  assert( 42
2e6b0 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
2e6c0 31 38 29 20 29 3b 0a 20 20 69 66 28 20 73 61 76  18) );.  if( sav
2e6d0 65 64 5f 6e 45 71 3d 3d 73 61 76 65 64 5f 6e 53  ed_nEq==saved_nS
2e6e0 6b 69 70 0a 20 20 20 26 26 20 73 61 76 65 64 5f  kip.   && saved_
2e6f0 6e 45 71 2b 31 3c 70 50 72 6f 62 65 2d 3e 6e 4b  nEq+1<pProbe->nK
2e700 65 79 43 6f 6c 0a 20 20 20 26 26 20 70 50 72 6f  eyCol.   && pPro
2e710 62 65 2d 3e 6e 6f 53 6b 69 70 53 63 61 6e 3d 3d  be->noSkipScan==
2e720 30 0a 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e  0.   && pProbe->
2e730 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65  aiRowLogEst[save
2e740 64 5f 6e 45 71 2b 31 5d 3e 3d 34 32 20 20 2f 2a  d_nEq+1]>=42  /*
2e750 20 54 55 4e 49 4e 47 3a 20 4d 69 6e 69 6d 75 6d   TUNING: Minimum
2e760 20 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20 2a   for skip-scan *
2e770 2f 0a 20 20 20 26 26 20 28 72 63 20 3d 20 77 68  /.   && (rc = wh
2e780 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62  ereLoopResize(db
2e790 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c  , pNew, pNew->nL
2e7a0 54 65 72 6d 2b 31 29 29 3d 3d 53 51 4c 49 54 45  Term+1))==SQLITE
2e7b0 5f 4f 4b 0a 20 20 29 7b 0a 20 20 20 20 4c 6f 67  _OK.  ){.    Log
2e7c0 45 73 74 20 6e 49 74 65 72 3b 0a 20 20 20 20 70  Est nIter;.    p
2e7d0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
2e7e0 2b 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53  ++;.    pNew->nS
2e7f0 6b 69 70 2b 2b 3b 0a 20 20 20 20 70 4e 65 77 2d  kip++;.    pNew-
2e800 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c  >aLTerm[pNew->nL
2e810 54 65 72 6d 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20  Term++] = 0;.   
2e820 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c   pNew->wsFlags |
2e830 3d 20 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e  = WHERE_SKIPSCAN
2e840 3b 0a 20 20 20 20 6e 49 74 65 72 20 3d 20 70 50  ;.    nIter = pP
2e850 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  robe->aiRowLogEs
2e860 74 5b 73 61 76 65 64 5f 6e 45 71 5d 20 2d 20 70  t[saved_nEq] - p
2e870 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45  Probe->aiRowLogE
2e880 73 74 5b 73 61 76 65 64 5f 6e 45 71 2b 31 5d 3b  st[saved_nEq+1];
2e890 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  .    pNew->nOut 
2e8a0 2d 3d 20 6e 49 74 65 72 3b 0a 20 20 20 20 2f 2a  -= nIter;.    /*
2e8b0 20 54 55 4e 49 4e 47 3a 20 20 42 65 63 61 75 73   TUNING:  Becaus
2e8c0 65 20 75 6e 63 65 72 74 61 69 6e 74 69 65 73 20  e uncertainties 
2e8d0 69 6e 20 74 68 65 20 65 73 74 69 6d 61 74 65 73  in the estimates
2e8e0 20 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20 71   for skip-scan q
2e8f0 75 65 72 69 65 73 2c 0a 20 20 20 20 2a 2a 20 61  ueries,.    ** a
2e900 64 64 20 61 20 31 2e 33 37 35 20 66 75 64 67 65  dd a 1.375 fudge
2e910 20 66 61 63 74 6f 72 20 74 6f 20 6d 61 6b 65 20   factor to make 
2e920 73 6b 69 70 2d 73 63 61 6e 20 73 6c 69 67 68 74  skip-scan slight
2e930 6c 79 20 6c 65 73 73 20 6c 69 6b 65 6c 79 2e 20  ly less likely. 
2e940 2a 2f 0a 20 20 20 20 6e 49 74 65 72 20 2b 3d 20  */.    nIter += 
2e950 35 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  5;.    whereLoop
2e960 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 70 42  AddBtreeIndex(pB
2e970 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50  uilder, pSrc, pP
2e980 72 6f 62 65 2c 20 6e 49 74 65 72 20 2b 20 6e 49  robe, nIter + nI
2e990 6e 4d 75 6c 29 3b 0a 20 20 20 20 70 4e 65 77 2d  nMul);.    pNew-
2e9a0 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f  >nOut = saved_nO
2e9b0 75 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ut;.    pNew->u.
2e9c0 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65  btree.nEq = save
2e9d0 64 5f 6e 45 71 3b 0a 20 20 20 20 70 4e 65 77 2d  d_nEq;.    pNew-
2e9e0 3e 6e 53 6b 69 70 20 3d 20 73 61 76 65 64 5f 6e  >nSkip = saved_n
2e9f0 53 6b 69 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Skip;.    pNew->
2ea00 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f  wsFlags = saved_
2ea10 77 73 46 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20  wsFlags;.  }..  
2ea20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2ea30 0a 2a 2a 20 52 65 74 75 72 6e 20 54 72 75 65 20  .** Return True 
2ea40 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  if it is possibl
2ea50 65 20 74 68 61 74 20 70 49 6e 64 65 78 20 6d 69  e that pIndex mi
2ea60 67 68 74 20 62 65 20 75 73 65 66 75 6c 20 69 6e  ght be useful in
2ea70 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67  .** implementing
2ea80 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
2ea90 61 75 73 65 20 69 6e 20 70 42 75 69 6c 64 65 72  ause in pBuilder
2eaa0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46  ..**.** Return F
2eab0 61 6c 73 65 20 69 66 20 70 42 75 69 6c 64 65 72  alse if pBuilder
2eac0 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69   does not contai
2ead0 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  n an ORDER BY cl
2eae0 61 75 73 65 20 6f 72 0a 2a 2a 20 69 66 20 74 68  ause or.** if th
2eaf0 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 66 6f  ere is no way fo
2eb00 72 20 70 49 6e 64 65 78 20 74 6f 20 62 65 20 75  r pIndex to be u
2eb10 73 65 66 75 6c 20 69 6e 20 69 6d 70 6c 65 6d 65  seful in impleme
2eb20 6e 74 69 6e 67 20 74 68 61 74 0a 2a 2a 20 4f 52  nting that.** OR
2eb30 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a  DER BY clause..*
2eb40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 64  /.static int ind
2eb50 65 78 4d 69 67 68 74 48 65 6c 70 57 69 74 68 4f  exMightHelpWithO
2eb60 72 64 65 72 42 79 28 0a 20 20 57 68 65 72 65 4c  rderBy(.  WhereL
2eb70 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
2eb80 6c 64 65 72 2c 0a 20 20 49 6e 64 65 78 20 2a 70  lder,.  Index *p
2eb90 49 6e 64 65 78 2c 0a 20 20 69 6e 74 20 69 43 75  Index,.  int iCu
2eba0 72 73 6f 72 0a 29 7b 0a 20 20 45 78 70 72 4c 69  rsor.){.  ExprLi
2ebb0 73 74 20 2a 70 4f 42 3b 0a 20 20 69 6e 74 20 69  st *pOB;.  int i
2ebc0 69 2c 20 6a 6a 3b 0a 0a 20 20 69 66 28 20 70 49  i, jj;..  if( pI
2ebd0 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64  ndex->bUnordered
2ebe0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
2ebf0 66 28 20 28 70 4f 42 20 3d 20 70 42 75 69 6c 64  f( (pOB = pBuild
2ec00 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  er->pWInfo->pOrd
2ec10 65 72 42 79 29 3d 3d 30 20 29 20 72 65 74 75 72  erBy)==0 ) retur
2ec20 6e 20 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b  n 0;.  for(ii=0;
2ec30 20 69 69 3c 70 4f 42 2d 3e 6e 45 78 70 72 3b 20   ii<pOB->nExpr; 
2ec40 69 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20  ii++){.    Expr 
2ec50 2a 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  *pExpr = sqlite3
2ec60 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
2ec70 70 4f 42 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72  pOB->a[ii].pExpr
2ec80 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  );.    if( pExpr
2ec90 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
2eca0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
2ecb0 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  if( pExpr->iTabl
2ecc0 65 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20  e==iCursor ){.  
2ecd0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
2ece0 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72  Column<0 ) retur
2ecf0 6e 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  n 1;.      for(j
2ed00 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65 78 2d 3e  j=0; jj<pIndex->
2ed10 6e 4b 65 79 43 6f 6c 3b 20 6a 6a 2b 2b 29 7b 0a  nKeyCol; jj++){.
2ed20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
2ed30 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64  r->iColumn==pInd
2ed40 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 6a 5d  ex->aiColumn[jj]
2ed50 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
2ed60 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
2ed70 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
2ed80 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 62 69 74  .** Return a bit
2ed90 6d 61 73 6b 20 77 68 65 72 65 20 31 73 20 69 6e  mask where 1s in
2eda0 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
2edb0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f  corresponding co
2edc0 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 74  lumn of.** the t
2edd0 61 62 6c 65 20 69 73 20 75 73 65 64 20 62 79 20  able is used by 
2ede0 61 6e 20 69 6e 64 65 78 2e 20 20 4f 6e 6c 79 20  an index.  Only 
2edf0 74 68 65 20 66 69 72 73 74 20 36 33 20 63 6f 6c  the first 63 col
2ee00 75 6d 6e 73 20 61 72 65 20 63 6f 6e 73 69 64 65  umns are conside
2ee10 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42  red..*/.static B
2ee20 69 74 6d 61 73 6b 20 63 6f 6c 75 6d 6e 73 49 6e  itmask columnsIn
2ee30 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70 49 64  Index(Index *pId
2ee40 78 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 20  x){.  Bitmask m 
2ee50 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  = 0;.  int j;.  
2ee60 66 6f 72 28 6a 3d 70 49 64 78 2d 3e 6e 43 6f 6c  for(j=pIdx->nCol
2ee70 75 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d  umn-1; j>=0; j--
2ee80 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 70  ){.    int x = p
2ee90 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
2eea0 3b 0a 20 20 20 20 69 66 28 20 78 3e 3d 30 20 29  ;.    if( x>=0 )
2eeb0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
2eec0 28 20 78 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  ( x==BMS-1 );.  
2eed0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d      testcase( x=
2eee0 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 20 20 20 20  =BMS-2 );.      
2eef0 69 66 28 20 78 3c 42 4d 53 2d 31 20 29 20 6d 20  if( x<BMS-1 ) m 
2ef00 7c 3d 20 4d 41 53 4b 42 49 54 28 78 29 3b 0a 20  |= MASKBIT(x);. 
2ef10 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2ef20 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 20 43 68 65 63 6b  n m;.}../* Check
2ef30 20 74 6f 20 73 65 65 20 69 66 20 61 20 70 61 72   to see if a par
2ef40 74 69 61 6c 20 69 6e 64 65 78 20 77 69 74 68 20  tial index with 
2ef50 70 50 61 72 74 49 6e 64 65 78 57 68 65 72 65 20  pPartIndexWhere 
2ef60 63 61 6e 20 62 65 20 75 73 65 64 0a 2a 2a 20 69  can be used.** i
2ef70 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 71 75  n the current qu
2ef80 65 72 79 2e 20 20 52 65 74 75 72 6e 20 74 72 75  ery.  Return tru
2ef90 65 20 69 66 20 69 74 20 63 61 6e 20 62 65 20 61  e if it can be a
2efa0 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e  nd false if not.
2efb0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
2efc0 68 65 72 65 55 73 61 62 6c 65 50 61 72 74 69 61  hereUsablePartia
2efd0 6c 49 6e 64 65 78 28 69 6e 74 20 69 54 61 62 2c  lIndex(int iTab,
2efe0 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
2eff0 43 2c 20 45 78 70 72 20 2a 70 57 68 65 72 65 29  C, Expr *pWhere)
2f000 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65  {.  int i;.  Whe
2f010 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
2f020 20 66 6f 72 28 69 3d 30 2c 20 70 54 65 72 6d 3d   for(i=0, pTerm=
2f030 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e  pWC->a; i<pWC->n
2f040 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d  Term; i++, pTerm
2f050 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
2f060 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45  Expr = pTerm->pE
2f070 78 70 72 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  xpr;.    if( sql
2f080 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45  ite3ExprImpliesE
2f090 78 70 72 28 70 45 78 70 72 2c 20 70 57 68 65 72  xpr(pExpr, pWher
2f0a0 65 2c 20 69 54 61 62 29 20 0a 20 20 20 20 20 26  e, iTab) .     &
2f0b0 26 20 28 21 45 78 70 72 48 61 73 50 72 6f 70 65  & (!ExprHasPrope
2f0c0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72  rty(pExpr, EP_Fr
2f0d0 6f 6d 4a 6f 69 6e 29 20 7c 7c 20 70 45 78 70 72  omJoin) || pExpr
2f0e0 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
2f0f0 65 3d 3d 69 54 61 62 29 0a 20 20 20 20 29 7b 0a  e==iTab).    ){.
2f100 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
2f110 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2f120 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn 0;.}../*.** A
2f130 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70  dd all WhereLoop
2f140 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 20 73   objects for a s
2f150 69 6e 67 6c 65 20 74 61 62 6c 65 20 6f 66 20 74  ingle table of t
2f160 68 65 20 6a 6f 69 6e 20 77 68 65 72 65 20 74 68  he join where th
2f170 65 20 74 61 62 6c 65 0a 2a 2a 20 69 73 20 69 64  e table.** is id
2f180 65 6e 66 69 65 64 20 62 79 20 70 42 75 69 6c 64  enfied by pBuild
2f190 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20  er->pNew->iTab. 
2f1a0 20 54 68 61 74 20 74 61 62 6c 65 20 69 73 20 67   That table is g
2f1b0 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 0a  uaranteed to be.
2f1c0 2a 2a 20 61 20 62 2d 74 72 65 65 20 74 61 62 6c  ** a b-tree tabl
2f1d0 65 2c 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c  e, not a virtual
2f1e0 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   table..**.** Th
2f1f0 65 20 63 6f 73 74 73 20 28 57 68 65 72 65 4c 6f  e costs (WhereLo
2f200 6f 70 2e 72 52 75 6e 29 20 6f 66 20 74 68 65 20  op.rRun) of the 
2f210 62 2d 74 72 65 65 20 6c 6f 6f 70 73 20 61 64 64  b-tree loops add
2f220 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
2f230 69 6f 6e 0a 2a 2a 20 61 72 65 20 63 61 6c 63 75  ion.** are calcu
2f240 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  lated as follows
2f250 3a 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 66 75  :.**.** For a fu
2f260 6c 6c 20 73 63 61 6e 2c 20 61 73 73 75 6d 69 6e  ll scan, assumin
2f270 67 20 74 68 65 20 74 61 62 6c 65 20 28 6f 72 20  g the table (or 
2f280 69 6e 64 65 78 29 20 63 6f 6e 74 61 69 6e 73 20  index) contains 
2f290 6e 52 6f 77 20 72 6f 77 73 3a 0a 2a 2a 0a 2a 2a  nRow rows:.**.**
2f2a0 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77       cost = nRow
2f2b0 20 2a 20 33 2e 30 20 20 20 20 20 20 20 20 20 20   * 3.0          
2f2c0 20 20 20 20 20 20 20 20 20 20 2f 2f 20 66 75 6c            // ful
2f2d0 6c 2d 74 61 62 6c 65 20 73 63 61 6e 0a 2a 2a 20  l-table scan.** 
2f2e0 20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20      cost = nRow 
2f2f0 2a 20 4b 20 20 20 20 20 20 20 20 20 20 20 20 20  * K             
2f300 20 20 20 20 20 20 20 20 20 2f 2f 20 73 63 61 6e           // scan
2f310 20 6f 66 20 63 6f 76 65 72 69 6e 67 20 69 6e 64   of covering ind
2f320 65 78 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d  ex.**     cost =
2f330 20 6e 52 6f 77 20 2a 20 28 4b 2b 33 2e 30 29 20   nRow * (K+3.0) 
2f340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f350 2f 20 73 63 61 6e 20 6f 66 20 6e 6f 6e 2d 63 6f  / scan of non-co
2f360 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a  vering index.**.
2f370 2a 2a 20 77 68 65 72 65 20 4b 20 69 73 20 61 20  ** where K is a 
2f380 76 61 6c 75 65 20 62 65 74 77 65 65 6e 20 31 2e  value between 1.
2f390 31 20 61 6e 64 20 33 2e 30 20 73 65 74 20 62 61  1 and 3.0 set ba
2f3a0 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6c 61 74  sed on the relat
2f3b0 69 76 65 20 0a 2a 2a 20 65 73 74 69 6d 61 74 65  ive .** estimate
2f3c0 64 20 61 76 65 72 61 67 65 20 73 69 7a 65 20 6f  d average size o
2f3d0 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  f the index and 
2f3e0 74 61 62 6c 65 20 72 65 63 6f 72 64 73 2e 0a 2a  table records..*
2f3f0 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 64 65  *.** For an inde
2f400 78 20 73 63 61 6e 2c 20 77 68 65 72 65 20 6e 56  x scan, where nV
2f410 69 73 69 74 20 69 73 20 74 68 65 20 6e 75 6d 62  isit is the numb
2f420 65 72 20 6f 66 20 69 6e 64 65 78 20 72 6f 77 73  er of index rows
2f430 20 76 69 73 69 74 65 64 0a 2a 2a 20 62 79 20 74   visited.** by t
2f440 68 65 20 73 63 61 6e 2c 20 61 6e 64 20 6e 53 65  he scan, and nSe
2f450 65 6b 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ek is the number
2f460 20 6f 66 20 73 65 65 6b 20 6f 70 65 72 61 74 69   of seek operati
2f470 6f 6e 73 20 72 65 71 75 69 72 65 64 20 6f 6e 20  ons required on 
2f480 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 62 2d  .** the index b-
2f490 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  tree:.**.**     
2f4a0 63 6f 73 74 20 3d 20 6e 53 65 65 6b 20 2a 20 28  cost = nSeek * (
2f4b0 6c 6f 67 28 6e 52 6f 77 29 20 2b 20 4b 20 2a 20  log(nRow) + K * 
2f4c0 6e 56 69 73 69 74 29 20 20 20 20 20 20 20 20 20  nVisit)         
2f4d0 20 2f 2f 20 63 6f 76 65 72 69 6e 67 20 69 6e 64   // covering ind
2f4e0 65 78 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d  ex.**     cost =
2f4f0 20 6e 53 65 65 6b 20 2a 20 28 6c 6f 67 28 6e 52   nSeek * (log(nR
2f500 6f 77 29 20 2b 20 28 4b 2b 33 2e 30 29 20 2a 20  ow) + (K+3.0) * 
2f510 6e 56 69 73 69 74 29 20 20 20 20 2f 2f 20 6e 6f  nVisit)    // no
2f520 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  n-covering index
2f530 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  .**.** Normally,
2f540 20 6e 53 65 65 6b 20 69 73 20 31 2e 20 6e 53 65   nSeek is 1. nSe
2f550 65 6b 20 76 61 6c 75 65 73 20 67 72 65 61 74 65  ek values greate
2f560 72 20 74 68 61 6e 20 31 20 63 6f 6d 65 20 61 62  r than 1 come ab
2f570 6f 75 74 20 69 66 20 74 68 65 20 0a 2a 2a 20 57  out if the .** W
2f580 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 63 6c  HERE clause incl
2f590 75 64 65 73 20 22 78 20 49 4e 20 28 2e 2e 2e 2e  udes "x IN (....
2f5a0 29 22 20 74 65 72 6d 73 20 75 73 65 64 20 69 6e  )" terms used in
2f5b0 20 70 6c 61 63 65 20 6f 66 20 22 78 3d 3f 22 2e   place of "x=?".
2f5c0 20 4f 72 20 77 68 65 6e 20 0a 2a 2a 20 69 6d 70   Or when .** imp
2f5d0 6c 69 63 69 74 20 22 78 20 49 4e 20 28 53 45 4c  licit "x IN (SEL
2f5e0 45 43 54 20 78 20 46 52 4f 4d 20 74 62 6c 29 22  ECT x FROM tbl)"
2f5f0 20 74 65 72 6d 73 20 61 72 65 20 61 64 64 65 64   terms are added
2f600 20 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 73 2e   for skip-scans.
2f610 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d  .**.** The estim
2f620 61 74 65 64 20 76 61 6c 75 65 73 20 28 6e 52 6f  ated values (nRo
2f630 77 2c 20 6e 56 69 73 69 74 2c 20 6e 53 65 65 6b  w, nVisit, nSeek
2f640 29 20 6f 66 74 65 6e 20 63 6f 6e 74 61 69 6e 20  ) often contain 
2f650 61 20 6c 61 72 67 65 20 61 6d 6f 75 6e 74 0a 2a  a large amount.*
2f660 2a 20 6f 66 20 75 6e 63 65 72 74 61 69 6e 74 79  * of uncertainty
2f670 2e 20 20 46 6f 72 20 74 68 69 73 20 72 65 61 73  .  For this reas
2f680 6f 6e 2c 20 73 63 6f 72 69 6e 67 20 69 73 20 64  on, scoring is d
2f690 65 73 69 67 6e 65 64 20 74 6f 20 70 69 63 6b 20  esigned to pick 
2f6a0 70 6c 61 6e 73 20 74 68 61 74 0a 2a 2a 20 22 64  plans that.** "d
2f6b0 6f 20 74 68 65 20 6c 65 61 73 74 20 68 61 72 6d  o the least harm
2f6c0 22 20 69 66 20 74 68 65 20 65 73 74 69 6d 61 74  " if the estimat
2f6d0 65 73 20 61 72 65 20 69 6e 61 63 63 75 72 61 74  es are inaccurat
2f6e0 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  e.  For example,
2f6f0 20 61 0a 2a 2a 20 6c 6f 67 28 6e 52 6f 77 29 20   a.** log(nRow) 
2f700 66 61 63 74 6f 72 20 69 73 20 6f 6d 69 74 74 65  factor is omitte
2f710 64 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 63 6f 76  d from a non-cov
2f720 65 72 69 6e 67 20 69 6e 64 65 78 20 73 63 61 6e  ering index scan
2f730 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 2a 2a 20   in order to.** 
2f740 62 69 61 73 20 74 68 65 20 73 63 6f 72 69 6e 67  bias the scoring
2f750 20 69 6e 20 66 61 76 6f 72 20 6f 66 20 75 73 69   in favor of usi
2f760 6e 67 20 61 6e 20 69 6e 64 65 78 2c 20 73 69 6e  ng an index, sin
2f770 63 65 20 74 68 65 20 77 6f 72 73 74 2d 63 61 73  ce the worst-cas
2f780 65 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65  e.** performance
2f790 20 6f 66 20 75 73 69 6e 67 20 61 6e 20 69 6e 64   of using an ind
2f7a0 65 78 20 69 73 20 66 61 72 20 62 65 74 74 65 72  ex is far better
2f7b0 20 74 68 61 6e 20 74 68 65 20 77 6f 72 73 74 2d   than the worst-
2f7c0 63 61 73 65 20 70 65 72 66 6f 72 6d 61 6e 63 65  case performance
2f7d0 0a 2a 2a 20 6f 66 20 61 20 66 75 6c 6c 20 74 61  .** of a full ta
2f7e0 62 6c 65 20 73 63 61 6e 2e 0a 2a 2f 0a 73 74 61  ble scan..*/.sta
2f7f0 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
2f800 70 41 64 64 42 74 72 65 65 28 0a 20 20 57 68 65  pAddBtree(.  Whe
2f810 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
2f820 42 75 69 6c 64 65 72 2c 20 2f 2a 20 57 48 45 52  Builder, /* WHER
2f830 45 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61  E clause informa
2f840 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73  tion */.  Bitmas
2f850 6b 20 6d 45 78 74 72 61 20 20 20 20 20 20 20 20  k mExtra        
2f860 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 70        /* Extra p
2f870 72 65 72 65 71 75 65 73 69 74 65 73 20 66 6f 72  rerequesites for
2f880 20 75 73 69 6e 67 20 74 68 69 73 20 74 61 62 6c   using this tabl
2f890 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49  e */.){.  WhereI
2f8a0 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20  nfo *pWInfo;    
2f8b0 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 61        /* WHERE a
2f8c0 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65 78 74 20  nalysis context 
2f8d0 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f  */.  Index *pPro
2f8e0 62 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  be;             
2f8f0 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 77 65 20   /* An index we 
2f900 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67 20 2a  are evaluating *
2f910 2f 0a 20 20 49 6e 64 65 78 20 73 50 6b 3b 20 20  /.  Index sPk;  
2f920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f930 2f 2a 20 41 20 66 61 6b 65 20 69 6e 64 65 78 20  /* A fake index 
2f940 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20 70  object for the p
2f950 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20  rimary key */.  
2f960 4c 6f 67 45 73 74 20 61 69 52 6f 77 45 73 74 50  LogEst aiRowEstP
2f970 6b 5b 32 5d 3b 20 20 20 20 20 20 20 2f 2a 20 54  k[2];       /* T
2f980 68 65 20 61 69 52 6f 77 4c 6f 67 45 73 74 5b 5d  he aiRowLogEst[]
2f990 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73   value for the s
2f9a0 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 31  Pk index */.  i1
2f9b0 36 20 61 69 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d  6 aiColumnPk = -
2f9c0 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  1;        /* The
2f9d0 20 61 43 6f 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65   aColumn[] value
2f9e0 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64   for the sPk ind
2f9f0 65 78 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  ex */.  SrcList 
2fa00 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20 20  *pTabList;      
2fa10 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20      /* The FROM 
2fa20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
2fa30 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
2fa40 2a 70 53 72 63 3b 20 20 2f 2a 20 54 68 65 20 46  *pSrc;  /* The F
2fa50 52 4f 4d 20 63 6c 61 75 73 65 20 62 74 72 65 65  ROM clause btree
2fa60 20 74 65 72 6d 20 74 6f 20 61 64 64 20 2a 2f 0a   term to add */.
2fa70 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65    WhereLoop *pNe
2fa80 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  w;            /*
2fa90 20 54 65 6d 70 6c 61 74 65 20 57 68 65 72 65 4c   Template WhereL
2faa0 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  oop object */.  
2fab0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2fac0 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52  OK;         /* R
2fad0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
2fae0 69 6e 74 20 69 53 6f 72 74 49 64 78 20 3d 20 31  int iSortIdx = 1
2faf0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ;           /* I
2fb00 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  ndex number */. 
2fb10 20 69 6e 74 20 62 3b 20 20 20 20 20 20 20 20 20   int b;         
2fb20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fb30 41 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20  A boolean value 
2fb40 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 69 7a  */.  LogEst rSiz
2fb50 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2fb60 20 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f   /* number of ro
2fb70 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ws in the table 
2fb80 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f 67  */.  LogEst rLog
2fb90 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
2fba0 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66   /* Logarithm of
2fbb0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
2fbc0 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
2fbd0 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
2fbe0 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20  e *pWC;         
2fbf0 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 64 20    /* The parsed 
2fc00 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
2fc10 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
2fc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2fc30 20 54 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65   Table being que
2fc40 72 69 65 64 20 2a 2f 0a 20 20 0a 20 20 70 4e 65  ried */.  .  pNe
2fc50 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  w = pBuilder->pN
2fc60 65 77 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70  ew;.  pWInfo = p
2fc70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b  Builder->pWInfo;
2fc80 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 57  .  pTabList = pW
2fc90 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a  Info->pTabList;.
2fca0 20 20 70 53 72 63 20 3d 20 70 54 61 62 4c 69 73    pSrc = pTabLis
2fcb0 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61  t->a + pNew->iTa
2fcc0 62 3b 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63  b;.  pTab = pSrc
2fcd0 2d 3e 70 54 61 62 3b 0a 20 20 70 57 43 20 3d 20  ->pTab;.  pWC = 
2fce0 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20  pBuilder->pWC;. 
2fcf0 20 61 73 73 65 72 74 28 20 21 49 73 56 69 72 74   assert( !IsVirt
2fd00 75 61 6c 28 70 53 72 63 2d 3e 70 54 61 62 29 20  ual(pSrc->pTab) 
2fd10 29 3b 0a 0a 20 20 69 66 28 20 70 53 72 63 2d 3e  );..  if( pSrc->
2fd20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 2f 2a  pIndex ){.    /*
2fd30 20 41 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63   An INDEXED BY c
2fd40 6c 61 75 73 65 20 73 70 65 63 69 66 69 65 73 20  lause specifies 
2fd50 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64  a particular ind
2fd60 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20  ex to use */.   
2fd70 20 70 50 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e   pProbe = pSrc->
2fd80 70 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 20  pIndex;.  }else 
2fd90 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54  if( !HasRowid(pT
2fda0 61 62 29 20 29 7b 0a 20 20 20 20 70 50 72 6f 62  ab) ){.    pProb
2fdb0 65 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78  e = pTab->pIndex
2fdc0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
2fdd0 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 49 4e  * There is no IN
2fde0 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2e  DEXED BY clause.
2fdf0 20 20 43 72 65 61 74 65 20 61 20 66 61 6b 65 20    Create a fake 
2fe00 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 69 6e 20  Index object in 
2fe10 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76 61 72  local.    ** var
2fe20 69 61 62 6c 65 20 73 50 6b 20 74 6f 20 72 65 70  iable sPk to rep
2fe30 72 65 73 65 6e 74 20 74 68 65 20 72 6f 77 69 64  resent the rowid
2fe40 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64   primary key ind
2fe50 65 78 2e 20 20 4d 61 6b 65 20 74 68 69 73 0a 20  ex.  Make this. 
2fe60 20 20 20 2a 2a 20 66 61 6b 65 20 69 6e 64 65 78     ** fake index
2fe70 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 20   the first in a 
2fe80 63 68 61 69 6e 20 6f 66 20 49 6e 64 65 78 20 6f  chain of Index o
2fe90 62 6a 65 63 74 73 20 77 69 74 68 20 61 6c 6c 20  bjects with all 
2fea0 6f 66 20 74 68 65 20 72 65 61 6c 0a 20 20 20 20  of the real.    
2feb0 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 66 6f  ** indices to fo
2fec0 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 49 6e 64 65  llow */.    Inde
2fed0 78 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20  x *pFirst;      
2fee0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2fef0 69 72 73 74 20 6f 66 20 72 65 61 6c 20 69 6e 64  irst of real ind
2ff00 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c  ices on the tabl
2ff10 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  e */.    memset(
2ff20 26 73 50 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sPk, 0, sizeof(
2ff30 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 73 50 6b  Index));.    sPk
2ff40 2e 6e 4b 65 79 43 6f 6c 20 3d 20 31 3b 0a 20 20  .nKeyCol = 1;.  
2ff50 20 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20    sPk.nColumn = 
2ff60 31 3b 0a 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c  1;.    sPk.aiCol
2ff70 75 6d 6e 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50  umn = &aiColumnP
2ff80 6b 3b 0a 20 20 20 20 73 50 6b 2e 61 69 52 6f 77  k;.    sPk.aiRow
2ff90 4c 6f 67 45 73 74 20 3d 20 61 69 52 6f 77 45 73  LogEst = aiRowEs
2ffa0 74 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e 45  tPk;.    sPk.onE
2ffb0 72 72 6f 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63  rror = OE_Replac
2ffc0 65 3b 0a 20 20 20 20 73 50 6b 2e 70 54 61 62 6c  e;.    sPk.pTabl
2ffd0 65 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 73 50  e = pTab;.    sP
2ffe0 6b 2e 73 7a 49 64 78 52 6f 77 20 3d 20 70 54 61  k.szIdxRow = pTa
2fff0 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20  b->szTabRow;.   
30000 20 61 69 52 6f 77 45 73 74 50 6b 5b 30 5d 20 3d   aiRowEstPk[0] =
30010 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73   pTab->nRowLogEs
30020 74 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50  t;.    aiRowEstP
30030 6b 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 70 46  k[1] = 0;.    pF
30040 69 72 73 74 20 3d 20 70 53 72 63 2d 3e 70 54 61  irst = pSrc->pTa
30050 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69  b->pIndex;.    i
30060 66 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65  f( pSrc->notInde
30070 78 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  xed==0 ){.      
30080 2f 2a 20 54 68 65 20 72 65 61 6c 20 69 6e 64 69  /* The real indi
30090 63 65 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ces of the table
300a0 20 61 72 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64   are only consid
300b0 65 72 65 64 20 69 66 20 74 68 65 0a 20 20 20 20  ered if the.    
300c0 20 20 2a 2a 20 4e 4f 54 20 49 4e 44 45 58 45 44    ** NOT INDEXED
300d0 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 6f 6d   qualifier is om
300e0 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 46  itted from the F
300f0 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
30100 20 20 20 20 73 50 6b 2e 70 4e 65 78 74 20 3d 20      sPk.pNext = 
30110 70 46 69 72 73 74 3b 0a 20 20 20 20 7d 0a 20 20  pFirst;.    }.  
30120 20 20 70 50 72 6f 62 65 20 3d 20 26 73 50 6b 3b    pProbe = &sPk;
30130 0a 20 20 7d 0a 20 20 72 53 69 7a 65 20 3d 20 70  .  }.  rSize = p
30140 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b  Tab->nRowLogEst;
30150 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73  .  rLogSize = es
30160 74 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 0a 23 69  tLog(rSize);..#i
30170 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
30180 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
30190 58 0a 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63  X.  /* Automatic
301a0 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69 66   indexes */.  if
301b0 28 20 21 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72  ( !pBuilder->pOr
301c0 53 65 74 0a 20 20 20 26 26 20 28 70 57 49 6e 66  Set.   && (pWInf
301d0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
301e0 57 48 45 52 45 5f 4e 4f 5f 41 55 54 4f 49 4e 44  WHERE_NO_AUTOIND
301f0 45 58 29 3d 3d 30 0a 20 20 20 26 26 20 28 70 57  EX)==0.   && (pW
30200 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62  Info->pParse->db
30210 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
30220 5f 41 75 74 6f 49 6e 64 65 78 29 21 3d 30 0a 20  _AutoIndex)!=0. 
30230 20 20 26 26 20 70 53 72 63 2d 3e 70 49 6e 64 65    && pSrc->pInde
30240 78 3d 3d 30 0a 20 20 20 26 26 20 21 70 53 72 63  x==0.   && !pSrc
30250 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 0a 20 20 20  ->notIndexed.   
30260 26 26 20 48 61 73 52 6f 77 69 64 28 70 54 61 62  && HasRowid(pTab
30270 29 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e 69  ).   && !pSrc->i
30280 73 43 6f 72 72 65 6c 61 74 65 64 0a 20 20 20 26  sCorrelated.   &
30290 26 20 21 70 53 72 63 2d 3e 69 73 52 65 63 75 72  & !pSrc->isRecur
302a0 73 69 76 65 0a 20 20 29 7b 0a 20 20 20 20 2f 2a  sive.  ){.    /*
302b0 20 47 65 6e 65 72 61 74 65 20 61 75 74 6f 2d 69   Generate auto-i
302c0 6e 64 65 78 20 57 68 65 72 65 4c 6f 6f 70 73 20  ndex WhereLoops 
302d0 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  */.    WhereTerm
302e0 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 57 68 65   *pTerm;.    Whe
302f0 72 65 54 65 72 6d 20 2a 70 57 43 45 6e 64 20 3d  reTerm *pWCEnd =
30300 20 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e   pWC->a + pWC->n
30310 54 65 72 6d 3b 0a 20 20 20 20 66 6f 72 28 70 54  Term;.    for(pT
30320 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 72 63 3d 3d  erm=pWC->a; rc==
30330 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 54 65  SQLITE_OK && pTe
30340 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d  rm<pWCEnd; pTerm
30350 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
30360 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
30370 74 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65  t & pNew->maskSe
30380 6c 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  lf ) continue;. 
30390 20 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e       if( termCan
303a0 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d  DriveIndex(pTerm
303b0 2c 20 70 53 72 63 2c 20 30 29 20 29 7b 0a 20 20  , pSrc, 0) ){.  
303c0 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74        pNew->u.bt
303d0 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20  ree.nEq = 1;.   
303e0 20 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70       pNew->nSkip
303f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4e   = 0;.        pN
30400 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  ew->u.btree.pInd
30410 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ex = 0;.        
30420 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31  pNew->nLTerm = 1
30430 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
30440 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72  aLTerm[0] = pTer
30450 6d 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55  m;.        /* TU
30460 4e 49 4e 47 3a 20 4f 6e 65 2d 74 69 6d 65 20 63  NING: One-time c
30470 6f 73 74 20 66 6f 72 20 63 6f 6d 70 75 74 69 6e  ost for computin
30480 67 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  g the automatic 
30490 69 6e 64 65 78 20 69 73 0a 20 20 20 20 20 20 20  index is.       
304a0 20 2a 2a 20 65 73 74 69 6d 61 74 65 64 20 74 6f   ** estimated to
304b0 20 62 65 20 58 2a 4e 2a 6c 6f 67 32 28 4e 29 20   be X*N*log2(N) 
304c0 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e  where N is the n
304d0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
304e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
304f0 74 61 62 6c 65 20 62 65 69 6e 67 20 69 6e 64 65  table being inde
30500 78 65 64 20 61 6e 64 20 77 68 65 72 65 20 58 20  xed and where X 
30510 69 73 20 37 20 28 4c 6f 67 45 73 74 3d 32 38 29  is 7 (LogEst=28)
30520 20 66 6f 72 20 6e 6f 72 6d 61 6c 0a 20 20 20 20   for normal.    
30530 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 20 6f 72      ** tables or
30540 20 31 2e 33 37 35 20 28 4c 6f 67 45 73 74 3d 34   1.375 (LogEst=4
30550 29 20 66 6f 72 20 76 69 65 77 73 20 61 6e 64 20  ) for views and 
30560 73 75 62 71 75 65 72 69 65 73 2e 20 20 54 68 65  subqueries.  The
30570 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20 2a   value.        *
30580 2a 20 6f 66 20 58 20 69 73 20 73 6d 61 6c 6c 65  * of X is smalle
30590 72 20 66 6f 72 20 76 69 65 77 73 20 61 6e 64 20  r for views and 
305a0 73 75 62 71 75 65 72 69 65 73 20 73 6f 20 74 68  subqueries so th
305b0 61 74 20 74 68 65 20 71 75 65 72 79 20 70 6c 61  at the query pla
305c0 6e 6e 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  nner.        ** 
305d0 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20 61 67 67  will be more agg
305e0 72 65 73 73 69 76 65 20 61 62 6f 75 74 20 67 65  ressive about ge
305f0 6e 65 72 61 74 69 6e 67 20 61 75 74 6f 6d 61 74  nerating automat
30600 69 63 20 69 6e 64 65 78 65 73 20 66 6f 72 0a 20  ic indexes for. 
30610 20 20 20 20 20 20 20 2a 2a 20 74 68 6f 73 65 20         ** those 
30620 6f 62 6a 65 63 74 73 2c 20 73 69 6e 63 65 20 74  objects, since t
30630 68 65 72 65 20 69 73 20 6e 6f 20 6f 70 70 6f 72  here is no oppor
30640 74 75 6e 69 74 79 20 74 6f 20 61 64 64 20 73 63  tunity to add sc
30650 68 65 6d 61 0a 20 20 20 20 20 20 20 20 2a 2a 20  hema.        ** 
30660 69 6e 64 65 78 65 73 20 6f 6e 20 73 75 62 71 75  indexes on subqu
30670 65 72 69 65 73 20 61 6e 64 20 76 69 65 77 73 2e  eries and views.
30680 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77   */.        pNew
30690 2d 3e 72 53 65 74 75 70 20 3d 20 72 4c 6f 67 53  ->rSetup = rLogS
306a0 69 7a 65 20 2b 20 72 53 69 7a 65 20 2b 20 34 3b  ize + rSize + 4;
306b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61  .        if( pTa
306c0 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 26 26  b->pSelect==0 &&
306d0 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73   (pTab->tabFlags
306e0 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29   & TF_Ephemeral)
306f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
30700 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 2b 3d   pNew->rSetup +=
30710 20 32 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   24;.        }. 
30720 20 20 20 20 20 20 20 41 70 70 6c 79 43 6f 73 74         ApplyCost
30730 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e 65 77 2d  Multiplier(pNew-
30740 3e 72 53 65 74 75 70 2c 20 70 54 61 62 2d 3e 63  >rSetup, pTab->c
30750 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20 20 20 20  ostMult);.      
30760 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 61 63    /* TUNING: Eac
30770 68 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 79  h index lookup y
30780 69 65 6c 64 73 20 32 30 20 72 6f 77 73 20 69 6e  ields 20 rows in
30790 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 69   the table.  Thi
307a0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  s.        ** is 
307b0 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20 75 73  more than the us
307c0 75 61 6c 20 67 75 65 73 73 20 6f 66 20 31 30 20  ual guess of 10 
307d0 72 6f 77 73 2c 20 73 69 6e 63 65 20 77 65 20 68  rows, since we h
307e0 61 76 65 20 6e 6f 20 77 61 79 0a 20 20 20 20 20  ave no way.     
307f0 20 20 20 2a 2a 20 6f 66 20 6b 6e 6f 77 69 6e 67     ** of knowing
30800 20 68 6f 77 20 73 65 6c 65 63 74 69 76 65 20 74   how selective t
30810 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 75 6c  he index will ul
30820 74 69 6d 61 74 65 6c 79 20 62 65 2e 20 20 49 74  timately be.  It
30830 20 77 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 2a   would.        *
30840 2a 20 6e 6f 74 20 62 65 20 75 6e 72 65 61 73 6f  * not be unreaso
30850 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 74 68  nable to make th
30860 69 73 20 76 61 6c 75 65 20 6d 75 63 68 20 6c 61  is value much la
30870 72 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20  rger. */.       
30880 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 34 33   pNew->nOut = 43
30890 3b 20 20 61 73 73 65 72 74 28 20 34 33 3d 3d 73  ;  assert( 43==s
308a0 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 30 29  qlite3LogEst(20)
308b0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   );.        pNew
308c0 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33  ->rRun = sqlite3
308d0 4c 6f 67 45 73 74 41 64 64 28 72 4c 6f 67 53 69  LogEstAdd(rLogSi
308e0 7a 65 2c 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b 0a  ze,pNew->nOut);.
308f0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73          pNew->ws
30900 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 41 55  Flags = WHERE_AU
30910 54 4f 5f 49 4e 44 45 58 3b 0a 20 20 20 20 20 20  TO_INDEX;.      
30920 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
30930 20 6d 45 78 74 72 61 20 7c 20 70 54 65 72 6d 2d   mExtra | pTerm-
30940 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20  >prereqRight;.  
30950 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
30960 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c  LoopInsert(pBuil
30970 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  der, pNew);.    
30980 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
30990 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
309a0 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  MIT_AUTOMATIC_IN
309b0 44 45 58 20 2a 2f 0a 0a 20 20 2f 2a 20 4c 6f 6f  DEX */..  /* Loo
309c0 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 69 63  p over all indic
309d0 65 73 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 3b 20  es.  */.  for(; 
309e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
309f0 20 70 50 72 6f 62 65 3b 20 70 50 72 6f 62 65 3d   pProbe; pProbe=
30a00 70 50 72 6f 62 65 2d 3e 70 4e 65 78 74 2c 20 69  pProbe->pNext, i
30a10 53 6f 72 74 49 64 78 2b 2b 29 7b 0a 20 20 20 20  SortIdx++){.    
30a20 69 66 28 20 70 50 72 6f 62 65 2d 3e 70 50 61 72  if( pProbe->pPar
30a30 74 49 64 78 57 68 65 72 65 21 3d 30 0a 20 20 20  tIdxWhere!=0.   
30a40 20 20 26 26 20 21 77 68 65 72 65 55 73 61 62 6c    && !whereUsabl
30a50 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28 70 53  ePartialIndex(pS
30a60 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20 70 57 43  rc->iCursor, pWC
30a70 2c 20 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49  , pProbe->pPartI
30a80 64 78 57 68 65 72 65 29 20 29 7b 0a 20 20 20 20  dxWhere) ){.    
30a90 20 20 74 65 73 74 63 61 73 65 28 20 70 4e 65 77    testcase( pNew
30aa0 2d 3e 69 54 61 62 21 3d 70 53 72 63 2d 3e 69 43  ->iTab!=pSrc->iC
30ab0 75 72 73 6f 72 20 29 3b 20 20 2f 2a 20 53 65 65  ursor );  /* See
30ac0 20 74 69 63 6b 65 74 20 5b 39 38 64 39 37 33 62   ticket [98d973b
30ad0 38 66 35 5d 20 2a 2f 0a 20 20 20 20 20 20 63 6f  8f5] */.      co
30ae0 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 50 61 72 74  ntinue;  /* Part
30af0 69 61 6c 20 69 6e 64 65 78 20 69 6e 61 70 70 72  ial index inappr
30b00 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 69 73  opriate for this
30b10 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 7d 0a   query */.    }.
30b20 20 20 20 20 72 53 69 7a 65 20 3d 20 70 50 72 6f      rSize = pPro
30b30 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b  be->aiRowLogEst[
30b40 30 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e  0];.    pNew->u.
30b50 62 74 72 65 65 2e 6e 45 71 20 3d 20 30 3b 0a 20  btree.nEq = 0;. 
30b60 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d     pNew->nSkip =
30b70 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c   0;.    pNew->nL
30b80 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 70 4e  Term = 0;.    pN
30b90 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 30  ew->iSortIdx = 0
30ba0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74  ;.    pNew->rSet
30bb0 75 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  up = 0;.    pNew
30bc0 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45 78 74 72  ->prereq = mExtr
30bd0 61 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75  a;.    pNew->nOu
30be0 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 70  t = rSize;.    p
30bf0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  New->u.btree.pIn
30c00 64 65 78 20 3d 20 70 50 72 6f 62 65 3b 0a 20 20  dex = pProbe;.  
30c10 20 20 62 20 3d 20 69 6e 64 65 78 4d 69 67 68 74    b = indexMight
30c20 48 65 6c 70 57 69 74 68 4f 72 64 65 72 42 79 28  HelpWithOrderBy(
30c30 70 42 75 69 6c 64 65 72 2c 20 70 50 72 6f 62 65  pBuilder, pProbe
30c40 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 29  , pSrc->iCursor)
30c50 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 4f 4e 45  ;.    /* The ONE
30c60 50 41 53 53 5f 44 45 53 49 52 45 44 20 66 6c 61  PASS_DESIRED fla
30c70 67 73 20 6e 65 76 65 72 20 6f 63 63 75 72 73 20  gs never occurs 
30c80 74 6f 67 65 74 68 65 72 20 77 69 74 68 20 4f 52  together with OR
30c90 44 45 52 20 42 59 20 2a 2f 0a 20 20 20 20 61 73  DER BY */.    as
30ca0 73 65 72 74 28 20 28 70 57 49 6e 66 6f 2d 3e 77  sert( (pWInfo->w
30cb0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
30cc0 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
30cd0 44 29 3d 3d 30 20 7c 7c 20 62 3d 3d 30 20 29 3b  D)==0 || b==0 );
30ce0 0a 20 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d  .    if( pProbe-
30cf0 3e 74 6e 75 6d 3c 3d 30 20 29 7b 0a 20 20 20 20  >tnum<=0 ){.    
30d00 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 70 72 69    /* Integer pri
30d10 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20 2a  mary key index *
30d20 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  /.      pNew->ws
30d30 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 49 50  Flags = WHERE_IP
30d40 4b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 75 6c  K;..      /* Ful
30d50 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 2a 2f 0a  l table scan */.
30d60 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72        pNew->iSor
30d70 74 49 64 78 20 3d 20 62 20 3f 20 69 53 6f 72 74  tIdx = b ? iSort
30d80 49 64 78 20 3a 20 30 3b 0a 20 20 20 20 20 20 2f  Idx : 0;.      /
30d90 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f  * TUNING: Cost o
30da0 66 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61  f full table sca
30db0 6e 20 69 73 20 28 4e 2a 33 2e 30 29 2e 20 2a 2f  n is (N*3.0). */
30dc0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75  .      pNew->rRu
30dd0 6e 20 3d 20 72 53 69 7a 65 20 2b 20 31 36 3b 0a  n = rSize + 16;.
30de0 20 20 20 20 20 20 41 70 70 6c 79 43 6f 73 74 4d        ApplyCostM
30df0 75 6c 74 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e  ultiplier(pNew->
30e00 72 52 75 6e 2c 20 70 54 61 62 2d 3e 63 6f 73 74  rRun, pTab->cost
30e10 4d 75 6c 74 29 3b 0a 20 20 20 20 20 20 77 68 65  Mult);.      whe
30e20 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75  reLoopOutputAdju
30e30 73 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 72 53  st(pWC, pNew, rS
30e40 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ize);.      rc =
30e50 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74   whereLoopInsert
30e60 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29  (pBuilder, pNew)
30e70 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f  ;.      pNew->nO
30e80 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20  ut = rSize;.    
30e90 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b    if( rc ) break
30ea0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
30eb0 20 20 20 42 69 74 6d 61 73 6b 20 6d 3b 0a 20 20     Bitmask m;.  
30ec0 20 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e      if( pProbe->
30ed0 69 73 43 6f 76 65 72 69 6e 67 20 29 7b 0a 20 20  isCovering ){.  
30ee0 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
30ef0 61 67 73 20 3d 20 57 48 45 52 45 5f 49 44 58 5f  ags = WHERE_IDX_
30f00 4f 4e 4c 59 20 7c 20 57 48 45 52 45 5f 49 4e 44  ONLY | WHERE_IND
30f10 45 58 45 44 3b 0a 20 20 20 20 20 20 20 20 6d 20  EXED;.        m 
30f20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
30f30 7b 0a 20 20 20 20 20 20 20 20 6d 20 3d 20 70 53  {.        m = pS
30f40 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 7e 63  rc->colUsed & ~c
30f50 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 70 50  olumnsInIndex(pP
30f60 72 6f 62 65 29 3b 0a 20 20 20 20 20 20 20 20 70  robe);.        p
30f70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 28  New->wsFlags = (
30f80 6d 3d 3d 30 29 20 3f 20 28 57 48 45 52 45 5f 49  m==0) ? (WHERE_I
30f90 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 4e  DX_ONLY|WHERE_IN
30fa0 44 45 58 45 44 29 20 3a 20 57 48 45 52 45 5f 49  DEXED) : WHERE_I
30fb0 4e 44 45 58 45 44 3b 0a 20 20 20 20 20 20 7d 0a  NDEXED;.      }.
30fc0 0a 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 73  .      /* Full s
30fd0 63 61 6e 20 76 69 61 20 69 6e 64 65 78 20 2a 2f  can via index */
30fe0 0a 20 20 20 20 20 20 69 66 28 20 62 0a 20 20 20  .      if( b.   
30ff0 20 20 20 20 7c 7c 20 21 48 61 73 52 6f 77 69 64      || !HasRowid
31000 28 70 54 61 62 29 0a 20 20 20 20 20 20 20 7c 7c  (pTab).       ||
31010 20 28 20 6d 3d 3d 30 0a 20 20 20 20 20 20 20 20   ( m==0.        
31020 20 26 26 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f   && pProbe->bUno
31030 72 64 65 72 65 64 3d 3d 30 0a 20 20 20 20 20 20  rdered==0.      
31040 20 20 20 26 26 20 28 70 50 72 6f 62 65 2d 3e 73     && (pProbe->s
31050 7a 49 64 78 52 6f 77 3c 70 54 61 62 2d 3e 73 7a  zIdxRow<pTab->sz
31060 54 61 62 52 6f 77 29 0a 20 20 20 20 20 20 20 20  TabRow).        
31070 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74   && (pWInfo->wct
31080 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
31090 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29  ONEPASS_DESIRED)
310a0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==0.         && 
310b0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
310c0 66 69 67 2e 62 55 73 65 43 69 73 0a 20 20 20 20  fig.bUseCis.    
310d0 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61       && Optimiza
310e0 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 57 49 6e  tionEnabled(pWIn
310f0 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20  fo->pParse->db, 
31100 53 51 4c 49 54 45 5f 43 6f 76 65 72 49 64 78 53  SQLITE_CoverIdxS
31110 63 61 6e 29 0a 20 20 20 20 20 20 20 20 20 20 29  can).          )
31120 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
31130 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78    pNew->iSortIdx
31140 20 3d 20 62 20 3f 20 69 53 6f 72 74 49 64 78 20   = b ? iSortIdx 
31150 3a 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  : 0;..        /*
31160 20 54 68 65 20 63 6f 73 74 20 6f 66 20 76 69 73   The cost of vis
31170 69 74 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20  iting the index 
31180 72 6f 77 73 20 69 73 20 4e 2a 4b 2c 20 77 68 65  rows is N*K, whe
31190 72 65 20 4b 20 69 73 0a 20 20 20 20 20 20 20 20  re K is.        
311a0 2a 2a 20 62 65 74 77 65 65 6e 20 31 2e 31 20 61  ** between 1.1 a
311b0 6e 64 20 33 2e 30 2c 20 64 65 70 65 6e 64 69 6e  nd 3.0, dependin
311c0 67 20 6f 6e 20 74 68 65 20 72 65 6c 61 74 69 76  g on the relativ
311d0 65 20 73 69 7a 65 73 20 6f 66 20 74 68 65 0a 20  e sizes of the. 
311e0 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 20         ** index 
311f0 61 6e 64 20 74 61 62 6c 65 20 72 6f 77 73 2e 20  and table rows. 
31200 49 66 20 74 68 69 73 20 69 73 20 61 20 6e 6f 6e  If this is a non
31210 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20  -covering index 
31220 73 63 61 6e 2c 0a 20 20 20 20 20 20 20 20 2a 2a  scan,.        **
31230 20 61 6c 73 6f 20 61 64 64 20 74 68 65 20 63 6f   also add the co
31240 73 74 20 6f 66 20 76 69 73 69 74 69 6e 67 20 74  st of visiting t
31250 61 62 6c 65 20 72 6f 77 73 20 28 4e 2a 33 2e 30  able rows (N*3.0
31260 29 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  ).  */.        p
31270 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72 53 69 7a  New->rRun = rSiz
31280 65 20 2b 20 31 20 2b 20 28 31 35 2a 70 50 72 6f  e + 1 + (15*pPro
31290 62 65 2d 3e 73 7a 49 64 78 52 6f 77 29 2f 70 54  be->szIdxRow)/pT
312a0 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20  ab->szTabRow;.  
312b0 20 20 20 20 20 20 69 66 28 20 6d 21 3d 30 20 29        if( m!=0 )
312c0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
312d0 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33  ->rRun = sqlite3
312e0 4c 6f 67 45 73 74 41 64 64 28 70 4e 65 77 2d 3e  LogEstAdd(pNew->
312f0 72 52 75 6e 2c 20 72 53 69 7a 65 2b 31 36 29 3b  rRun, rSize+16);
31300 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
31310 20 20 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74     ApplyCostMult
31320 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72 52 75  iplier(pNew->rRu
31330 6e 2c 20 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c  n, pTab->costMul
31340 74 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72  t);.        wher
31350 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73  eLoopOutputAdjus
31360 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 72 53 69  t(pWC, pNew, rSi
31370 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ze);.        rc 
31380 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72  = whereLoopInser
31390 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77  t(pBuilder, pNew
313a0 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
313b0 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20  >nOut = rSize;. 
313c0 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20         if( rc ) 
313d0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
313e0 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 77     }..    rc = w
313f0 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65  hereLoopAddBtree
31400 49 6e 64 65 78 28 70 42 75 69 6c 64 65 72 2c 20  Index(pBuilder, 
31410 70 53 72 63 2c 20 70 50 72 6f 62 65 2c 20 30 29  pSrc, pProbe, 0)
31420 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
31430 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
31440 53 54 41 54 34 0a 20 20 20 20 73 71 6c 69 74 65  STAT4.    sqlite
31450 33 53 74 61 74 34 50 72 6f 62 65 46 72 65 65 28  3Stat4ProbeFree(
31460 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 29 3b  pBuilder->pRec);
31470 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e  .    pBuilder->n
31480 52 65 63 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20  RecValid = 0;.  
31490 20 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63    pBuilder->pRec
314a0 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20   = 0;.#endif..  
314b0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61    /* If there wa
314c0 73 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20  s an INDEXED BY 
314d0 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 6f 6e 6c  clause, then onl
314e0 79 20 74 68 61 74 20 6f 6e 65 20 69 6e 64 65 78  y that one index
314f0 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69   is.    ** consi
31500 64 65 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66  dered. */.    if
31510 28 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 20 29  ( pSrc->pIndex )
31520 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
31530 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
31540 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
31550 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a  VIRTUALTABLE./*.
31560 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65  ** Add all Where
31570 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72  Loop objects for
31580 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20   a table of the 
31590 6a 6f 69 6e 20 69 64 65 6e 74 69 66 69 65 64 20  join identified 
315a0 62 79 0a 2a 2a 20 70 42 75 69 6c 64 65 72 2d 3e  by.** pBuilder->
315b0 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68 61  pNew->iTab.  Tha
315c0 74 20 74 61 62 6c 65 20 69 73 20 67 75 61 72 61  t table is guara
315d0 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20 76 69  nteed to be a vi
315e0 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a  rtual table..*/.
315f0 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
31600 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28 0a  LoopAddVirtual(.
31610 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
31620 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 20 2f  er *pBuilder,  /
31630 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  * WHERE clause i
31640 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20  nformation */.  
31650 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 0a 29  Bitmask mExtra.)
31660 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
31670 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  WInfo;          
31680 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73   /* WHERE analys
31690 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  is context */.  
316a0 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20  Parse *pParse;  
316b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
316c0 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
316d0 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ext */.  WhereCl
316e0 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20  ause *pWC;      
316f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
31700 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  RE clause */.  s
31710 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
31720 65 6d 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20 54  em *pSrc;   /* T
31730 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
31740 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f  erm to search */
31750 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
31760 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
31770 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
31780 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 20  nfo *pIdxInfo;. 
31790 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
317a0 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
317b0 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74   *pIdxCons;.  st
317c0 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
317d0 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73  ex_constraint_us
317e0 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20 57  age *pUsage;.  W
317f0 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
31800 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69  .  int i, j;.  i
31810 6e 74 20 69 54 65 72 6d 2c 20 6d 78 54 65 72 6d  nt iTerm, mxTerm
31820 3b 0a 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61  ;.  int nConstra
31830 69 6e 74 3b 0a 20 20 69 6e 74 20 73 65 65 6e 49  int;.  int seenI
31840 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  n = 0;          
31850 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
31860 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73  n IN operator is
31870 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 73   seen */.  int s
31880 65 65 6e 56 61 72 20 3d 20 30 3b 20 20 20 20 20  eenVar = 0;     
31890 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
318a0 69 66 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e  if a non-constan
318b0 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20  t constraint is 
318c0 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 50  seen */.  int iP
318d0 68 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  hase;           
318e0 20 20 20 20 20 20 20 2f 2a 20 30 3a 20 63 6f 6e         /* 0: con
318f0 73 74 20 77 2f 6f 20 49 4e 2c 20 31 3a 20 63 6f  st w/o IN, 1: co
31900 6e 73 74 2c 20 32 3a 20 6e 6f 20 49 4e 2c 20 20  nst, 2: no IN,  
31910 32 3a 20 49 4e 20 2a 2f 0a 20 20 57 68 65 72 65  2: IN */.  Where
31920 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  Loop *pNew;.  in
31930 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
31940 3b 0a 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42  ;..  pWInfo = pB
31950 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a  uilder->pWInfo;.
31960 20 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66    pParse = pWInf
31970 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20  o->pParse;.  db 
31980 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
31990 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  pWC = pBuilder->
319a0 70 57 43 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42  pWC;.  pNew = pB
319b0 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20  uilder->pNew;.  
319c0 70 53 72 63 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  pSrc = &pWInfo->
319d0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4e 65 77  pTabList->a[pNew
319e0 2d 3e 69 54 61 62 5d 3b 0a 20 20 70 54 61 62 20  ->iTab];.  pTab 
319f0 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20  = pSrc->pTab;.  
31a00 61 73 73 65 72 74 28 20 49 73 56 69 72 74 75 61  assert( IsVirtua
31a10 6c 28 70 54 61 62 29 20 29 3b 0a 20 20 70 49 64  l(pTab) );.  pId
31a20 78 49 6e 66 6f 20 3d 20 61 6c 6c 6f 63 61 74 65  xInfo = allocate
31a30 49 6e 64 65 78 49 6e 66 6f 28 70 50 61 72 73 65  IndexInfo(pParse
31a40 2c 20 70 57 43 2c 20 70 53 72 63 2c 20 70 42 75  , pWC, pSrc, pBu
31a50 69 6c 64 65 72 2d 3e 70 4f 72 64 65 72 42 79 29  ilder->pOrderBy)
31a60 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f  ;.  if( pIdxInfo
31a70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
31a80 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 4e 65  ITE_NOMEM;.  pNe
31a90 77 2d 3e 70 72 65 72 65 71 20 3d 20 30 3b 0a 20  w->prereq = 0;. 
31aa0 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
31ab0 30 3b 0a 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61  0;.  pNew->wsFla
31ac0 67 73 20 3d 20 57 48 45 52 45 5f 56 49 52 54 55  gs = WHERE_VIRTU
31ad0 41 4c 54 41 42 4c 45 3b 0a 20 20 70 4e 65 77 2d  ALTABLE;.  pNew-
31ae0 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70  >nLTerm = 0;.  p
31af0 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  New->u.vtab.need
31b00 46 72 65 65 20 3d 20 30 3b 0a 20 20 70 55 73 61  Free = 0;.  pUsa
31b10 67 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61  ge = pIdxInfo->a
31b20 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 3b  ConstraintUsage;
31b30 0a 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d  .  nConstraint =
31b40 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73   pIdxInfo->nCons
31b50 74 72 61 69 6e 74 3b 0a 20 20 69 66 28 20 77 68  traint;.  if( wh
31b60 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62  ereLoopResize(db
31b70 2c 20 70 4e 65 77 2c 20 6e 43 6f 6e 73 74 72 61  , pNew, nConstra
31b80 69 6e 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  int) ){.    sqli
31b90 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
31ba0 64 78 49 6e 66 6f 29 3b 0a 20 20 20 20 72 65 74  dxInfo);.    ret
31bb0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
31bc0 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 50 68  ;.  }..  for(iPh
31bd0 61 73 65 3d 30 3b 20 69 50 68 61 73 65 3c 3d 33  ase=0; iPhase<=3
31be0 3b 20 69 50 68 61 73 65 2b 2b 29 7b 0a 20 20 20  ; iPhase++){.   
31bf0 20 69 66 28 20 21 73 65 65 6e 49 6e 20 26 26 20   if( !seenIn && 
31c00 28 69 50 68 61 73 65 26 31 29 21 3d 30 20 29 7b  (iPhase&1)!=0 ){
31c10 0a 20 20 20 20 20 20 69 50 68 61 73 65 2b 2b 3b  .      iPhase++;
31c20 0a 20 20 20 20 20 20 69 66 28 20 69 50 68 61 73  .      if( iPhas
31c30 65 3e 33 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  e>3 ) break;.   
31c40 20 7d 0a 20 20 20 20 69 66 28 20 21 73 65 65 6e   }.    if( !seen
31c50 56 61 72 20 26 26 20 69 50 68 61 73 65 3e 31 20  Var && iPhase>1 
31c60 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 49 64  ) break;.    pId
31c70 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74  xCons = *(struct
31c80 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
31c90 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64  onstraint**)&pId
31ca0 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
31cb0 6e 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  nt;.    for(i=0;
31cc0 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f   i<pIdxInfo->nCo
31cd0 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70  nstraint; i++, p
31ce0 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20  IdxCons++){.    
31cf0 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e    j = pIdxCons->
31d00 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20  iTermOffset;.   
31d10 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
31d20 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 77 69  >a[j];.      swi
31d30 74 63 68 28 20 69 50 68 61 73 65 20 29 7b 0a 20  tch( iPhase ){. 
31d40 20 20 20 20 20 20 20 63 61 73 65 20 30 3a 20 20         case 0:  
31d50 20 20 2f 2a 20 43 6f 6e 73 74 61 6e 74 73 20 77    /* Constants w
31d60 69 74 68 6f 75 74 20 49 4e 20 6f 70 65 72 61 74  ithout IN operat
31d70 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  or */.          
31d80 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65  pIdxCons->usable
31d90 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
31da0 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
31db0 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d  rator & WO_IN)!=
31dc0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
31dd0 20 73 65 65 6e 49 6e 20 3d 20 31 3b 0a 20 20 20   seenIn = 1;.   
31de0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31df0 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72     if( pTerm->pr
31e00 65 72 65 71 52 69 67 68 74 21 3d 30 20 29 7b 0a  ereqRight!=0 ){.
31e10 20 20 20 20 20 20 20 20 20 20 20 20 73 65 65 6e              seen
31e20 56 61 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Var = 1;.       
31e30 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 54     }else if( (pT
31e40 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
31e50 20 57 4f 5f 49 4e 29 3d 3d 30 20 29 7b 0a 20 20   WO_IN)==0 ){.  
31e60 20 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f            pIdxCo
31e70 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a  ns->usable = 1;.
31e80 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
31e90 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
31ea0 20 20 20 20 20 63 61 73 65 20 31 3a 20 20 20 20       case 1:    
31eb0 2f 2a 20 43 6f 6e 73 74 61 6e 74 73 20 77 69 74  /* Constants wit
31ec0 68 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 2a  h IN operators *
31ed0 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
31ee0 72 74 28 20 73 65 65 6e 49 6e 20 29 3b 0a 20 20  rt( seenIn );.  
31ef0 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73          pIdxCons
31f00 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70 54 65 72  ->usable = (pTer
31f10 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3d 3d  m->prereqRight==
31f20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  0);.          br
31f30 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
31f40 65 20 32 3a 20 20 20 20 2f 2a 20 56 61 72 69 61  e 2:    /* Varia
31f50 62 6c 65 73 20 77 69 74 68 6f 75 74 20 49 4e 20  bles without IN 
31f60 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
31f70 65 72 74 28 20 73 65 65 6e 56 61 72 20 29 3b 0a  ert( seenVar );.
31f80 20 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f            pIdxCo
31f90 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70 54  ns->usable = (pT
31fa0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
31fb0 20 57 4f 5f 49 4e 29 3d 3d 30 3b 0a 20 20 20 20   WO_IN)==0;.    
31fc0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
31fd0 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20       default:   
31fe0 2f 2a 20 56 61 72 69 61 62 6c 65 73 20 77 69 74  /* Variables wit
31ff0 68 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20  h IN */.        
32000 20 20 61 73 73 65 72 74 28 20 73 65 65 6e 56 61    assert( seenVa
32010 72 20 26 26 20 73 65 65 6e 49 6e 20 29 3b 0a 20  r && seenIn );. 
32020 20 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e           pIdxCon
32030 73 2d 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20  s->usable = 1;. 
32040 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
32050 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
32060 20 20 6d 65 6d 73 65 74 28 70 55 73 61 67 65 2c    memset(pUsage,
32070 20 30 2c 20 73 69 7a 65 6f 66 28 70 55 73 61 67   0, sizeof(pUsag
32080 65 5b 30 5d 29 2a 70 49 64 78 49 6e 66 6f 2d 3e  e[0])*pIdxInfo->
32090 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20  nConstraint);.  
320a0 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e    if( pIdxInfo->
320b0 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
320c0 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28   ) sqlite3_free(
320d0 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72  pIdxInfo->idxStr
320e0 29 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  );.    pIdxInfo-
320f0 3e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20  >idxStr = 0;.   
32100 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75   pIdxInfo->idxNu
32110 6d 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49  m = 0;.    pIdxI
32120 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
32130 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 70  dxStr = 0;.    p
32140 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79  IdxInfo->orderBy
32150 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20  Consumed = 0;.  
32160 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69    pIdxInfo->esti
32170 6d 61 74 65 64 43 6f 73 74 20 3d 20 53 51 4c 49  matedCost = SQLI
32180 54 45 5f 42 49 47 5f 44 42 4c 20 2f 20 28 64 6f  TE_BIG_DBL / (do
32190 75 62 6c 65 29 32 3b 0a 20 20 20 20 70 49 64 78  uble)2;.    pIdx
321a0 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52  Info->estimatedR
321b0 6f 77 73 20 3d 20 32 35 3b 0a 20 20 20 20 72 63  ows = 25;.    rc
321c0 20 3d 20 76 74 61 62 42 65 73 74 49 6e 64 65 78   = vtabBestIndex
321d0 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70  (pParse, pTab, p
321e0 49 64 78 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66  IdxInfo);.    if
321f0 28 20 72 63 20 29 20 67 6f 74 6f 20 77 68 65 72  ( rc ) goto wher
32200 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f 65 78 69  eLoopAddVtab_exi
32210 74 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 20  t;.    pIdxCons 
32220 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74  = *(struct sqlit
32230 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
32240 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  int**)&pIdxInfo-
32250 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20  >aConstraint;.  
32260 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
32270 20 6d 45 78 74 72 61 3b 0a 20 20 20 20 6d 78 54   mExtra;.    mxT
32280 65 72 6d 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73  erm = -1;.    as
32290 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4c 53 6c  sert( pNew->nLSl
322a0 6f 74 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20  ot>=nConstraint 
322b0 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
322c0 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  i<nConstraint; i
322d0 2b 2b 29 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d  ++) pNew->aLTerm
322e0 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  [i] = 0;.    pNe
322f0 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61  w->u.vtab.omitMa
32300 73 6b 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  sk = 0;.    for(
32310 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69  i=0; i<nConstrai
32320 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e  nt; i++, pIdxCon
32330 73 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  s++){.      if( 
32340 28 69 54 65 72 6d 20 3d 20 70 55 73 61 67 65 5b  (iTerm = pUsage[
32350 69 5d 2e 61 72 67 76 49 6e 64 65 78 20 2d 20 31  i].argvIndex - 1
32360 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )>=0 ){.        
32370 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54  j = pIdxCons->iT
32380 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ermOffset;.     
32390 20 20 20 69 66 28 20 69 54 65 72 6d 3e 3d 6e 43     if( iTerm>=nC
323a0 6f 6e 73 74 72 61 69 6e 74 0a 20 20 20 20 20 20  onstraint.      
323b0 20 20 20 7c 7c 20 6a 3c 30 0a 20 20 20 20 20 20     || j<0.      
323c0 20 20 20 7c 7c 20 6a 3e 3d 70 57 43 2d 3e 6e 54     || j>=pWC->nT
323d0 65 72 6d 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  erm.         || 
323e0 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65  pNew->aLTerm[iTe
323f0 72 6d 5d 21 3d 30 0a 20 20 20 20 20 20 20 20 29  rm]!=0.        )
32400 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
32410 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
32420 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
32430 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
32440 20 22 25 73 2e 78 42 65 73 74 49 6e 64 65 78 28   "%s.xBestIndex(
32450 29 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 22 2c 20  ) malfunction", 
32460 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
32470 20 20 20 20 20 20 20 20 67 6f 74 6f 20 77 68 65          goto whe
32480 72 65 4c 6f 6f 70 41 64 64 56 74 61 62 5f 65 78  reLoopAddVtab_ex
32490 69 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  it;.        }.  
324a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
324b0 69 54 65 72 6d 3d 3d 6e 43 6f 6e 73 74 72 61 69  iTerm==nConstrai
324c0 6e 74 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  nt-1 );.        
324d0 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 30 20 29  testcase( j==0 )
324e0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
324f0 73 65 28 20 6a 3d 3d 70 57 43 2d 3e 6e 54 65 72  se( j==pWC->nTer
32500 6d 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70  m-1 );.        p
32510 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a  Term = &pWC->a[j
32520 5d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ];.        pNew-
32530 3e 70 72 65 72 65 71 20 7c 3d 20 70 54 65 72 6d  >prereq |= pTerm
32540 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20  ->prereqRight;. 
32550 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
32560 54 65 72 6d 3c 70 4e 65 77 2d 3e 6e 4c 53 6c 6f  Term<pNew->nLSlo
32570 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  t );.        pNe
32580 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d  w->aLTerm[iTerm]
32590 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
325a0 20 20 69 66 28 20 69 54 65 72 6d 3e 6d 78 54 65    if( iTerm>mxTe
325b0 72 6d 20 29 20 6d 78 54 65 72 6d 20 3d 20 69 54  rm ) mxTerm = iT
325c0 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 74 65 73  erm;.        tes
325d0 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d 31 35  tcase( iTerm==15
325e0 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
325f0 63 61 73 65 28 20 69 54 65 72 6d 3d 3d 31 36 20  case( iTerm==16 
32600 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
32610 54 65 72 6d 3c 31 36 20 26 26 20 70 55 73 61 67  Term<16 && pUsag
32620 65 5b 69 5d 2e 6f 6d 69 74 20 29 20 70 4e 65 77  e[i].omit ) pNew
32630 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73  ->u.vtab.omitMas
32640 6b 20 7c 3d 20 31 3c 3c 69 54 65 72 6d 3b 0a 20  k |= 1<<iTerm;. 
32650 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72         if( (pTer
32660 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
32670 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20  O_IN)!=0 ){.    
32680 20 20 20 20 20 20 69 66 28 20 70 55 73 61 67 65        if( pUsage
32690 5b 69 5d 2e 6f 6d 69 74 3d 3d 30 20 29 7b 0a 20  [i].omit==0 ){. 
326a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
326b0 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20   not attempt to 
326c0 75 73 65 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72  use an IN constr
326d0 61 69 6e 74 20 69 66 20 74 68 65 20 76 69 72 74  aint if the virt
326e0 75 61 6c 20 74 61 62 6c 65 0a 20 20 20 20 20 20  ual table.      
326f0 20 20 20 20 20 20 2a 2a 20 73 61 79 73 20 74 68        ** says th
32700 61 74 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  at the equivalen
32710 74 20 45 51 20 63 6f 6e 73 74 72 61 69 6e 74 20  t EQ constraint 
32720 63 61 6e 6e 6f 74 20 62 65 20 73 61 66 65 6c 79  cannot be safely
32730 20 6f 6d 69 74 74 65 64 2e 0a 20 20 20 20 20 20   omitted..      
32740 20 20 20 20 20 20 2a 2a 20 49 66 20 77 65 20 64        ** If we d
32750 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  o attempt to use
32760 20 73 75 63 68 20 61 20 63 6f 6e 73 74 72 61 69   such a constrai
32770 6e 74 2c 20 73 6f 6d 65 20 72 6f 77 73 20 6d 69  nt, some rows mi
32780 67 68 74 20 62 65 0a 20 20 20 20 20 20 20 20 20  ght be.         
32790 20 20 20 2a 2a 20 72 65 70 65 61 74 65 64 20 69     ** repeated i
327a0 6e 20 74 68 65 20 6f 75 74 70 75 74 2e 20 2a 2f  n the output. */
327b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
327c0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
327d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 76            /* A v
327e0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68 61  irtual table tha
327f0 74 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64  t is constrained
32800 20 62 79 20 61 6e 20 49 4e 20 63 6c 61 75 73 65   by an IN clause
32810 20 6d 61 79 20 6e 6f 74 0a 20 20 20 20 20 20 20   may not.       
32820 20 20 20 2a 2a 20 63 6f 6e 73 75 6d 65 20 74 68     ** consume th
32830 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
32840 65 20 62 65 63 61 75 73 65 20 28 31 29 20 74 68  e because (1) th
32850 65 20 6f 72 64 65 72 20 6f 66 20 49 4e 20 74 65  e order of IN te
32860 72 6d 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  rms.          **
32870 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
32880 69 6c 79 20 72 65 6c 61 74 65 64 20 74 6f 20 74  ily related to t
32890 68 65 20 6f 72 64 65 72 20 6f 66 20 6f 75 74 70  he order of outp
328a0 75 74 20 74 65 72 6d 73 20 61 6e 64 0a 20 20 20  ut terms and.   
328b0 20 20 20 20 20 20 20 2a 2a 20 28 32 29 20 4d 75         ** (2) Mu
328c0 6c 74 69 70 6c 65 20 6f 75 74 70 75 74 73 20 66  ltiple outputs f
328d0 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 49 4e 20  rom a single IN 
328e0 76 61 6c 75 65 20 77 69 6c 6c 20 6e 6f 74 20 6d  value will not m
328f0 65 72 67 65 0a 20 20 20 20 20 20 20 20 20 20 2a  erge.          *
32900 2a 20 74 6f 67 65 74 68 65 72 2e 20 20 2a 2f 0a  * together.  */.
32910 20 20 20 20 20 20 20 20 20 20 70 49 64 78 49 6e            pIdxIn
32920 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75  fo->orderByConsu
32930 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  med = 0;.       
32940 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
32950 0a 20 20 20 20 69 66 28 20 69 3e 3d 6e 43 6f 6e  .    if( i>=nCon
32960 73 74 72 61 69 6e 74 20 29 7b 0a 20 20 20 20 20  straint ){.     
32970 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20   pNew->nLTerm = 
32980 6d 78 54 65 72 6d 2b 31 3b 0a 20 20 20 20 20 20  mxTerm+1;.      
32990 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4c  assert( pNew->nL
329a0 54 65 72 6d 3c 3d 70 4e 65 77 2d 3e 6e 4c 53 6c  Term<=pNew->nLSl
329b0 6f 74 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  ot );.      pNew
329c0 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 20  ->u.vtab.idxNum 
329d0 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e  = pIdxInfo->idxN
329e0 75 6d 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  um;.      pNew->
329f0 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
32a00 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64  = pIdxInfo->need
32a10 54 6f 46 72 65 65 49 64 78 53 74 72 3b 0a 20 20  ToFreeIdxStr;.  
32a20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65      pIdxInfo->ne
32a30 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d  edToFreeIdxStr =
32a40 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   0;.      pNew->
32a50 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20 3d 20  u.vtab.idxStr = 
32a60 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72  pIdxInfo->idxStr
32a70 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e  ;.      pNew->u.
32a80 76 74 61 62 2e 69 73 4f 72 64 65 72 65 64 20 3d  vtab.isOrdered =
32a90 20 28 69 38 29 28 70 49 64 78 49 6e 66 6f 2d 3e   (i8)(pIdxInfo->
32aa0 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20  orderByConsumed 
32ab0 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ?.              
32ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32ad0 20 20 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f          pIdxInfo
32ae0 2d 3e 6e 4f 72 64 65 72 42 79 20 3a 20 30 29 3b  ->nOrderBy : 0);
32af0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65  .      pNew->rSe
32b00 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  tup = 0;.      p
32b10 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69  New->rRun = sqli
32b20 74 65 33 4c 6f 67 45 73 74 46 72 6f 6d 44 6f 75  te3LogEstFromDou
32b30 62 6c 65 28 70 49 64 78 49 6e 66 6f 2d 3e 65 73  ble(pIdxInfo->es
32b40 74 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a 20 20  timatedCost);.  
32b50 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
32b60 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70   sqlite3LogEst(p
32b70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
32b80 65 64 52 6f 77 73 29 3b 0a 20 20 20 20 20 20 77  edRows);.      w
32b90 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70  hereLoopInsert(p
32ba0 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a  Builder, pNew);.
32bb0 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e        if( pNew->
32bc0 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
32bd0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
32be0 65 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e 75 2e  e3_free(pNew->u.
32bf0 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a 20 20  vtab.idxStr);.  
32c00 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74        pNew->u.vt
32c10 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b  ab.needFree = 0;
32c20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
32c30 20 7d 20 20 0a 0a 77 68 65 72 65 4c 6f 6f 70 41   }  ..whereLoopA
32c40 64 64 56 74 61 62 5f 65 78 69 74 3a 0a 20 20 69  ddVtab_exit:.  i
32c50 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65  f( pIdxInfo->nee
32c60 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 29 20  dToFreeIdxStr ) 
32c70 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64  sqlite3_free(pId
32c80 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a  xInfo->idxStr);.
32c90 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
32ca0 64 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20  db, pIdxInfo);. 
32cb0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
32cc0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
32cd0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
32ce0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 57   */../*.** Add W
32cf0 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 69 65 73  hereLoop entries
32d00 20 74 6f 20 68 61 6e 64 6c 65 20 4f 52 20 74 65   to handle OR te
32d10 72 6d 73 2e 20 20 54 68 69 73 20 77 6f 72 6b 73  rms.  This works
32d20 20 66 6f 72 20 65 69 74 68 65 72 0a 2a 2a 20 62   for either.** b
32d30 74 72 65 65 73 20 6f 72 20 76 69 72 74 75 61 6c  trees or virtual
32d40 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74   tables..*/.stat
32d50 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
32d60 41 64 64 4f 72 28 57 68 65 72 65 4c 6f 6f 70 42  AddOr(WhereLoopB
32d70 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
32d80 2c 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61  , Bitmask mExtra
32d90 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
32da0 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
32db0 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 57 68 65  r->pWInfo;.  Whe
32dc0 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20  reClause *pWC;. 
32dd0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77   WhereLoop *pNew
32de0 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  ;.  WhereTerm *p
32df0 54 65 72 6d 2c 20 2a 70 57 43 45 6e 64 3b 0a 20  Term, *pWCEnd;. 
32e00 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
32e10 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b  _OK;.  int iCur;
32e20 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 74  .  WhereClause t
32e30 65 6d 70 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f  empWC;.  WhereLo
32e40 6f 70 42 75 69 6c 64 65 72 20 73 53 75 62 42 75  opBuilder sSubBu
32e50 69 6c 64 3b 0a 20 20 57 68 65 72 65 4f 72 53 65  ild;.  WhereOrSe
32e60 74 20 73 53 75 6d 2c 20 73 43 75 72 3b 0a 20 20  t sSum, sCur;.  
32e70 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
32e80 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 0a 20  tem *pItem;.  . 
32e90 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d   pWC = pBuilder-
32ea0 3e 70 57 43 3b 0a 20 20 70 57 43 45 6e 64 20 3d  >pWC;.  pWCEnd =
32eb0 20 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e   pWC->a + pWC->n
32ec0 54 65 72 6d 3b 0a 20 20 70 4e 65 77 20 3d 20 70  Term;.  pNew = p
32ed0 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20  Builder->pNew;. 
32ee0 20 6d 65 6d 73 65 74 28 26 73 53 75 6d 2c 20 30   memset(&sSum, 0
32ef0 2c 20 73 69 7a 65 6f 66 28 73 53 75 6d 29 29 3b  , sizeof(sSum));
32f00 0a 20 20 70 49 74 65 6d 20 3d 20 70 57 49 6e 66  .  pItem = pWInf
32f10 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b  o->pTabList->a +
32f20 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20 69   pNew->iTab;.  i
32f30 43 75 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75  Cur = pItem->iCu
32f40 72 73 6f 72 3b 0a 0a 20 20 66 6f 72 28 70 54 65  rsor;..  for(pTe
32f50 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d  rm=pWC->a; pTerm
32f60 3c 70 57 43 45 6e 64 20 26 26 20 72 63 3d 3d 53  <pWCEnd && rc==S
32f70 51 4c 49 54 45 5f 4f 4b 3b 20 70 54 65 72 6d 2b  QLITE_OK; pTerm+
32f80 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70 54 65  +){.    if( (pTe
32f90 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
32fa0 57 4f 5f 4f 52 29 21 3d 30 0a 20 20 20 20 20 26  WO_OR)!=0.     &
32fb0 26 20 28 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49  & (pTerm->u.pOrI
32fc0 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 26  nfo->indexable &
32fd0 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 29   pNew->maskSelf)
32fe0 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  !=0 .    ){.    
32ff0 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 20    WhereClause * 
33000 63 6f 6e 73 74 20 70 4f 72 57 43 20 3d 20 26 70  const pOrWC = &p
33010 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d  Term->u.pOrInfo-
33020 3e 77 63 3b 0a 20 20 20 20 20 20 57 68 65 72 65  >wc;.      Where
33030 54 65 72 6d 20 2a 20 63 6f 6e 73 74 20 70 4f 72  Term * const pOr
33040 57 43 45 6e 64 20 3d 20 26 70 4f 72 57 43 2d 3e  WCEnd = &pOrWC->
33050 61 5b 70 4f 72 57 43 2d 3e 6e 54 65 72 6d 5d 3b  a[pOrWC->nTerm];
33060 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
33070 20 2a 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20   *pOrTerm;.     
33080 20 69 6e 74 20 6f 6e 63 65 20 3d 20 31 3b 0a 20   int once = 1;. 
33090 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20       int i, j;. 
330a0 20 20 20 0a 20 20 20 20 20 20 73 53 75 62 42 75     .      sSubBu
330b0 69 6c 64 20 3d 20 2a 70 42 75 69 6c 64 65 72 3b  ild = *pBuilder;
330c0 0a 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64  .      sSubBuild
330d0 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  .pOrderBy = 0;. 
330e0 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70       sSubBuild.p
330f0 4f 72 53 65 74 20 3d 20 26 73 43 75 72 3b 0a 0a  OrSet = &sCur;..
33100 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
33110 28 30 78 32 30 30 2c 20 28 22 42 65 67 69 6e 20  (0x200, ("Begin 
33120 70 72 6f 63 65 73 73 69 6e 67 20 4f 52 2d 63 6c  processing OR-cl
33130 61 75 73 65 20 25 70 5c 6e 22 2c 20 70 54 65 72  ause %p\n", pTer
33140 6d 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  m));.      for(p
33150 4f 72 54 65 72 6d 3d 70 4f 72 57 43 2d 3e 61 3b  OrTerm=pOrWC->a;
33160 20 70 4f 72 54 65 72 6d 3c 70 4f 72 57 43 45 6e   pOrTerm<pOrWCEn
33170 64 3b 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20  d; pOrTerm++){. 
33180 20 20 20 20 20 20 20 69 66 28 20 28 70 4f 72 54         if( (pOrT
33190 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
331a0 20 57 4f 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20   WO_AND)!=0 ){. 
331b0 20 20 20 20 20 20 20 20 20 73 53 75 62 42 75 69           sSubBui
331c0 6c 64 2e 70 57 43 20 3d 20 26 70 4f 72 54 65 72  ld.pWC = &pOrTer
331d0 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77  m->u.pAndInfo->w
331e0 63 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  c;.        }else
331f0 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65   if( pOrTerm->le
33200 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29  ftCursor==iCur )
33210 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70  {.          temp
33220 57 43 2e 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d  WC.pWInfo = pWC-
33230 3e 70 57 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20  >pWInfo;.       
33240 20 20 20 74 65 6d 70 57 43 2e 70 4f 75 74 65 72     tempWC.pOuter
33250 20 3d 20 70 57 43 3b 0a 20 20 20 20 20 20 20 20   = pWC;.        
33260 20 20 74 65 6d 70 57 43 2e 6f 70 20 3d 20 54 4b    tempWC.op = TK
33270 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20 20 20 20  _AND;.          
33280 74 65 6d 70 57 43 2e 6e 54 65 72 6d 20 3d 20 31  tempWC.nTerm = 1
33290 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70  ;.          temp
332a0 57 43 2e 61 20 3d 20 70 4f 72 54 65 72 6d 3b 0a  WC.a = pOrTerm;.
332b0 20 20 20 20 20 20 20 20 20 20 73 53 75 62 42 75            sSubBu
332c0 69 6c 64 2e 70 57 43 20 3d 20 26 74 65 6d 70 57  ild.pWC = &tempW
332d0 43 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  C;.        }else
332e0 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  {.          cont
332f0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  inue;.        }.
33300 20 20 20 20 20 20 20 20 73 43 75 72 2e 6e 20 3d          sCur.n =
33310 20 30 3b 0a 23 69 66 64 65 66 20 57 48 45 52 45   0;.#ifdef WHERE
33320 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
33330 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
33340 28 30 78 32 30 30 2c 20 28 22 4f 52 2d 74 65 72  (0x200, ("OR-ter
33350 6d 20 25 64 20 6f 66 20 25 70 20 68 61 73 20 25  m %d of %p has %
33360 64 20 73 75 62 74 65 72 6d 73 3a 5c 6e 22 2c 20  d subterms:\n", 
33370 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
33380 20 20 20 20 28 69 6e 74 29 28 70 4f 72 54 65 72      (int)(pOrTer
33390 6d 2d 70 4f 72 57 43 2d 3e 61 29 2c 20 70 54 65  m-pOrWC->a), pTe
333a0 72 6d 2c 20 73 53 75 62 42 75 69 6c 64 2e 70 57  rm, sSubBuild.pW
333b0 43 2d 3e 6e 54 65 72 6d 29 29 3b 0a 20 20 20 20  C->nTerm));.    
333c0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
333d0 68 65 72 65 54 72 61 63 65 20 26 20 30 78 34 30  hereTrace & 0x40
333e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  0 ){.          f
333f0 6f 72 28 69 3d 30 3b 20 69 3c 73 53 75 62 42 75  or(i=0; i<sSubBu
33400 69 6c 64 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  ild.pWC->nTerm; 
33410 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
33420 20 20 77 68 65 72 65 54 65 72 6d 50 72 69 6e 74    whereTermPrint
33430 28 26 73 53 75 62 42 75 69 6c 64 2e 70 57 43 2d  (&sSubBuild.pWC-
33440 3e 61 5b 69 5d 2c 20 69 29 3b 0a 20 20 20 20 20  >a[i], i);.     
33450 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
33460 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
33470 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
33480 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 20  UALTABLE.       
33490 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
334a0 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20  Item->pTab) ){. 
334b0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68           rc = wh
334c0 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61  ereLoopAddVirtua
334d0 6c 28 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 45  l(&sSubBuild, mE
334e0 78 74 72 61 29 3b 0a 20 20 20 20 20 20 20 20 7d  xtra);.        }
334f0 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
33500 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20      {.          
33510 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
33520 64 42 74 72 65 65 28 26 73 53 75 62 42 75 69 6c  dBtree(&sSubBuil
33530 64 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20  d, mExtra);.    
33540 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
33550 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
33560 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
33570 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72  = whereLoopAddOr
33580 28 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 45 78  (&sSubBuild, mEx
33590 74 72 61 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  tra);.        }.
335a0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
335b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
335c0 20 73 43 75 72 2e 6e 3d 3d 30 20 29 3b 0a 20 20   sCur.n==0 );.  
335d0 20 20 20 20 20 20 69 66 28 20 73 43 75 72 2e 6e        if( sCur.n
335e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
335f0 20 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20   sSum.n = 0;.   
33600 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
33610 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
33620 6f 6e 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  once ){.        
33630 20 20 77 68 65 72 65 4f 72 4d 6f 76 65 28 26 73    whereOrMove(&s
33640 53 75 6d 2c 20 26 73 43 75 72 29 3b 0a 20 20 20  Sum, &sCur);.   
33650 20 20 20 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b         once = 0;
33660 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
33670 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65 4f            WhereO
33680 72 53 65 74 20 73 50 72 65 76 3b 0a 20 20 20 20  rSet sPrev;.    
33690 20 20 20 20 20 20 77 68 65 72 65 4f 72 4d 6f 76        whereOrMov
336a0 65 28 26 73 50 72 65 76 2c 20 26 73 53 75 6d 29  e(&sPrev, &sSum)
336b0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 6d  ;.          sSum
336c0 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  .n = 0;.        
336d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 50 72    for(i=0; i<sPr
336e0 65 76 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ev.n; i++){.    
336f0 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
33700 20 6a 3c 73 43 75 72 2e 6e 3b 20 6a 2b 2b 29 7b   j<sCur.n; j++){
33710 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77  .              w
33720 68 65 72 65 4f 72 49 6e 73 65 72 74 28 26 73 53  hereOrInsert(&sS
33730 75 6d 2c 20 73 50 72 65 76 2e 61 5b 69 5d 2e 70  um, sPrev.a[i].p
33740 72 65 72 65 71 20 7c 20 73 43 75 72 2e 61 5b 6a  rereq | sCur.a[j
33750 5d 2e 70 72 65 72 65 71 2c 0a 20 20 20 20 20 20  ].prereq,.      
33760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33770 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 67        sqlite3Log
33780 45 73 74 41 64 64 28 73 50 72 65 76 2e 61 5b 69  EstAdd(sPrev.a[i
33790 5d 2e 72 52 75 6e 2c 20 73 43 75 72 2e 61 5b 6a  ].rRun, sCur.a[j
337a0 5d 2e 72 52 75 6e 29 2c 0a 20 20 20 20 20 20 20  ].rRun),.       
337b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
337c0 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 67 45       sqlite3LogE
337d0 73 74 41 64 64 28 73 50 72 65 76 2e 61 5b 69 5d  stAdd(sPrev.a[i]
337e0 2e 6e 4f 75 74 2c 20 73 43 75 72 2e 61 5b 6a 5d  .nOut, sCur.a[j]
337f0 2e 6e 4f 75 74 29 29 3b 0a 20 20 20 20 20 20 20  .nOut));.       
33800 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
33810 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
33820 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d     }.      pNew-
33830 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20  >nLTerm = 1;.   
33840 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
33850 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  0] = pTerm;.    
33860 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
33870 3d 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52  = WHERE_MULTI_OR
33880 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53  ;.      pNew->rS
33890 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  etup = 0;.      
338a0 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d  pNew->iSortIdx =
338b0 20 30 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   0;.      memset
338c0 28 26 70 4e 65 77 2d 3e 75 2c 20 30 2c 20 73 69  (&pNew->u, 0, si
338d0 7a 65 6f 66 28 70 4e 65 77 2d 3e 75 29 29 3b 0a  zeof(pNew->u));.
338e0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72        for(i=0; r
338f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
33900 69 3c 73 53 75 6d 2e 6e 3b 20 69 2b 2b 29 7b 0a  i<sSum.n; i++){.
33910 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e          /* TUNIN
33920 47 3a 20 43 75 72 72 65 6e 74 6c 79 20 73 53 75  G: Currently sSu
33930 6d 2e 61 5b 69 5d 2e 72 52 75 6e 20 69 73 20 73  m.a[i].rRun is s
33940 65 74 20 74 6f 20 74 68 65 20 73 75 6d 20 6f 66  et to the sum of
33950 20 74 68 65 20 63 6f 73 74 73 0a 20 20 20 20 20   the costs.     
33960 20 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 73 75 62     ** of all sub
33970 2d 73 63 61 6e 73 20 72 65 71 75 69 72 65 64 20  -scans required 
33980 62 79 20 74 68 65 20 4f 52 2d 73 63 61 6e 2e 20  by the OR-scan. 
33990 48 6f 77 65 76 65 72 2c 20 64 75 65 20 74 6f 20  However, due to 
339a0 72 6f 75 6e 64 69 6e 67 0a 20 20 20 20 20 20 20  rounding.       
339b0 20 2a 2a 20 65 72 72 6f 72 73 2c 20 69 74 20 6d   ** errors, it m
339c0 61 79 20 62 65 20 74 68 61 74 20 74 68 65 20 63  ay be that the c
339d0 6f 73 74 20 6f 66 20 74 68 65 20 4f 52 2d 73 63  ost of the OR-sc
339e0 61 6e 20 69 73 20 65 71 75 61 6c 20 74 6f 20 69  an is equal to i
339f0 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f  ts.        ** mo
33a00 73 74 20 65 78 70 65 6e 73 69 76 65 20 73 75 62  st expensive sub
33a10 2d 73 63 61 6e 2e 20 41 64 64 20 74 68 65 20 73  -scan. Add the s
33a20 6d 61 6c 6c 65 73 74 20 70 6f 73 73 69 62 6c 65  mallest possible
33a30 20 70 65 6e 61 6c 74 79 20 0a 20 20 20 20 20 20   penalty .      
33a40 20 20 2a 2a 20 28 65 71 75 69 76 61 6c 65 6e 74    ** (equivalent
33a50 20 74 6f 20 6d 75 6c 74 69 70 6c 79 69 6e 67 20   to multiplying 
33a60 74 68 65 20 63 6f 73 74 20 62 79 20 31 2e 30 37  the cost by 1.07
33a70 29 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  ) to ensure that
33a80 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69   .        ** thi
33a90 73 20 64 6f 65 73 20 6e 6f 74 20 68 61 70 70 65  s does not happe
33aa0 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6f  n. Otherwise, fo
33ab0 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 20  r WHERE clauses 
33ac0 73 75 63 68 20 61 73 20 74 68 65 0a 20 20 20 20  such as the.    
33ad0 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67      ** following
33ae0 20 77 68 65 72 65 20 74 68 65 72 65 20 69 73 20   where there is 
33af0 61 6e 20 69 6e 64 65 78 20 6f 6e 20 22 79 22 3a  an index on "y":
33b00 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
33b10 20 20 20 20 2a 2a 20 20 20 20 20 57 48 45 52 45      **     WHERE
33b20 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 78 3d 3f 2c   likelihood(x=?,
33b30 20 30 2e 39 39 29 20 4f 52 20 79 3d 3f 0a 20 20   0.99) OR y=?.  
33b40 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
33b50 20 2a 2a 20 74 68 65 20 70 6c 61 6e 6e 65 72 20   ** the planner 
33b60 6d 61 79 20 65 6c 65 63 74 20 74 6f 20 22 4f 52  may elect to "OR
33b70 22 20 74 6f 67 65 74 68 65 72 20 61 20 66 75 6c  " together a ful
33b80 6c 2d 74 61 62 6c 65 20 73 63 61 6e 20 61 6e 64  l-table scan and
33b90 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69   an.        ** i
33ba0 6e 64 65 78 20 6c 6f 6f 6b 75 70 2e 20 41 6e 64  ndex lookup. And
33bb0 20 6f 74 68 65 72 20 73 69 6d 69 6c 61 72 6c 79   other similarly
33bc0 20 6f 64 64 20 72 65 73 75 6c 74 73 2e 20 20 2a   odd results.  *
33bd0 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  /.        pNew->
33be0 72 52 75 6e 20 3d 20 73 53 75 6d 2e 61 5b 69 5d  rRun = sSum.a[i]
33bf0 2e 72 52 75 6e 20 2b 20 31 3b 0a 20 20 20 20 20  .rRun + 1;.     
33c00 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
33c10 73 53 75 6d 2e 61 5b 69 5d 2e 6e 4f 75 74 3b 0a  sSum.a[i].nOut;.
33c20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72          pNew->pr
33c30 65 72 65 71 20 3d 20 73 53 75 6d 2e 61 5b 69 5d  ereq = sSum.a[i]
33c40 2e 70 72 65 72 65 71 3b 0a 20 20 20 20 20 20 20  .prereq;.       
33c50 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49   rc = whereLoopI
33c60 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
33c70 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pNew);.      }. 
33c80 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
33c90 30 78 32 30 30 2c 20 28 22 45 6e 64 20 70 72 6f  0x200, ("End pro
33ca0 63 65 73 73 69 6e 67 20 4f 52 2d 63 6c 61 75 73  cessing OR-claus
33cb0 65 20 25 70 5c 6e 22 2c 20 70 54 65 72 6d 29 29  e %p\n", pTerm))
33cc0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
33cd0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
33ce0 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c  * Add all WhereL
33cf0 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20  oop objects for 
33d00 61 6c 6c 20 74 61 62 6c 65 73 20 0a 2a 2f 0a 73  all tables .*/.s
33d10 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
33d20 6f 6f 70 41 64 64 41 6c 6c 28 57 68 65 72 65 4c  oopAddAll(WhereL
33d30 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
33d40 6c 64 65 72 29 7b 0a 20 20 57 68 65 72 65 49 6e  lder){.  WhereIn
33d50 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75  fo *pWInfo = pBu
33d60 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20  ilder->pWInfo;. 
33d70 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 20   Bitmask mExtra 
33d80 3d 20 30 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  = 0;.  Bitmask m
33d90 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 69 6e 74  Prior = 0;.  int
33da0 20 69 54 61 62 3b 0a 20 20 53 72 63 4c 69 73 74   iTab;.  SrcList
33db0 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49   *pTabList = pWI
33dc0 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20  nfo->pTabList;. 
33dd0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
33de0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73  item *pItem;.  s
33df0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49  qlite3 *db = pWI
33e00 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b  nfo->pParse->db;
33e10 0a 20 20 69 6e 74 20 6e 54 61 62 4c 69 73 74 20  .  int nTabList 
33e20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  = pWInfo->nLevel
33e30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
33e40 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 70 72 69  ITE_OK;.  u8 pri
33e50 6f 72 4a 6f 69 6e 54 79 70 65 20 3d 20 30 3b 0a  orJoinType = 0;.
33e60 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65    WhereLoop *pNe
33e70 77 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76  w;..  /* Loop ov
33e80 65 72 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e  er the tables in
33e90 20 74 68 65 20 6a 6f 69 6e 2c 20 66 72 6f 6d 20   the join, from 
33ea0 6c 65 66 74 20 74 6f 20 72 69 67 68 74 20 2a 2f  left to right */
33eb0 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64  .  pNew = pBuild
33ec0 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 77 68 65 72  er->pNew;.  wher
33ed0 65 4c 6f 6f 70 49 6e 69 74 28 70 4e 65 77 29 3b  eLoopInit(pNew);
33ee0 0a 20 20 66 6f 72 28 69 54 61 62 3d 30 2c 20 70  .  for(iTab=0, p
33ef0 49 74 65 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61  Item=pTabList->a
33f00 3b 20 69 54 61 62 3c 6e 54 61 62 4c 69 73 74 3b  ; iTab<nTabList;
33f10 20 69 54 61 62 2b 2b 2c 20 70 49 74 65 6d 2b 2b   iTab++, pItem++
33f20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 54 61  ){.    pNew->iTa
33f30 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 4e  b = iTab;.    pN
33f40 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 67  ew->maskSelf = g
33f50 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e  etMask(&pWInfo->
33f60 73 4d 61 73 6b 53 65 74 2c 20 70 49 74 65 6d 2d  sMaskSet, pItem-
33f70 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 69  >iCursor);.    i
33f80 66 28 20 28 28 70 49 74 65 6d 2d 3e 6a 6f 69 6e  f( ((pItem->join
33f90 74 79 70 65 7c 70 72 69 6f 72 4a 6f 69 6e 54 79  type|priorJoinTy
33fa0 70 65 29 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a  pe) & (JT_LEFT|J
33fb0 54 5f 43 52 4f 53 53 29 29 21 3d 30 20 29 7b 0a  T_CROSS))!=0 ){.
33fc0 20 20 20 20 20 20 6d 45 78 74 72 61 20 3d 20 6d        mExtra = m
33fd0 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  Prior;.    }.   
33fe0 20 70 72 69 6f 72 4a 6f 69 6e 54 79 70 65 20 3d   priorJoinType =
33ff0 20 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65   pItem->jointype
34000 3b 0a 20 20 20 20 69 66 28 20 49 73 56 69 72 74  ;.    if( IsVirt
34010 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62 29  ual(pItem->pTab)
34020 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   ){.      rc = w
34030 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75  hereLoopAddVirtu
34040 61 6c 28 70 42 75 69 6c 64 65 72 2c 20 6d 45 78  al(pBuilder, mEx
34050 74 72 61 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  tra);.    }else{
34060 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72  .      rc = wher
34070 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 70 42  eLoopAddBtree(pB
34080 75 69 6c 64 65 72 2c 20 6d 45 78 74 72 61 29 3b  uilder, mExtra);
34090 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
340a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
340b0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
340c0 4c 6f 6f 70 41 64 64 4f 72 28 70 42 75 69 6c 64  LoopAddOr(pBuild
340d0 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20  er, mExtra);.   
340e0 20 7d 0a 20 20 20 20 6d 50 72 69 6f 72 20 7c 3d   }.    mPrior |=
340f0 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b   pNew->maskSelf;
34100 0a 20 20 20 20 69 66 28 20 72 63 20 7c 7c 20 64  .    if( rc || d
34110 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
34120 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 77  ) break;.  }.  w
34130 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62  hereLoopClear(db
34140 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72  , pNew);.  retur
34150 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  n rc;.}../*.** E
34160 78 61 6d 69 6e 65 20 61 20 57 68 65 72 65 50 61  xamine a WherePa
34170 74 68 20 28 77 69 74 68 20 74 68 65 20 61 64 64  th (with the add
34180 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 78 74  ition of the ext
34190 72 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 66 20  ra WhereLoop of 
341a0 74 68 65 20 35 74 68 0a 2a 2a 20 70 61 72 61 6d  the 5th.** param
341b0 65 74 65 72 73 29 20 74 6f 20 73 65 65 20 69 66  eters) to see if
341c0 20 69 74 20 6f 75 74 70 75 74 73 20 72 6f 77 73   it outputs rows
341d0 20 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65   in the requeste
341e0 64 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 28 6f  d ORDER BY.** (o
341f0 72 20 47 52 4f 55 50 20 42 59 29 20 77 69 74 68  r GROUP BY) with
34200 6f 75 74 20 72 65 71 75 69 72 69 6e 67 20 61 20  out requiring a 
34210 73 65 70 61 72 61 74 65 20 73 6f 72 74 20 6f 70  separate sort op
34220 65 72 61 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e  eration.  Return
34230 20 4e 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4e 3e 30   N:.** .**   N>0
34240 3a 20 20 20 4e 20 74 65 72 6d 73 20 6f 66 20 74  :   N terms of t
34250 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
34260 73 65 20 61 72 65 20 73 61 74 69 73 66 69 65 64  se are satisfied
34270 0a 2a 2a 20 20 20 4e 3d 3d 30 3a 20 20 4e 6f 20  .**   N==0:  No 
34280 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44  terms of the ORD
34290 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65  ER BY clause are
342a0 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 20 20   satisfied.**   
342b0 4e 3c 30 3a 20 20 20 55 6e 6b 6e 6f 77 6e 20 79  N<0:   Unknown y
342c0 65 74 20 68 6f 77 20 6d 61 6e 79 20 74 65 72 6d  et how many term
342d0 73 20 6f 66 20 4f 52 44 45 52 20 42 59 20 6d 69  s of ORDER BY mi
342e0 67 68 74 20 62 65 20 73 61 74 69 73 66 69 65 64  ght be satisfied
342f0 2e 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  .   .**.** Note 
34300 74 68 61 74 20 70 72 6f 63 65 73 73 69 6e 67 20  that processing 
34310 66 6f 72 20 57 48 45 52 45 5f 47 52 4f 55 50 42  for WHERE_GROUPB
34320 59 20 61 6e 64 20 57 48 45 52 45 5f 44 49 53 54  Y and WHERE_DIST
34330 49 4e 43 54 42 59 20 69 73 20 6e 6f 74 20 61 73  INCTBY is not as
34340 0a 2a 2a 20 73 74 72 69 63 74 2e 20 20 57 69 74  .** strict.  Wit
34350 68 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20 44  h GROUP BY and D
34360 49 53 54 49 4e 43 54 20 74 68 65 20 6f 6e 6c 79  ISTINCT the only
34370 20 72 65 71 75 69 72 65 6d 65 6e 74 20 69 73 20   requirement is 
34380 74 68 61 74 0a 2a 2a 20 65 71 75 69 76 61 6c 65  that.** equivale
34390 6e 74 20 72 6f 77 73 20 61 70 70 65 61 72 20 69  nt rows appear i
343a0 6d 6d 65 64 69 61 74 65 6c 79 20 61 64 6a 61 63  mmediately adjac
343b0 65 6e 74 20 74 6f 20 6f 6e 65 20 61 6e 6f 74 68  ent to one anoth
343c0 65 72 2e 20 20 47 52 4f 55 50 20 42 59 0a 2a 2a  er.  GROUP BY.**
343d0 20 61 6e 64 20 44 49 53 54 49 4e 43 54 20 64 6f   and DISTINCT do
343e0 20 6e 6f 74 20 72 65 71 75 69 72 65 20 72 6f 77   not require row
343f0 73 20 74 6f 20 61 70 70 65 61 72 20 69 6e 20 61  s to appear in a
34400 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20 6f 72  ny particular or
34410 64 65 72 20 61 73 20 6c 6f 6e 67 0a 2a 2a 20 61  der as long.** a
34420 73 20 65 71 75 69 76 61 6c 65 6e 74 20 72 6f 77  s equivalent row
34430 73 20 61 72 65 20 67 72 6f 75 70 65 64 20 74 6f  s are grouped to
34440 67 65 74 68 65 72 2e 20 20 54 68 75 73 20 66 6f  gether.  Thus fo
34450 72 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20 44  r GROUP BY and D
34460 49 53 54 49 4e 43 54 0a 2a 2a 20 74 68 65 20 70  ISTINCT.** the p
34470 4f 72 64 65 72 42 79 20 74 65 72 6d 73 20 63 61  OrderBy terms ca
34480 6e 20 62 65 20 6d 61 74 63 68 65 64 20 69 6e 20  n be matched in 
34490 61 6e 79 20 6f 72 64 65 72 2e 20 20 57 69 74 68  any order.  With
344a0 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20 0a   ORDER BY, the .
344b0 2a 2a 20 70 4f 72 64 65 72 42 79 20 74 65 72 6d  ** pOrderBy term
344c0 73 20 6d 75 73 74 20 62 65 20 6d 61 74 63 68 65  s must be matche
344d0 64 20 69 6e 20 73 74 72 69 63 74 20 6c 65 66 74  d in strict left
344e0 2d 74 6f 2d 72 69 67 68 74 20 6f 72 64 65 72 2e  -to-right order.
344f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 38 20 77 68  .*/.static i8 wh
34500 65 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73  erePathSatisfies
34510 4f 72 64 65 72 42 79 28 0a 20 20 57 68 65 72 65  OrderBy(.  Where
34520 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20  Info *pWInfo,   
34530 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
34540 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
34550 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
34560 2f 2a 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47  /* ORDER BY or G
34570 52 4f 55 50 20 42 59 20 6f 72 20 44 49 53 54 49  ROUP BY or DISTI
34580 4e 43 54 20 63 6c 61 75 73 65 20 74 6f 20 63 68  NCT clause to ch
34590 65 63 6b 20 2a 2f 0a 20 20 57 68 65 72 65 50 61  eck */.  WherePa
345a0 74 68 20 2a 70 50 61 74 68 2c 20 20 20 20 20 2f  th *pPath,     /
345b0 2a 20 54 68 65 20 57 68 65 72 65 50 61 74 68 20  * The WherePath 
345c0 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 75 31  to check */.  u1
345d0 36 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20  6 wctrlFlags,   
345e0 20 20 20 20 2f 2a 20 4d 69 67 68 74 20 63 6f 6e      /* Might con
345f0 74 61 69 6e 20 57 48 45 52 45 5f 47 52 4f 55 50  tain WHERE_GROUP
34600 42 59 20 6f 72 20 57 48 45 52 45 5f 44 49 53 54  BY or WHERE_DIST
34610 49 4e 43 54 42 59 20 2a 2f 0a 20 20 75 31 36 20  INCTBY */.  u16 
34620 6e 4c 6f 6f 70 2c 20 20 20 20 20 20 20 20 20 20  nLoop,          
34630 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
34640 6e 74 72 69 65 73 20 69 6e 20 70 50 61 74 68 2d  ntries in pPath-
34650 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 57 68  >aLoop[] */.  Wh
34660 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 2c 20  ereLoop *pLast, 
34670 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20      /* Add this 
34680 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 74 68 65  WhereLoop to the
34690 20 65 6e 64 20 6f 66 20 70 50 61 74 68 2d 3e 61   end of pPath->a
346a0 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 42 69 74 6d  Loop[] */.  Bitm
346b0 61 73 6b 20 2a 70 52 65 76 4d 61 73 6b 20 20 20  ask *pRevMask   
346c0 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 73 6b 20 6f    /* OUT: Mask o
346d0 66 20 57 68 65 72 65 4c 6f 6f 70 73 20 74 6f 20  f WhereLoops to 
346e0 72 75 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f  run in reverse o
346f0 72 64 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 38 20  rder */.){.  u8 
34700 72 65 76 53 65 74 3b 20 20 20 20 20 20 20 20 20  revSet;         
34710 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65     /* True if re
34720 76 20 69 73 20 6b 6e 6f 77 6e 20 2a 2f 0a 20 20  v is known */.  
34730 75 38 20 72 65 76 3b 20 20 20 20 20 20 20 20 20  u8 rev;         
34740 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6f 73 69        /* Composi
34750 74 65 20 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f  te sort order */
34760 0a 20 20 75 38 20 72 65 76 49 64 78 3b 20 20 20  .  u8 revIdx;   
34770 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
34780 78 20 73 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a  x sort order */.
34790 20 20 75 38 20 69 73 4f 72 64 65 72 44 69 73 74    u8 isOrderDist
347a0 69 6e 63 74 3b 20 20 20 2f 2a 20 41 6c 6c 20 70  inct;   /* All p
347b0 72 69 6f 72 20 57 68 65 72 65 4c 6f 6f 70 73 20  rior WhereLoops 
347c0 61 72 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e  are order-distin
347d0 63 74 20 2a 2f 0a 20 20 75 38 20 64 69 73 74 69  ct */.  u8 disti
347e0 6e 63 74 43 6f 6c 75 6d 6e 73 3b 20 20 20 2f 2a  nctColumns;   /*
347f0 20 54 72 75 65 20 69 66 20 74 68 65 20 6c 6f 6f   True if the loo
34800 70 20 68 61 73 20 55 4e 49 51 55 45 20 4e 4f 54  p has UNIQUE NOT
34810 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f   NULL columns */
34820 0a 20 20 75 38 20 69 73 4d 61 74 63 68 3b 20 20  .  u8 isMatch;  
34830 20 20 20 20 20 20 20 20 20 2f 2a 20 69 43 6f 6c           /* iCol
34840 75 6d 6e 20 6d 61 74 63 68 65 73 20 61 20 74 65  umn matches a te
34850 72 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  rm of the ORDER 
34860 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75  BY clause */.  u
34870 31 36 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20  16 nKeyCol;     
34880 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
34890 66 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 69 6e  f key columns in
348a0 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36   pIndex */.  u16
348b0 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20   nColumn;       
348c0 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
348d0 65 72 20 6f 66 20 6f 72 64 65 72 65 64 20 63 6f  er of ordered co
348e0 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64  lumns in the ind
348f0 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e 4f 72 64  ex */.  u16 nOrd
34900 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a  erBy;         /*
34910 20 4e 75 6d 62 65 72 20 74 65 72 6d 73 20 69 6e   Number terms in
34920 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
34930 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  ause */.  int iL
34940 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  oop;            
34950 2f 2a 20 49 6e 64 65 78 20 6f 66 20 57 68 65 72  /* Index of Wher
34960 65 4c 6f 6f 70 20 69 6e 20 70 50 61 74 68 20 62  eLoop in pPath b
34970 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 20 2a  eing processed *
34980 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  /.  int i, j;   
34990 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
349a0 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
349b0 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20  int iCur;       
349c0 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
349d0 6e 75 6d 62 65 72 20 66 6f 72 20 63 75 72 72 65  number for curre
349e0 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a  nt WhereLoop */.
349f0 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20    int iColumn;  
34a00 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6c          /* A col
34a10 75 6d 6e 20 6e 75 6d 62 65 72 20 77 69 74 68 69  umn number withi
34a20 6e 20 74 61 62 6c 65 20 69 43 75 72 20 2a 2f 0a  n table iCur */.
34a30 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
34a40 6f 70 20 3d 20 30 3b 20 2f 2a 20 43 75 72 72 65  op = 0; /* Curre
34a50 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20 62 65 69  nt WhereLoop bei
34a60 6e 67 20 70 72 6f 63 65 73 73 65 64 2e 20 2a 2f  ng processed. */
34a70 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
34a80 65 72 6d 3b 20 20 20 20 20 2f 2a 20 41 20 73 69  erm;     /* A si
34a90 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65  ngle term of the
34aa0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
34ab0 0a 20 20 45 78 70 72 20 2a 70 4f 42 45 78 70 72  .  Expr *pOBExpr
34ac0 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65  ;        /* An e
34ad0 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74  xpression from t
34ae0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
34af0 73 65 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20  se */.  CollSeq 
34b00 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 2f 2a  *pColl;       /*
34b10 20 43 4f 4c 4c 41 54 45 20 66 75 6e 63 74 69 6f   COLLATE functio
34b20 6e 20 66 72 6f 6d 20 61 6e 20 4f 52 44 45 52 20  n from an ORDER 
34b30 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d 20 2a  BY clause term *
34b40 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  /.  Index *pInde
34b50 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  x;        /* The
34b60 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65   index associate
34b70 64 20 77 69 74 68 20 70 4c 6f 6f 70 20 2a 2f 0a  d with pLoop */.
34b80 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
34b90 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e  pWInfo->pParse->
34ba0 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65  db;  /* Database
34bb0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
34bc0 20 42 69 74 6d 61 73 6b 20 6f 62 53 61 74 20 3d   Bitmask obSat =
34bd0 20 30 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f   0;    /* Mask o
34be0 66 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  f ORDER BY terms
34bf0 20 73 61 74 69 73 66 69 65 64 20 73 6f 20 66 61   satisfied so fa
34c00 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f  r */.  Bitmask o
34c10 62 44 6f 6e 65 3b 20 20 20 20 20 20 20 2f 2a 20  bDone;       /* 
34c20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 4f 52 44 45  Mask of all ORDE
34c30 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20  R BY terms */.  
34c40 42 69 74 6d 61 73 6b 20 6f 72 64 65 72 44 69 73  Bitmask orderDis
34c50 74 69 6e 63 74 4d 61 73 6b 3b 20 20 2f 2a 20 4d  tinctMask;  /* M
34c60 61 73 6b 20 6f 66 20 61 6c 6c 20 77 65 6c 6c 2d  ask of all well-
34c70 6f 72 64 65 72 65 64 20 6c 6f 6f 70 73 20 2a 2f  ordered loops */
34c80 0a 20 20 42 69 74 6d 61 73 6b 20 72 65 61 64 79  .  Bitmask ready
34c90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
34ca0 2a 20 4d 61 73 6b 20 6f 66 20 69 6e 6e 65 72 20  * Mask of inner 
34cb0 6c 6f 6f 70 73 20 2a 2f 0a 0a 20 20 2f 2a 0a 20  loops */..  /*. 
34cc0 20 2a 2a 20 57 65 20 73 61 79 20 74 68 65 20 57   ** We say the W
34cd0 68 65 72 65 4c 6f 6f 70 20 69 73 20 22 6f 6e 65  hereLoop is "one
34ce0 2d 72 6f 77 22 20 69 66 20 69 74 20 67 65 6e 65  -row" if it gene
34cf0 72 61 74 65 73 20 6e 6f 20 6d 6f 72 65 20 74 68  rates no more th
34d00 61 6e 20 6f 6e 65 0a 20 20 2a 2a 20 72 6f 77 20  an one.  ** row 
34d10 6f 66 20 6f 75 74 70 75 74 2e 20 20 41 20 57 68  of output.  A Wh
34d20 65 72 65 4c 6f 6f 70 20 69 73 20 6f 6e 65 2d 72  ereLoop is one-r
34d30 6f 77 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65  ow if all of the
34d40 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
34d50 72 75 65 3a 0a 20 20 2a 2a 20 20 28 61 29 20 41  rue:.  **  (a) A
34d60 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73  ll index columns
34d70 20 6d 61 74 63 68 20 77 69 74 68 20 57 48 45 52   match with WHER
34d80 45 5f 43 4f 4c 55 4d 4e 5f 45 51 2e 0a 20 20 2a  E_COLUMN_EQ..  *
34d90 2a 20 20 28 62 29 20 54 68 65 20 69 6e 64 65 78  *  (b) The index
34da0 20 69 73 20 75 6e 69 71 75 65 0a 20 20 2a 2a 20   is unique.  ** 
34db0 41 6e 79 20 57 68 65 72 65 4c 6f 6f 70 20 77 69  Any WhereLoop wi
34dc0 74 68 20 61 6e 20 57 48 45 52 45 5f 43 4f 4c 55  th an WHERE_COLU
34dd0 4d 4e 5f 45 51 20 63 6f 6e 73 74 72 61 69 6e 74  MN_EQ constraint
34de0 20 6f 6e 20 74 68 65 20 72 6f 77 69 64 20 69 73   on the rowid is
34df0 20 6f 6e 65 2d 72 6f 77 2e 0a 20 20 2a 2a 20 45   one-row..  ** E
34e00 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68 65  very one-row Whe
34e10 72 65 4c 6f 6f 70 20 77 69 6c 6c 20 68 61 76 65  reLoop will have
34e20 20 74 68 65 20 57 48 45 52 45 5f 4f 4e 45 52 4f   the WHERE_ONERO
34e30 57 20 62 69 74 20 73 65 74 20 69 6e 20 77 73 46  W bit set in wsF
34e40 6c 61 67 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lags..  **.  ** 
34e50 57 65 20 73 61 79 20 74 68 65 20 57 68 65 72 65  We say the Where
34e60 4c 6f 6f 70 20 69 73 20 22 6f 72 64 65 72 2d 64  Loop is "order-d
34e70 69 73 74 69 6e 63 74 22 20 69 66 20 74 68 65 20  istinct" if the 
34e80 73 65 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 66  set of columns f
34e90 72 6f 6d 0a 20 20 2a 2a 20 74 68 61 74 20 57 68  rom.  ** that Wh
34ea0 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 61 72 65  ereLoop that are
34eb0 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
34ec0 20 63 6c 61 75 73 65 20 61 72 65 20 64 69 66 66   clause are diff
34ed0 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79 0a  erent for every.
34ee0 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65 20    ** row of the 
34ef0 57 68 65 72 65 4c 6f 6f 70 2e 20 20 45 76 65 72  WhereLoop.  Ever
34f00 79 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c  y one-row WhereL
34f10 6f 6f 70 20 69 73 20 61 75 74 6f 6d 61 74 69 63  oop is automatic
34f20 61 6c 6c 79 0a 20 20 2a 2a 20 6f 72 64 65 72 2d  ally.  ** order-
34f30 64 69 73 74 69 6e 63 74 2e 20 20 20 41 20 57 68  distinct.   A Wh
34f40 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 68 61 73  ereLoop that has
34f50 20 6e 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   no columns in t
34f60 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
34f70 73 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6f  se.  ** is not o
34f80 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 20 54  rder-distinct. T
34f90 6f 20 62 65 20 6f 72 64 65 72 2d 64 69 73 74 69  o be order-disti
34fa0 6e 63 74 20 69 73 20 6e 6f 74 20 71 75 69 74 65  nct is not quite
34fb0 20 74 68 65 20 73 61 6d 65 20 61 73 20 62 65 69   the same as bei
34fc0 6e 67 0a 20 20 2a 2a 20 55 4e 49 51 55 45 20 73  ng.  ** UNIQUE s
34fd0 69 6e 63 65 20 61 20 55 4e 49 51 55 45 20 63 6f  ince a UNIQUE co
34fe0 6c 75 6d 6e 20 6f 72 20 69 6e 64 65 78 20 63 61  lumn or index ca
34ff0 6e 20 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 20  n have multiple 
35000 72 6f 77 73 20 74 68 61 74 20 0a 20 20 2a 2a 20  rows that .  ** 
35010 61 72 65 20 4e 55 4c 4c 20 61 6e 64 20 4e 55 4c  are NULL and NUL
35020 4c 20 76 61 6c 75 65 73 20 61 72 65 20 65 71 75  L values are equ
35030 69 76 61 6c 65 6e 74 20 66 6f 72 20 74 68 65 20  ivalent for the 
35040 70 75 72 70 6f 73 65 20 6f 66 20 6f 72 64 65 72  purpose of order
35050 2d 64 69 73 74 69 6e 63 74 2e 0a 20 20 2a 2a 20  -distinct..  ** 
35060 54 6f 20 62 65 20 6f 72 64 65 72 2d 64 69 73 74  To be order-dist
35070 69 6e 63 74 2c 20 74 68 65 20 63 6f 6c 75 6d 6e  inct, the column
35080 73 20 6d 75 73 74 20 62 65 20 55 4e 49 51 55 45  s must be UNIQUE
35090 20 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 20   and NOT NULL.. 
350a0 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 6f 77   **.  ** The row
350b0 69 64 20 66 6f 72 20 61 20 74 61 62 6c 65 20 69  id for a table i
350c0 73 20 61 6c 77 61 79 73 20 55 4e 49 51 55 45 20  s always UNIQUE 
350d0 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c 20 73 6f 20  and NOT NULL so 
350e0 77 68 65 6e 65 76 65 72 20 74 68 65 0a 20 20 2a  whenever the.  *
350f0 2a 20 72 6f 77 69 64 20 61 70 70 65 61 72 73 20  * rowid appears 
35100 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  in the ORDER BY 
35110 63 6c 61 75 73 65 2c 20 74 68 65 20 63 6f 72 72  clause, the corr
35120 65 73 70 6f 6e 64 69 6e 67 20 57 68 65 72 65 4c  esponding WhereL
35130 6f 6f 70 20 69 73 0a 20 20 2a 2a 20 61 75 74 6f  oop is.  ** auto
35140 6d 61 74 69 63 61 6c 6c 79 20 6f 72 64 65 72 2d  matically order-
35150 64 69 73 74 69 6e 63 74 2e 0a 20 20 2a 2f 0a 0a  distinct..  */..
35160 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72    assert( pOrder
35170 42 79 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e  By!=0 );.  if( n
35180 4c 6f 6f 70 20 26 26 20 4f 70 74 69 6d 69 7a 61  Loop && Optimiza
35190 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c  tionDisabled(db,
351a0 20 53 51 4c 49 54 45 5f 4f 72 64 65 72 42 79 49   SQLITE_OrderByI
351b0 64 78 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e  dxJoin) ) return
351c0 20 30 3b 0a 0a 20 20 6e 4f 72 64 65 72 42 79 20   0;..  nOrderBy 
351d0 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  = pOrderBy->nExp
351e0 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  r;.  testcase( n
351f0 4f 72 64 65 72 42 79 3d 3d 42 4d 53 2d 31 20 29  OrderBy==BMS-1 )
35200 3b 0a 20 20 69 66 28 20 6e 4f 72 64 65 72 42 79  ;.  if( nOrderBy
35210 3e 42 4d 53 2d 31 20 29 20 72 65 74 75 72 6e 20  >BMS-1 ) return 
35220 30 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 6f 70  0;  /* Cannot op
35230 74 69 6d 69 7a 65 20 6f 76 65 72 6c 79 20 6c 61  timize overly la
35240 72 67 65 20 4f 52 44 45 52 20 42 59 73 20 2a 2f  rge ORDER BYs */
35250 0a 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  .  isOrderDistin
35260 63 74 20 3d 20 31 3b 0a 20 20 6f 62 44 6f 6e 65  ct = 1;.  obDone
35270 20 3d 20 4d 41 53 4b 42 49 54 28 6e 4f 72 64 65   = MASKBIT(nOrde
35280 72 42 79 29 2d 31 3b 0a 20 20 6f 72 64 65 72 44  rBy)-1;.  orderD
35290 69 73 74 69 6e 63 74 4d 61 73 6b 20 3d 20 30 3b  istinctMask = 0;
352a0 0a 20 20 72 65 61 64 79 20 3d 20 30 3b 0a 20 20  .  ready = 0;.  
352b0 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 73 4f  for(iLoop=0; isO
352c0 72 64 65 72 44 69 73 74 69 6e 63 74 20 26 26 20  rderDistinct && 
352d0 6f 62 53 61 74 3c 6f 62 44 6f 6e 65 20 26 26 20  obSat<obDone && 
352e0 69 4c 6f 6f 70 3c 3d 6e 4c 6f 6f 70 3b 20 69 4c  iLoop<=nLoop; iL
352f0 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  oop++){.    if( 
35300 69 4c 6f 6f 70 3e 30 20 29 20 72 65 61 64 79 20  iLoop>0 ) ready 
35310 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65  |= pLoop->maskSe
35320 6c 66 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20  lf;.    pLoop = 
35330 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 20 3f 20 70 50  iLoop<nLoop ? pP
35340 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70  ath->aLoop[iLoop
35350 5d 20 3a 20 70 4c 61 73 74 3b 0a 20 20 20 20 69  ] : pLast;.    i
35360 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
35370 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
35380 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20 20 20 20  LTABLE ){.      
35390 69 66 28 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61  if( pLoop->u.vta
353a0 62 2e 69 73 4f 72 64 65 72 65 64 20 29 20 6f 62  b.isOrdered ) ob
353b0 53 61 74 20 3d 20 6f 62 44 6f 6e 65 3b 0a 20 20  Sat = obDone;.  
353c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
353d0 0a 20 20 20 20 69 43 75 72 20 3d 20 70 57 49 6e  .    iCur = pWIn
353e0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b  fo->pTabList->a[
353f0 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 69 43 75  pLoop->iTab].iCu
35400 72 73 6f 72 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61  rsor;..    /* Ma
35410 72 6b 20 6f 66 66 20 61 6e 79 20 4f 52 44 45 52  rk off any ORDER
35420 20 42 59 20 74 65 72 6d 20 58 20 74 68 61 74 20   BY term X that 
35430 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  is a column in t
35440 68 65 20 74 61 62 6c 65 20 6f 66 0a 20 20 20 20  he table of.    
35450 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  ** the current l
35460 6f 6f 70 20 66 6f 72 20 77 68 69 63 68 20 74 68  oop for which th
35470 65 72 65 20 69 73 20 74 65 72 6d 20 69 6e 20 74  ere is term in t
35480 68 65 20 57 48 45 52 45 0a 20 20 20 20 2a 2a 20  he WHERE.    ** 
35490 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f  clause of the fo
354a0 72 6d 20 58 20 49 53 20 4e 55 4c 4c 20 6f 72 20  rm X IS NULL or 
354b0 58 3d 3f 20 74 68 61 74 20 72 65 66 65 72 65 6e  X=? that referen
354c0 63 65 20 6f 6e 6c 79 20 6f 75 74 65 72 0a 20 20  ce only outer.  
354d0 20 20 2a 2a 20 6c 6f 6f 70 73 2e 0a 20 20 20 20    ** loops..    
354e0 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
354f0 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29  i<nOrderBy; i++)
35500 7b 0a 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b  {.      if( MASK
35510 42 49 54 28 69 29 20 26 20 6f 62 53 61 74 20 29  BIT(i) & obSat )
35520 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
35530 20 70 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74   pOBExpr = sqlit
35540 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
35550 65 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  e(pOrderBy->a[i]
35560 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69  .pExpr);.      i
35570 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d  f( pOBExpr->op!=
35580 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74  TK_COLUMN ) cont
35590 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
355a0 70 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c 65 21  pOBExpr->iTable!
355b0 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65  =iCur ) continue
355c0 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
355d0 66 69 6e 64 54 65 72 6d 28 26 70 57 49 6e 66 6f  findTerm(&pWInfo
355e0 2d 3e 73 57 43 2c 20 69 43 75 72 2c 20 70 4f 42  ->sWC, iCur, pOB
355f0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20  Expr->iColumn,. 
35600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35610 20 20 20 20 20 20 7e 72 65 61 64 79 2c 20 57 4f        ~ready, WO
35620 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f  _EQ|WO_ISNULL|WO
35630 5f 49 53 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  _IS, 0);.      i
35640 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 63 6f  f( pTerm==0 ) co
35650 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
35660 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
35670 74 6f 72 26 28 57 4f 5f 45 51 7c 57 4f 5f 49 53  tor&(WO_EQ|WO_IS
35680 29 29 21 3d 30 20 26 26 20 70 4f 42 45 78 70 72  ))!=0 && pOBExpr
35690 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a  ->iColumn>=0 ){.
356a0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
356b0 61 72 20 2a 7a 31 2c 20 2a 7a 32 3b 0a 20 20 20  ar *z1, *z2;.   
356c0 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
356d0 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
356e0 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20  pWInfo->pParse, 
356f0 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
35700 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69  Expr);.        i
35710 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c  f( !pColl ) pCol
35720 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
35730 6c 3b 0a 20 20 20 20 20 20 20 20 7a 31 20 3d 20  l;.        z1 = 
35740 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  pColl->zName;.  
35750 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
35760 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
35770 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c  (pWInfo->pParse,
35780 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 29 3b 0a   pTerm->pExpr);.
35790 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f          if( !pCo
357a0 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d  ll ) pColl = db-
357b0 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
357c0 20 20 20 20 7a 32 20 3d 20 70 43 6f 6c 6c 2d 3e      z2 = pColl->
357d0 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69  zName;.        i
357e0 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
357f0 70 28 7a 31 2c 20 7a 32 29 21 3d 30 20 29 20 63  p(z1, z2)!=0 ) c
35800 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
35810 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
35820 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ->pExpr->op==TK_
35830 49 53 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  IS );.      }.  
35840 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53      obSat |= MAS
35850 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 7d 0a 0a  KBIT(i);.    }..
35860 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e      if( (pLoop->
35870 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
35880 4f 4e 45 52 4f 57 29 3d 3d 30 20 29 7b 0a 20 20  ONEROW)==0 ){.  
35890 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
358a0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
358b0 50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  PK ){.        pI
358c0 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  ndex = 0;.      
358d0 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a 20    nKeyCol = 0;. 
358e0 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d         nColumn =
358f0 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   1;.      }else 
35900 69 66 28 20 28 70 49 6e 64 65 78 20 3d 20 70 4c  if( (pIndex = pL
35910 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
35920 64 65 78 29 3d 3d 30 20 7c 7c 20 70 49 6e 64 65  dex)==0 || pInde
35930 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 7b  x->bUnordered ){
35940 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
35950 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
35960 20 20 20 20 20 20 20 20 6e 4b 65 79 43 6f 6c 20          nKeyCol 
35970 3d 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f  = pIndex->nKeyCo
35980 6c 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 75  l;.        nColu
35990 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 43 6f  mn = pIndex->nCo
359a0 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 61 73  lumn;.        as
359b0 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 6e  sert( nColumn==n
359c0 4b 65 79 43 6f 6c 2b 31 20 7c 7c 20 21 48 61 73  KeyCol+1 || !Has
359d0 52 6f 77 69 64 28 70 49 6e 64 65 78 2d 3e 70 54  Rowid(pIndex->pT
359e0 61 62 6c 65 29 20 29 3b 0a 20 20 20 20 20 20 20  able) );.       
359f0 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d   assert( pIndex-
35a00 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d  >aiColumn[nColum
35a10 6e 2d 31 5d 3d 3d 28 2d 31 29 20 7c 7c 20 21 48  n-1]==(-1) || !H
35a20 61 73 52 6f 77 69 64 28 70 49 6e 64 65 78 2d 3e  asRowid(pIndex->
35a30 70 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 20 20  pTable));.      
35a40 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63    isOrderDistinc
35a50 74 20 3d 20 49 73 55 6e 69 71 75 65 49 6e 64 65  t = IsUniqueInde
35a60 78 28 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20  x(pIndex);.     
35a70 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 6f   }..      /* Loo
35a80 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 63 6f  p through all co
35a90 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64  lumns of the ind
35aa0 65 78 20 61 6e 64 20 64 65 61 6c 20 77 69 74 68  ex and deal with
35ab0 20 74 68 65 20 6f 6e 65 73 0a 20 20 20 20 20 20   the ones.      
35ac0 2a 2a 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  ** that are not 
35ad0 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20 3d  constrained by =
35ae0 3d 20 6f 72 20 49 4e 2e 0a 20 20 20 20 20 20 2a  = or IN..      *
35af0 2f 0a 20 20 20 20 20 20 72 65 76 20 3d 20 72 65  /.      rev = re
35b00 76 53 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  vSet = 0;.      
35b10 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20  distinctColumns 
35b20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  = 0;.      for(j
35b30 3d 30 3b 20 6a 3c 6e 43 6f 6c 75 6d 6e 3b 20 6a  =0; j<nColumn; j
35b40 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  ++){.        u8 
35b50 62 4f 6e 63 65 3b 20 20 20 2f 2a 20 54 72 75 65  bOnce;   /* True
35b60 20 74 6f 20 72 75 6e 20 74 68 65 20 4f 52 44 45   to run the ORDE
35b70 52 20 42 59 20 73 65 61 72 63 68 20 6c 6f 6f 70  R BY search loop
35b80 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   */..        /* 
35b90 53 6b 69 70 20 6f 76 65 72 20 3d 3d 20 61 6e 64  Skip over == and
35ba0 20 49 53 20 4e 55 4c 4c 20 74 65 72 6d 73 20 2a   IS NULL terms *
35bb0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c  /.        if( j<
35bc0 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
35bd0 45 71 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  Eq.         && p
35be0 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 3d 3d 30 0a 20  Loop->nSkip==0. 
35bf0 20 20 20 20 20 20 20 20 26 26 20 28 28 69 20 3d          && ((i =
35c00 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
35c10 5d 2d 3e 65 4f 70 65 72 61 74 6f 72 29 20 26 20  ]->eOperator) & 
35c20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c  (WO_EQ|WO_ISNULL
35c30 7c 57 4f 5f 49 53 29 29 21 3d 30 0a 20 20 20 20  |WO_IS))!=0.    
35c40 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
35c50 20 69 66 28 20 69 20 26 20 57 4f 5f 49 53 4e 55   if( i & WO_ISNU
35c60 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  LL ){.          
35c70 20 20 74 65 73 74 63 61 73 65 28 20 69 73 4f 72    testcase( isOr
35c80 64 65 72 44 69 73 74 69 6e 63 74 20 29 3b 0a 20  derDistinct );. 
35c90 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
35ca0 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a  erDistinct = 0;.
35cb0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
35cc0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20        continue; 
35cd0 20 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20   .        }..   
35ce0 20 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20       /* Get the 
35cf0 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 69 6e  column number in
35d00 20 74 68 65 20 74 61 62 6c 65 20 28 69 43 6f 6c   the table (iCol
35d10 75 6d 6e 29 20 61 6e 64 20 73 6f 72 74 20 6f 72  umn) and sort or
35d20 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 28  der.        ** (
35d30 72 65 76 49 64 78 29 20 66 6f 72 20 74 68 65 20  revIdx) for the 
35d40 6a 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  j-th column of t
35d50 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20  he index..      
35d60 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
35d70 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20   pIndex ){.     
35d80 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70       iColumn = p
35d90 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
35da0 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  j];.          re
35db0 76 49 64 78 20 3d 20 70 49 6e 64 65 78 2d 3e 61  vIdx = pIndex->a
35dc0 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20  SortOrder[j];.  
35dd0 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
35de0 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e 70 54 61  umn==pIndex->pTa
35df0 62 6c 65 2d 3e 69 50 4b 65 79 20 29 20 69 43 6f  ble->iPKey ) iCo
35e00 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20  lumn = -1;.     
35e10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
35e20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31      iColumn = -1
35e30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 76 49  ;.          revI
35e40 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  dx = 0;.        
35e50 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e  }..        /* An
35e60 20 75 6e 63 6f 6e 73 74 72 61 69 6e 65 64 20 63   unconstrained c
35e70 6f 6c 75 6d 6e 20 74 68 61 74 20 6d 69 67 68 74  olumn that might
35e80 20 62 65 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 74   be NULL means t
35e90 68 61 74 20 74 68 69 73 0a 20 20 20 20 20 20 20  hat this.       
35ea0 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20 69 73   ** WhereLoop is
35eb0 20 6e 6f 74 20 77 65 6c 6c 2d 6f 72 64 65 72 65   not well-ordere
35ec0 64 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  d.        */.   
35ed0 20 20 20 20 20 69 66 28 20 69 73 4f 72 64 65 72       if( isOrder
35ee0 44 69 73 74 69 6e 63 74 0a 20 20 20 20 20 20 20  Distinct.       
35ef0 20 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30 0a    && iColumn>=0.
35f00 20 20 20 20 20 20 20 20 20 26 26 20 6a 3e 3d 70           && j>=p
35f10 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
35f20 71 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 49  q.         && pI
35f30 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43  ndex->pTable->aC
35f40 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e  ol[iColumn].notN
35f50 75 6c 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20 29  ull==0.        )
35f60 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73 4f 72  {.          isOr
35f70 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b  derDistinct = 0;
35f80 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
35f90 20 20 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20      /* Find the 
35fa0 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 74 68  ORDER BY term th
35fb0 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  at corresponds t
35fc0 6f 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d  o the j-th colum
35fd0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  n.        ** of 
35fe0 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 6d 61  the index and ma
35ff0 72 6b 20 74 68 61 74 20 4f 52 44 45 52 20 42 59  rk that ORDER BY
36000 20 74 65 72 6d 20 6f 66 66 20 0a 20 20 20 20 20   term off .     
36010 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 4f     */.        bO
36020 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  nce = 1;.       
36030 20 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20   isMatch = 0;.  
36040 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 62        for(i=0; b
36050 4f 6e 63 65 20 26 26 20 69 3c 6e 4f 72 64 65 72  Once && i<nOrder
36060 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  By; i++){.      
36070 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28      if( MASKBIT(
36080 69 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e  i) & obSat ) con
36090 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
360a0 20 70 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74   pOBExpr = sqlit
360b0 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
360c0 65 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  e(pOrderBy->a[i]
360d0 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
360e0 20 20 20 74 65 73 74 63 61 73 65 28 20 77 63 74     testcase( wct
360f0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
36100 47 52 4f 55 50 42 59 20 29 3b 0a 20 20 20 20 20  GROUPBY );.     
36110 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 77       testcase( w
36120 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
36130 45 5f 44 49 53 54 49 4e 43 54 42 59 20 29 3b 0a  E_DISTINCTBY );.
36140 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 77            if( (w
36150 63 74 72 6c 46 6c 61 67 73 20 26 20 28 57 48 45  ctrlFlags & (WHE
36160 52 45 5f 47 52 4f 55 50 42 59 7c 57 48 45 52 45  RE_GROUPBY|WHERE
36170 5f 44 49 53 54 49 4e 43 54 42 59 29 29 3d 3d 30  _DISTINCTBY))==0
36180 20 29 20 62 4f 6e 63 65 20 3d 20 30 3b 0a 20 20   ) bOnce = 0;.  
36190 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 42 45          if( pOBE
361a0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
361b0 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  MN ) continue;. 
361c0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 42           if( pOB
361d0 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43  Expr->iTable!=iC
361e0 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ur ) continue;. 
361f0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 42           if( pOB
36200 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69  Expr->iColumn!=i
36210 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75  Column ) continu
36220 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e;.          if(
36230 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20   iColumn>=0 ){. 
36240 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c             pColl
36250 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
36260 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50  llSeq(pWInfo->pP
36270 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e  arse, pOrderBy->
36280 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
36290 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43           if( !pC
362a0 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62  oll ) pColl = db
362b0 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
362c0 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
362d0 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c  ite3StrICmp(pCol
362e0 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78  l->zName, pIndex
362f0 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20  ->azColl[j])!=0 
36300 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
36310 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
36320 20 20 69 73 4d 61 74 63 68 20 3d 20 31 3b 0a 20    isMatch = 1;. 
36330 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
36340 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
36350 20 20 69 66 28 20 69 73 4d 61 74 63 68 20 26 26    if( isMatch &&
36360 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
36370 48 45 52 45 5f 47 52 4f 55 50 42 59 29 3d 3d 30  HERE_GROUPBY)==0
36380 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
36390 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   Make sure the s
363a0 6f 72 74 20 6f 72 64 65 72 20 69 73 20 63 6f 6d  ort order is com
363b0 70 61 74 69 62 6c 65 20 69 6e 20 61 6e 20 4f 52  patible in an OR
363c0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20  DER BY clause.. 
363d0 20 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 72 74           ** Sort
363e0 20 6f 72 64 65 72 20 69 73 20 69 72 72 65 6c 65   order is irrele
363f0 76 61 6e 74 20 66 6f 72 20 61 20 47 52 4f 55 50  vant for a GROUP
36400 20 42 59 20 63 6c 61 75 73 65 2e 20 2a 2f 0a 20   BY clause. */. 
36410 20 20 20 20 20 20 20 20 20 69 66 28 20 72 65 76           if( rev
36420 53 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Set ){.         
36430 20 20 20 69 66 28 20 28 72 65 76 20 5e 20 72 65     if( (rev ^ re
36440 76 49 64 78 29 21 3d 70 4f 72 64 65 72 42 79 2d  vIdx)!=pOrderBy-
36450 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20  >a[i].sortOrder 
36460 29 20 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20  ) isMatch = 0;. 
36470 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
36480 20 20 20 20 20 20 20 20 20 20 20 20 72 65 76 20              rev 
36490 3d 20 72 65 76 49 64 78 20 5e 20 70 4f 72 64 65  = revIdx ^ pOrde
364a0 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  rBy->a[i].sortOr
364b0 64 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  der;.           
364c0 20 69 66 28 20 72 65 76 20 29 20 2a 70 52 65 76   if( rev ) *pRev
364d0 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 28  Mask |= MASKBIT(
364e0 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20  iLoop);.        
364f0 20 20 20 20 72 65 76 53 65 74 20 3d 20 31 3b 0a      revSet = 1;.
36500 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
36510 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
36520 28 20 69 73 4d 61 74 63 68 20 29 7b 0a 20 20 20  ( isMatch ){.   
36530 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75         if( iColu
36540 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  mn<0 ){.        
36550 20 20 20 20 74 65 73 74 63 61 73 65 28 20 64 69      testcase( di
36560 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3d 3d 30  stinctColumns==0
36570 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
36580 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20  distinctColumns 
36590 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 1;.          }
365a0 0a 20 20 20 20 20 20 20 20 20 20 6f 62 53 61 74  .          obSat
365b0 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a   |= MASKBIT(i);.
365c0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
365d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6d           /* No m
365e0 61 74 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 20 20  atch found */.  
365f0 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 30          if( j==0
36600 20 7c 7c 20 6a 3c 6e 4b 65 79 43 6f 6c 20 29 7b   || j<nKeyCol ){
36610 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
36620 74 63 61 73 65 28 20 69 73 4f 72 64 65 72 44 69  tcase( isOrderDi
36630 73 74 69 6e 63 74 21 3d 30 20 29 3b 0a 20 20 20  stinct!=0 );.   
36640 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
36650 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20  Distinct = 0;.  
36660 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
36670 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
36680 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f 2a 20     }.      } /* 
36690 65 6e 64 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c  end Loop over al
366a0 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20  l index columns 
366b0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 64 69 73  */.      if( dis
366c0 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 29 7b 0a  tinctColumns ){.
366d0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
366e0 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63  ( isOrderDistinc
366f0 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t==0 );.        
36700 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
36710 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
36720 20 7d 20 2f 2a 20 65 6e 64 2d 69 66 20 6e 6f 74   } /* end-if not
36730 20 6f 6e 65 2d 72 6f 77 20 2a 2f 0a 0a 20 20 20   one-row */..   
36740 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79   /* Mark off any
36750 20 6f 74 68 65 72 20 4f 52 44 45 52 20 42 59 20   other ORDER BY 
36760 74 65 72 6d 73 20 74 68 61 74 20 72 65 66 65 72  terms that refer
36770 65 6e 63 65 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20  ence pLoop */.  
36780 20 20 69 66 28 20 69 73 4f 72 64 65 72 44 69 73    if( isOrderDis
36790 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 6f  tinct ){.      o
367a0 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b  rderDistinctMask
367b0 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53   |= pLoop->maskS
367c0 65 6c 66 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  elf;.      for(i
367d0 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20  =0; i<nOrderBy; 
367e0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78  i++){.        Ex
367f0 70 72 20 2a 70 3b 0a 20 20 20 20 20 20 20 20 42  pr *p;.        B
36800 69 74 6d 61 73 6b 20 6d 54 65 72 6d 3b 0a 20 20  itmask mTerm;.  
36810 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49        if( MASKBI
36820 54 28 69 29 20 26 20 6f 62 53 61 74 20 29 20 63  T(i) & obSat ) c
36830 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
36840 20 70 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61   p = pOrderBy->a
36850 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
36860 20 20 20 6d 54 65 72 6d 20 3d 20 65 78 70 72 54     mTerm = exprT
36870 61 62 6c 65 55 73 61 67 65 28 26 70 57 49 6e 66  ableUsage(&pWInf
36880 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 70 29 3b 0a  o->sMaskSet,p);.
36890 20 20 20 20 20 20 20 20 69 66 28 20 6d 54 65 72          if( mTer
368a0 6d 3d 3d 30 20 26 26 20 21 73 71 6c 69 74 65 33  m==0 && !sqlite3
368b0 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
368c0 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
368d0 20 20 20 20 20 20 69 66 28 20 28 6d 54 65 72 6d        if( (mTerm
368e0 26 7e 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d  &~orderDistinctM
368f0 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
36900 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41       obSat |= MA
36910 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 20 20  SKBIT(i);.      
36920 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
36930 7d 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 74 68 65  }.  } /* End the
36940 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 57   loop over all W
36950 68 65 72 65 4c 6f 6f 70 73 20 66 72 6f 6d 20 6f  hereLoops from o
36960 75 74 65 72 2d 6d 6f 73 74 20 64 6f 77 6e 20 74  uter-most down t
36970 6f 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 2a 2f 0a  o inner-most */.
36980 20 20 69 66 28 20 6f 62 53 61 74 3d 3d 6f 62 44    if( obSat==obD
36990 6f 6e 65 20 29 20 72 65 74 75 72 6e 20 28 69 38  one ) return (i8
369a0 29 6e 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28  )nOrderBy;.  if(
369b0 20 21 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63   !isOrderDistinc
369c0 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 6e  t ){.    for(i=n
369d0 4f 72 64 65 72 42 79 2d 31 3b 20 69 3e 30 3b 20  OrderBy-1; i>0; 
369e0 69 2d 2d 29 7b 0a 20 20 20 20 20 20 42 69 74 6d  i--){.      Bitm
369f0 61 73 6b 20 6d 20 3d 20 4d 41 53 4b 42 49 54 28  ask m = MASKBIT(
36a00 69 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 69 66  i) - 1;.      if
36a10 28 20 28 6f 62 53 61 74 26 6d 29 3d 3d 6d 20 29  ( (obSat&m)==m )
36a20 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 20 20 7d   return i;.    }
36a30 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
36a40 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a   }.  return -1;.
36a50 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  }.../*.** If the
36a60 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 66   WHERE_GROUPBY f
36a70 6c 61 67 20 69 73 20 73 65 74 20 69 6e 20 74 68  lag is set in th
36a80 65 20 6d 61 73 6b 20 70 61 73 73 65 64 20 74 6f  e mask passed to
36a90 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
36aa0 69 6e 28 29 2c 0a 2a 2a 20 74 68 65 20 70 6c 61  in(),.** the pla
36ab0 6e 6e 65 72 20 61 73 73 75 6d 65 73 20 74 68 61  nner assumes tha
36ac0 74 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  t the specified 
36ad0 70 4f 72 64 65 72 42 79 20 6c 69 73 74 20 69 73  pOrderBy list is
36ae0 20 61 63 74 75 61 6c 6c 79 20 61 20 47 52 4f 55   actually a GROU
36af0 50 0a 2a 2a 20 42 59 20 63 6c 61 75 73 65 20 2d  P.** BY clause -
36b00 20 61 6e 64 20 73 6f 20 61 6e 79 20 6f 72 64 65   and so any orde
36b10 72 20 74 68 61 74 20 67 72 6f 75 70 73 20 72 6f  r that groups ro
36b20 77 73 20 61 73 20 72 65 71 75 69 72 65 64 20 73  ws as required s
36b30 61 74 69 73 66 69 65 73 20 74 68 65 0a 2a 2a 20  atisfies the.** 
36b40 72 65 71 75 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 4e  request..**.** N
36b50 6f 72 6d 61 6c 6c 79 2c 20 69 6e 20 74 68 69 73  ormally, in this
36b60 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20   case it is not 
36b70 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65  possible for the
36b80 20 63 61 6c 6c 65 72 20 74 6f 20 64 65 74 65 72   caller to deter
36b90 6d 69 6e 65 0a 2a 2a 20 77 68 65 74 68 65 72 20  mine.** whether 
36ba0 6f 72 20 6e 6f 74 20 74 68 65 20 72 6f 77 73 20  or not the rows 
36bb0 61 72 65 20 72 65 61 6c 6c 79 20 62 65 69 6e 67  are really being
36bc0 20 64 65 6c 69 76 65 72 65 64 20 69 6e 20 73 6f   delivered in so
36bd0 72 74 65 64 20 6f 72 64 65 72 2c 20 6f 72 0a 2a  rted order, or.*
36be0 2a 20 6a 75 73 74 20 69 6e 20 73 6f 6d 65 20 6f  * just in some o
36bf0 74 68 65 72 20 6f 72 64 65 72 20 74 68 61 74 20  ther order that 
36c00 70 72 6f 76 69 64 65 73 20 74 68 65 20 72 65 71  provides the req
36c10 75 69 72 65 64 20 67 72 6f 75 70 69 6e 67 2e 20  uired grouping. 
36c20 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 69 66 20 74  However,.** if t
36c30 68 65 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47  he WHERE_SORTBYG
36c40 52 4f 55 50 20 66 6c 61 67 20 69 73 20 61 6c 73  ROUP flag is als
36c50 6f 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  o passed to sqli
36c60 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2c  te3WhereBegin(),
36c70 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75   then.** this fu
36c80 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61  nction may be ca
36c90 6c 6c 65 64 20 6f 6e 20 74 68 65 20 72 65 74 75  lled on the retu
36ca0 72 6e 65 64 20 57 68 65 72 65 49 6e 66 6f 20 6f  rned WhereInfo o
36cb0 62 6a 65 63 74 2e 20 49 74 20 72 65 74 75 72 6e  bject. It return
36cc0 73 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65  s.** true if the
36cd0 20 72 6f 77 73 20 72 65 61 6c 6c 79 20 77 69 6c   rows really wil
36ce0 6c 20 62 65 20 73 6f 72 74 65 64 20 69 6e 20 74  l be sorted in t
36cf0 68 65 20 73 70 65 63 69 66 69 65 64 20 6f 72 64  he specified ord
36d00 65 72 2c 20 6f 72 20 66 61 6c 73 65 0a 2a 2a 20  er, or false.** 
36d10 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
36d20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73   For example, as
36d30 73 75 6d 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  suming:.**.**   
36d40 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20  CREATE INDEX i1 
36d50 4f 4e 20 74 31 28 78 2c 20 59 29 3b 0a 2a 2a 0a  ON t1(x, Y);.**.
36d60 2a 2a 20 74 68 65 6e 0a 2a 2a 0a 2a 2a 20 20 20  ** then.**.**   
36d70 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
36d80 20 47 52 4f 55 50 20 42 59 20 78 2c 79 20 4f 52   GROUP BY x,y OR
36d90 44 45 52 20 42 59 20 78 2c 79 3b 20 20 20 2d 2d  DER BY x,y;   --
36da0 20 49 73 53 6f 72 74 65 64 28 29 3d 3d 31 0a 2a   IsSorted()==1.*
36db0 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  *   SELECT * FRO
36dc0 4d 20 74 31 20 47 52 4f 55 50 20 42 59 20 79 2c  M t1 GROUP BY y,
36dd0 78 20 4f 52 44 45 52 20 42 59 20 79 2c 78 3b 20  x ORDER BY y,x; 
36de0 20 20 2d 2d 20 49 73 53 6f 72 74 65 64 28 29 3d    -- IsSorted()=
36df0 3d 30 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  =0.*/.int sqlite
36e00 33 57 68 65 72 65 49 73 53 6f 72 74 65 64 28 57  3WhereIsSorted(W
36e10 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
36e20 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49  ){.  assert( pWI
36e30 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
36e40 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20  & WHERE_GROUPBY 
36e50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49  );.  assert( pWI
36e60 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
36e70 26 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52  & WHERE_SORTBYGR
36e80 4f 55 50 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  OUP );.  return 
36e90 70 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 3b 0a  pWInfo->sorted;.
36ea0 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  }..#ifdef WHERET
36eb0 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 20  RACE_ENABLED./* 
36ec0 46 6f 72 20 64 65 62 75 67 67 69 6e 67 20 75 73  For debugging us
36ed0 65 20 6f 6e 6c 79 3a 20 2a 2f 0a 73 74 61 74 69  e only: */.stati
36ee0 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 68  c const char *wh
36ef0 65 72 65 50 61 74 68 4e 61 6d 65 28 57 68 65 72  erePathName(Wher
36f00 65 50 61 74 68 20 2a 70 50 61 74 68 2c 20 69 6e  ePath *pPath, in
36f10 74 20 6e 4c 6f 6f 70 2c 20 57 68 65 72 65 4c 6f  t nLoop, WhereLo
36f20 6f 70 20 2a 70 4c 61 73 74 29 7b 0a 20 20 73 74  op *pLast){.  st
36f30 61 74 69 63 20 63 68 61 72 20 7a 4e 61 6d 65 5b  atic char zName[
36f40 36 35 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  65];.  int i;.  
36f50 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4c 6f 6f 70  for(i=0; i<nLoop
36f60 3b 20 69 2b 2b 29 7b 20 7a 4e 61 6d 65 5b 69 5d  ; i++){ zName[i]
36f70 20 3d 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b   = pPath->aLoop[
36f80 69 5d 2d 3e 63 49 64 3b 20 7d 0a 20 20 69 66 28  i]->cId; }.  if(
36f90 20 70 4c 61 73 74 20 29 20 7a 4e 61 6d 65 5b 69   pLast ) zName[i
36fa0 2b 2b 5d 20 3d 20 70 4c 61 73 74 2d 3e 63 49 64  ++] = pLast->cId
36fb0 3b 0a 20 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30  ;.  zName[i] = 0
36fc0 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65  ;.  return zName
36fd0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
36fe0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f 73  * Return the cos
36ff0 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 6e 52 6f  t of sorting nRo
37000 77 20 72 6f 77 73 2c 20 61 73 73 75 6d 69 6e 67  w rows, assuming
37010 20 74 68 61 74 20 74 68 65 20 6b 65 79 73 20 68   that the keys h
37020 61 76 65 20 0a 2a 2a 20 6e 4f 72 64 65 72 62 79  ave .** nOrderby
37030 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 61   columns and tha
37040 74 20 74 68 65 20 66 69 72 73 74 20 6e 53 6f 72  t the first nSor
37050 74 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20  ted columns are 
37060 61 6c 72 65 61 64 79 20 69 6e 0a 2a 2a 20 6f 72  already in.** or
37070 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c  der..*/.static L
37080 6f 67 45 73 74 20 77 68 65 72 65 53 6f 72 74 69  ogEst whereSorti
37090 6e 67 43 6f 73 74 28 0a 20 20 57 68 65 72 65 49  ngCost(.  WhereI
370a0 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 0a 20 20 4c  nfo *pWInfo,.  L
370b0 6f 67 45 73 74 20 6e 52 6f 77 2c 0a 20 20 69 6e  ogEst nRow,.  in
370c0 74 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20 69 6e  t nOrderBy,.  in
370d0 74 20 6e 53 6f 72 74 65 64 0a 29 7b 0a 20 20 2f  t nSorted.){.  /
370e0 2a 20 54 55 4e 49 4e 47 3a 20 45 73 74 69 6d 61  * TUNING: Estima
370f0 74 65 64 20 63 6f 73 74 20 6f 66 20 61 20 66 75  ted cost of a fu
37100 6c 6c 20 65 78 74 65 72 6e 61 6c 20 73 6f 72 74  ll external sort
37110 2c 20 77 68 65 72 65 20 4e 20 69 73 20 0a 20 20  , where N is .  
37120 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
37130 20 72 6f 77 73 20 74 6f 20 73 6f 72 74 20 69 73   rows to sort is
37140 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 63 6f  :.  **.  **   co
37150 73 74 20 3d 20 28 33 2e 30 20 2a 20 4e 20 2a 20  st = (3.0 * N * 
37160 6c 6f 67 28 4e 29 29 2e 0a 20 20 2a 2a 20 0a 20  log(N))..  ** . 
37170 20 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 6f   ** Or, if the o
37180 72 64 65 72 2d 62 79 20 63 6c 61 75 73 65 20 68  rder-by clause h
37190 61 73 20 58 20 74 65 72 6d 73 20 62 75 74 20 6f  as X terms but o
371a0 6e 6c 79 20 74 68 65 20 6c 61 73 74 20 59 20 0a  nly the last Y .
371b0 20 20 2a 2a 20 74 65 72 6d 73 20 61 72 65 20 6f    ** terms are o
371c0 75 74 20 6f 66 20 6f 72 64 65 72 2c 20 74 68 65  ut of order, the
371d0 6e 20 62 6c 6f 63 6b 2d 73 6f 72 74 69 6e 67 20  n block-sorting 
371e0 77 69 6c 6c 20 72 65 64 75 63 65 20 74 68 65 20  will reduce the 
371f0 0a 20 20 2a 2a 20 73 6f 72 74 69 6e 67 20 63 6f  .  ** sorting co
37200 73 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  st to:.  **.  **
37210 20 20 20 63 6f 73 74 20 3d 20 28 33 2e 30 20 2a     cost = (3.0 *
37220 20 4e 20 2a 20 6c 6f 67 28 4e 29 29 20 2a 20 28   N * log(N)) * (
37230 59 2f 58 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  Y/X).  **.  ** T
37240 68 65 20 28 59 2f 58 29 20 74 65 72 6d 20 69 73  he (Y/X) term is
37250 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69   implemented usi
37260 6e 67 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c  ng stack variabl
37270 65 20 72 53 63 61 6c 65 0a 20 20 2a 2a 20 62 65  e rScale.  ** be
37280 6c 6f 77 2e 20 20 2a 2f 0a 20 20 4c 6f 67 45 73  low.  */.  LogEs
37290 74 20 72 53 63 61 6c 65 2c 20 72 53 6f 72 74 43  t rScale, rSortC
372a0 6f 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ost;.  assert( n
372b0 4f 72 64 65 72 42 79 3e 30 20 26 26 20 36 36 3d  OrderBy>0 && 66=
372c0 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
372d0 30 30 29 20 29 3b 0a 20 20 72 53 63 61 6c 65 20  00) );.  rScale 
372e0 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
372f0 28 6e 4f 72 64 65 72 42 79 2d 6e 53 6f 72 74 65  (nOrderBy-nSorte
37300 64 29 2a 31 30 30 2f 6e 4f 72 64 65 72 42 79 29  d)*100/nOrderBy)
37310 20 2d 20 36 36 3b 0a 20 20 72 53 6f 72 74 43 6f   - 66;.  rSortCo
37320 73 74 20 3d 20 6e 52 6f 77 20 2b 20 65 73 74 4c  st = nRow + estL
37330 6f 67 28 6e 52 6f 77 29 20 2b 20 72 53 63 61 6c  og(nRow) + rScal
37340 65 20 2b 20 31 36 3b 0a 0a 20 20 2f 2a 20 54 55  e + 16;..  /* TU
37350 4e 49 4e 47 3a 20 54 68 65 20 63 6f 73 74 20 6f  NING: The cost o
37360 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 44  f implementing D
37370 49 53 54 49 4e 43 54 20 75 73 69 6e 67 20 61 20  ISTINCT using a 
37380 42 2d 54 52 45 45 20 69 73 0a 20 20 2a 2a 20 73  B-TREE is.  ** s
37390 69 6d 69 6c 61 72 20 62 75 74 20 77 69 74 68 20  imilar but with 
373a0 61 20 6c 61 72 67 65 72 20 63 6f 6e 73 74 61 6e  a larger constan
373b0 74 20 6f 66 20 70 72 6f 70 6f 72 74 69 6f 6e 61  t of proportiona
373c0 6c 69 74 79 2e 20 0a 20 20 2a 2a 20 4d 75 6c 74  lity. .  ** Mult
373d0 69 70 6c 79 20 62 79 20 61 6e 20 61 64 64 69 74  iply by an addit
373e0 69 6f 6e 61 6c 20 66 61 63 74 6f 72 20 6f 66 20  ional factor of 
373f0 33 2e 30 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  3.0.  */.  if( p
37400 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
37410 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44  s & WHERE_WANT_D
37420 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 72  ISTINCT ){.    r
37430 53 6f 72 74 43 6f 73 74 20 2b 3d 20 31 36 3b 0a  SortCost += 16;.
37440 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 53    }..  return rS
37450 6f 72 74 43 6f 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  ortCost;.}../*.*
37460 2a 20 47 69 76 65 6e 20 74 68 65 20 6c 69 73 74  * Given the list
37470 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62   of WhereLoop ob
37480 6a 65 63 74 73 20 61 74 20 70 57 49 6e 66 6f 2d  jects at pWInfo-
37490 3e 70 4c 6f 6f 70 73 2c 20 74 68 69 73 20 72 6f  >pLoops, this ro
374a0 75 74 69 6e 65 0a 2a 2a 20 61 74 74 65 6d 70 74  utine.** attempt
374b0 73 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6c 6f  s to find the lo
374c0 77 65 73 74 20 63 6f 73 74 20 70 61 74 68 20 74  west cost path t
374d0 68 61 74 20 76 69 73 69 74 73 20 65 61 63 68 20  hat visits each 
374e0 57 68 65 72 65 4c 6f 6f 70 0a 2a 2a 20 6f 6e 63  WhereLoop.** onc
374f0 65 2e 20 20 54 68 69 73 20 70 61 74 68 20 69 73  e.  This path is
37500 20 74 68 65 6e 20 6c 6f 61 64 65 64 20 69 6e 74   then loaded int
37510 6f 20 74 68 65 20 70 57 49 6e 66 6f 2d 3e 61 5b  o the pWInfo->a[
37520 5d 2e 70 57 4c 6f 6f 70 20 66 69 65 6c 64 73 2e  ].pWLoop fields.
37530 0a 2a 2a 0a 2a 2a 20 41 73 73 75 6d 65 20 74 68  .**.** Assume th
37540 61 74 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  at the total num
37550 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f  ber of output ro
37560 77 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 65  ws that will nee
37570 64 20 74 6f 20 62 65 20 73 6f 72 74 65 64 0a 2a  d to be sorted.*
37580 2a 20 77 69 6c 6c 20 62 65 20 6e 52 6f 77 45 73  * will be nRowEs
37590 74 20 28 69 6e 20 74 68 65 20 31 30 2a 6c 6f 67  t (in the 10*log
375a0 32 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  2 representation
375b0 29 2e 20 20 4f 72 2c 20 69 67 6e 6f 72 65 20 73  ).  Or, ignore s
375c0 6f 72 74 69 6e 67 0a 2a 2a 20 63 6f 73 74 73 20  orting.** costs 
375d0 69 66 20 6e 52 6f 77 45 73 74 3d 3d 30 2e 0a 2a  if nRowEst==0..*
375e0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
375f0 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
37600 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   or SQLITE_NOMEM
37610 20 6f 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   of a memory all
37620 6f 63 61 74 69 6f 6e 0a 2a 2a 20 65 72 72 6f 72  ocation.** error
37630 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74   occurs..*/.stat
37640 69 63 20 69 6e 74 20 77 68 65 72 65 50 61 74 68  ic int wherePath
37650 53 6f 6c 76 65 72 28 57 68 65 72 65 49 6e 66 6f  Solver(WhereInfo
37660 20 2a 70 57 49 6e 66 6f 2c 20 4c 6f 67 45 73 74   *pWInfo, LogEst
37670 20 6e 52 6f 77 45 73 74 29 7b 0a 20 20 69 6e 74   nRowEst){.  int
37680 20 6d 78 43 68 6f 69 63 65 3b 20 20 20 20 20 20   mxChoice;      
37690 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
376a0 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 75  m number of simu
376b0 6c 74 61 6e 65 6f 75 73 20 70 61 74 68 73 20 74  ltaneous paths t
376c0 72 61 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20  racked */.  int 
376d0 6e 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nLoop;          
376e0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
376f0 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  of terms in the 
37700 6a 6f 69 6e 20 2a 2f 0a 20 20 50 61 72 73 65 20  join */.  Parse 
37710 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20  *pParse;        
37720 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
37730 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69  ontext */.  sqli
37740 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
37750 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
37760 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
37770 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b   */.  int iLoop;
37780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37790 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
377a0 6f 76 65 72 20 74 68 65 20 74 65 72 6d 73 20 6f  over the terms o
377b0 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20  f the join */.  
377c0 69 6e 74 20 69 69 2c 20 6a 6a 3b 20 20 20 20 20  int ii, jj;     
377d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
377e0 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
377f0 69 6e 74 20 6d 78 49 20 3d 20 30 3b 20 20 20 20  int mxI = 0;    
37800 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
37810 65 78 20 6f 66 20 6e 65 78 74 20 65 6e 74 72 79  ex of next entry
37820 20 74 6f 20 72 65 70 6c 61 63 65 20 2a 2f 0a 20   to replace */. 
37830 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20 20   int nOrderBy;  
37840 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
37850 6d 62 65 72 20 6f 66 20 4f 52 44 45 52 20 42 59  mber of ORDER BY
37860 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 2a 2f   clause terms */
37870 0a 20 20 4c 6f 67 45 73 74 20 6d 78 43 6f 73 74  .  LogEst mxCost
37880 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
37890 4d 61 78 69 6d 75 6d 20 63 6f 73 74 20 6f 66 20  Maximum cost of 
378a0 61 20 73 65 74 20 6f 66 20 70 61 74 68 73 20 2a  a set of paths *
378b0 2f 0a 20 20 4c 6f 67 45 73 74 20 6d 78 55 6e 73  /.  LogEst mxUns
378c0 6f 72 74 65 64 20 3d 20 30 3b 20 20 20 20 2f 2a  orted = 0;    /*
378d0 20 4d 61 78 69 6d 75 6d 20 75 6e 73 6f 72 74 65   Maximum unsorte
378e0 64 20 63 6f 73 74 20 6f 66 20 61 20 73 65 74 20  d cost of a set 
378f0 6f 66 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74  of path */.  int
37900 20 6e 54 6f 2c 20 6e 46 72 6f 6d 3b 20 20 20 20   nTo, nFrom;    
37910 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
37920 20 6f 66 20 76 61 6c 69 64 20 65 6e 74 72 69 65   of valid entrie
37930 73 20 69 6e 20 61 54 6f 5b 5d 20 61 6e 64 20 61  s in aTo[] and a
37940 46 72 6f 6d 5b 5d 20 2a 2f 0a 20 20 57 68 65 72  From[] */.  Wher
37950 65 50 61 74 68 20 2a 61 46 72 6f 6d 3b 20 20 20  ePath *aFrom;   
37960 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6e 46 72        /* All nFr
37970 6f 6d 20 70 61 74 68 73 20 61 74 20 74 68 65 20  om paths at the 
37980 70 72 65 76 69 6f 75 73 20 6c 65 76 65 6c 20 2a  previous level *
37990 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 61  /.  WherePath *a
379a0 54 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  To;           /*
379b0 20 54 68 65 20 6e 54 6f 20 62 65 73 74 20 70 61   The nTo best pa
379c0 74 68 73 20 61 74 20 74 68 65 20 63 75 72 72 65  ths at the curre
379d0 6e 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68  nt level */.  Wh
379e0 65 72 65 50 61 74 68 20 2a 70 46 72 6f 6d 3b 20  erePath *pFrom; 
379f0 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c          /* An el
37a00 65 6d 65 6e 74 20 6f 66 20 61 46 72 6f 6d 5b 5d  ement of aFrom[]
37a10 20 74 68 61 74 20 77 65 20 61 72 65 20 77 6f 72   that we are wor
37a20 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65  king on */.  Whe
37a30 72 65 50 61 74 68 20 2a 70 54 6f 3b 20 20 20 20  rePath *pTo;    
37a40 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65         /* An ele
37a50 6d 65 6e 74 20 6f 66 20 61 54 6f 5b 5d 20 74 68  ment of aTo[] th
37a60 61 74 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e  at we are workin
37a70 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c  g on */.  WhereL
37a80 6f 6f 70 20 2a 70 57 4c 6f 6f 70 3b 20 20 20 20  oop *pWLoop;    
37a90 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
37aa0 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  e WhereLoop obje
37ab0 63 74 73 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  cts */.  WhereLo
37ac0 6f 70 20 2a 2a 70 58 3b 20 20 20 20 20 20 20 20  op **pX;        
37ad0 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 64 69     /* Used to di
37ae0 76 79 20 75 70 20 74 68 65 20 70 53 70 61 63 65  vy up the pSpace
37af0 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 4c 6f 67   memory */.  Log
37b00 45 73 74 20 2a 61 53 6f 72 74 43 6f 73 74 20 3d  Est *aSortCost =
37b10 20 30 3b 20 20 20 20 2f 2a 20 53 6f 72 74 69 6e   0;    /* Sortin
37b20 67 20 61 6e 64 20 70 61 72 74 69 61 6c 20 73 6f  g and partial so
37b30 72 74 69 6e 67 20 63 6f 73 74 73 20 2a 2f 0a 20  rting costs */. 
37b40 20 63 68 61 72 20 2a 70 53 70 61 63 65 3b 20 20   char *pSpace;  
37b50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
37b60 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20 75  mporary memory u
37b70 73 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74  sed by this rout
37b80 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 70  ine */.  int nSp
37b90 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ace;            
37ba0 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73     /* Bytes of s
37bb0 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 61  pace allocated a
37bc0 74 20 70 53 70 61 63 65 20 2a 2f 0a 0a 20 20 70  t pSpace */..  p
37bd0 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e  Parse = pWInfo->
37be0 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70  pParse;.  db = p
37bf0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6e 4c 6f  Parse->db;.  nLo
37c00 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65  op = pWInfo->nLe
37c10 76 65 6c 3b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47  vel;.  /* TUNING
37c20 3a 20 46 6f 72 20 73 69 6d 70 6c 65 20 71 75 65  : For simple que
37c30 72 69 65 73 2c 20 6f 6e 6c 79 20 74 68 65 20 62  ries, only the b
37c40 65 73 74 20 70 61 74 68 20 69 73 20 74 72 61 63  est path is trac
37c50 6b 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 32 2d  ked..  ** For 2-
37c60 77 61 79 20 6a 6f 69 6e 73 2c 20 74 68 65 20 35  way joins, the 5
37c70 20 62 65 73 74 20 70 61 74 68 73 20 61 72 65 20   best paths are 
37c80 66 6f 6c 6c 6f 77 65 64 2e 0a 20 20 2a 2a 20 46  followed..  ** F
37c90 6f 72 20 6a 6f 69 6e 73 20 6f 66 20 33 20 6f 72  or joins of 3 or
37ca0 20 6d 6f 72 65 20 74 61 62 6c 65 73 2c 20 74 72   more tables, tr
37cb0 61 63 6b 20 74 68 65 20 31 30 20 62 65 73 74 20  ack the 10 best 
37cc0 70 61 74 68 73 20 2a 2f 0a 20 20 6d 78 43 68 6f  paths */.  mxCho
37cd0 69 63 65 20 3d 20 28 6e 4c 6f 6f 70 3c 3d 31 29  ice = (nLoop<=1)
37ce0 20 3f 20 31 20 3a 20 28 6e 4c 6f 6f 70 3d 3d 32   ? 1 : (nLoop==2
37cf0 20 3f 20 35 20 3a 20 31 30 29 3b 0a 20 20 61 73   ? 5 : 10);.  as
37d00 73 65 72 74 28 20 6e 4c 6f 6f 70 3c 3d 70 57 49  sert( nLoop<=pWI
37d10 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e  nfo->pTabList->n
37d20 53 72 63 20 29 3b 0a 20 20 57 48 45 52 45 54 52  Src );.  WHERETR
37d30 41 43 45 28 30 78 30 30 32 2c 20 28 22 2d 2d 2d  ACE(0x002, ("---
37d40 2d 20 62 65 67 69 6e 20 73 6f 6c 76 65 72 2e 20  - begin solver. 
37d50 20 28 6e 52 6f 77 45 73 74 3d 25 64 29 5c 6e 22   (nRowEst=%d)\n"
37d60 2c 20 6e 52 6f 77 45 73 74 29 29 3b 0a 0a 20 20  , nRowEst));..  
37d70 2f 2a 20 49 66 20 6e 52 6f 77 45 73 74 20 69 73  /* If nRowEst is
37d80 20 7a 65 72 6f 20 61 6e 64 20 74 68 65 72 65 20   zero and there 
37d90 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
37da0 6c 61 75 73 65 2c 20 69 67 6e 6f 72 65 20 69 74  lause, ignore it
37db0 2e 20 49 6e 20 74 68 69 73 0a 20 20 2a 2a 20 63  . In this.  ** c
37dc0 61 73 65 20 74 68 65 20 70 75 72 70 6f 73 65 20  ase the purpose 
37dd0 6f 66 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20  of this call is 
37de0 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20  to estimate the 
37df0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 72  number of rows r
37e00 65 74 75 72 6e 65 64 0a 20 20 2a 2a 20 62 79 20  eturned.  ** by 
37e10 74 68 65 20 6f 76 65 72 61 6c 6c 20 71 75 65 72  the overall quer
37e20 79 2e 20 4f 6e 63 65 20 74 68 69 73 20 65 73 74  y. Once this est
37e30 69 6d 61 74 65 20 68 61 73 20 62 65 65 6e 20 6f  imate has been o
37e40 62 74 61 69 6e 65 64 2c 20 74 68 65 20 63 61 6c  btained, the cal
37e50 6c 65 72 0a 20 20 2a 2a 20 77 69 6c 6c 20 69 6e  ler.  ** will in
37e60 76 6f 6b 65 20 74 68 69 73 20 66 75 6e 63 74 69  voke this functi
37e70 6f 6e 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65  on a second time
37e80 2c 20 70 61 73 73 69 6e 67 20 74 68 65 20 65 73  , passing the es
37e90 74 69 6d 61 74 65 20 61 73 20 74 68 65 0a 20 20  timate as the.  
37ea0 2a 2a 20 6e 52 6f 77 45 73 74 20 70 61 72 61 6d  ** nRowEst param
37eb0 65 74 65 72 2e 20 20 2a 2f 0a 20 20 69 66 28 20  eter.  */.  if( 
37ec0 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
37ed0 3d 3d 30 20 7c 7c 20 6e 52 6f 77 45 73 74 3d 3d  ==0 || nRowEst==
37ee0 30 20 29 7b 0a 20 20 20 20 6e 4f 72 64 65 72 42  0 ){.    nOrderB
37ef0 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  y = 0;.  }else{.
37f00 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70      nOrderBy = p
37f10 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d  WInfo->pOrderBy-
37f20 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 0a 20 20 2f  >nExpr;.  }..  /
37f30 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69  * Allocate and i
37f40 6e 69 74 69 61 6c 69 7a 65 20 73 70 61 63 65 20  nitialize space 
37f50 66 6f 72 20 61 54 6f 2c 20 61 46 72 6f 6d 20 61  for aTo, aFrom a
37f60 6e 64 20 61 53 6f 72 74 43 6f 73 74 5b 5d 20 2a  nd aSortCost[] *
37f70 2f 0a 20 20 6e 53 70 61 63 65 20 3d 20 28 73 69  /.  nSpace = (si
37f80 7a 65 6f 66 28 57 68 65 72 65 50 61 74 68 29 2b  zeof(WherePath)+
37f90 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70  sizeof(WhereLoop
37fa0 2a 29 2a 6e 4c 6f 6f 70 29 2a 6d 78 43 68 6f 69  *)*nLoop)*mxChoi
37fb0 63 65 2a 32 3b 0a 20 20 6e 53 70 61 63 65 20 2b  ce*2;.  nSpace +
37fc0 3d 20 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29  = sizeof(LogEst)
37fd0 20 2a 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 70   * nOrderBy;.  p
37fe0 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 44  Space = sqlite3D
37ff0 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 6e  bMallocRaw(db, n
38000 53 70 61 63 65 29 3b 0a 20 20 69 66 28 20 70 53  Space);.  if( pS
38010 70 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  pace==0 ) return
38020 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
38030 20 61 54 6f 20 3d 20 28 57 68 65 72 65 50 61 74   aTo = (WherePat
38040 68 2a 29 70 53 70 61 63 65 3b 0a 20 20 61 46 72  h*)pSpace;.  aFr
38050 6f 6d 20 3d 20 61 54 6f 2b 6d 78 43 68 6f 69 63  om = aTo+mxChoic
38060 65 3b 0a 20 20 6d 65 6d 73 65 74 28 61 46 72 6f  e;.  memset(aFro
38070 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 46 72  m, 0, sizeof(aFr
38080 6f 6d 5b 30 5d 29 29 3b 0a 20 20 70 58 20 3d 20  om[0]));.  pX = 
38090 28 57 68 65 72 65 4c 6f 6f 70 2a 2a 29 28 61 46  (WhereLoop**)(aF
380a0 72 6f 6d 2b 6d 78 43 68 6f 69 63 65 29 3b 0a 20  rom+mxChoice);. 
380b0 20 66 6f 72 28 69 69 3d 6d 78 43 68 6f 69 63 65   for(ii=mxChoice
380c0 2a 32 2c 20 70 46 72 6f 6d 3d 61 54 6f 3b 20 69  *2, pFrom=aTo; i
380d0 69 3e 30 3b 20 69 69 2d 2d 2c 20 70 46 72 6f 6d  i>0; ii--, pFrom
380e0 2b 2b 2c 20 70 58 20 2b 3d 20 6e 4c 6f 6f 70 29  ++, pX += nLoop)
380f0 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 61 4c 6f  {.    pFrom->aLo
38100 6f 70 20 3d 20 70 58 3b 0a 20 20 7d 0a 20 20 69  op = pX;.  }.  i
38110 66 28 20 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( nOrderBy ){. 
38120 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
38130 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
38140 61 75 73 65 20 61 6e 64 20 69 74 20 69 73 20 6e  ause and it is n
38150 6f 74 20 62 65 69 6e 67 20 69 67 6e 6f 72 65 64  ot being ignored
38160 2c 20 73 65 74 20 75 70 0a 20 20 20 20 2a 2a 20  , set up.    ** 
38170 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 61 53  space for the aS
38180 6f 72 74 43 6f 73 74 5b 5d 20 61 72 72 61 79 2e  ortCost[] array.
38190 20 45 61 63 68 20 65 6c 65 6d 65 6e 74 20 6f 66   Each element of
381a0 20 74 68 65 20 61 53 6f 72 74 43 6f 73 74 20 61   the aSortCost a
381b0 72 72 6