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

Artifact 2f42fe0d19303e0f5ce29aff3afbd3e43cbd6efb:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 23 69 6e 63 6c 75 64 65 20 22 77 68 65 72 65  .#include "where
0350: 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 52 65  Int.h"../*.** Re
0360: 74 75 72 6e 20 74 68 65 20 65 73 74 69 6d 61 74  turn the estimat
0370: 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  ed number of out
0380: 70 75 74 20 72 6f 77 73 20 66 72 6f 6d 20 61 20  put rows from a 
0390: 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2f 0a  WHERE clause.*/.
03a0: 75 36 34 20 73 71 6c 69 74 65 33 57 68 65 72 65  u64 sqlite3Where
03b0: 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 57  OutputRowCount(W
03c0: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
03d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
03e0: 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70  te3LogEstToInt(p
03f0: 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b  WInfo->nRowOut);
0400: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
0410: 20 6f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52   one of the WHER
0420: 45 5f 44 49 53 54 49 4e 43 54 5f 78 78 78 78 78  E_DISTINCT_xxxxx
0430: 20 76 61 6c 75 65 73 20 74 6f 20 69 6e 64 69 63   values to indic
0440: 61 74 65 20 68 6f 77 20 74 68 69 73 0a 2a 2a 20  ate how this.** 
0450: 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65 74  WHERE clause ret
0460: 75 72 6e 73 20 6f 75 74 70 75 74 73 20 66 6f 72  urns outputs for
0470: 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73   DISTINCT proces
0480: 73 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sing..*/.int sql
0490: 69 74 65 33 57 68 65 72 65 49 73 44 69 73 74 69  ite3WhereIsDisti
04a0: 6e 63 74 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  nct(WhereInfo *p
04b0: 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e  WInfo){.  return
04c0: 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
04d0: 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ct;.}../*.** Ret
04e0: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
04f0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65 74  WHERE clause ret
0500: 75 72 6e 73 20 72 6f 77 73 20 69 6e 20 4f 52 44  urns rows in ORD
0510: 45 52 20 42 59 20 6f 72 64 65 72 2e 0a 2a 2a 20  ER BY order..** 
0520: 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20  Return FALSE if 
0530: 74 68 65 20 6f 75 74 70 75 74 20 6e 65 65 64 73  the output needs
0540: 20 74 6f 20 62 65 20 73 6f 72 74 65 64 2e 0a 2a   to be sorted..*
0550: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  /.int sqlite3Whe
0560: 72 65 49 73 4f 72 64 65 72 65 64 28 57 68 65 72  reIsOrdered(Wher
0570: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
0580: 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d    return pWInfo-
0590: 3e 6e 4f 42 53 61 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  >nOBSat;.}../*.*
05a0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 44 42  * Return the VDB
05b0: 45 20 61 64 64 72 65 73 73 20 6f 72 20 6c 61 62  E address or lab
05c0: 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69 6e  el to jump to in
05d0: 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 74 69 6e   order to contin
05e0: 75 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  ue.** immediatel
05f0: 79 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20  y with the next 
0600: 72 6f 77 20 6f 66 20 61 20 57 48 45 52 45 20 63  row of a WHERE c
0610: 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  lause..*/.int sq
0620: 6c 69 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e  lite3WhereContin
0630: 75 65 4c 61 62 65 6c 28 57 68 65 72 65 49 6e 66  ueLabel(WhereInf
0640: 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 61 73  o *pWInfo){.  as
0650: 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 69 43  sert( pWInfo->iC
0660: 6f 6e 74 69 6e 75 65 21 3d 30 20 29 3b 0a 20 20  ontinue!=0 );.  
0670: 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 69  return pWInfo->i
0680: 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
0690: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 44  ** Return the VD
06a0: 42 45 20 61 64 64 72 65 73 73 20 6f 72 20 6c 61  BE address or la
06b0: 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69  bel to jump to i
06c0: 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 65 61 6b  n order to break
06d0: 0a 2a 2a 20 6f 75 74 20 6f 66 20 61 20 57 48 45  .** out of a WHE
06e0: 52 45 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20  RE loop..*/.int 
06f0: 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65 61  sqlite3WhereBrea
0700: 6b 4c 61 62 65 6c 28 57 68 65 72 65 49 6e 66 6f  kLabel(WhereInfo
0710: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74   *pWInfo){.  ret
0720: 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  urn pWInfo->iBre
0730: 61 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ak;.}../*.** Ret
0740: 75 72 6e 20 54 52 55 45 20 69 66 20 61 6e 20 55  urn TRUE if an U
0750: 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
0760: 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 20 6f 70  statement can op
0770: 65 72 61 74 65 20 64 69 72 65 63 74 6c 79 20 6f  erate directly o
0780: 6e 0a 2a 2a 20 74 68 65 20 72 6f 77 69 64 73 20  n.** the rowids 
0790: 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 57 48  returned by a WH
07a0: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 52 65 74  ERE clause.  Ret
07b0: 75 72 6e 20 46 41 4c 53 45 20 69 66 20 64 6f 69  urn FALSE if doi
07c0: 6e 67 20 61 6e 0a 2a 2a 20 55 50 44 41 54 45 20  ng an.** UPDATE 
07d0: 6f 72 20 44 45 4c 45 54 45 20 6d 69 67 68 74 20  or DELETE might 
07e0: 63 68 61 6e 67 65 20 73 75 62 73 65 71 75 65 6e  change subsequen
07f0: 74 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 72  t WHERE clause r
0800: 65 73 75 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  esults..**.** If
0810: 20 74 68 65 20 4f 4e 45 50 41 53 53 20 6f 70 74   the ONEPASS opt
0820: 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65  imization is use
0830: 64 20 28 69 66 20 74 68 69 73 20 72 6f 75 74 69  d (if this routi
0840: 6e 65 20 72 65 74 75 72 6e 73 20 74 72 75 65 29  ne returns true)
0850: 0a 2a 2a 20 74 68 65 6e 20 61 6c 73 6f 20 77 72  .** then also wr
0860: 69 74 65 20 74 68 65 20 69 6e 64 69 63 65 73 20  ite the indices 
0870: 6f 66 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 20  of open cursors 
0880: 75 73 65 64 20 62 79 20 4f 4e 45 50 41 53 53 0a  used by ONEPASS.
0890: 2a 2a 20 69 6e 74 6f 20 61 69 43 75 72 5b 30 5d  ** into aiCur[0]
08a0: 20 61 6e 64 20 61 69 43 75 72 5b 31 5d 2e 20 20   and aiCur[1].  
08b0: 69 61 43 75 72 5b 30 5d 20 67 65 74 73 20 74 68  iaCur[0] gets th
08c0: 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20  e cursor of the 
08d0: 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20 61 6e  data.** table an
08e0: 64 20 69 61 43 75 72 5b 31 5d 20 67 65 74 73 20  d iaCur[1] gets 
08f0: 74 68 65 20 63 75 72 73 6f 72 20 75 73 65 64 20  the cursor used 
0900: 62 79 20 61 6e 20 61 75 78 69 6c 69 61 72 79 20  by an auxiliary 
0910: 69 6e 64 65 78 2e 0a 2a 2a 20 45 69 74 68 65 72  index..** Either
0920: 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 2d 31   value may be -1
0930: 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61  , indicating tha
0940: 74 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  t cursor is not 
0950: 75 73 65 64 2e 0a 2a 2a 20 41 6e 79 20 63 75 72  used..** Any cur
0960: 73 6f 72 73 20 72 65 74 75 72 6e 65 64 20 77 69  sors returned wi
0970: 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65  ll have been ope
0980: 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67 2e  ned for writing.
0990: 0a 2a 2a 0a 2a 2a 20 61 69 43 75 72 5b 30 5d 20  .**.** aiCur[0] 
09a0: 61 6e 64 20 61 69 43 75 72 5b 31 5d 20 62 6f 74  and aiCur[1] bot
09b0: 68 20 67 65 74 20 2d 31 20 69 66 20 74 68 65 20  h get -1 if the 
09c0: 77 68 65 72 65 2d 63 6c 61 75 73 65 20 6c 6f 67  where-clause log
09d0: 69 63 20 69 73 0a 2a 2a 20 75 6e 61 62 6c 65 20  ic is.** unable 
09e0: 74 6f 20 75 73 65 20 74 68 65 20 4f 4e 45 50 41  to use the ONEPA
09f0: 53 53 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  SS optimization.
0a00: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57  .*/.int sqlite3W
0a10: 68 65 72 65 4f 6b 4f 6e 65 50 61 73 73 28 57 68  hereOkOnePass(Wh
0a20: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
0a30: 20 69 6e 74 20 2a 61 69 43 75 72 29 7b 0a 20 20   int *aiCur){.  
0a40: 6d 65 6d 63 70 79 28 61 69 43 75 72 2c 20 70 57  memcpy(aiCur, pW
0a50: 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61  Info->aiCurOnePa
0a60: 73 73 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a  ss, sizeof(int)*
0a70: 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49  2);.  return pWI
0a80: 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 3b 0a  nfo->okOnePass;.
0a90: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
0aa0: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 53 72  e content of pSr
0ab0: 63 20 69 6e 74 6f 20 70 44 65 73 74 0a 2a 2f 0a  c into pDest.*/.
0ac0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
0ad0: 65 4f 72 4d 6f 76 65 28 57 68 65 72 65 4f 72 53  eOrMove(WhereOrS
0ae0: 65 74 20 2a 70 44 65 73 74 2c 20 57 68 65 72 65  et *pDest, Where
0af0: 4f 72 53 65 74 20 2a 70 53 72 63 29 7b 0a 20 20  OrSet *pSrc){.  
0b00: 70 44 65 73 74 2d 3e 6e 20 3d 20 70 53 72 63 2d  pDest->n = pSrc-
0b10: 3e 6e 3b 0a 20 20 6d 65 6d 63 70 79 28 70 44 65  >n;.  memcpy(pDe
0b20: 73 74 2d 3e 61 2c 20 70 53 72 63 2d 3e 61 2c 20  st->a, pSrc->a, 
0b30: 70 44 65 73 74 2d 3e 6e 2a 73 69 7a 65 6f 66 28  pDest->n*sizeof(
0b40: 70 44 65 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 7d  pDest->a[0]));.}
0b50: 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 69  ../*.** Try to i
0b60: 6e 73 65 72 74 20 61 20 6e 65 77 20 70 72 65 72  nsert a new prer
0b70: 65 71 75 69 73 69 74 65 2f 63 6f 73 74 20 65 6e  equisite/cost en
0b80: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 57 68 65  try into the Whe
0b90: 72 65 4f 72 53 65 74 20 70 53 65 74 2e 0a 2a 2a  reOrSet pSet..**
0ba0: 0a 2a 2a 20 54 68 65 20 6e 65 77 20 65 6e 74 72  .** The new entr
0bb0: 79 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69 74  y might overwrit
0bc0: 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65 6e  e an existing en
0bd0: 74 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68 74  try, or it might
0be0: 20 62 65 0a 2a 2a 20 61 70 70 65 6e 64 65 64 2c   be.** appended,
0bf0: 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65 20   or it might be 
0c00: 64 69 73 63 61 72 64 65 64 2e 20 20 44 6f 20 77  discarded.  Do w
0c10: 68 61 74 65 76 65 72 20 69 73 20 74 68 65 20 72  hatever is the r
0c20: 69 67 68 74 20 74 68 69 6e 67 0a 2a 2a 20 73 6f  ight thing.** so
0c30: 20 74 68 61 74 20 70 53 65 74 20 6b 65 65 70 73   that pSet keeps
0c40: 20 74 68 65 20 4e 5f 4f 52 5f 43 4f 53 54 20 62   the N_OR_COST b
0c50: 65 73 74 20 65 6e 74 72 69 65 73 20 73 65 65 6e  est entries seen
0c60: 20 73 6f 20 66 61 72 2e 0a 2a 2f 0a 73 74 61 74   so far..*/.stat
0c70: 69 63 20 69 6e 74 20 77 68 65 72 65 4f 72 49 6e  ic int whereOrIn
0c80: 73 65 72 74 28 0a 20 20 57 68 65 72 65 4f 72 53  sert(.  WhereOrS
0c90: 65 74 20 2a 70 53 65 74 2c 20 20 20 20 20 20 2f  et *pSet,      /
0ca0: 2a 20 54 68 65 20 57 68 65 72 65 4f 72 53 65 74  * The WhereOrSet
0cb0: 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 2a   to be updated *
0cc0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72  /.  Bitmask prer
0cd0: 65 71 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 72  eq,        /* Pr
0ce0: 65 72 65 71 75 69 73 69 74 65 73 20 6f 66 20 74  erequisites of t
0cf0: 68 65 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a  he new entry */.
0d00: 20 20 4c 6f 67 45 73 74 20 72 52 75 6e 2c 20 20    LogEst rRun,  
0d10: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 75 6e 2d           /* Run-
0d20: 63 6f 73 74 20 6f 66 20 74 68 65 20 6e 65 77 20  cost of the new 
0d30: 65 6e 74 72 79 20 2a 2f 0a 20 20 4c 6f 67 45 73  entry */.  LogEs
0d40: 74 20 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20  t nOut          
0d50: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
0d60: 75 74 70 75 74 73 20 66 6f 72 20 74 68 65 20 6e  utputs for the n
0d70: 65 77 20 65 6e 74 72 79 20 2a 2f 0a 29 7b 0a 20  ew entry */.){. 
0d80: 20 75 31 36 20 69 3b 0a 20 20 57 68 65 72 65 4f   u16 i;.  WhereO
0d90: 72 43 6f 73 74 20 2a 70 3b 0a 20 20 66 6f 72 28  rCost *p;.  for(
0da0: 69 3d 70 53 65 74 2d 3e 6e 2c 20 70 3d 70 53 65  i=pSet->n, p=pSe
0db0: 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  t->a; i>0; i--, 
0dc0: 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 72 52  p++){.    if( rR
0dd0: 75 6e 3c 3d 70 2d 3e 72 52 75 6e 20 26 26 20 28  un<=p->rRun && (
0de0: 70 72 65 72 65 71 20 26 20 70 2d 3e 70 72 65 72  prereq & p->prer
0df0: 65 71 29 3d 3d 70 72 65 72 65 71 20 29 7b 0a 20  eq)==prereq ){. 
0e00: 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 4f       goto whereO
0e10: 72 49 6e 73 65 72 74 5f 64 6f 6e 65 3b 0a 20 20  rInsert_done;.  
0e20: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 72    }.    if( p->r
0e30: 52 75 6e 3c 3d 72 52 75 6e 20 26 26 20 28 70 2d  Run<=rRun && (p-
0e40: 3e 70 72 65 72 65 71 20 26 20 70 72 65 72 65 71  >prereq & prereq
0e50: 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20 29 7b 0a  )==p->prereq ){.
0e60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
0e70: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
0e80: 70 53 65 74 2d 3e 6e 3c 4e 5f 4f 52 5f 43 4f 53  pSet->n<N_OR_COS
0e90: 54 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 53  T ){.    p = &pS
0ea0: 65 74 2d 3e 61 5b 70 53 65 74 2d 3e 6e 2b 2b 5d  et->a[pSet->n++]
0eb0: 3b 0a 20 20 20 20 70 2d 3e 6e 4f 75 74 20 3d 20  ;.    p->nOut = 
0ec0: 6e 4f 75 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nOut;.  }else{. 
0ed0: 20 20 20 70 20 3d 20 70 53 65 74 2d 3e 61 3b 0a     p = pSet->a;.
0ee0: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70      for(i=1; i<p
0ef0: 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Set->n; i++){.  
0f00: 20 20 20 20 69 66 28 20 70 2d 3e 72 52 75 6e 3e      if( p->rRun>
0f10: 70 53 65 74 2d 3e 61 5b 69 5d 2e 72 52 75 6e 20  pSet->a[i].rRun 
0f20: 29 20 70 20 3d 20 70 53 65 74 2d 3e 61 20 2b 20  ) p = pSet->a + 
0f30: 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  i;.    }.    if(
0f40: 20 70 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20 29   p->rRun<=rRun )
0f50: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 77   return 0;.  }.w
0f60: 68 65 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f 6e  hereOrInsert_don
0f70: 65 3a 0a 20 20 70 2d 3e 70 72 65 72 65 71 20 3d  e:.  p->prereq =
0f80: 20 70 72 65 72 65 71 3b 0a 20 20 70 2d 3e 72 52   prereq;.  p->rR
0f90: 75 6e 20 3d 20 72 52 75 6e 3b 0a 20 20 69 66 28  un = rRun;.  if(
0fa0: 20 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29 20   p->nOut>nOut ) 
0fb0: 70 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 3b 0a  p->nOut = nOut;.
0fc0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
0fd0: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
0fe0: 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 57  a preallocated W
0ff0: 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63  hereClause struc
1000: 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
1010: 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73 65  void whereClause
1020: 49 6e 69 74 28 0a 20 20 57 68 65 72 65 43 6c 61  Init(.  WhereCla
1030: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
1040: 20 2f 2a 20 54 68 65 20 57 68 65 72 65 43 6c 61   /* The WhereCla
1050: 75 73 65 20 74 6f 20 62 65 20 69 6e 69 74 69 61  use to be initia
1060: 6c 69 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72 65  lized */.  Where
1070: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 20 20 20  Info *pWInfo    
1080: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
1090: 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74   processing cont
10a0: 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 70 57 43 2d  ext */.){.  pWC-
10b0: 3e 70 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f  >pWInfo = pWInfo
10c0: 3b 0a 20 20 70 57 43 2d 3e 70 4f 75 74 65 72 20  ;.  pWC->pOuter 
10d0: 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 54 65 72  = 0;.  pWC->nTer
10e0: 6d 20 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 53  m = 0;.  pWC->nS
10f0: 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65 28  lot = ArraySize(
1100: 70 57 43 2d 3e 61 53 74 61 74 69 63 29 3b 0a 20  pWC->aStatic);. 
1110: 20 70 57 43 2d 3e 61 20 3d 20 70 57 43 2d 3e 61   pWC->a = pWC->a
1120: 53 74 61 74 69 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  Static;.}../* Fo
1130: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
1140: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
1150: 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28  hereClauseClear(
1160: 57 68 65 72 65 43 6c 61 75 73 65 2a 29 3b 0a 0a  WhereClause*);..
1170: 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65  /*.** Deallocate
1180: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f   all memory asso
1190: 63 69 61 74 65 64 20 77 69 74 68 20 61 20 57 68  ciated with a Wh
11a0: 65 72 65 4f 72 49 6e 66 6f 20 6f 62 6a 65 63 74  ereOrInfo object
11b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11c0: 20 77 68 65 72 65 4f 72 49 6e 66 6f 44 65 6c 65   whereOrInfoDele
11d0: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
11e0: 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70 29 7b  WhereOrInfo *p){
11f0: 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c  .  whereClauseCl
1200: 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20 73  ear(&p->wc);.  s
1210: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1220: 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   p);.}../*.** De
1230: 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d  allocate all mem
1240: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
1250: 69 74 68 20 61 20 57 68 65 72 65 41 6e 64 49 6e  ith a WhereAndIn
1260: 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  fo object..*/.st
1270: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 41  atic void whereA
1280: 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c  ndInfoDelete(sql
1290: 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 41  ite3 *db, WhereA
12a0: 6e 64 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 77 68  ndInfo *p){.  wh
12b0: 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26  ereClauseClear(&
12c0: 70 2d 3e 77 63 29 3b 0a 20 20 73 71 6c 69 74 65  p->wc);.  sqlite
12d0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
12e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  }../*.** Dealloc
12f0: 61 74 65 20 61 20 57 68 65 72 65 43 6c 61 75 73  ate a WhereClaus
1300: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  e structure.  Th
1310: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  e WhereClause st
1320: 72 75 63 74 75 72 65 0a 2a 2a 20 69 74 73 65 6c  ructure.** itsel
1330: 66 20 69 73 20 6e 6f 74 20 66 72 65 65 64 2e 20  f is not freed. 
1340: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1350: 20 74 68 65 20 69 6e 76 65 72 73 65 20 6f 66 20   the inverse of 
1360: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28  whereClauseInit(
1370: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
1380: 64 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65  d whereClauseCle
1390: 61 72 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a  ar(WhereClause *
13a0: 70 57 43 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  pWC){.  int i;. 
13b0: 20 57 68 65 72 65 54 65 72 6d 20 2a 61 3b 0a 20   WhereTerm *a;. 
13c0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
13d0: 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72  WC->pWInfo->pPar
13e0: 73 65 2d 3e 64 62 3b 0a 20 20 66 6f 72 28 69 3d  se->db;.  for(i=
13f0: 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 2c 20 61 3d  pWC->nTerm-1, a=
1400: 70 57 43 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d  pWC->a; i>=0; i-
1410: 2d 2c 20 61 2b 2b 29 7b 0a 20 20 20 20 69 66 28  -, a++){.    if(
1420: 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45   a->wtFlags & TE
1430: 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20  RM_DYNAMIC ){.  
1440: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
1450: 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 70 45 78  elete(db, a->pEx
1460: 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  pr);.    }.    i
1470: 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20  f( a->wtFlags & 
1480: 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 29 7b 0a 20  TERM_ORINFO ){. 
1490: 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e 66 6f       whereOrInfo
14a0: 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e  Delete(db, a->u.
14b0: 70 4f 72 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 65  pOrInfo);.    }e
14c0: 6c 73 65 20 69 66 28 20 61 2d 3e 77 74 46 6c 61  lse if( a->wtFla
14d0: 67 73 20 26 20 54 45 52 4d 5f 41 4e 44 49 4e 46  gs & TERM_ANDINF
14e0: 4f 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65  O ){.      where
14f0: 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 64 62  AndInfoDelete(db
1500: 2c 20 61 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 29  , a->u.pAndInfo)
1510: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
1520: 28 20 70 57 43 2d 3e 61 21 3d 70 57 43 2d 3e 61  ( pWC->a!=pWC->a
1530: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 73 71  Static ){.    sq
1540: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1550: 70 57 43 2d 3e 61 29 3b 0a 20 20 7d 0a 7d 0a 0a  pWC->a);.  }.}..
1560: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67  /*.** Add a sing
1570: 6c 65 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d  le new WhereTerm
1580: 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 57 68   entry to the Wh
1590: 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74  ereClause object
15a0: 20 70 57 43 2e 0a 2a 2a 20 54 68 65 20 6e 65 77   pWC..** The new
15b0: 20 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63   WhereTerm objec
15c0: 74 20 69 73 20 63 6f 6e 73 74 72 75 63 74 65 64  t is constructed
15d0: 20 66 72 6f 6d 20 45 78 70 72 20 70 20 61 6e 64   from Expr p and
15e0: 20 77 69 74 68 20 77 74 46 6c 61 67 73 2e 0a 2a   with wtFlags..*
15f0: 2a 20 54 68 65 20 69 6e 64 65 78 20 69 6e 20 70  * The index in p
1600: 57 43 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 6e  WC->a[] of the n
1610: 65 77 20 57 68 65 72 65 54 65 72 6d 20 69 73 20  ew WhereTerm is 
1620: 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
1630: 65 73 73 2e 0a 2a 2a 20 30 20 69 73 20 72 65 74  ess..** 0 is ret
1640: 75 72 6e 65 64 20 69 66 20 74 68 65 20 6e 65 77  urned if the new
1650: 20 57 68 65 72 65 54 65 72 6d 20 63 6f 75 6c 64   WhereTerm could
1660: 20 6e 6f 74 20 62 65 20 61 64 64 65 64 20 64 75   not be added du
1670: 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79 0a 2a 2a  e to a memory.**
1680: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
1690: 72 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 61  r.  The memory a
16a0: 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72  llocation failur
16b0: 65 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 72 64  e will be record
16c0: 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 62 2d  ed in.** the db-
16d0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c  >mallocFailed fl
16e0: 61 67 20 73 6f 20 74 68 61 74 20 68 69 67 68 65  ag so that highe
16f0: 72 2d 6c 65 76 65 6c 20 66 75 6e 63 74 69 6f 6e  r-level function
1700: 73 20 63 61 6e 20 64 65 74 65 63 74 20 69 74 2e  s can detect it.
1710: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1720: 69 6e 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73  ine will increas
1730: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
1740: 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79  e pWC->a[] array
1750: 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   as necessary..*
1760: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 74 46 6c  *.** If the wtFl
1770: 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 6e 63  ags argument inc
1780: 6c 75 64 65 73 20 54 45 52 4d 5f 44 59 4e 41 4d  ludes TERM_DYNAM
1790: 49 43 2c 20 74 68 65 6e 20 72 65 73 70 6f 6e 73  IC, then respons
17a0: 69 62 69 6c 69 74 79 0a 2a 2a 20 66 6f 72 20 66  ibility.** for f
17b0: 72 65 65 69 6e 67 20 74 68 65 20 65 78 70 72 65  reeing the expre
17c0: 73 73 69 6f 6e 20 70 20 69 73 20 61 73 73 75 6d  ssion p is assum
17d0: 65 64 20 62 79 20 74 68 65 20 57 68 65 72 65 43  ed by the WhereC
17e0: 6c 61 75 73 65 20 6f 62 6a 65 63 74 20 70 57 43  lause object pWC
17f0: 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 72 75  ..** This is tru
1800: 65 20 65 76 65 6e 20 69 66 20 74 68 69 73 20 72  e even if this r
1810: 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 74 6f 20  outine fails to 
1820: 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 57  allocate a new W
1830: 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20  hereTerm..**.** 
1840: 57 41 52 4e 49 4e 47 3a 20 20 54 68 69 73 20 72  WARNING:  This r
1850: 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65 61  outine might rea
1860: 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 70 61 63  llocate the spac
1870: 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a  e used to store.
1880: 2a 2a 20 57 68 65 72 65 54 65 72 6d 73 2e 20 20  ** WhereTerms.  
1890: 41 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  All pointers to 
18a0: 57 68 65 72 65 54 65 72 6d 73 20 73 68 6f 75 6c  WhereTerms shoul
18b0: 64 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64  d be invalidated
18c0: 20 61 66 74 65 72 0a 2a 2a 20 63 61 6c 6c 69 6e   after.** callin
18d0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
18e0: 20 53 75 63 68 20 70 6f 69 6e 74 65 72 73 20 6d   Such pointers m
18f0: 61 79 20 62 65 20 72 65 69 6e 69 74 69 61 6c 69  ay be reinitiali
1900: 7a 65 64 20 62 79 20 72 65 66 65 72 65 6e 63 69  zed by referenci
1910: 6e 67 0a 2a 2a 20 74 68 65 20 70 57 43 2d 3e 61  ng.** the pWC->a
1920: 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61  [] array..*/.sta
1930: 74 69 63 20 69 6e 74 20 77 68 65 72 65 43 6c 61  tic int whereCla
1940: 75 73 65 49 6e 73 65 72 74 28 57 68 65 72 65 43  useInsert(WhereC
1950: 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72  lause *pWC, Expr
1960: 20 2a 70 2c 20 75 38 20 77 74 46 6c 61 67 73 29   *p, u8 wtFlags)
1970: 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  {.  WhereTerm *p
1980: 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 64 78 3b  Term;.  int idx;
1990: 0a 20 20 74 65 73 74 63 61 73 65 28 20 77 74 46  .  testcase( wtF
19a0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
19b0: 55 41 4c 20 29 3b 0a 20 20 69 66 28 20 70 57 43  UAL );.  if( pWC
19c0: 2d 3e 6e 54 65 72 6d 3e 3d 70 57 43 2d 3e 6e 53  ->nTerm>=pWC->nS
19d0: 6c 6f 74 20 29 7b 0a 20 20 20 20 57 68 65 72 65  lot ){.    Where
19e0: 54 65 72 6d 20 2a 70 4f 6c 64 20 3d 20 70 57 43  Term *pOld = pWC
19f0: 2d 3e 61 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ->a;.    sqlite3
1a00: 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70 57 49 6e   *db = pWC->pWIn
1a10: 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a  fo->pParse->db;.
1a20: 20 20 20 20 70 57 43 2d 3e 61 20 3d 20 73 71 6c      pWC->a = sql
1a30: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
1a40: 64 62 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d 3e  db, sizeof(pWC->
1a50: 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 53 6c 6f 74  a[0])*pWC->nSlot
1a60: 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70 57  *2 );.    if( pW
1a70: 43 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20  C->a==0 ){.     
1a80: 20 69 66 28 20 77 74 46 6c 61 67 73 20 26 20 54   if( wtFlags & T
1a90: 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20  ERM_DYNAMIC ){. 
1aa0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1ab0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 29 3b  prDelete(db, p);
1ac0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1ad0: 57 43 2d 3e 61 20 3d 20 70 4f 6c 64 3b 0a 20 20  WC->a = pOld;.  
1ae0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1af0: 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70    }.    memcpy(p
1b00: 57 43 2d 3e 61 2c 20 70 4f 6c 64 2c 20 73 69 7a  WC->a, pOld, siz
1b10: 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a 70  eof(pWC->a[0])*p
1b20: 57 43 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20 20  WC->nTerm);.    
1b30: 69 66 28 20 70 4f 6c 64 21 3d 70 57 43 2d 3e 61  if( pOld!=pWC->a
1b40: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20 20  Static ){.      
1b50: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1b60: 2c 20 70 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a 20  , pOld);.    }. 
1b70: 20 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20     pWC->nSlot = 
1b80: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53  sqlite3DbMallocS
1b90: 69 7a 65 28 64 62 2c 20 70 57 43 2d 3e 61 29 2f  ize(db, pWC->a)/
1ba0: 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d  sizeof(pWC->a[0]
1bb0: 29 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d  );.  }.  pTerm =
1bc0: 20 26 70 57 43 2d 3e 61 5b 69 64 78 20 3d 20 70   &pWC->a[idx = p
1bd0: 57 43 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b 0a 20 20  WC->nTerm++];.  
1be0: 69 66 28 20 70 20 26 26 20 45 78 70 72 48 61 73  if( p && ExprHas
1bf0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 55  Property(p, EP_U
1c00: 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a 20 20 20 20  nlikely) ){.    
1c10: 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
1c20: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
1c30: 28 70 2d 3e 69 54 61 62 6c 65 29 20 2d 20 39 39  (p->iTable) - 99
1c40: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1c50: 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 20  Term->truthProb 
1c60: 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d  = 1;.  }.  pTerm
1c70: 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65  ->pExpr = sqlite
1c80: 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
1c90: 28 70 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74  (p);.  pTerm->wt
1ca0: 46 6c 61 67 73 20 3d 20 77 74 46 6c 61 67 73 3b  Flags = wtFlags;
1cb0: 0a 20 20 70 54 65 72 6d 2d 3e 70 57 43 20 3d 20  .  pTerm->pWC = 
1cc0: 70 57 43 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50  pWC;.  pTerm->iP
1cd0: 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 72 65  arent = -1;.  re
1ce0: 74 75 72 6e 20 69 64 78 3b 0a 7d 0a 0a 2f 2a 0a  turn idx;.}../*.
1cf0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1d00: 69 64 65 6e 74 69 66 69 65 73 20 73 75 62 65 78  identifies subex
1d10: 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
1d20: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 77 68   WHERE clause wh
1d30: 65 72 65 0a 2a 2a 20 65 61 63 68 20 73 75 62 65  ere.** each sube
1d40: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70  xpression is sep
1d50: 61 72 61 74 65 64 20 62 79 20 74 68 65 20 41 4e  arated by the AN
1d60: 44 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 6f  D operator or so
1d70: 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 6f 70 65 72  me other.** oper
1d80: 61 74 6f 72 20 73 70 65 63 69 66 69 65 64 20 69  ator specified i
1d90: 6e 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74  n the op paramet
1da0: 65 72 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c  er.  The WhereCl
1db0: 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a  ause structure.*
1dc0: 2a 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68  * is filled with
1dd0: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 75 62   pointers to sub
1de0: 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 46 6f  expressions.  Fo
1df0: 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  r example:.**.**
1e00: 20 20 20 20 57 48 45 52 45 20 20 61 3d 3d 27 68      WHERE  a=='h
1e10: 65 6c 6c 6f 27 20 41 4e 44 20 63 6f 61 6c 65 73  ello' AND coales
1e20: 63 65 28 62 2c 31 31 29 3c 31 30 20 41 4e 44 20  ce(b,11)<10 AND 
1e30: 28 63 2b 31 32 21 3d 64 20 4f 52 20 63 3d 3d 32  (c+12!=d OR c==2
1e40: 32 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  2).**           
1e50: 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c  \________/     \
1e60: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
1e70: 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
1e80: 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20  ______/.**      
1e90: 20 20 20 20 20 20 73 6c 6f 74 5b 30 5d 20 20 20        slot[0]   
1ea0: 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 31 5d           slot[1]
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1ec0: 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65  lot[2].**.** The
1ed0: 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20   original WHERE 
1ee0: 63 6c 61 75 73 65 20 69 6e 20 70 45 78 70 72 20  clause in pExpr 
1ef0: 69 73 20 75 6e 61 6c 74 65 72 65 64 2e 20 20 41  is unaltered.  A
1f00: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  ll this routine.
1f10: 2a 2a 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20  ** does is make 
1f20: 73 6c 6f 74 5b 5d 20 65 6e 74 72 69 65 73 20 70  slot[] entries p
1f30: 6f 69 6e 74 20 74 6f 20 73 75 62 73 74 72 75 63  oint to substruc
1f40: 74 75 72 65 20 77 69 74 68 69 6e 20 70 45 78 70  ture within pExp
1f50: 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  r..**.** In the 
1f60: 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63  previous sentenc
1f70: 65 20 61 6e 64 20 69 6e 20 74 68 65 20 64 69 61  e and in the dia
1f80: 67 72 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22 20 72  gram, "slot[]" r
1f90: 65 66 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20  efers to.** the 
1fa0: 57 68 65 72 65 43 6c 61 75 73 65 2e 61 5b 5d 20  WhereClause.a[] 
1fb0: 61 72 72 61 79 2e 20 20 54 68 65 20 73 6c 6f 74  array.  The slot
1fc0: 5b 5d 20 61 72 72 61 79 20 67 72 6f 77 73 20 61  [] array grows a
1fd0: 73 20 6e 65 65 64 65 64 20 74 6f 20 63 6f 6e 74  s needed to cont
1fe0: 61 69 6e 0a 2a 2a 20 61 6c 6c 20 74 65 72 6d 73  ain.** all terms
1ff0: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
2000: 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ause..*/.static 
2010: 76 6f 69 64 20 77 68 65 72 65 53 70 6c 69 74 28  void whereSplit(
2020: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
2030: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 75  , Expr *pExpr, u
2040: 38 20 6f 70 29 7b 0a 20 20 70 57 43 2d 3e 6f 70  8 op){.  pWC->op
2050: 20 3d 20 6f 70 3b 0a 20 20 69 66 28 20 70 45 78   = op;.  if( pEx
2060: 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  pr==0 ) return;.
2070: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
2080: 3d 6f 70 20 29 7b 0a 20 20 20 20 77 68 65 72 65  =op ){.    where
2090: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
20a0: 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d  , pExpr, 0);.  }
20b0: 65 6c 73 65 7b 0a 20 20 20 20 77 68 65 72 65 53  else{.    whereS
20c0: 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70 72 2d  plit(pWC, pExpr-
20d0: 3e 70 4c 65 66 74 2c 20 6f 70 29 3b 0a 20 20 20  >pLeft, op);.   
20e0: 20 77 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c   whereSplit(pWC,
20f0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
2100: 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  op);.  }.}../*.*
2110: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 57  * Initialize a W
2120: 68 65 72 65 4d 61 73 6b 53 65 74 20 6f 62 6a 65  hereMaskSet obje
2130: 63 74 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e  ct.*/.#define in
2140: 69 74 4d 61 73 6b 53 65 74 28 50 29 20 20 28 50  itMaskSet(P)  (P
2150: 29 2d 3e 6e 3d 30 0a 0a 2f 2a 0a 2a 2a 20 52 65  )->n=0../*.** Re
2160: 74 75 72 6e 20 74 68 65 20 62 69 74 6d 61 73 6b  turn the bitmask
2170: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 63   for the given c
2180: 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e 20 20 52  ursor number.  R
2190: 65 74 75 72 6e 20 30 20 69 66 0a 2a 2a 20 69 43  eturn 0 if.** iC
21a0: 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e 20  ursor is not in 
21b0: 74 68 65 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74  the set..*/.stat
21c0: 69 63 20 42 69 74 6d 61 73 6b 20 67 65 74 4d 61  ic Bitmask getMa
21d0: 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74 20  sk(WhereMaskSet 
21e0: 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69  *pMaskSet, int i
21f0: 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20 69  Cursor){.  int i
2200: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61 73  ;.  assert( pMas
2210: 6b 53 65 74 2d 3e 6e 3c 3d 28 69 6e 74 29 73 69  kSet->n<=(int)si
2220: 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 20  zeof(Bitmask)*8 
2230: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
2240: 70 4d 61 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b 2b  pMaskSet->n; i++
2250: 29 7b 0a 20 20 20 20 69 66 28 20 70 4d 61 73 6b  ){.    if( pMask
2260: 53 65 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75 72  Set->ix[i]==iCur
2270: 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 72 65 74  sor ){.      ret
2280: 75 72 6e 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a  urn MASKBIT(i);.
2290: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
22a0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
22b0: 72 65 61 74 65 20 61 20 6e 65 77 20 6d 61 73 6b  reate a new mask
22c0: 20 66 6f 72 20 63 75 72 73 6f 72 20 69 43 75 72   for cursor iCur
22d0: 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  sor..**.** There
22e0: 20 69 73 20 6f 6e 65 20 63 75 72 73 6f 72 20 70   is one cursor p
22f0: 65 72 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  er table in the 
2300: 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68  FROM clause.  Th
2310: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 74  e number of.** t
2320: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f  ables in the FRO
2330: 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69  M clause is limi
2340: 74 65 64 20 62 79 20 61 20 74 65 73 74 20 65 61  ted by a test ea
2350: 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a 20 73 71  rly in the.** sq
2360: 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
2370: 29 20 72 6f 75 74 69 6e 65 2e 20 20 53 6f 20 77  ) routine.  So w
2380: 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
2390: 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a 2a  pMaskSet->ix[].*
23a0: 2a 20 61 72 72 61 79 20 77 69 6c 6c 20 6e 65 76  * array will nev
23b0: 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f 0a  er overflow..*/.
23c0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 72 65 61  static void crea
23d0: 74 65 4d 61 73 6b 28 57 68 65 72 65 4d 61 73 6b  teMask(WhereMask
23e0: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69  Set *pMaskSet, i
23f0: 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20 61  nt iCursor){.  a
2400: 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74 2d  ssert( pMaskSet-
2410: 3e 6e 20 3c 20 41 72 72 61 79 53 69 7a 65 28 70  >n < ArraySize(p
2420: 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20 29 3b 0a  MaskSet->ix) );.
2430: 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 70    pMaskSet->ix[p
2440: 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20  MaskSet->n++] = 
2450: 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  iCursor;.}../*.*
2460: 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73  * These routines
2470: 20 77 61 6c 6b 20 28 72 65 63 75 72 73 69 76 65   walk (recursive
2480: 6c 79 29 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ly) an expressio
2490: 6e 20 74 72 65 65 20 61 6e 64 20 67 65 6e 65 72  n tree and gener
24a0: 61 74 65 0a 2a 2a 20 61 20 62 69 74 6d 61 73 6b  ate.** a bitmask
24b0: 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68 69 63   indicating whic
24c0: 68 20 74 61 62 6c 65 73 20 61 72 65 20 75 73 65  h tables are use
24d0: 64 20 69 6e 20 74 68 61 74 20 65 78 70 72 65 73  d in that expres
24e0: 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a 2a 2f  sion.** tree..*/
24f0: 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20  .static Bitmask 
2500: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
2510: 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a  ge(WhereMaskSet*
2520: 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74  , ExprList*);.st
2530: 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70  atic Bitmask exp
2540: 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67  rSelectTableUsag
2550: 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a 2c  e(WhereMaskSet*,
2560: 20 53 65 6c 65 63 74 2a 29 3b 0a 73 74 61 74 69   Select*);.stati
2570: 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 54 61  c Bitmask exprTa
2580: 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61  bleUsage(WhereMa
2590: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
25a0: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 42 69 74   Expr *p){.  Bit
25b0: 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20  mask mask = 0;. 
25c0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
25d0: 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6f  rn 0;.  if( p->o
25e0: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p==TK_COLUMN ){.
25f0: 20 20 20 20 6d 61 73 6b 20 3d 20 67 65 74 4d 61      mask = getMa
2600: 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e  sk(pMaskSet, p->
2610: 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 72 65 74  iTable);.    ret
2620: 75 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a 20 20  urn mask;.  }.  
2630: 6d 61 73 6b 20 3d 20 65 78 70 72 54 61 62 6c 65  mask = exprTable
2640: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
2650: 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 6d 61  p->pRight);.  ma
2660: 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55  sk |= exprTableU
2670: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
2680: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20  ->pLeft);.  if( 
2690: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
26a0: 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  p, EP_xIsSelect)
26b0: 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20   ){.    mask |= 
26c0: 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55  exprSelectTableU
26d0: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
26e0: 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20  ->x.pSelect);.  
26f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 61 73 6b 20  }else{.    mask 
2700: 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65  |= exprListTable
2710: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
2720: 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d  p->x.pList);.  }
2730: 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a  .  return mask;.
2740: 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  }.static Bitmask
2750: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
2760: 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74  age(WhereMaskSet
2770: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70 72   *pMaskSet, Expr
2780: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
2790: 69 6e 74 20 69 3b 0a 20 20 42 69 74 6d 61 73 6b  int i;.  Bitmask
27a0: 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28   mask = 0;.  if(
27b0: 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f   pList ){.    fo
27c0: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
27d0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
27e0: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54     mask |= exprT
27f0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
2800: 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  et, pList->a[i].
2810: 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pExpr);.    }.  
2820: 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b  }.  return mask;
2830: 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  .}.static Bitmas
2840: 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c  k exprSelectTabl
2850: 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b  eUsage(WhereMask
2860: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 53  Set *pMaskSet, S
2870: 65 6c 65 63 74 20 2a 70 53 29 7b 0a 20 20 42 69  elect *pS){.  Bi
2880: 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a  tmask mask = 0;.
2890: 20 20 77 68 69 6c 65 28 20 70 53 20 29 7b 0a 20    while( pS ){. 
28a0: 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63     SrcList *pSrc
28b0: 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20   = pS->pSrc;.   
28c0: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73   mask |= exprLis
28d0: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
28e0: 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69 73 74  kSet, pS->pEList
28f0: 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  );.    mask |= e
2900: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
2910: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e  e(pMaskSet, pS->
2920: 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 6d  pGroupBy);.    m
2930: 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54  ask |= exprListT
2940: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
2950: 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72 42 79  et, pS->pOrderBy
2960: 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  );.    mask |= e
2970: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
2980: 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 57 68 65  askSet, pS->pWhe
2990: 72 65 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  re);.    mask |=
29a0: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
29b0: 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 48  pMaskSet, pS->pH
29c0: 61 76 69 6e 67 29 3b 0a 20 20 20 20 69 66 28 20  aving);.    if( 
29d0: 41 4c 57 41 59 53 28 70 53 72 63 21 3d 30 29 20  ALWAYS(pSrc!=0) 
29e0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
29f0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
2a00: 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b  <pSrc->nSrc; i++
2a10: 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 20  ){.        mask 
2a20: 7c 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61 62  |= exprSelectTab
2a30: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
2a40: 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53 65  , pSrc->a[i].pSe
2a50: 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 6d  lect);.        m
2a60: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
2a70: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
2a80: 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 4f 6e 29 3b  pSrc->a[i].pOn);
2a90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2aa0: 20 20 20 70 53 20 3d 20 70 53 2d 3e 70 50 72 69     pS = pS->pPri
2ab0: 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  or;.  }.  return
2ac0: 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   mask;.}../*.** 
2ad0: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
2ae0: 68 65 20 67 69 76 65 6e 20 6f 70 65 72 61 74 6f  he given operato
2af0: 72 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 20  r is one of the 
2b00: 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 69  operators that i
2b10: 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 66 6f 72  s.** allowed for
2b20: 20 61 6e 20 69 6e 64 65 78 61 62 6c 65 20 57 48   an indexable WH
2b30: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 2e  ERE clause term.
2b40: 20 20 54 68 65 20 61 6c 6c 6f 77 65 64 20 6f 70    The allowed op
2b50: 65 72 61 74 6f 72 73 20 61 72 65 0a 2a 2a 20 22  erators are.** "
2b60: 3d 22 2c 20 22 3c 22 2c 20 22 3e 22 2c 20 22 3c  =", "<", ">", "<
2b70: 3d 22 2c 20 22 3e 3d 22 2c 20 22 49 4e 22 2c 20  =", ">=", "IN", 
2b80: 61 6e 64 20 22 49 53 20 4e 55 4c 4c 22 0a 2a 2f  and "IS NULL".*/
2b90: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
2ba0: 77 65 64 4f 70 28 69 6e 74 20 6f 70 29 7b 0a 20  wedOp(int op){. 
2bb0: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54   assert( TK_GT>T
2bc0: 4b 5f 45 51 20 26 26 20 54 4b 5f 47 54 3c 54 4b  K_EQ && TK_GT<TK
2bd0: 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GE );.  assert(
2be0: 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26 26 20   TK_LT>TK_EQ && 
2bf0: 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b 0a 20  TK_LT<TK_GE );. 
2c00: 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3e 54   assert( TK_LE>T
2c10: 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 45 3c 54 4b  K_EQ && TK_LE<TK
2c20: 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _GE );.  assert(
2c30: 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b 34 20   TK_GE==TK_EQ+4 
2c40: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 70 3d 3d  );.  return op==
2c50: 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d 54 4b  TK_IN || (op>=TK
2c60: 5f 45 51 20 26 26 20 6f 70 3c 3d 54 4b 5f 47 45  _EQ && op<=TK_GE
2c70: 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ) || op==TK_ISNU
2c80: 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  LL;.}../*.** Com
2c90: 6d 75 74 65 20 61 20 63 6f 6d 70 61 72 69 73 6f  mute a compariso
2ca0: 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 45 78 70  n operator.  Exp
2cb0: 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  ressions of the 
2cc0: 66 6f 72 6d 20 22 58 20 6f 70 20 59 22 0a 2a 2a  form "X op Y".**
2cd0: 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69   are converted i
2ce0: 6e 74 6f 20 22 59 20 6f 70 20 58 22 2e 0a 2a 2a  nto "Y op X"..**
2cf0: 0a 2a 2a 20 49 66 20 6c 65 66 74 2f 72 69 67 68  .** If left/righ
2d00: 74 20 70 72 65 63 65 64 65 6e 63 65 20 72 75 6c  t precedence rul
2d10: 65 73 20 63 6f 6d 65 20 69 6e 74 6f 20 70 6c 61  es come into pla
2d20: 79 20 77 68 65 6e 20 64 65 74 65 72 6d 69 6e 69  y when determini
2d30: 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6c 6c 61 74  ng the.** collat
2d40: 69 6e 67 20 73 65 71 75 65 6e 63 65 2c 20 74 68  ing sequence, th
2d50: 65 6e 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61  en COLLATE opera
2d60: 74 6f 72 73 20 61 72 65 20 61 64 6a 75 73 74 65  tors are adjuste
2d70: 64 20 74 6f 20 65 6e 73 75 72 65 0a 2a 2a 20 74  d to ensure.** t
2d80: 68 61 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  hat the collatin
2d90: 67 20 73 65 71 75 65 6e 63 65 20 64 6f 65 73 20  g sequence does 
2da0: 6e 6f 74 20 63 68 61 6e 67 65 2e 20 20 46 6f 72  not change.  For
2db0: 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 20 22 59 20   example:.** "Y 
2dc0: 63 6f 6c 6c 61 74 65 20 4e 4f 43 41 53 45 20 6f  collate NOCASE o
2dd0: 70 20 58 22 20 62 65 63 6f 6d 65 73 20 22 58 20  p X" becomes "X 
2de0: 6f 70 20 59 22 20 62 65 63 61 75 73 65 20 61 6e  op Y" because an
2df0: 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  y collation sequ
2e00: 65 6e 63 65 20 6f 6e 0a 2a 2a 20 74 68 65 20 6c  ence on.** the l
2e10: 65 66 74 20 68 61 6e 64 20 73 69 64 65 20 6f 66  eft hand side of
2e20: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 76   a comparison ov
2e30: 65 72 72 69 64 65 73 20 61 6e 79 20 63 6f 6c 6c  errides any coll
2e40: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 0a  ation sequence .
2e50: 2a 2a 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  ** attached to t
2e60: 68 65 20 72 69 67 68 74 2e 20 46 6f 72 20 74 68  he right. For th
2e70: 65 20 73 61 6d 65 20 72 65 61 73 6f 6e 20 74 68  e same reason th
2e80: 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20 66 6c 61  e EP_Collate fla
2e90: 67 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6d 6d  g.** is not comm
2ea0: 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uted..*/.static 
2eb0: 76 6f 69 64 20 65 78 70 72 43 6f 6d 6d 75 74 65  void exprCommute
2ec0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2ed0: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
2ee0: 75 31 36 20 65 78 70 52 69 67 68 74 20 3d 20 28  u16 expRight = (
2ef0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66  pExpr->pRight->f
2f00: 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
2f10: 65 29 3b 0a 20 20 75 31 36 20 65 78 70 4c 65 66  e);.  u16 expLef
2f20: 74 20 3d 20 28 70 45 78 70 72 2d 3e 70 4c 65 66  t = (pExpr->pLef
2f30: 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f  t->flags & EP_Co
2f40: 6c 6c 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74  llate);.  assert
2f50: 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70 45 78 70  ( allowedOp(pExp
2f60: 72 2d 3e 6f 70 29 20 26 26 20 70 45 78 70 72 2d  r->op) && pExpr-
2f70: 3e 6f 70 21 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20  >op!=TK_IN );.  
2f80: 69 66 28 20 65 78 70 52 69 67 68 74 3d 3d 65 78  if( expRight==ex
2f90: 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 2f 2a 20  pLeft ){.    /* 
2fa0: 45 69 74 68 65 72 20 58 20 61 6e 64 20 59 20 62  Either X and Y b
2fb0: 6f 74 68 20 68 61 76 65 20 43 4f 4c 4c 41 54 45  oth have COLLATE
2fc0: 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 6e 65 69   operator or nei
2fd0: 74 68 65 72 20 64 6f 20 2a 2f 0a 20 20 20 20 69  ther do */.    i
2fe0: 66 28 20 65 78 70 52 69 67 68 74 20 29 7b 0a 20  f( expRight ){. 
2ff0: 20 20 20 20 20 2f 2a 20 42 6f 74 68 20 58 20 61       /* Both X a
3000: 6e 64 20 59 20 68 61 76 65 20 43 4f 4c 4c 41 54  nd Y have COLLAT
3010: 45 20 6f 70 65 72 61 74 6f 72 73 2e 20 20 4d 61  E operators.  Ma
3020: 6b 65 20 73 75 72 65 20 58 20 69 73 20 61 6c 77  ke sure X is alw
3030: 61 79 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 65  ays.      ** use
3040: 64 20 62 79 20 63 6c 65 61 72 69 6e 67 20 74 68  d by clearing th
3050: 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20 66 6c 61  e EP_Collate fla
3060: 67 20 66 72 6f 6d 20 59 2e 20 2a 2f 0a 20 20 20  g from Y. */.   
3070: 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74     pExpr->pRight
3080: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 45 50 5f 43  ->flags &= ~EP_C
3090: 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 7d 65 6c 73  ollate;.    }els
30a0: 65 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70  e if( sqlite3Exp
30b0: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
30c0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d   pExpr->pLeft)!=
30d0: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 65  0 ){.      /* Ne
30e0: 69 74 68 65 72 20 58 20 6e 6f 72 20 59 20 68 61  ither X nor Y ha
30f0: 76 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61  ve COLLATE opera
3100: 74 6f 72 73 2c 20 62 75 74 20 58 20 68 61 73 20  tors, but X has 
3110: 61 20 6e 6f 6e 2d 64 65 66 61 75 6c 74 0a 20 20  a non-default.  
3120: 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67      ** collating
3130: 20 73 65 71 75 65 6e 63 65 2e 20 20 53 6f 20 61   sequence.  So a
3140: 64 64 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61 74  dd the EP_Collat
3150: 65 20 6d 61 72 6b 65 72 20 6f 6e 20 58 20 74 6f  e marker on X to
3160: 20 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20   cause.      ** 
3170: 69 74 20 74 6f 20 62 65 20 73 65 61 72 63 68 65  it to be searche
3180: 64 20 66 69 72 73 74 2e 20 2a 2f 0a 20 20 20 20  d first. */.    
3190: 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e    pExpr->pLeft->
31a0: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c  flags |= EP_Coll
31b0: 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ate;.    }.  }. 
31c0: 20 53 57 41 50 28 45 78 70 72 2a 2c 70 45 78 70   SWAP(Expr*,pExp
31d0: 72 2d 3e 70 52 69 67 68 74 2c 70 45 78 70 72 2d  r->pRight,pExpr-
31e0: 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 70  >pLeft);.  if( p
31f0: 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20  Expr->op>=TK_GT 
3200: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 54  ){.    assert( T
3210: 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b  K_LT==TK_GT+2 );
3220: 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f  .    assert( TK_
3230: 47 45 3d 3d 54 4b 5f 4c 45 2b 32 20 29 3b 0a 20  GE==TK_LE+2 );. 
3240: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54     assert( TK_GT
3250: 3e 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 61 73  >TK_EQ );.    as
3260: 73 65 72 74 28 20 54 4b 5f 47 54 3c 54 4b 5f 4c  sert( TK_GT<TK_L
3270: 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
3280: 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47   pExpr->op>=TK_G
3290: 54 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3c 3d  T && pExpr->op<=
32a0: 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 70 45 78  TK_GE );.    pEx
32b0: 70 72 2d 3e 6f 70 20 3d 20 28 28 70 45 78 70 72  pr->op = ((pExpr
32c0: 2d 3e 6f 70 2d 54 4b 5f 47 54 29 5e 32 29 2b 54  ->op-TK_GT)^2)+T
32d0: 4b 5f 47 54 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  K_GT;.  }.}../*.
32e0: 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20 66 72 6f  ** Translate fro
32f0: 6d 20 54 4b 5f 78 78 20 6f 70 65 72 61 74 6f 72  m TK_xx operator
3300: 20 74 6f 20 57 4f 5f 78 78 20 62 69 74 6d 61 73   to WO_xx bitmas
3310: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36  k..*/.static u16
3320: 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 69 6e   operatorMask(in
3330: 74 20 6f 70 29 7b 0a 20 20 75 31 36 20 63 3b 0a  t op){.  u16 c;.
3340: 20 20 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65    assert( allowe
3350: 64 4f 70 28 6f 70 29 20 29 3b 0a 20 20 69 66 28  dOp(op) );.  if(
3360: 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20   op==TK_IN ){.  
3370: 20 20 63 20 3d 20 57 4f 5f 49 4e 3b 0a 20 20 7d    c = WO_IN;.  }
3380: 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  else if( op==TK_
3390: 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 63 20  ISNULL ){.    c 
33a0: 3d 20 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20 7d  = WO_ISNULL;.  }
33b0: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
33c0: 28 20 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b  ( (WO_EQ<<(op-TK
33d0: 5f 45 51 29 29 20 3c 20 30 78 37 66 66 66 20 29  _EQ)) < 0x7fff )
33e0: 3b 0a 20 20 20 20 63 20 3d 20 28 75 31 36 29 28  ;.    c = (u16)(
33f0: 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51  WO_EQ<<(op-TK_EQ
3400: 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ));.  }.  assert
3410: 28 20 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ( op!=TK_ISNULL 
3420: 7c 7c 20 63 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20  || c==WO_ISNULL 
3430: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
3440: 3d 54 4b 5f 49 4e 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_IN || c==WO_
3450: 49 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  IN );.  assert( 
3460: 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 63 3d 3d  op!=TK_EQ || c==
3470: 57 4f 5f 45 51 20 29 3b 0a 20 20 61 73 73 65 72  WO_EQ );.  asser
3480: 74 28 20 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20  t( op!=TK_LT || 
3490: 63 3d 3d 57 4f 5f 4c 54 20 29 3b 0a 20 20 61 73  c==WO_LT );.  as
34a0: 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 45 20  sert( op!=TK_LE 
34b0: 7c 7c 20 63 3d 3d 57 4f 5f 4c 45 20 29 3b 0a 20  || c==WO_LE );. 
34c0: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
34d0: 47 54 20 7c 7c 20 63 3d 3d 57 4f 5f 47 54 20 29  GT || c==WO_GT )
34e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d  ;.  assert( op!=
34f0: 54 4b 5f 47 45 20 7c 7c 20 63 3d 3d 57 4f 5f 47  TK_GE || c==WO_G
3500: 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 3b  E );.  return c;
3510: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
3520: 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 57 68  e to the next Wh
3530: 65 72 65 54 65 72 6d 20 74 68 61 74 20 6d 61 74  ereTerm that mat
3540: 63 68 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74  ches according t
3550: 6f 20 74 68 65 20 63 72 69 74 65 72 69 61 0a 2a  o the criteria.*
3560: 2a 20 65 73 74 61 62 6c 69 73 68 65 64 20 77 68  * established wh
3570: 65 6e 20 74 68 65 20 70 53 63 61 6e 20 6f 62 6a  en the pScan obj
3580: 65 63 74 20 77 61 73 20 69 6e 69 74 69 61 6c 69  ect was initiali
3590: 7a 65 64 20 62 79 20 77 68 65 72 65 53 63 61 6e  zed by whereScan
35a0: 49 6e 69 74 28 29 2e 0a 2a 2a 20 52 65 74 75 72  Init()..** Retur
35b0: 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20  n NULL if there 
35c0: 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6d 61 74 63  are no more matc
35d0: 68 69 6e 67 20 57 68 65 72 65 54 65 72 6d 73 2e  hing WhereTerms.
35e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65  .*/.static Where
35f0: 54 65 72 6d 20 2a 77 68 65 72 65 53 63 61 6e 4e  Term *whereScanN
3600: 65 78 74 28 57 68 65 72 65 53 63 61 6e 20 2a 70  ext(WhereScan *p
3610: 53 63 61 6e 29 7b 0a 20 20 69 6e 74 20 69 43 75  Scan){.  int iCu
3620: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
3630: 20 54 68 65 20 63 75 72 73 6f 72 20 6f 6e 20 74   The cursor on t
3640: 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 74 65  he LHS of the te
3650: 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  rm */.  int iCol
3660: 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  umn;         /* 
3670: 54 68 65 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68  The column on th
3680: 65 20 4c 48 53 20 6f 66 20 74 68 65 20 74 65 72  e LHS of the ter
3690: 6d 2e 20 20 2d 31 20 66 6f 72 20 49 50 4b 20 2a  m.  -1 for IPK *
36a0: 2f 0a 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20  /.  Expr *pX;   
36b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
36c0: 78 70 72 65 73 73 69 6f 6e 20 62 65 69 6e 67 20  xpression being 
36d0: 74 65 73 74 65 64 20 2a 2f 0a 20 20 57 68 65 72  tested */.  Wher
36e0: 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20  eClause *pWC;   
36f0: 20 2f 2a 20 53 68 6f 72 74 68 61 6e 64 20 66 6f   /* Shorthand fo
3700: 72 20 70 53 63 61 6e 2d 3e 70 57 43 20 2a 2f 0a  r pScan->pWC */.
3710: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
3720: 72 6d 3b 20 20 20 20 2f 2a 20 54 68 65 20 74 65  rm;    /* The te
3730: 72 6d 20 62 65 69 6e 67 20 74 65 73 74 65 64 20  rm being tested 
3740: 2a 2f 0a 20 20 69 6e 74 20 6b 20 3d 20 70 53 63  */.  int k = pSc
3750: 61 6e 2d 3e 6b 3b 20 20 20 20 2f 2a 20 57 68 65  an->k;    /* Whe
3760: 72 65 20 74 6f 20 73 74 61 72 74 20 73 63 61 6e  re to start scan
3770: 6e 69 6e 67 20 2a 2f 0a 0a 20 20 77 68 69 6c 65  ning */..  while
3780: 28 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 3c  ( pScan->iEquiv<
3790: 3d 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20 29  =pScan->nEquiv )
37a0: 7b 0a 20 20 20 20 69 43 75 72 20 3d 20 70 53 63  {.    iCur = pSc
37b0: 61 6e 2d 3e 61 45 71 75 69 76 5b 70 53 63 61 6e  an->aEquiv[pScan
37c0: 2d 3e 69 45 71 75 69 76 2d 32 5d 3b 0a 20 20 20  ->iEquiv-2];.   
37d0: 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 53 63 61 6e   iColumn = pScan
37e0: 2d 3e 61 45 71 75 69 76 5b 70 53 63 61 6e 2d 3e  ->aEquiv[pScan->
37f0: 69 45 71 75 69 76 2d 31 5d 3b 0a 20 20 20 20 77  iEquiv-1];.    w
3800: 68 69 6c 65 28 20 28 70 57 43 20 3d 20 70 53 63  hile( (pWC = pSc
3810: 61 6e 2d 3e 70 57 43 29 21 3d 30 20 29 7b 0a 20  an->pWC)!=0 ){. 
3820: 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70       for(pTerm=p
3830: 57 43 2d 3e 61 2b 6b 3b 20 6b 3c 70 57 43 2d 3e  WC->a+k; k<pWC->
3840: 6e 54 65 72 6d 3b 20 6b 2b 2b 2c 20 70 54 65 72  nTerm; k++, pTer
3850: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  m++){.        if
3860: 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
3870: 73 6f 72 3d 3d 69 43 75 72 0a 20 20 20 20 20 20  sor==iCur.      
3880: 20 20 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e 6c     && pTerm->u.l
3890: 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75  eftColumn==iColu
38a0: 6d 6e 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  mn.         && (
38b0: 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 3c 3d 32  pScan->iEquiv<=2
38c0: 20 7c 7c 20 21 45 78 70 72 48 61 73 50 72 6f 70   || !ExprHasProp
38d0: 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70  erty(pTerm->pExp
38e0: 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29  r, EP_FromJoin))
38f0: 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
3900: 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
3910: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
3920: 5f 45 51 55 49 56 29 21 3d 30 0a 20 20 20 20 20  _EQUIV)!=0.     
3930: 20 20 20 20 20 20 26 26 20 70 53 63 61 6e 2d 3e        && pScan->
3940: 6e 45 71 75 69 76 3c 41 72 72 61 79 53 69 7a 65  nEquiv<ArraySize
3950: 28 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 29 0a  (pScan->aEquiv).
3960: 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
3970: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a           int j;.
3980: 20 20 20 20 20 20 20 20 20 20 20 20 70 58 20 3d              pX =
3990: 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
39a0: 43 6f 6c 6c 61 74 65 28 70 54 65 72 6d 2d 3e 70  Collate(pTerm->p
39b0: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
39c0: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
39d0: 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  t( pX->op==TK_CO
39e0: 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20  LUMN );.        
39f0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
3a00: 53 63 61 6e 2d 3e 6e 45 71 75 69 76 3b 20 6a 2b  Scan->nEquiv; j+
3a10: 3d 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  =2){.           
3a20: 20 20 20 69 66 28 20 70 53 63 61 6e 2d 3e 61 45     if( pScan->aE
3a30: 71 75 69 76 5b 6a 5d 3d 3d 70 58 2d 3e 69 54 61  quiv[j]==pX->iTa
3a40: 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ble.            
3a50: 20 20 20 26 26 20 70 53 63 61 6e 2d 3e 61 45 71     && pScan->aEq
3a60: 75 69 76 5b 6a 2b 31 5d 3d 3d 70 58 2d 3e 69 43  uiv[j+1]==pX->iC
3a70: 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
3a80: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
3a90: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
3aa0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
3ab0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
3ac0: 6a 3d 3d 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76  j==pScan->nEquiv
3ad0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
3ae0: 20 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b    pScan->aEquiv[
3af0: 6a 5d 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b  j] = pX->iTable;
3b00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
3b10: 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 2b 31  Scan->aEquiv[j+1
3b20: 5d 20 3d 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e 3b  ] = pX->iColumn;
3b30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
3b40: 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20 2b 3d 20  Scan->nEquiv += 
3b50: 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  2;.            }
3b60: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
3b70: 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72         if( (pTer
3b80: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 70  m->eOperator & p
3b90: 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 29 21 3d 30  Scan->opMask)!=0
3ba0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
3bb0: 2f 2a 20 56 65 72 69 66 79 20 74 68 65 20 61 66  /* Verify the af
3bc0: 66 69 6e 69 74 79 20 61 6e 64 20 63 6f 6c 6c 61  finity and colla
3bd0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6d 61  ting sequence ma
3be0: 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  tch */.         
3bf0: 20 20 20 69 66 28 20 70 53 63 61 6e 2d 3e 7a 43     if( pScan->zC
3c00: 6f 6c 6c 4e 61 6d 65 20 26 26 20 28 70 54 65 72  ollName && (pTer
3c10: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
3c20: 4f 5f 49 53 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a  O_ISNULL)==0 ){.
3c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43 6f                Co
3c40: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
3c50: 20 20 20 20 20 20 20 20 20 20 20 20 50 61 72 73              Pars
3c60: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d  e *pParse = pWC-
3c70: 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b  >pWInfo->pParse;
3c80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
3c90: 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  X = pTerm->pExpr
3ca0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
3cb0: 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65  if( !sqlite3Inde
3cc0: 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c 20  xAffinityOk(pX, 
3cd0: 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 29 20 29  pScan->idxaff) )
3ce0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
3cf0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
3d00: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
3d10: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
3d20: 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  (pX->pLeft);.   
3d30: 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c             pColl
3d40: 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79   = sqlite3Binary
3d50: 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
3d60: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
3d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d90: 20 20 20 20 20 20 20 20 20 70 58 2d 3e 70 4c 65           pX->pLe
3da0: 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b  ft, pX->pRight);
3db0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
3dc0: 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43  f( pColl==0 ) pC
3dd0: 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  oll = pParse->db
3de0: 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
3df0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
3e00: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
3e10: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 53 63 61  oll->zName, pSca
3e20: 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 29 20 29 7b  n->zCollName) ){
3e30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3e40: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
3e50: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
3e60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3e70: 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
3e80: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
3e90: 45 51 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  EQ)!=0.         
3ea0: 20 20 20 20 26 26 20 28 70 58 20 3d 20 70 54 65      && (pX = pTe
3eb0: 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rm->pExpr->pRigh
3ec0: 74 29 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  t)->op==TK_COLUM
3ed0: 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26  N.             &
3ee0: 26 20 70 58 2d 3e 69 54 61 62 6c 65 3d 3d 70 53  & pX->iTable==pS
3ef0: 63 61 6e 2d 3e 61 45 71 75 69 76 5b 30 5d 0a 20  can->aEquiv[0]. 
3f00: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70              && p
3f10: 58 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 53 63 61  X->iColumn==pSca
3f20: 6e 2d 3e 61 45 71 75 69 76 5b 31 5d 0a 20 20 20  n->aEquiv[1].   
3f30: 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
3f40: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
3f50: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
3f60: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53  }.            pS
3f70: 63 61 6e 2d 3e 6b 20 3d 20 6b 2b 31 3b 0a 20 20  can->k = k+1;.  
3f80: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
3f90: 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20   pTerm;.        
3fa0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
3fb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 63 61      }.      pSca
3fc0: 6e 2d 3e 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e  n->pWC = pScan->
3fd0: 70 57 43 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 20  pWC->pOuter;.   
3fe0: 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 0a     k = 0;.    }.
3ff0: 20 20 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d      pScan->pWC =
4000: 20 70 53 63 61 6e 2d 3e 70 4f 72 69 67 57 43 3b   pScan->pOrigWC;
4010: 0a 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20  .    k = 0;.    
4020: 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 20 2b 3d  pScan->iEquiv +=
4030: 20 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   2;.  }.  return
4040: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69   0;.}../*.** Ini
4050: 74 69 61 6c 69 7a 65 20 61 20 57 48 45 52 45 20  tialize a WHERE 
4060: 63 6c 61 75 73 65 20 73 63 61 6e 6e 65 72 20 6f  clause scanner o
4070: 62 6a 65 63 74 2e 20 20 52 65 74 75 72 6e 20 61  bject.  Return a
4080: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a   pointer to the.
4090: 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68 2e 20  ** first match. 
40a0: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
40b0: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 61 74  there are no mat
40c0: 63 68 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ches..**.** The 
40d0: 73 63 61 6e 6e 65 72 20 77 69 6c 6c 20 62 65 20  scanner will be 
40e0: 73 65 61 72 63 68 69 6e 67 20 74 68 65 20 57 48  searching the WH
40f0: 45 52 45 20 63 6c 61 75 73 65 20 70 57 43 2e 20  ERE clause pWC. 
4100: 20 49 74 20 77 69 6c 6c 20 6c 6f 6f 6b 0a 2a 2a   It will look.**
4110: 20 66 6f 72 20 74 65 72 6d 73 20 6f 66 20 74 68   for terms of th
4120: 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c  e form "X <op> <
4130: 65 78 70 72 3e 22 20 77 68 65 72 65 20 58 20 69  expr>" where X i
4140: 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 75 6d 6e  s column iColumn
4150: 20 6f 66 20 74 61 62 6c 65 0a 2a 2a 20 69 43 75   of table.** iCu
4160: 72 2e 20 20 54 68 65 20 3c 6f 70 3e 20 6d 75 73  r.  The <op> mus
4170: 74 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65 20  t be one of the 
4180: 6f 70 65 72 61 74 6f 72 73 20 64 65 73 63 72 69  operators descri
4190: 62 65 64 20 62 79 20 6f 70 4d 61 73 6b 2e 0a 2a  bed by opMask..*
41a0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 61 72  *.** If the sear
41b0: 63 68 20 69 73 20 66 6f 72 20 58 20 61 6e 64 20  ch is for X and 
41c0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
41d0: 20 63 6f 6e 74 61 69 6e 73 20 74 65 72 6d 73 20   contains terms 
41e0: 6f 66 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 20 58  of the.** form X
41f0: 3d 59 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  =Y then this rou
4200: 74 69 6e 65 20 6d 69 67 68 74 20 61 6c 73 6f 20  tine might also 
4210: 72 65 74 75 72 6e 20 74 65 72 6d 73 20 6f 66 20  return terms of 
4220: 74 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 59 20 3c  the form.** "Y <
4230: 6f 70 3e 20 3c 65 78 70 72 3e 22 2e 20 20 54 68  op> <expr>".  Th
4240: 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65  e number of leve
4250: 6c 73 20 6f 66 20 74 72 61 6e 73 69 74 69 76 69  ls of transitivi
4260: 74 79 20 69 73 20 6c 69 6d 69 74 65 64 2c 0a 2a  ty is limited,.*
4270: 2a 20 62 75 74 20 69 73 20 65 6e 6f 75 67 68 20  * but is enough 
4280: 74 6f 20 68 61 6e 64 6c 65 20 6d 6f 73 74 20 63  to handle most c
4290: 6f 6d 6d 6f 6e 6c 79 20 6f 63 63 75 72 72 69 6e  ommonly occurrin
42a0: 67 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  g SQL statements
42b0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20 69 73 20  ..**.** If X is 
42c0: 6e 6f 74 20 74 68 65 20 49 4e 54 45 47 45 52 20  not the INTEGER 
42d0: 50 52 49 4d 41 52 59 20 4b 45 59 20 74 68 65 6e  PRIMARY KEY then
42e0: 20 58 20 6d 75 73 74 20 62 65 20 63 6f 6d 70 61   X must be compa
42f0: 74 69 62 6c 65 20 77 69 74 68 0a 2a 2a 20 69 6e  tible with.** in
4300: 64 65 78 20 70 49 64 78 2e 0a 2a 2f 0a 73 74 61  dex pIdx..*/.sta
4310: 74 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a 77  tic WhereTerm *w
4320: 68 65 72 65 53 63 61 6e 49 6e 69 74 28 0a 20 20  hereScanInit(.  
4330: 57 68 65 72 65 53 63 61 6e 20 2a 70 53 63 61 6e  WhereScan *pScan
4340: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57  ,       /* The W
4350: 68 65 72 65 53 63 61 6e 20 6f 62 6a 65 63 74 20  hereScan object 
4360: 62 65 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 65  being initialize
4370: 64 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  d */.  WhereClau
4380: 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 2f  se *pWC,       /
4390: 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
43a0: 73 65 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64  se to be scanned
43b0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20   */.  int iCur, 
43c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
43d0: 20 43 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 20   Cursor to scan 
43e0: 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  for */.  int iCo
43f0: 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20  lumn,           
4400: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20 73 63   /* Column to sc
4410: 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 75 33 32 20  an for */.  u32 
4420: 6f 70 4d 61 73 6b 2c 20 20 20 20 20 20 20 20 20  opMask,         
4430: 20 20 20 20 2f 2a 20 4f 70 65 72 61 74 6f 72 28      /* Operator(
4440: 73 29 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a  s) to scan for *
4450: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20  /.  Index *pIdx 
4460: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
4470: 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c  ust be compatibl
4480: 65 20 77 69 74 68 20 74 68 69 73 20 69 6e 64 65  e with this inde
4490: 78 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 3b  x */.){.  int j;
44a0: 0a 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 53  ..  /* memset(pS
44b0: 63 61 6e 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  can, 0, sizeof(*
44c0: 70 53 63 61 6e 29 29 3b 20 2a 2f 0a 20 20 70 53  pScan)); */.  pS
44d0: 63 61 6e 2d 3e 70 4f 72 69 67 57 43 20 3d 20 70  can->pOrigWC = p
44e0: 57 43 3b 0a 20 20 70 53 63 61 6e 2d 3e 70 57 43  WC;.  pScan->pWC
44f0: 20 3d 20 70 57 43 3b 0a 20 20 69 66 28 20 70 49   = pWC;.  if( pI
4500: 64 78 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30  dx && iColumn>=0
4510: 20 29 7b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69   ){.    pScan->i
4520: 64 78 61 66 66 20 3d 20 70 49 64 78 2d 3e 70 54  dxaff = pIdx->pT
4530: 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75  able->aCol[iColu
4540: 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20  mn].affinity;.  
4550: 20 20 66 6f 72 28 6a 3d 30 3b 20 70 49 64 78 2d    for(j=0; pIdx-
4560: 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 69 43  >aiColumn[j]!=iC
4570: 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  olumn; j++){.   
4580: 20 20 20 69 66 28 20 4e 45 56 45 52 28 6a 3e 70     if( NEVER(j>p
4590: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 29 20  Idx->nColumn) ) 
45a0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
45b0: 20 20 20 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c      pScan->zColl
45c0: 4e 61 6d 65 20 3d 20 70 49 64 78 2d 3e 61 7a 43  Name = pIdx->azC
45d0: 6f 6c 6c 5b 6a 5d 3b 0a 20 20 7d 65 6c 73 65 7b  oll[j];.  }else{
45e0: 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69 64 78 61  .    pScan->idxa
45f0: 66 66 20 3d 20 30 3b 0a 20 20 20 20 70 53 63 61  ff = 0;.    pSca
4600: 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 30  n->zCollName = 0
4610: 3b 0a 20 20 7d 0a 20 20 70 53 63 61 6e 2d 3e 6f  ;.  }.  pScan->o
4620: 70 4d 61 73 6b 20 3d 20 6f 70 4d 61 73 6b 3b 0a  pMask = opMask;.
4630: 20 20 70 53 63 61 6e 2d 3e 6b 20 3d 20 30 3b 0a    pScan->k = 0;.
4640: 20 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b    pScan->aEquiv[
4650: 30 5d 20 3d 20 69 43 75 72 3b 0a 20 20 70 53 63  0] = iCur;.  pSc
4660: 61 6e 2d 3e 61 45 71 75 69 76 5b 31 5d 20 3d 20  an->aEquiv[1] = 
4670: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70 53 63 61 6e  iColumn;.  pScan
4680: 2d 3e 6e 45 71 75 69 76 20 3d 20 32 3b 0a 20 20  ->nEquiv = 2;.  
4690: 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 20 3d 20  pScan->iEquiv = 
46a0: 32 3b 0a 20 20 72 65 74 75 72 6e 20 77 68 65 72  2;.  return wher
46b0: 65 53 63 61 6e 4e 65 78 74 28 70 53 63 61 6e 29  eScanNext(pScan)
46c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63  ;.}../*.** Searc
46d0: 68 20 66 6f 72 20 61 20 74 65 72 6d 20 69 6e 20  h for a term in 
46e0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
46f0: 20 74 68 61 74 20 69 73 20 6f 66 20 74 68 65 20   that is of the 
4700: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78  form "X <op> <ex
4710: 70 72 3e 22 0a 2a 2a 20 77 68 65 72 65 20 58 20  pr>".** where X 
4720: 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  is a reference t
4730: 6f 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20 6f 66  o the iColumn of
4740: 20 74 61 62 6c 65 20 69 43 75 72 20 61 6e 64 20   table iCur and 
4750: 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 0a 2a  <op> is one of.*
4760: 2a 20 74 68 65 20 57 4f 5f 78 78 20 6f 70 65 72  * the WO_xx oper
4770: 61 74 6f 72 20 63 6f 64 65 73 20 73 70 65 63 69  ator codes speci
4780: 66 69 65 64 20 62 79 20 74 68 65 20 6f 70 20 70  fied by the op p
4790: 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 52 65 74  arameter..** Ret
47a0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
47b0: 20 74 68 65 20 74 65 72 6d 2e 20 20 52 65 74 75   the term.  Retu
47c0: 72 6e 20 30 20 69 66 20 6e 6f 74 20 66 6f 75 6e  rn 0 if not foun
47d0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72  d..**.** The ter
47e0: 6d 20 72 65 74 75 72 6e 65 64 20 6d 69 67 68 74  m returned might
47f0: 20 62 79 20 59 3d 3c 65 78 70 72 3e 20 69 66 20   by Y=<expr> if 
4800: 74 68 65 72 65 20 69 73 20 61 6e 6f 74 68 65 72  there is another
4810: 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e 0a 2a   constraint in.*
4820: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
4830: 73 65 20 74 68 61 74 20 73 70 65 63 69 66 69 65  se that specifie
4840: 73 20 74 68 61 74 20 58 3d 59 2e 20 20 41 6e 79  s that X=Y.  Any
4850: 20 73 75 63 68 20 63 6f 6e 73 74 72 61 69 6e 74   such constraint
4860: 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 64 65  s will be.** ide
4870: 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20 57  ntified by the W
4880: 4f 5f 45 51 55 49 56 20 62 69 74 20 69 6e 20 74  O_EQUIV bit in t
4890: 68 65 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  he pTerm->eOpera
48a0: 74 6f 72 20 66 69 65 6c 64 2e 20 20 54 68 65 0a  tor field.  The.
48b0: 2a 2a 20 61 45 71 75 69 76 5b 5d 20 61 72 72 61  ** aEquiv[] arra
48c0: 79 20 68 6f 6c 64 73 20 58 20 61 6e 64 20 61 6c  y holds X and al
48d0: 6c 20 69 74 73 20 65 71 75 69 76 61 6c 65 6e 74  l its equivalent
48e0: 73 2c 20 77 69 74 68 20 65 61 63 68 20 53 51 4c  s, with each SQL
48f0: 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 74 61 6b   variable.** tak
4900: 69 6e 67 20 75 70 20 74 77 6f 20 73 6c 6f 74 73  ing up two slots
4910: 20 69 6e 20 61 45 71 75 69 76 5b 5d 2e 20 20 54   in aEquiv[].  T
4920: 68 65 20 66 69 72 73 74 20 73 6c 6f 74 20 69 73  he first slot is
4930: 20 66 6f 72 20 74 68 65 20 63 75 72 73 6f 72 20   for the cursor 
4940: 6e 75 6d 62 65 72 0a 2a 2a 20 61 6e 64 20 74 68  number.** and th
4950: 65 20 73 65 63 6f 6e 64 20 69 73 20 66 6f 72 20  e second is for 
4960: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  the column numbe
4970: 72 2e 20 20 54 68 65 72 65 20 61 72 65 20 32 32  r.  There are 22
4980: 20 73 6c 6f 74 73 20 69 6e 20 61 45 71 75 69 76   slots in aEquiv
4990: 5b 5d 0a 2a 2a 20 73 6f 20 74 68 61 74 20 6d 65  [].** so that me
49a0: 61 6e 73 20 77 65 20 63 61 6e 20 6c 6f 6f 6b 20  ans we can look 
49b0: 66 6f 72 20 58 20 70 6c 75 73 20 75 70 20 74 6f  for X plus up to
49c0: 20 31 30 20 6f 74 68 65 72 20 65 71 75 69 76 61   10 other equiva
49d0: 6c 65 6e 74 20 76 61 6c 75 65 73 2e 0a 2a 2a 20  lent values..** 
49e0: 48 65 6e 63 65 20 61 20 73 65 61 72 63 68 20 66  Hence a search f
49f0: 6f 72 20 58 20 77 69 6c 6c 20 72 65 74 75 72 6e  or X will return
4a00: 20 3c 65 78 70 72 3e 20 69 66 20 58 3d 41 31 20   <expr> if X=A1 
4a10: 61 6e 64 20 41 31 3d 41 32 20 61 6e 64 20 41 32  and A1=A2 and A2
4a20: 3d 41 33 0a 2a 2a 20 61 6e 64 20 2e 2e 2e 20 61  =A3.** and ... a
4a30: 6e 64 20 41 39 3d 41 31 30 20 61 6e 64 20 41 31  nd A9=A10 and A1
4a40: 30 3d 3c 65 78 70 72 3e 2e 0a 2a 2a 0a 2a 2a 20  0=<expr>..**.** 
4a50: 49 66 20 74 68 65 72 65 20 61 72 65 20 6d 75 6c  If there are mul
4a60: 74 69 70 6c 65 20 74 65 72 6d 73 20 69 6e 20 74  tiple terms in t
4a70: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
4a80: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c  of the form "X <
4a90: 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 74  op> <expr>".** t
4aa0: 68 65 6e 20 74 72 79 20 66 6f 72 20 74 68 65 20  hen try for the 
4ab0: 6f 6e 65 20 77 69 74 68 20 6e 6f 20 64 65 70 65  one with no depe
4ac0: 6e 64 65 6e 63 69 65 73 20 6f 6e 20 3c 65 78 70  ndencies on <exp
4ad0: 72 3e 20 2d 20 69 6e 20 6f 74 68 65 72 20 77 6f  r> - in other wo
4ae0: 72 64 73 20 77 68 65 72 65 0a 2a 2a 20 3c 65 78  rds where.** <ex
4af0: 70 72 3e 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  pr> is a constan
4b00: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20  t expression of 
4b10: 73 6f 6d 65 20 6b 69 6e 64 2e 20 20 4f 6e 6c 79  some kind.  Only
4b20: 20 72 65 74 75 72 6e 20 65 6e 74 72 69 65 73 20   return entries 
4b30: 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20 22  of.** the form "
4b40: 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65 20  X <op> Y" where 
4b50: 59 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  Y is a column in
4b60: 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69   another table i
4b70: 66 20 6e 6f 20 74 65 72 6d 73 20 6f 66 0a 2a 2a  f no terms of.**
4b80: 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70   the form "X <op
4b90: 3e 20 3c 63 6f 6e 73 74 2d 65 78 70 72 3e 22 20  > <const-expr>" 
4ba0: 65 78 69 73 74 2e 20 20 20 49 66 20 6e 6f 20 74  exist.   If no t
4bb0: 65 72 6d 73 20 77 69 74 68 20 61 20 63 6f 6e 73  erms with a cons
4bc0: 74 61 6e 74 20 52 48 53 0a 2a 2a 20 65 78 69 73  tant RHS.** exis
4bd0: 74 2c 20 74 72 79 20 74 6f 20 72 65 74 75 72 6e  t, try to return
4be0: 20 61 20 74 65 72 6d 20 74 68 61 74 20 64 6f 65   a term that doe
4bf0: 73 20 6e 6f 74 20 75 73 65 20 57 4f 5f 45 51 55  s not use WO_EQU
4c00: 49 56 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68  IV..*/.static Wh
4c10: 65 72 65 54 65 72 6d 20 2a 66 69 6e 64 54 65 72  ereTerm *findTer
4c20: 6d 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  m(.  WhereClause
4c30: 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20 54 68   *pWC,     /* Th
4c40: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
4c50: 6f 20 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f  o be searched */
4c60: 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20  .  int iCur,    
4c70: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
4c80: 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53  or number of LHS
4c90: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d   */.  int iColum
4ca0: 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  n,          /* C
4cb0: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20  olumn number of 
4cc0: 4c 48 53 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  LHS */.  Bitmask
4cd0: 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 2f   notReady,     /
4ce0: 2a 20 52 48 53 20 6d 75 73 74 20 6e 6f 74 20 6f  * RHS must not o
4cf0: 76 65 72 6c 61 70 20 77 69 74 68 20 74 68 69 73  verlap with this
4d00: 20 6d 61 73 6b 20 2a 2f 0a 20 20 75 33 32 20 6f   mask */.  u32 o
4d10: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
4d20: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 57 4f 5f 78   /* Mask of WO_x
4d30: 78 20 76 61 6c 75 65 73 20 64 65 73 63 72 69 62  x values describ
4d40: 69 6e 67 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  ing operator */.
4d50: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20    Index *pIdx   
4d60: 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20          /* Must 
4d70: 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  be compatible wi
4d80: 74 68 20 74 68 69 73 20 69 6e 64 65 78 2c 20 69  th this index, i
4d90: 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  f not NULL */.){
4da0: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52  .  WhereTerm *pR
4db0: 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 57 68 65  esult = 0;.  Whe
4dc0: 72 65 54 65 72 6d 20 2a 70 3b 0a 20 20 57 68 65  reTerm *p;.  Whe
4dd0: 72 65 53 63 61 6e 20 73 63 61 6e 3b 0a 0a 20 20  reScan scan;..  
4de0: 70 20 3d 20 77 68 65 72 65 53 63 61 6e 49 6e 69  p = whereScanIni
4df0: 74 28 26 73 63 61 6e 2c 20 70 57 43 2c 20 69 43  t(&scan, pWC, iC
4e00: 75 72 2c 20 69 43 6f 6c 75 6d 6e 2c 20 6f 70 2c  ur, iColumn, op,
4e10: 20 70 49 64 78 29 3b 0a 20 20 77 68 69 6c 65 28   pIdx);.  while(
4e20: 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70   p ){.    if( (p
4e30: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
4e40: 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20 29 7b 0a  notReady)==0 ){.
4e50: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 72 65        if( p->pre
4e60: 72 65 71 52 69 67 68 74 3d 3d 30 20 26 26 20 28  reqRight==0 && (
4e70: 70 2d 3e 65 4f 70 65 72 61 74 6f 72 26 57 4f 5f  p->eOperator&WO_
4e80: 45 51 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  EQ)!=0 ){.      
4e90: 20 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 20 20    return p;.    
4ea0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 52    }.      if( pR
4eb0: 65 73 75 6c 74 3d 3d 30 20 29 20 70 52 65 73 75  esult==0 ) pResu
4ec0: 6c 74 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20  lt = p;.    }.  
4ed0: 20 20 70 20 3d 20 77 68 65 72 65 53 63 61 6e 4e    p = whereScanN
4ee0: 65 78 74 28 26 73 63 61 6e 29 3b 0a 20 20 7d 0a  ext(&scan);.  }.
4ef0: 20 20 72 65 74 75 72 6e 20 70 52 65 73 75 6c 74    return pResult
4f00: 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  ;.}../* Forward 
4f10: 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61  reference */.sta
4f20: 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61  tic void exprAna
4f30: 6c 79 7a 65 28 53 72 63 4c 69 73 74 2a 2c 20 57  lyze(SrcList*, W
4f40: 68 65 72 65 43 6c 61 75 73 65 2a 2c 20 69 6e 74  hereClause*, int
4f50: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 65  );../*.** Call e
4f60: 78 70 72 41 6e 61 6c 79 7a 65 20 6f 6e 20 61 6c  xprAnalyze on al
4f70: 6c 20 74 65 72 6d 73 20 69 6e 20 61 20 57 48 45  l terms in a WHE
4f80: 52 45 20 63 6c 61 75 73 65 2e 20 20 0a 2a 2f 0a  RE clause.  .*/.
4f90: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72  static void expr
4fa0: 41 6e 61 6c 79 7a 65 41 6c 6c 28 0a 20 20 53 72  AnalyzeAll(.  Sr
4fb0: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
4fc0: 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52         /* the FR
4fd0: 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  OM clause */.  W
4fe0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 20  hereClause *pWC 
4ff0: 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 57          /* the W
5000: 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62  HERE clause to b
5010: 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b  e analyzed */.){
5020: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
5030: 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 3b 20  i=pWC->nTerm-1; 
5040: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
5050: 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 54 61 62  exprAnalyze(pTab
5060: 4c 69 73 74 2c 20 70 57 43 2c 20 69 29 3b 0a 20  List, pWC, i);. 
5070: 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51   }.}..#ifndef SQ
5080: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f  LITE_OMIT_LIKE_O
5090: 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a  PTIMIZATION./*.*
50a0: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
50b0: 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
50c0: 65 73 73 69 6f 6e 20 69 73 20 61 20 4c 49 4b 45  ession is a LIKE
50d0: 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f   or GLOB operato
50e0: 72 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62 65  r that.** can be
50f0: 20 6f 70 74 69 6d 69 7a 65 64 20 75 73 69 6e 67   optimized using
5100: 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
5110: 74 72 61 69 6e 74 73 2e 20 20 52 65 74 75 72 6e  traints.  Return
5120: 20 54 52 55 45 20 69 66 20 69 74 20 69 73 0a 2a   TRUE if it is.*
5130: 2a 20 73 6f 20 61 6e 64 20 66 61 6c 73 65 20 69  * so and false i
5140: 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  f not..**.** In 
5150: 6f 72 64 65 72 20 66 6f 72 20 74 68 65 20 6f 70  order for the op
5160: 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 70 74  erator to be opt
5170: 69 6d 69 7a 69 62 6c 65 2c 20 74 68 65 20 52 48  imizible, the RH
5180: 53 20 6d 75 73 74 20 62 65 20 61 20 73 74 72 69  S must be a stri
5190: 6e 67 0a 2a 2a 20 6c 69 74 65 72 61 6c 20 74 68  ng.** literal th
51a0: 61 74 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69  at does not begi
51b0: 6e 20 77 69 74 68 20 61 20 77 69 6c 64 63 61 72  n with a wildcar
51c0: 64 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  d.  .*/.static i
51d0: 6e 74 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28  nt isLikeOrGlob(
51e0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
51f0: 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
5200: 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
5210: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
5220: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
5230: 20 20 20 2f 2a 20 54 65 73 74 20 74 68 69 73 20     /* Test this 
5240: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
5250: 45 78 70 72 20 2a 2a 70 70 50 72 65 66 69 78 2c  Expr **ppPrefix,
5260: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
5270: 54 4b 5f 53 54 52 49 4e 47 20 65 78 70 72 65 73  TK_STRING expres
5280: 73 69 6f 6e 20 77 69 74 68 20 70 61 74 74 65 72  sion with patter
5290: 6e 20 70 72 65 66 69 78 20 2a 2f 0a 20 20 69 6e  n prefix */.  in
52a0: 74 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 2c 20  t *pisComplete, 
52b0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 6f  /* True if the o
52c0: 6e 6c 79 20 77 69 6c 64 63 61 72 64 20 69 73 20  nly wildcard is 
52d0: 25 20 69 6e 20 74 68 65 20 6c 61 73 74 20 63 68  % in the last ch
52e0: 61 72 61 63 74 65 72 20 2a 2f 0a 20 20 69 6e 74  aracter */.  int
52f0: 20 2a 70 6e 6f 43 61 73 65 20 20 20 20 20 20 2f   *pnoCase      /
5300: 2a 20 54 72 75 65 20 69 66 20 75 70 70 65 72 63  * True if upperc
5310: 61 73 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e  ase is equivalen
5320: 74 20 74 6f 20 6c 6f 77 65 72 63 61 73 65 20 2a  t to lowercase *
5330: 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
5340: 72 20 2a 7a 20 3d 20 30 3b 20 20 20 20 20 20 20  r *z = 0;       
5350: 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 6e 20 52    /* String on R
5360: 48 53 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72 61  HS of LIKE opera
5370: 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  tor */.  Expr *p
5380: 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b 20 20  Right, *pLeft;  
5390: 20 20 20 20 2f 2a 20 52 69 67 68 74 20 61 6e 64      /* Right and
53a0: 20 6c 65 66 74 20 73 69 7a 65 20 6f 66 20 4c 49   left size of LI
53b0: 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  KE operator */. 
53c0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
53d0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ;           /* L
53e0: 69 73 74 20 6f 66 20 6f 70 65 72 61 6e 64 73 20  ist of operands 
53f0: 74 6f 20 74 68 65 20 4c 49 4b 45 20 6f 70 65 72  to the LIKE oper
5400: 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 63 3b  ator */.  int c;
5410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5420: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 63 68 61 72       /* One char
5430: 61 63 74 65 72 20 69 6e 20 7a 5b 5d 20 2a 2f 0a  acter in z[] */.
5440: 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20    int cnt;      
5450: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5460: 4e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d 77 69  Number of non-wi
5470: 6c 64 63 61 72 64 20 70 72 65 66 69 78 20 63 68  ldcard prefix ch
5480: 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 63 68  aracters */.  ch
5490: 61 72 20 77 63 5b 33 5d 3b 20 20 20 20 20 20 20  ar wc[3];       
54a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c 64           /* Wild
54b0: 63 61 72 64 20 63 68 61 72 61 63 74 65 72 73 20  card characters 
54c0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
54d0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
54e0: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
54f0: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69  ection */.  sqli
5500: 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20  te3_value *pVal 
5510: 3d 20 30 3b 0a 20 20 69 6e 74 20 6f 70 3b 20 20  = 0;.  int op;  
5520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5530: 20 20 2f 2a 20 4f 70 63 6f 64 65 20 6f 66 20 70    /* Opcode of p
5540: 52 69 67 68 74 20 2a 2f 0a 0a 20 20 69 66 28 20  Right */..  if( 
5550: 21 73 71 6c 69 74 65 33 49 73 4c 69 6b 65 46 75  !sqlite3IsLikeFu
5560: 6e 63 74 69 6f 6e 28 64 62 2c 20 70 45 78 70 72  nction(db, pExpr
5570: 2c 20 70 6e 6f 43 61 73 65 2c 20 77 63 29 20 29  , pnoCase, wc) )
5580: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
5590: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
55a0: 45 5f 45 42 43 44 49 43 0a 20 20 69 66 28 20 2a  E_EBCDIC.  if( *
55b0: 70 6e 6f 43 61 73 65 20 29 20 72 65 74 75 72 6e  pnoCase ) return
55c0: 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 4c 69   0;.#endif.  pLi
55d0: 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st = pExpr->x.pL
55e0: 69 73 74 3b 0a 20 20 70 4c 65 66 74 20 3d 20 70  ist;.  pLeft = p
55f0: 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
5600: 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f  ;.  if( pLeft->o
5610: 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 0a 20 20  p!=TK_COLUMN .  
5620: 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 41   || sqlite3ExprA
5630: 66 66 69 6e 69 74 79 28 70 4c 65 66 74 29 21 3d  ffinity(pLeft)!=
5640: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
5650: 0a 20 20 20 7c 7c 20 49 73 56 69 72 74 75 61 6c  .   || IsVirtual
5660: 28 70 4c 65 66 74 2d 3e 70 54 61 62 29 0a 20 20  (pLeft->pTab).  
5670: 29 7b 0a 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52  ){.    /* IMP: R
5680: 2d 30 32 30 36 35 2d 34 39 34 36 35 20 54 68 65  -02065-49465 The
5690: 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20   left-hand side 
56a0: 6f 66 20 74 68 65 20 4c 49 4b 45 20 6f 72 20 47  of the LIKE or G
56b0: 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 6d 75 73  LOB operator mus
56c0: 74 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 65 20  t.    ** be the 
56d0: 6e 61 6d 65 20 6f 66 20 61 6e 20 69 6e 64 65 78  name of an index
56e0: 65 64 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 54  ed column with T
56f0: 45 58 54 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f  EXT affinity. */
5700: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
5710: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65   }.  assert( pLe
5720: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 28 2d 31  ft->iColumn!=(-1
5730: 29 20 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20  ) ); /* Because 
5740: 49 50 4b 20 6e 65 76 65 72 20 68 61 73 20 41 46  IPK never has AF
5750: 46 5f 54 45 58 54 20 2a 2f 0a 0a 20 20 70 52 69  F_TEXT */..  pRi
5760: 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
5770: 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69  rSkipCollate(pLi
5780: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  st->a[0].pExpr);
5790: 0a 20 20 6f 70 20 3d 20 70 52 69 67 68 74 2d 3e  .  op = pRight->
57a0: 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  op;.  if( op==TK
57b0: 5f 56 41 52 49 41 42 4c 45 20 29 7b 0a 20 20 20  _VARIABLE ){.   
57c0: 20 56 64 62 65 20 2a 70 52 65 70 72 65 70 61 72   Vdbe *pReprepar
57d0: 65 20 3d 20 70 50 61 72 73 65 2d 3e 70 52 65 70  e = pParse->pRep
57e0: 72 65 70 61 72 65 3b 0a 20 20 20 20 69 6e 74 20  repare;.    int 
57f0: 69 43 6f 6c 20 3d 20 70 52 69 67 68 74 2d 3e 69  iCol = pRight->i
5800: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 56 61 6c  Column;.    pVal
5810: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65   = sqlite3VdbeGe
5820: 74 42 6f 75 6e 64 56 61 6c 75 65 28 70 52 65 70  tBoundValue(pRep
5830: 72 65 70 61 72 65 2c 20 69 43 6f 6c 2c 20 53 51  repare, iCol, SQ
5840: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 3b 0a  LITE_AFF_NONE);.
5850: 20 20 20 20 69 66 28 20 70 56 61 6c 20 26 26 20      if( pVal && 
5860: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
5870: 70 65 28 70 56 61 6c 29 3d 3d 53 51 4c 49 54 45  pe(pVal)==SQLITE
5880: 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20 7a  _TEXT ){.      z
5890: 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
58a0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 56  e3_value_text(pV
58b0: 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  al);.    }.    s
58c0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 56 61 72  qlite3VdbeSetVar
58d0: 6d 61 73 6b 28 70 50 61 72 73 65 2d 3e 70 56 64  mask(pParse->pVd
58e0: 62 65 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 61  be, iCol);.    a
58f0: 73 73 65 72 74 28 20 70 52 69 67 68 74 2d 3e 6f  ssert( pRight->o
5900: 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 7c  p==TK_VARIABLE |
5910: 7c 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  | pRight->op==TK
5920: 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20 7d  _REGISTER );.  }
5930: 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  else if( op==TK_
5940: 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20 7a 20  STRING ){.    z 
5950: 3d 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b  = pRight->u.zTok
5960: 65 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 20  en;.  }.  if( z 
5970: 29 7b 0a 20 20 20 20 63 6e 74 20 3d 20 30 3b 0a  ){.    cnt = 0;.
5980: 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 7a 5b      while( (c=z[
5990: 63 6e 74 5d 29 21 3d 30 20 26 26 20 63 21 3d 77  cnt])!=0 && c!=w
59a0: 63 5b 30 5d 20 26 26 20 63 21 3d 77 63 5b 31 5d  c[0] && c!=wc[1]
59b0: 20 26 26 20 63 21 3d 77 63 5b 32 5d 20 29 7b 0a   && c!=wc[2] ){.
59c0: 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20        cnt++;.   
59d0: 20 7d 0a 20 20 20 20 69 66 28 20 63 6e 74 21 3d   }.    if( cnt!=
59e0: 30 20 26 26 20 32 35 35 21 3d 28 75 38 29 7a 5b  0 && 255!=(u8)z[
59f0: 63 6e 74 2d 31 5d 20 29 7b 0a 20 20 20 20 20 20  cnt-1] ){.      
5a00: 45 78 70 72 20 2a 70 50 72 65 66 69 78 3b 0a 20  Expr *pPrefix;. 
5a10: 20 20 20 20 20 2a 70 69 73 43 6f 6d 70 6c 65 74       *pisComplet
5a20: 65 20 3d 20 63 3d 3d 77 63 5b 30 5d 20 26 26 20  e = c==wc[0] && 
5a30: 7a 5b 63 6e 74 2b 31 5d 3d 3d 30 3b 0a 20 20 20  z[cnt+1]==0;.   
5a40: 20 20 20 70 50 72 65 66 69 78 20 3d 20 73 71 6c     pPrefix = sql
5a50: 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f  ite3Expr(db, TK_
5a60: 53 54 52 49 4e 47 2c 20 7a 29 3b 0a 20 20 20 20  STRING, z);.    
5a70: 20 20 69 66 28 20 70 50 72 65 66 69 78 20 29 20    if( pPrefix ) 
5a80: 70 50 72 65 66 69 78 2d 3e 75 2e 7a 54 6f 6b 65  pPrefix->u.zToke
5a90: 6e 5b 63 6e 74 5d 20 3d 20 30 3b 0a 20 20 20 20  n[cnt] = 0;.    
5aa0: 20 20 2a 70 70 50 72 65 66 69 78 20 3d 20 70 50    *ppPrefix = pP
5ab0: 72 65 66 69 78 3b 0a 20 20 20 20 20 20 69 66 28  refix;.      if(
5ac0: 20 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45   op==TK_VARIABLE
5ad0: 20 29 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65   ){.        Vdbe
5ae0: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
5af0: 64 62 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  dbe;.        sql
5b00: 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d 61  ite3VdbeSetVarma
5b10: 73 6b 28 76 2c 20 70 52 69 67 68 74 2d 3e 69 43  sk(v, pRight->iC
5b20: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20  olumn);.        
5b30: 69 66 28 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65  if( *pisComplete
5b40: 20 26 26 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54   && pRight->u.zT
5b50: 6f 6b 65 6e 5b 31 5d 20 29 7b 0a 20 20 20 20 20  oken[1] ){.     
5b60: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72       /* If the r
5b70: 68 73 20 6f 66 20 74 68 65 20 4c 49 4b 45 20 65  hs of the LIKE e
5b80: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 76  xpression is a v
5b90: 61 72 69 61 62 6c 65 2c 20 61 6e 64 20 74 68 65  ariable, and the
5ba0: 20 63 75 72 72 65 6e 74 0a 20 20 20 20 20 20 20   current.       
5bb0: 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74     ** value of t
5bc0: 68 65 20 76 61 72 69 61 62 6c 65 20 6d 65 61 6e  he variable mean
5bd0: 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  s there is no ne
5be0: 65 64 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65  ed to invoke the
5bf0: 20 4c 49 4b 45 0a 20 20 20 20 20 20 20 20 20 20   LIKE.          
5c00: 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65  ** function, the
5c10: 6e 20 6e 6f 20 4f 50 5f 56 61 72 69 61 62 6c 65  n no OP_Variable
5c20: 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74   will be added t
5c30: 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 20  o the program.. 
5c40: 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73           ** This
5c50: 20 63 61 75 73 65 73 20 70 72 6f 62 6c 65 6d 73   causes problems
5c60: 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33   for the sqlite3
5c70: 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
5c80: 6e 61 6d 65 28 29 0a 20 20 20 20 20 20 20 20 20  name().         
5c90: 20 2a 2a 20 41 50 49 2e 20 54 6f 20 77 6f 72 6b   ** API. To work
5ca0: 20 61 72 6f 75 6e 64 20 74 68 65 6d 2c 20 61 64   around them, ad
5cb0: 64 20 61 20 64 75 6d 6d 79 20 4f 50 5f 56 61 72  d a dummy OP_Var
5cc0: 69 61 62 6c 65 20 68 65 72 65 2e 0a 20 20 20 20  iable here..    
5cd0: 20 20 20 20 20 20 2a 2f 20 0a 20 20 20 20 20 20        */ .      
5ce0: 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
5cf0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
5d00: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
5d10: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
5d20: 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
5d30: 70 52 69 67 68 74 2c 20 72 31 29 3b 0a 20 20 20  pRight, r1);.   
5d40: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5d50: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 73 71  beChangeP3(v, sq
5d60: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
5d70: 41 64 64 72 28 76 29 2d 31 2c 20 30 29 3b 0a 20  Addr(v)-1, 0);. 
5d80: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
5d90: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
5da0: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
5db0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
5dc0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
5dd0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
5de0: 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
5df0: 72 65 65 28 70 56 61 6c 29 3b 0a 20 20 72 65 74  ree(pVal);.  ret
5e00: 75 72 6e 20 28 7a 21 3d 30 29 3b 0a 7d 0a 23 65  urn (z!=0);.}.#e
5e10: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
5e20: 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a  MIT_LIKE_OPTIMIZ
5e30: 41 54 49 4f 4e 20 2a 2f 0a 0a 0a 23 69 66 6e 64  ATION */...#ifnd
5e40: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
5e50: 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a  IRTUALTABLE./*.*
5e60: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
5e70: 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
5e80: 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65  ession is of the
5e90: 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20   form.**.**     
5ea0: 20 20 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48      column MATCH
5eb0: 20 65 78 70 72 0a 2a 2a 0a 2a 2a 20 49 66 20 69   expr.**.** If i
5ec0: 74 20 69 73 20 74 68 65 6e 20 72 65 74 75 72 6e  t is then return
5ed0: 20 54 52 55 45 2e 20 20 49 66 20 6e 6f 74 2c 20   TRUE.  If not, 
5ee0: 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f  return FALSE..*/
5ef0: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4d 61  .static int isMa
5f00: 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 0a 20 20 45  tchOfColumn(.  E
5f10: 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20  xpr *pExpr      
5f20: 2f 2a 20 54 65 73 74 20 74 68 69 73 20 65 78 70  /* Test this exp
5f30: 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  ression */.){.  
5f40: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b  ExprList *pList;
5f50: 0a 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ..  if( pExpr->o
5f60: 70 21 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29  p!=TK_FUNCTION )
5f70: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
5f80: 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
5f90: 33 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e  3StrICmp(pExpr->
5fa0: 75 2e 7a 54 6f 6b 65 6e 2c 22 6d 61 74 63 68 22  u.zToken,"match"
5fb0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )!=0 ){.    retu
5fc0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73  rn 0;.  }.  pLis
5fd0: 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
5fe0: 73 74 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 2d  st;.  if( pList-
5ff0: 3e 6e 45 78 70 72 21 3d 32 20 29 7b 0a 20 20 20  >nExpr!=2 ){.   
6000: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
6010: 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 31 5d   if( pList->a[1]
6020: 2e 70 45 78 70 72 2d 3e 6f 70 20 21 3d 20 54 4b  .pExpr->op != TK
6030: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 72  _COLUMN ){.    r
6040: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
6050: 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
6060: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
6070: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
6080: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ../*.** If the p
6090: 42 61 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20  Base expression 
60a0: 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68  originated in th
60b0: 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
60c0: 61 75 73 65 20 6f 66 0a 2a 2a 20 61 20 6a 6f 69  ause of.** a joi
60d0: 6e 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72  n, then transfer
60e0: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
60f0: 20 6d 61 72 6b 69 6e 67 73 20 6f 76 65 72 20 74   markings over t
6100: 6f 20 64 65 72 69 76 65 64 2e 0a 2a 2f 0a 73 74  o derived..*/.st
6110: 61 74 69 63 20 76 6f 69 64 20 74 72 61 6e 73 66  atic void transf
6120: 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 45  erJoinMarkings(E
6130: 78 70 72 20 2a 70 44 65 72 69 76 65 64 2c 20 45  xpr *pDerived, E
6140: 78 70 72 20 2a 70 42 61 73 65 29 7b 0a 20 20 69  xpr *pBase){.  i
6150: 66 28 20 70 44 65 72 69 76 65 64 20 29 7b 0a 20  f( pDerived ){. 
6160: 20 20 20 70 44 65 72 69 76 65 64 2d 3e 66 6c 61     pDerived->fla
6170: 67 73 20 7c 3d 20 70 42 61 73 65 2d 3e 66 6c 61  gs |= pBase->fla
6180: 67 73 20 26 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  gs & EP_FromJoin
6190: 3b 0a 20 20 20 20 70 44 65 72 69 76 65 64 2d 3e  ;.    pDerived->
61a0: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
61b0: 3d 20 70 42 61 73 65 2d 3e 69 52 69 67 68 74 4a  = pBase->iRightJ
61c0: 6f 69 6e 54 61 62 6c 65 3b 0a 20 20 7d 0a 7d 0a  oinTable;.  }.}.
61d0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
61e0: 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54  LITE_OMIT_OR_OPT
61f0: 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26 20 21 64  IMIZATION) && !d
6200: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
6210: 49 54 5f 53 55 42 51 55 45 52 59 29 0a 2f 2a 0a  IT_SUBQUERY)./*.
6220: 2a 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74 65 72  ** Analyze a ter
6230: 6d 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20  m that consists 
6240: 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 4f  of two or more O
6250: 52 2d 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 73  R-connected.** s
6260: 75 62 74 65 72 6d 73 2e 20 20 53 6f 20 69 6e 3a  ubterms.  So in:
6270: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20 57  .**.**     ... W
6280: 48 45 52 45 20 20 28 61 3d 35 29 20 41 4e 44 20  HERE  (a=5) AND 
6290: 28 62 3d 37 20 4f 52 20 63 3d 39 20 4f 52 20 64  (b=7 OR c=9 OR d
62a0: 3d 31 33 29 20 41 4e 44 20 28 64 3d 31 33 29 0a  =13) AND (d=13).
62b0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
62c0: 20 20 20 20 20 20 20 20 20 20 20 20 5e 5e 5e 5e              ^^^^
62d0: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e  ^^^^^^^^^^^^^^^^
62e0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
62f0: 69 6e 65 20 61 6e 61 6c 79 7a 65 73 20 74 65 72  ine analyzes ter
6300: 6d 73 20 73 75 63 68 20 61 73 20 74 68 65 20 6d  ms such as the m
6310: 69 64 64 6c 65 20 74 65 72 6d 20 69 6e 20 74 68  iddle term in th
6320: 65 20 61 62 6f 76 65 20 65 78 61 6d 70 6c 65 2e  e above example.
6330: 0a 2a 2a 20 41 20 57 68 65 72 65 4f 72 54 65 72  .** A WhereOrTer
6340: 6d 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6d 70  m object is comp
6350: 75 74 65 64 20 61 6e 64 20 61 74 74 61 63 68 65  uted and attache
6360: 64 20 74 6f 20 74 68 65 20 74 65 72 6d 20 75 6e  d to the term un
6370: 64 65 72 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 2c  der.** analysis,
6380: 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74   regardless of t
6390: 68 65 20 6f 75 74 63 6f 6d 65 20 6f 66 20 74 68  he outcome of th
63a0: 65 20 61 6e 61 6c 79 73 69 73 2e 20 20 48 65 6e  e analysis.  Hen
63b0: 63 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68  ce:.**.**     Wh
63c0: 65 72 65 54 65 72 6d 2e 77 74 46 6c 61 67 73 20  ereTerm.wtFlags 
63d0: 20 20 7c 3d 20 20 54 45 52 4d 5f 4f 52 49 4e 46    |=  TERM_ORINF
63e0: 4f 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65  O.**     WhereTe
63f0: 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 20 20 3d 20  rm.u.pOrInfo  = 
6400: 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61   a dynamically a
6410: 6c 6c 6f 63 61 74 65 64 20 57 68 65 72 65 4f 72  llocated WhereOr
6420: 54 65 72 6d 20 6f 62 6a 65 63 74 0a 2a 2a 0a 2a  Term object.**.*
6430: 2a 20 54 68 65 20 74 65 72 6d 20 62 65 69 6e 67  * The term being
6440: 20 61 6e 61 6c 79 7a 65 64 20 6d 75 73 74 20 68   analyzed must h
6450: 61 76 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  ave two or more 
6460: 6f 66 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20  of OR-connected 
6470: 73 75 62 74 65 72 6d 73 2e 0a 2a 2a 20 41 20 73  subterms..** A s
6480: 69 6e 67 6c 65 20 73 75 62 74 65 72 6d 20 6d 69  ingle subterm mi
6490: 67 68 74 20 62 65 20 61 20 73 65 74 20 6f 66 20  ght be a set of 
64a0: 41 4e 44 2d 63 6f 6e 6e 65 63 74 65 64 20 73 75  AND-connected su
64b0: 62 2d 73 75 62 74 65 72 6d 73 2e 0a 2a 2a 20 45  b-subterms..** E
64c0: 78 61 6d 70 6c 65 73 20 6f 66 20 74 65 72 6d 73  xamples of terms
64d0: 20 75 6e 64 65 72 20 61 6e 61 6c 79 73 69 73 3a   under analysis:
64e0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 41 29 20 20  .**.**     (A)  
64f0: 20 20 20 74 31 2e 78 3d 74 32 2e 79 20 4f 52 20     t1.x=t2.y OR 
6500: 74 31 2e 78 3d 74 32 2e 7a 20 4f 52 20 74 31 2e  t1.x=t2.z OR t1.
6510: 79 3d 31 35 20 4f 52 20 74 31 2e 7a 3d 74 33 2e  y=15 OR t1.z=t3.
6520: 61 2b 35 0a 2a 2a 20 20 20 20 20 28 42 29 20 20  a+5.**     (B)  
6530: 20 20 20 78 3d 65 78 70 72 31 20 4f 52 20 65 78     x=expr1 OR ex
6540: 70 72 32 3d 78 20 4f 52 20 78 3d 65 78 70 72 33  pr2=x OR x=expr3
6550: 0a 2a 2a 20 20 20 20 20 28 43 29 20 20 20 20 20  .**     (C)     
6560: 74 31 2e 78 3d 74 32 2e 79 20 4f 52 20 28 74 31  t1.x=t2.y OR (t1
6570: 2e 78 3d 74 32 2e 7a 20 41 4e 44 20 74 31 2e 79  .x=t2.z AND t1.y
6580: 3d 31 35 29 0a 2a 2a 20 20 20 20 20 28 44 29 20  =15).**     (D) 
6590: 20 20 20 20 78 3d 65 78 70 72 31 20 4f 52 20 28      x=expr1 OR (
65a0: 79 3e 31 31 20 41 4e 44 20 79 3c 32 32 20 41 4e  y>11 AND y<22 AN
65b0: 44 20 7a 20 4c 49 4b 45 20 27 2a 68 65 6c 6c 6f  D z LIKE '*hello
65c0: 2a 27 29 0a 2a 2a 20 20 20 20 20 28 45 29 20 20  *').**     (E)  
65d0: 20 20 20 28 70 2e 61 3d 31 20 41 4e 44 20 71 2e     (p.a=1 AND q.
65e0: 62 3d 32 20 41 4e 44 20 72 2e 63 3d 33 29 20 4f  b=2 AND r.c=3) O
65f0: 52 20 28 70 2e 78 3d 34 20 41 4e 44 20 71 2e 79  R (p.x=4 AND q.y
6600: 3d 35 20 41 4e 44 20 72 2e 7a 3d 36 29 0a 2a 2a  =5 AND r.z=6).**
6610: 0a 2a 2a 20 43 41 53 45 20 31 3a 0a 2a 2a 0a 2a  .** CASE 1:.**.*
6620: 2a 20 49 66 20 61 6c 6c 20 73 75 62 74 65 72 6d  * If all subterm
6630: 73 20 61 72 65 20 6f 66 20 74 68 65 20 66 6f 72  s are of the for
6640: 6d 20 54 2e 43 3d 65 78 70 72 20 66 6f 72 20 73  m T.C=expr for s
6650: 6f 6d 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  ome single colum
6660: 6e 20 6f 66 20 43 20 61 6e 64 0a 2a 2a 20 61 20  n of C and.** a 
6670: 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 54 20 28  single table T (
6680: 61 73 20 73 68 6f 77 6e 20 69 6e 20 65 78 61 6d  as shown in exam
6690: 70 6c 65 20 42 20 61 62 6f 76 65 29 20 74 68 65  ple B above) the
66a0: 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 76  n create a new v
66b0: 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 74  irtual.** term t
66c0: 68 61 74 20 69 73 20 61 6e 20 65 71 75 69 76 61  hat is an equiva
66d0: 6c 65 6e 74 20 49 4e 20 65 78 70 72 65 73 73 69  lent IN expressi
66e0: 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  on.  In other wo
66f0: 72 64 73 2c 20 69 66 20 74 68 65 20 74 65 72 6d  rds, if the term
6700: 0a 2a 2a 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a  .** being analyz
6710: 65 64 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ed is:.**.**    
6720: 20 20 78 20 3d 20 65 78 70 72 31 20 20 4f 52 20    x = expr1  OR 
6730: 20 65 78 70 72 32 20 3d 20 78 20 20 4f 52 20 20   expr2 = x  OR  
6740: 78 20 3d 20 65 78 70 72 33 0a 2a 2a 0a 2a 2a 20  x = expr3.**.** 
6750: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65  then create a ne
6760: 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6c  w virtual term l
6770: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
6780: 20 20 20 20 20 78 20 49 4e 20 28 65 78 70 72 31       x IN (expr1
6790: 2c 65 78 70 72 32 2c 65 78 70 72 33 29 0a 2a 2a  ,expr2,expr3).**
67a0: 0a 2a 2a 20 43 41 53 45 20 32 3a 0a 2a 2a 0a 2a  .** CASE 2:.**.*
67b0: 2a 20 49 66 20 61 6c 6c 20 73 75 62 74 65 72 6d  * If all subterm
67c0: 73 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65 20  s are indexable 
67d0: 62 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  by a single tabl
67e0: 65 20 54 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a  e T, then set.**
67f0: 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65 72  .**     WhereTer
6800: 6d 2e 65 4f 70 65 72 61 74 6f 72 20 20 20 20 20  m.eOperator     
6810: 20 20 20 20 20 20 20 20 20 3d 20 20 57 4f 5f 4f           =  WO_O
6820: 52 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65  R.**     WhereTe
6830: 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e  rm.u.pOrInfo->in
6840: 64 65 78 61 62 6c 65 20 20 7c 3d 20 20 74 68 65  dexable  |=  the
6850: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
6860: 6f 72 20 74 61 62 6c 65 20 54 0a 2a 2a 0a 2a 2a  or table T.**.**
6870: 20 41 20 73 75 62 74 65 72 6d 20 69 73 20 22 69   A subterm is "i
6880: 6e 64 65 78 61 62 6c 65 22 20 69 66 20 69 74 20  ndexable" if it 
6890: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a  is of the form.*
68a0: 2a 20 22 54 2e 43 20 3c 6f 70 3e 20 3c 65 78 70  * "T.C <op> <exp
68b0: 72 3e 22 20 77 68 65 72 65 20 43 20 69 73 20 61  r>" where C is a
68c0: 6e 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62  ny column of tab
68d0: 6c 65 20 54 20 61 6e 64 20 0a 2a 2a 20 3c 6f 70  le T and .** <op
68e0: 3e 20 69 73 20 6f 6e 65 20 6f 66 20 22 3d 22 2c  > is one of "=",
68f0: 20 22 3c 22 2c 20 22 3c 3d 22 2c 20 22 3e 22 2c   "<", "<=", ">",
6900: 20 22 3e 3d 22 2c 20 22 49 53 20 4e 55 4c 4c 22   ">=", "IS NULL"
6910: 2c 20 6f 72 20 22 49 4e 22 2e 0a 2a 2a 20 41 20  , or "IN"..** A 
6920: 73 75 62 74 65 72 6d 20 69 73 20 61 6c 73 6f 20  subterm is also 
6930: 69 6e 64 65 78 61 62 6c 65 20 69 66 20 69 74 20  indexable if it 
6940: 69 73 20 61 6e 20 41 4e 44 20 6f 66 20 74 77 6f  is an AND of two
6950: 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 73 75 62 73   or more.** subs
6960: 75 62 74 65 72 6d 73 20 61 74 20 6c 65 61 73 74  ubterms at least
6970: 20 6f 6e 65 20 6f 66 20 77 68 69 63 68 20 69 73   one of which is
6980: 20 69 6e 64 65 78 61 62 6c 65 2e 20 20 49 6e 64   indexable.  Ind
6990: 65 78 61 62 6c 65 20 41 4e 44 20 0a 2a 2a 20 73  exable AND .** s
69a0: 75 62 74 65 72 6d 73 20 68 61 76 65 20 74 68 65  ubterms have the
69b0: 69 72 20 65 4f 70 65 72 61 74 6f 72 20 73 65 74  ir eOperator set
69c0: 20 74 6f 20 57 4f 5f 41 4e 44 20 61 6e 64 20 74   to WO_AND and t
69d0: 68 65 79 20 68 61 76 65 0a 2a 2a 20 75 2e 70 41  hey have.** u.pA
69e0: 6e 64 49 6e 66 6f 20 73 65 74 20 74 6f 20 61 20  ndInfo set to a 
69f0: 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f  dynamically allo
6a00: 63 61 74 65 64 20 57 68 65 72 65 41 6e 64 54 65  cated WhereAndTe
6a10: 72 6d 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a  rm object..**.**
6a20: 20 46 72 6f 6d 20 61 6e 6f 74 68 65 72 20 70 6f   From another po
6a30: 69 6e 74 20 6f 66 20 76 69 65 77 2c 20 22 69 6e  int of view, "in
6a40: 64 65 78 61 62 6c 65 22 20 6d 65 61 6e 73 20 74  dexable" means t
6a50: 68 61 74 20 74 68 65 20 73 75 62 74 65 72 6d 20  hat the subterm 
6a60: 63 6f 75 6c 64 0a 2a 2a 20 70 6f 74 65 6e 74 69  could.** potenti
6a70: 61 6c 6c 79 20 62 65 20 75 73 65 64 20 77 69 74  ally be used wit
6a80: 68 20 61 6e 20 69 6e 64 65 78 20 69 66 20 61 6e  h an index if an
6a90: 20 61 70 70 72 6f 70 72 69 61 74 65 20 69 6e 64   appropriate ind
6aa0: 65 78 20 65 78 69 73 74 73 2e 0a 2a 2a 20 54 68  ex exists..** Th
6ab0: 69 73 20 61 6e 61 6c 79 73 69 73 20 64 6f 65 73  is analysis does
6ac0: 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 20 77 68   not consider wh
6ad0: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
6ae0: 20 69 6e 64 65 78 20 65 78 69 73 74 73 3b 20 74   index exists; t
6af0: 68 61 74 0a 2a 2a 20 69 73 20 64 65 63 69 64 65  hat.** is decide
6b00: 64 20 65 6c 73 65 77 68 65 72 65 2e 20 20 54 68  d elsewhere.  Th
6b10: 69 73 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79  is analysis only
6b20: 20 6c 6f 6f 6b 73 20 61 74 20 77 68 65 74 68 65   looks at whethe
6b30: 72 20 73 75 62 74 65 72 6d 73 0a 2a 2a 20 61 70  r subterms.** ap
6b40: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e  propriate for in
6b50: 64 65 78 69 6e 67 20 65 78 69 73 74 2e 0a 2a 2a  dexing exist..**
6b60: 0a 2a 2a 20 41 6c 6c 20 65 78 61 6d 70 6c 65 73  .** All examples
6b70: 20 41 20 74 68 72 6f 75 67 68 20 45 20 61 62 6f   A through E abo
6b80: 76 65 20 73 61 74 69 73 66 79 20 63 61 73 65 20  ve satisfy case 
6b90: 32 2e 20 20 42 75 74 20 69 66 20 61 20 74 65 72  2.  But if a ter
6ba0: 6d 0a 2a 2a 20 61 6c 73 6f 20 73 61 74 69 73 66  m.** also satisf
6bb0: 69 65 73 20 63 61 73 65 20 31 20 28 73 75 63 68  ies case 1 (such
6bc0: 20 61 73 20 42 29 20 77 65 20 6b 6e 6f 77 20 74   as B) we know t
6bd0: 68 61 74 20 74 68 65 20 6f 70 74 69 6d 69 7a 65  hat the optimize
6be0: 72 20 77 69 6c 6c 0a 2a 2a 20 61 6c 77 61 79 73  r will.** always
6bf0: 20 70 72 65 66 65 72 20 63 61 73 65 20 31 2c 20   prefer case 1, 
6c00: 73 6f 20 69 6e 20 74 68 61 74 20 63 61 73 65 20  so in that case 
6c10: 77 65 20 70 72 65 74 65 6e 64 20 74 68 61 74 20  we pretend that 
6c20: 63 61 73 65 20 32 20 69 73 20 6e 6f 74 0a 2a 2a  case 2 is not.**
6c30: 20 73 61 74 69 73 66 69 65 64 2e 0a 2a 2a 0a 2a   satisfied..**.*
6c40: 2a 20 49 74 20 6d 69 67 68 74 20 62 65 20 74 68  * It might be th
6c50: 65 20 63 61 73 65 20 74 68 61 74 20 6d 75 6c 74  e case that mult
6c60: 69 70 6c 65 20 74 61 62 6c 65 73 20 61 72 65 20  iple tables are 
6c70: 69 6e 64 65 78 61 62 6c 65 2e 20 20 46 6f 72 20  indexable.  For 
6c80: 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 28 45 29 20  example,.** (E) 
6c90: 61 62 6f 76 65 20 69 73 20 69 6e 64 65 78 61 62  above is indexab
6ca0: 6c 65 20 6f 6e 20 74 61 62 6c 65 73 20 50 2c 20  le on tables P, 
6cb0: 51 2c 20 61 6e 64 20 52 2e 0a 2a 2a 0a 2a 2a 20  Q, and R..**.** 
6cc0: 54 65 72 6d 73 20 74 68 61 74 20 73 61 74 69 73  Terms that satis
6cd0: 66 79 20 63 61 73 65 20 32 20 61 72 65 20 63 61  fy case 2 are ca
6ce0: 6e 64 69 64 61 74 65 73 20 66 6f 72 20 6c 6f 6f  ndidates for loo
6cf0: 6b 75 70 20 62 79 20 75 73 69 6e 67 0a 2a 2a 20  kup by using.** 
6d00: 73 65 70 61 72 61 74 65 20 69 6e 64 69 63 65 73  separate indices
6d10: 20 74 6f 20 66 69 6e 64 20 72 6f 77 69 64 73 20   to find rowids 
6d20: 66 6f 72 20 65 61 63 68 20 73 75 62 74 65 72 6d  for each subterm
6d30: 20 61 6e 64 20 63 6f 6d 70 6f 73 69 6e 67 0a 2a   and composing.*
6d40: 2a 20 74 68 65 20 75 6e 69 6f 6e 20 6f 66 20 61  * the union of a
6d50: 6c 6c 20 72 6f 77 69 64 73 20 75 73 69 6e 67 20  ll rowids using 
6d60: 61 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 2e  a RowSet object.
6d70: 20 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61    This is simila
6d80: 72 0a 2a 2a 20 74 6f 20 22 62 69 74 6d 61 70 20  r.** to "bitmap 
6d90: 69 6e 64 69 63 65 73 22 20 69 6e 20 6f 74 68 65  indices" in othe
6da0: 72 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e  r database engin
6db0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 54 48 45 52 57  es..**.** OTHERW
6dc0: 49 53 45 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65  ISE:.**.** If ne
6dd0: 69 74 68 65 72 20 63 61 73 65 20 31 20 6e 6f 72  ither case 1 nor
6de0: 20 63 61 73 65 20 32 20 61 70 70 6c 79 2c 20 74   case 2 apply, t
6df0: 68 65 6e 20 6c 65 61 76 65 20 74 68 65 20 65 4f  hen leave the eO
6e00: 70 65 72 61 74 6f 72 20 73 65 74 20 74 6f 0a 2a  perator set to.*
6e10: 2a 20 7a 65 72 6f 2e 20 20 54 68 69 73 20 74 65  * zero.  This te
6e20: 72 6d 20 69 73 20 6e 6f 74 20 75 73 65 66 75 6c  rm is not useful
6e30: 20 66 6f 72 20 73 65 61 72 63 68 2e 0a 2a 2f 0a   for search..*/.
6e40: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72  static void expr
6e50: 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28 0a 20  AnalyzeOrTerm(. 
6e60: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20   SrcList *pSrc, 
6e70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68             /* th
6e80: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
6e90: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
6ea0: 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  pWC,         /* 
6eb0: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 57 48 45  the complete WHE
6ec0: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  RE clause */.  i
6ed0: 6e 74 20 69 64 78 54 65 72 6d 20 20 20 20 20 20  nt idxTerm      
6ee0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
6ef0: 78 20 6f 66 20 74 68 65 20 4f 52 2d 74 65 72 6d  x of the OR-term
6f00: 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20   to be analyzed 
6f10: 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66  */.){.  WhereInf
6f20: 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d  o *pWInfo = pWC-
6f30: 3e 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  >pWInfo;        
6f40: 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  /* WHERE clause 
6f50: 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74 65  processing conte
6f60: 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70  xt */.  Parse *p
6f70: 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e  Parse = pWInfo->
6f80: 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20  pParse;         
6f90: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
6fa0: 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  t */.  sqlite3 *
6fb0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
6fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6fd0: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
6fe0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65  ction */.  Where
6ff0: 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20 26 70  Term *pTerm = &p
7000: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 20  WC->a[idxTerm]; 
7010: 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 74     /* The term t
7020: 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  o be analyzed */
7030: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d  .  Expr *pExpr =
7040: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 20 20   pTerm->pExpr;  
7050: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
7060: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20  e expression of 
7070: 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e  the term */.  in
7080: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
7090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70a0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
70b0: 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72  unters */.  Wher
70c0: 65 43 6c 61 75 73 65 20 2a 70 4f 72 57 63 3b 20  eClause *pOrWc; 
70d0: 20 20 20 20 20 20 2f 2a 20 42 72 65 61 6b 75 70        /* Breakup
70e0: 20 6f 66 20 70 54 65 72 6d 20 69 6e 74 6f 20 73   of pTerm into s
70f0: 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20 57 68 65  ubterms */.  Whe
7100: 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b  reTerm *pOrTerm;
7110: 20 20 20 20 20 20 20 2f 2a 20 41 20 53 75 62 2d         /* A Sub-
7120: 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68 65 20  term within the 
7130: 70 4f 72 57 63 20 2a 2f 0a 20 20 57 68 65 72 65  pOrWc */.  Where
7140: 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e 66 6f 3b  OrInfo *pOrInfo;
7150: 20 20 20 20 20 2f 2a 20 41 64 64 69 74 69 6f 6e       /* Addition
7160: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  al information a
7170: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
7180: 54 65 72 6d 20 2a 2f 0a 20 20 42 69 74 6d 61 73  Term */.  Bitmas
7190: 6b 20 63 68 6e 67 54 6f 49 4e 3b 20 20 20 20 20  k chngToIN;     
71a0: 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74 68      /* Tables th
71b0: 61 74 20 6d 69 67 68 74 20 73 61 74 69 73 66 79  at might satisfy
71c0: 20 63 61 73 65 20 31 20 2a 2f 0a 20 20 42 69 74   case 1 */.  Bit
71d0: 6d 61 73 6b 20 69 6e 64 65 78 61 62 6c 65 3b 20  mask indexable; 
71e0: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73         /* Tables
71f0: 20 74 68 61 74 20 61 72 65 20 69 6e 64 65 78 61   that are indexa
7200: 62 6c 65 2c 20 73 61 74 69 73 66 79 69 6e 67 20  ble, satisfying 
7210: 63 61 73 65 20 32 20 2a 2f 0a 0a 20 20 2f 2a 0a  case 2 */..  /*.
7220: 20 20 2a 2a 20 42 72 65 61 6b 20 74 68 65 20 4f    ** Break the O
7230: 52 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 69 74  R clause into it
7240: 73 20 73 65 70 61 72 61 74 65 20 73 75 62 74 65  s separate subte
7250: 72 6d 73 2e 20 20 54 68 65 20 73 75 62 74 65 72  rms.  The subter
7260: 6d 73 20 61 72 65 0a 20 20 2a 2a 20 73 74 6f 72  ms are.  ** stor
7270: 65 64 20 69 6e 20 61 20 57 68 65 72 65 43 6c 61  ed in a WhereCla
7280: 75 73 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  use structure co
7290: 6e 74 61 69 6e 69 6e 67 20 77 69 74 68 69 6e 20  ntaining within 
72a0: 74 68 65 20 57 68 65 72 65 4f 72 49 6e 66 6f 0a  the WhereOrInfo.
72b0: 20 20 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74    ** object that
72c0: 20 69 73 20 61 74 74 61 63 68 65 64 20 74 6f 20   is attached to 
72d0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 4f 52 20  the original OR 
72e0: 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 20 20 2a  clause term..  *
72f0: 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 54 65  /.  assert( (pTe
7300: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54  rm->wtFlags & (T
7310: 45 52 4d 5f 44 59 4e 41 4d 49 43 7c 54 45 52 4d  ERM_DYNAMIC|TERM
7320: 5f 4f 52 49 4e 46 4f 7c 54 45 52 4d 5f 41 4e 44  _ORINFO|TERM_AND
7330: 49 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a 20 20 61  INFO))==0 );.  a
7340: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
7350: 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 70 54 65  ==TK_OR );.  pTe
7360: 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 20 3d 20  rm->u.pOrInfo = 
7370: 70 4f 72 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  pOrInfo = sqlite
7380: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
7390: 2c 20 73 69 7a 65 6f 66 28 2a 70 4f 72 49 6e 66  , sizeof(*pOrInf
73a0: 6f 29 29 3b 0a 20 20 69 66 28 20 70 4f 72 49 6e  o));.  if( pOrIn
73b0: 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  fo==0 ) return;.
73c0: 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73    pTerm->wtFlags
73d0: 20 7c 3d 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 3b   |= TERM_ORINFO;
73e0: 0a 20 20 70 4f 72 57 63 20 3d 20 26 70 4f 72 49  .  pOrWc = &pOrI
73f0: 6e 66 6f 2d 3e 77 63 3b 0a 20 20 77 68 65 72 65  nfo->wc;.  where
7400: 43 6c 61 75 73 65 49 6e 69 74 28 70 4f 72 57 63  ClauseInit(pOrWc
7410: 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 77 68 65  , pWInfo);.  whe
7420: 72 65 53 70 6c 69 74 28 70 4f 72 57 63 2c 20 70  reSplit(pOrWc, p
7430: 45 78 70 72 2c 20 54 4b 5f 4f 52 29 3b 0a 20 20  Expr, TK_OR);.  
7440: 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70  exprAnalyzeAll(p
7450: 53 72 63 2c 20 70 4f 72 57 63 29 3b 0a 20 20 69  Src, pOrWc);.  i
7460: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
7470: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
7480: 61 73 73 65 72 74 28 20 70 4f 72 57 63 2d 3e 6e  assert( pOrWc->n
7490: 54 65 72 6d 3e 3d 32 20 29 3b 0a 0a 20 20 2f 2a  Term>=2 );..  /*
74a0: 0a 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  .  ** Compute th
74b0: 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20  e set of tables 
74c0: 74 68 61 74 20 6d 69 67 68 74 20 73 61 74 69 73  that might satis
74d0: 66 79 20 63 61 73 65 73 20 31 20 6f 72 20 32 2e  fy cases 1 or 2.
74e0: 0a 20 20 2a 2f 0a 20 20 69 6e 64 65 78 61 62 6c  .  */.  indexabl
74f0: 65 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b  e = ~(Bitmask)0;
7500: 0a 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 7e 28  .  chngToIN = ~(
7510: 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72  Bitmask)0;.  for
7520: 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d  (i=pOrWc->nTerm-
7530: 31 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63  1, pOrTerm=pOrWc
7540: 2d 3e 61 3b 20 69 3e 3d 30 20 26 26 20 69 6e 64  ->a; i>=0 && ind
7550: 65 78 61 62 6c 65 3b 20 69 2d 2d 2c 20 70 4f 72  exable; i--, pOr
7560: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
7570: 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72   (pOrTerm->eOper
7580: 61 74 6f 72 20 26 20 57 4f 5f 53 49 4e 47 4c 45  ator & WO_SINGLE
7590: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 68  )==0 ){.      Wh
75a0: 65 72 65 41 6e 64 49 6e 66 6f 20 2a 70 41 6e 64  ereAndInfo *pAnd
75b0: 49 6e 66 6f 3b 0a 20 20 20 20 20 20 61 73 73 65  Info;.      asse
75c0: 72 74 28 20 28 70 4f 72 54 65 72 6d 2d 3e 77 74  rt( (pOrTerm->wt
75d0: 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 41 4e  Flags & (TERM_AN
75e0: 44 49 4e 46 4f 7c 54 45 52 4d 5f 4f 52 49 4e 46  DINFO|TERM_ORINF
75f0: 4f 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  O))==0 );.      
7600: 63 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20  chngToIN = 0;.  
7610: 20 20 20 20 70 41 6e 64 49 6e 66 6f 20 3d 20 73      pAndInfo = s
7620: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
7630: 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 41  w(db, sizeof(*pA
7640: 6e 64 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20  ndInfo));.      
7650: 69 66 28 20 70 41 6e 64 49 6e 66 6f 20 29 7b 0a  if( pAndInfo ){.
7660: 20 20 20 20 20 20 20 20 57 68 65 72 65 43 6c 61          WhereCla
7670: 75 73 65 20 2a 70 41 6e 64 57 43 3b 0a 20 20 20  use *pAndWC;.   
7680: 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
7690: 70 41 6e 64 54 65 72 6d 3b 0a 20 20 20 20 20 20  pAndTerm;.      
76a0: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20    int j;.       
76b0: 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 30 3b 0a   Bitmask b = 0;.
76c0: 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d          pOrTerm-
76d0: 3e 75 2e 70 41 6e 64 49 6e 66 6f 20 3d 20 70 41  >u.pAndInfo = pA
76e0: 6e 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  ndInfo;.        
76f0: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
7700: 20 7c 3d 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f   |= TERM_ANDINFO
7710: 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65 72  ;.        pOrTer
7720: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57  m->eOperator = W
7730: 4f 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20 20 70  O_AND;.        p
7740: 41 6e 64 57 43 20 3d 20 26 70 41 6e 64 49 6e 66  AndWC = &pAndInf
7750: 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 77  o->wc;.        w
7760: 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 70  hereClauseInit(p
7770: 41 6e 64 57 43 2c 20 70 57 43 2d 3e 70 57 49 6e  AndWC, pWC->pWIn
7780: 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65  fo);.        whe
7790: 72 65 53 70 6c 69 74 28 70 41 6e 64 57 43 2c 20  reSplit(pAndWC, 
77a0: 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  pOrTerm->pExpr, 
77b0: 54 4b 5f 41 4e 44 29 3b 0a 20 20 20 20 20 20 20  TK_AND);.       
77c0: 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28   exprAnalyzeAll(
77d0: 70 53 72 63 2c 20 70 41 6e 64 57 43 29 3b 0a 20  pSrc, pAndWC);. 
77e0: 20 20 20 20 20 20 20 70 41 6e 64 57 43 2d 3e 70         pAndWC->p
77f0: 4f 75 74 65 72 20 3d 20 70 57 43 3b 0a 20 20 20  Outer = pWC;.   
7800: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 64       testcase( d
7810: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
7820: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
7830: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
7840: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   ){.          fo
7850: 72 28 6a 3d 30 2c 20 70 41 6e 64 54 65 72 6d 3d  r(j=0, pAndTerm=
7860: 70 41 6e 64 57 43 2d 3e 61 3b 20 6a 3c 70 41 6e  pAndWC->a; j<pAn
7870: 64 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c  dWC->nTerm; j++,
7880: 20 70 41 6e 64 54 65 72 6d 2b 2b 29 7b 0a 20 20   pAndTerm++){.  
7890: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
78a0: 28 20 70 41 6e 64 54 65 72 6d 2d 3e 70 45 78 70  ( pAndTerm->pExp
78b0: 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r );.           
78c0: 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70   if( allowedOp(p
78d0: 41 6e 64 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  AndTerm->pExpr->
78e0: 6f 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  op) ){.         
78f0: 20 20 20 20 20 62 20 7c 3d 20 67 65 74 4d 61 73       b |= getMas
7900: 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
7910: 53 65 74 2c 20 70 41 6e 64 54 65 72 6d 2d 3e 6c  Set, pAndTerm->l
7920: 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  eftCursor);.    
7930: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7940: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
7950: 20 20 20 20 20 20 20 20 69 6e 64 65 78 61 62 6c          indexabl
7960: 65 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a  e &= b;.      }.
7970: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f      }else if( pO
7980: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
7990: 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 29 7b 0a   TERM_COPIED ){.
79a0: 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 74 68        /* Skip th
79b0: 69 73 20 74 65 72 6d 20 66 6f 72 20 6e 6f 77 2e  is term for now.
79c0: 20 20 57 65 20 72 65 76 69 73 69 74 20 69 74 20    We revisit it 
79d0: 77 68 65 6e 20 77 65 20 70 72 6f 63 65 73 73 20  when we process 
79e0: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72  the.      ** cor
79f0: 72 65 73 70 6f 6e 64 69 6e 67 20 54 45 52 4d 5f  responding TERM_
7a00: 56 49 52 54 55 41 4c 20 74 65 72 6d 20 2a 2f 0a  VIRTUAL term */.
7a10: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7a20: 20 42 69 74 6d 61 73 6b 20 62 3b 0a 20 20 20 20   Bitmask b;.    
7a30: 20 20 62 20 3d 20 67 65 74 4d 61 73 6b 28 26 70    b = getMask(&p
7a40: 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c  WInfo->sMaskSet,
7a50: 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75   pOrTerm->leftCu
7a60: 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 69 66 28  rsor);.      if(
7a70: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67   pOrTerm->wtFlag
7a80: 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
7a90: 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72   ){.        Wher
7aa0: 65 54 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20  eTerm *pOther = 
7ab0: 26 70 4f 72 57 63 2d 3e 61 5b 70 4f 72 54 65 72  &pOrWc->a[pOrTer
7ac0: 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20  m->iParent];.   
7ad0: 20 20 20 20 20 62 20 7c 3d 20 67 65 74 4d 61 73       b |= getMas
7ae0: 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
7af0: 53 65 74 2c 20 70 4f 74 68 65 72 2d 3e 6c 65 66  Set, pOther->lef
7b00: 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  tCursor);.      
7b10: 7d 0a 20 20 20 20 20 20 69 6e 64 65 78 61 62 6c  }.      indexabl
7b20: 65 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 69 66  e &= b;.      if
7b30: 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65  ( (pOrTerm->eOpe
7b40: 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 29 3d 3d  rator & WO_EQ)==
7b50: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 6e  0 ){.        chn
7b60: 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20  gToIN = 0;.     
7b70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7b80: 63 68 6e 67 54 6f 49 4e 20 26 3d 20 62 3b 0a 20  chngToIN &= b;. 
7b90: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
7ba0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 63 6f  ..  /*.  ** Reco
7bb0: 72 64 20 74 68 65 20 73 65 74 20 6f 66 20 74 61  rd the set of ta
7bc0: 62 6c 65 73 20 74 68 61 74 20 73 61 74 69 73 66  bles that satisf
7bd0: 79 20 63 61 73 65 20 32 2e 20 20 54 68 65 20 73  y case 2.  The s
7be0: 65 74 20 6d 69 67 68 74 20 62 65 0a 20 20 2a 2a  et might be.  **
7bf0: 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 70   empty..  */.  p
7c00: 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c  OrInfo->indexabl
7c10: 65 20 3d 20 69 6e 64 65 78 61 62 6c 65 3b 0a 20  e = indexable;. 
7c20: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
7c30: 72 20 3d 20 69 6e 64 65 78 61 62 6c 65 3d 3d 30  r = indexable==0
7c40: 20 3f 20 30 20 3a 20 57 4f 5f 4f 52 3b 0a 0a 20   ? 0 : WO_OR;.. 
7c50: 20 2f 2a 0a 20 20 2a 2a 20 63 68 6e 67 54 6f 49   /*.  ** chngToI
7c60: 4e 20 68 6f 6c 64 73 20 61 20 73 65 74 20 6f 66  N holds a set of
7c70: 20 74 61 62 6c 65 73 20 74 68 61 74 20 2a 6d 69   tables that *mi
7c80: 67 68 74 2a 20 73 61 74 69 73 66 79 20 63 61 73  ght* satisfy cas
7c90: 65 20 31 2e 20 20 42 75 74 0a 20 20 2a 2a 20 77  e 1.  But.  ** w
7ca0: 65 20 68 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d  e have to do som
7cb0: 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 68 65  e additional che
7cc0: 63 6b 69 6e 67 20 74 6f 20 73 65 65 20 69 66 20  cking to see if 
7cd0: 63 61 73 65 20 31 20 72 65 61 6c 6c 79 0a 20 20  case 1 really.  
7ce0: 2a 2a 20 69 73 20 73 61 74 69 73 66 69 65 64 2e  ** is satisfied.
7cf0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 63 68 6e 67 54  .  **.  ** chngT
7d00: 6f 49 4e 20 77 69 6c 6c 20 68 6f 6c 64 20 65 69  oIN will hold ei
7d10: 74 68 65 72 20 30 2c 20 31 2c 20 6f 72 20 32 20  ther 0, 1, or 2 
7d20: 62 69 74 73 2e 20 20 54 68 65 20 30 2d 62 69 74  bits.  The 0-bit
7d30: 20 63 61 73 65 20 6d 65 61 6e 73 0a 20 20 2a 2a   case means.  **
7d40: 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e   that there is n
7d50: 6f 20 70 6f 73 73 69 62 69 6c 69 74 79 20 6f 66  o possibility of
7d60: 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74 68   transforming th
7d70: 65 20 4f 52 20 63 6c 61 75 73 65 20 69 6e 74 6f  e OR clause into
7d80: 20 61 6e 0a 20 20 2a 2a 20 49 4e 20 6f 70 65 72   an.  ** IN oper
7d90: 61 74 6f 72 20 62 65 63 61 75 73 65 20 6f 6e 65  ator because one
7da0: 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 20 69   or more terms i
7db0: 6e 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20  n the OR clause 
7dc0: 63 6f 6e 74 61 69 6e 0a 20 20 2a 2a 20 73 6f 6d  contain.  ** som
7dd0: 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61  ething other tha
7de0: 6e 20 3d 3d 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e  n == on a column
7df0: 20 69 6e 20 74 68 65 20 73 69 6e 67 6c 65 20 74   in the single t
7e00: 61 62 6c 65 2e 20 20 54 68 65 20 31 2d 62 69 74  able.  The 1-bit
7e10: 0a 20 20 2a 2a 20 63 61 73 65 20 6d 65 61 6e 73  .  ** case means
7e20: 20 74 68 61 74 20 65 76 65 72 79 20 74 65 72 6d   that every term
7e30: 20 6f 66 20 74 68 65 20 4f 52 20 63 6c 61 75 73   of the OR claus
7e40: 65 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  e is of the form
7e50: 0a 20 20 2a 2a 20 22 74 61 62 6c 65 2e 63 6f 6c  .  ** "table.col
7e60: 75 6d 6e 3d 65 78 70 72 22 20 66 6f 72 20 73 6f  umn=expr" for so
7e70: 6d 65 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e  me single table.
7e80: 20 20 54 68 65 20 6f 6e 65 20 62 69 74 20 74 68    The one bit th
7e90: 61 74 20 69 73 20 73 65 74 0a 20 20 2a 2a 20 77  at is set.  ** w
7ea0: 69 6c 6c 20 63 6f 72 72 65 73 70 6f 6e 64 20 74  ill correspond t
7eb0: 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 74 61 62  o the common tab
7ec0: 6c 65 2e 20 20 57 65 20 73 74 69 6c 6c 20 6e 65  le.  We still ne
7ed0: 65 64 20 74 6f 20 63 68 65 63 6b 20 74 6f 20 6d  ed to check to m
7ee0: 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 74 68  ake.  ** sure th
7ef0: 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 69 73  e same column is
7f00: 20 75 73 65 64 20 6f 6e 20 61 6c 6c 20 74 65 72   used on all ter
7f10: 6d 73 2e 20 20 54 68 65 20 32 2d 62 69 74 20 63  ms.  The 2-bit c
7f20: 61 73 65 20 69 73 20 77 68 65 6e 0a 20 20 2a 2a  ase is when.  **
7f30: 20 74 68 65 20 61 6c 6c 20 74 65 72 6d 73 20 61   the all terms a
7f40: 72 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  re of the form "
7f50: 74 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e 3d 74 61  table1.column=ta
7f60: 62 6c 65 32 2e 63 6f 6c 75 6d 6e 22 2e 20 20 49  ble2.column".  I
7f70: 74 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20  t.  ** might be 
7f80: 70 6f 73 73 69 62 6c 65 20 74 6f 20 66 6f 72 6d  possible to form
7f90: 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   an IN operator 
7fa0: 77 69 74 68 20 65 69 74 68 65 72 20 74 61 62 6c  with either tabl
7fb0: 65 31 2e 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6f  e1.column.  ** o
7fc0: 72 20 74 61 62 6c 65 32 2e 63 6f 6c 75 6d 6e 20  r table2.column 
7fd0: 61 73 20 74 68 65 20 4c 48 53 20 69 66 20 65 69  as the LHS if ei
7fe0: 74 68 65 72 20 69 73 20 63 6f 6d 6d 6f 6e 20 74  ther is common t
7ff0: 6f 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66 0a  o every term of.
8000: 20 20 2a 2a 20 74 68 65 20 4f 52 20 63 6c 61 75    ** the OR clau
8010: 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f  se..  **.  ** No
8020: 74 65 20 74 68 61 74 20 74 65 72 6d 73 20 6f 66  te that terms of
8030: 20 74 68 65 20 66 6f 72 6d 20 22 74 61 62 6c 65   the form "table
8040: 2e 63 6f 6c 75 6d 6e 31 3d 74 61 62 6c 65 2e 63  .column1=table.c
8050: 6f 6c 75 6d 6e 32 22 20 28 74 68 65 0a 20 20 2a  olumn2" (the.  *
8060: 2a 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 6e 20  * same table on 
8070: 62 6f 74 68 20 73 69 7a 65 73 20 6f 66 20 74 68  both sizes of th
8080: 65 20 3d 3d 29 20 63 61 6e 6e 6f 74 20 62 65 20  e ==) cannot be 
8090: 6f 70 74 69 6d 69 7a 65 64 2e 0a 20 20 2a 2f 0a  optimized..  */.
80a0: 20 20 69 66 28 20 63 68 6e 67 54 6f 49 4e 20 29    if( chngToIN )
80b0: 7b 0a 20 20 20 20 69 6e 74 20 6f 6b 54 6f 43 68  {.    int okToCh
80c0: 6e 67 54 6f 49 4e 20 3d 20 30 3b 20 20 20 20 20  ngToIN = 0;     
80d0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 63  /* True if the c
80e0: 6f 6e 76 65 72 73 69 6f 6e 20 74 6f 20 49 4e 20  onversion to IN 
80f0: 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 20 20  is valid */.    
8100: 69 6e 74 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31  int iColumn = -1
8110: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c  ;         /* Col
8120: 75 6d 6e 20 69 6e 64 65 78 20 6f 6e 20 6c 68 73  umn index on lhs
8130: 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   of IN operator 
8140: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 75 72 73  */.    int iCurs
8150: 6f 72 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20  or = -1;        
8160: 20 2f 2a 20 54 61 62 6c 65 20 63 75 72 73 6f 72   /* Table cursor
8170: 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 74   common to all t
8180: 65 72 6d 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  erms */.    int 
8190: 6a 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  j = 0;          
81a0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
81b0: 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a  unter */..    /*
81c0: 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 74 61   Search for a ta
81d0: 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 74  ble and column t
81e0: 68 61 74 20 61 70 70 65 61 72 73 20 6f 6e 20 6f  hat appears on o
81f0: 6e 65 20 73 69 64 65 20 6f 72 20 74 68 65 0a 20  ne side or the. 
8200: 20 20 20 2a 2a 20 6f 74 68 65 72 20 6f 66 20 74     ** other of t
8210: 68 65 20 3d 3d 20 6f 70 65 72 61 74 6f 72 20 69  he == operator i
8220: 6e 20 65 76 65 72 79 20 73 75 62 74 65 72 6d 2e  n every subterm.
8230: 20 20 54 68 61 74 20 74 61 62 6c 65 20 61 6e 64    That table and
8240: 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2a 20 77   column.    ** w
8250: 69 6c 6c 20 62 65 20 72 65 63 6f 72 64 65 64 20  ill be recorded 
8260: 69 6e 20 69 43 75 72 73 6f 72 20 61 6e 64 20 69  in iCursor and i
8270: 43 6f 6c 75 6d 6e 2e 20 20 54 68 65 72 65 20 6d  Column.  There m
8280: 69 67 68 74 20 6e 6f 74 20 62 65 20 61 6e 79 0a  ight not be any.
8290: 20 20 20 20 2a 2a 20 73 75 63 68 20 74 61 62 6c      ** such tabl
82a0: 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20 53  e and column.  S
82b0: 65 74 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20  et okToChngToIN 
82c0: 69 66 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  if an appropriat
82d0: 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 61  e table.    ** a
82e0: 6e 64 20 63 6f 6c 75 6d 6e 20 69 73 20 66 6f 75  nd column is fou
82f0: 6e 64 20 62 75 74 20 6c 65 61 76 65 20 6f 6b 54  nd but leave okT
8300: 6f 43 68 6e 67 54 6f 49 4e 20 66 61 6c 73 65 20  oChngToIN false 
8310: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20  if not found..  
8320: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30    */.    for(j=0
8330: 3b 20 6a 3c 32 20 26 26 20 21 6f 6b 54 6f 43 68  ; j<2 && !okToCh
8340: 6e 67 54 6f 49 4e 3b 20 6a 2b 2b 29 7b 0a 20 20  ngToIN; j++){.  
8350: 20 20 20 20 70 4f 72 54 65 72 6d 20 3d 20 70 4f      pOrTerm = pO
8360: 72 57 63 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f  rWc->a;.      fo
8370: 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d  r(i=pOrWc->nTerm
8380: 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70  -1; i>=0; i--, p
8390: 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20  OrTerm++){.     
83a0: 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65     assert( pOrTe
83b0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
83c0: 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20  WO_EQ );.       
83d0: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67   pOrTerm->wtFlag
83e0: 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b  s &= ~TERM_OR_OK
83f0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  ;.        if( pO
8400: 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  rTerm->leftCurso
8410: 72 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20  r==iCursor ){.  
8420: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
8430: 69 73 20 74 68 65 20 32 2d 62 69 74 20 63 61 73  is the 2-bit cas
8440: 65 20 61 6e 64 20 77 65 20 61 72 65 20 6f 6e 20  e and we are on 
8450: 74 68 65 20 73 65 63 6f 6e 64 20 69 74 65 72 61  the second itera
8460: 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20  tion and.       
8470: 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 74 65     ** current te
8480: 72 6d 20 69 73 20 66 72 6f 6d 20 74 68 65 20 66  rm is from the f
8490: 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 2e 20  irst iteration. 
84a0: 20 53 6f 20 73 6b 69 70 20 74 68 69 73 20 74 65   So skip this te
84b0: 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  rm. */.         
84c0: 20 61 73 73 65 72 74 28 20 6a 3d 3d 31 20 29 3b   assert( j==1 );
84d0: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
84e0: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nue;.        }. 
84f0: 20 20 20 20 20 20 20 69 66 28 20 28 63 68 6e 67         if( (chng
8500: 54 6f 49 4e 20 26 20 67 65 74 4d 61 73 6b 28 26  ToIN & getMask(&
8510: 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
8520: 2c 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  , pOrTerm->leftC
8530: 75 72 73 6f 72 29 29 3d 3d 30 20 29 7b 0a 20 20  ursor))==0 ){.  
8540: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
8550: 74 65 72 6d 20 6d 75 73 74 20 62 65 20 6f 66 20  term must be of 
8560: 74 68 65 20 66 6f 72 6d 20 74 31 2e 61 3d 3d 74  the form t1.a==t
8570: 32 2e 62 20 77 68 65 72 65 20 74 32 20 69 73 20  2.b where t2 is 
8580: 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  in the.         
8590: 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 73 65 74   ** chngToIN set
85a0: 20 62 75 74 20 74 31 20 69 73 20 6e 6f 74 2e 20   but t1 is not. 
85b0: 20 54 68 69 73 20 74 65 72 6d 20 77 69 6c 6c 20   This term will 
85c0: 62 65 20 65 69 74 68 65 72 20 70 72 65 63 65 64  be either preced
85d0: 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ed.          ** 
85e0: 6f 72 20 66 6f 6c 6c 77 65 64 20 62 79 20 61 6e  or follwed by an
85f0: 20 69 6e 76 65 72 74 65 64 20 63 6f 70 79 20 28   inverted copy (
8600: 74 32 2e 62 3d 3d 74 31 2e 61 29 2e 20 20 53 6b  t2.b==t1.a).  Sk
8610: 69 70 20 74 68 69 73 20 74 65 72 6d 20 0a 20 20  ip this term .  
8620: 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 75          ** and u
8630: 73 65 20 69 74 73 20 69 6e 76 65 72 73 69 6f 6e  se its inversion
8640: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74  . */.          t
8650: 65 73 74 63 61 73 65 28 20 70 4f 72 54 65 72 6d  estcase( pOrTerm
8660: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
8670: 5f 43 4f 50 49 45 44 20 29 3b 0a 20 20 20 20 20  _COPIED );.     
8680: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
8690: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
86a0: 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
86b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
86c0: 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46  rt( pOrTerm->wtF
86d0: 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 43 4f 50  lags & (TERM_COP
86e0: 49 45 44 7c 54 45 52 4d 5f 56 49 52 54 55 41 4c  IED|TERM_VIRTUAL
86f0: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ) );.          c
8700: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
8710: 20 7d 0a 20 20 20 20 20 20 20 20 69 43 6f 6c 75   }.        iColu
8720: 6d 6e 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 75 2e  mn = pOrTerm->u.
8730: 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  leftColumn;.    
8740: 20 20 20 20 69 43 75 72 73 6f 72 20 3d 20 70 4f      iCursor = pO
8750: 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  rTerm->leftCurso
8760: 72 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  r;.        break
8770: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8780: 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 20  if( i<0 ){.     
8790: 20 20 20 2f 2a 20 4e 6f 20 63 61 6e 64 69 64 61     /* No candida
87a0: 74 65 20 74 61 62 6c 65 2b 63 6f 6c 75 6d 6e 20  te table+column 
87b0: 77 61 73 20 66 6f 75 6e 64 2e 20 20 54 68 69 73  was found.  This
87c0: 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 0a   can only occur.
87d0: 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68          ** on th
87e0: 65 20 73 65 63 6f 6e 64 20 69 74 65 72 61 74 69  e second iterati
87f0: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  on */.        as
8800: 73 65 72 74 28 20 6a 3d 3d 31 20 29 3b 0a 20 20  sert( j==1 );.  
8810: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 49 73        assert( Is
8820: 50 6f 77 65 72 4f 66 54 77 6f 28 63 68 6e 67 54  PowerOfTwo(chngT
8830: 6f 49 4e 29 20 29 3b 0a 20 20 20 20 20 20 20 20  oIN) );.        
8840: 61 73 73 65 72 74 28 20 63 68 6e 67 54 6f 49 4e  assert( chngToIN
8850: 3d 3d 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66  ==getMask(&pWInf
8860: 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43 75  o->sMaskSet, iCu
8870: 72 73 6f 72 29 20 29 3b 0a 20 20 20 20 20 20 20  rsor) );.       
8880: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
8890: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
88a0: 6a 3d 3d 31 20 29 3b 0a 0a 20 20 20 20 20 20 2f  j==1 );..      /
88b0: 2a 20 57 65 20 68 61 76 65 20 66 6f 75 6e 64 20  * We have found 
88c0: 61 20 63 61 6e 64 69 64 61 74 65 20 74 61 62 6c  a candidate tabl
88d0: 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20 43  e and column.  C
88e0: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
88f0: 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 74 61 62  hat.      ** tab
8900: 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 73  le and column is
8910: 20 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 72 79   common to every
8920: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 4f 52 20   term in the OR 
8930: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
8940: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 31  okToChngToIN = 1
8950: 3b 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 69 3e  ;.      for(; i>
8960: 3d 30 20 26 26 20 6f 6b 54 6f 43 68 6e 67 54 6f  =0 && okToChngTo
8970: 49 4e 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d  IN; i--, pOrTerm
8980: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ++){.        ass
8990: 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f  ert( pOrTerm->eO
89a0: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20  perator & WO_EQ 
89b0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
89c0: 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  OrTerm->leftCurs
89d0: 6f 72 21 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20  or!=iCursor ){. 
89e0: 20 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d           pOrTerm
89f0: 2d 3e 77 74 46 6c 61 67 73 20 26 3d 20 7e 54 45  ->wtFlags &= ~TE
8a00: 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20  RM_OR_OK;.      
8a10: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54    }else if( pOrT
8a20: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
8a30: 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  n!=iColumn ){.  
8a40: 20 20 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67          okToChng
8a50: 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20  ToIN = 0;.      
8a60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8a70: 20 20 20 69 6e 74 20 61 66 66 4c 65 66 74 2c 20     int affLeft, 
8a80: 61 66 66 52 69 67 68 74 3b 0a 20 20 20 20 20 20  affRight;.      
8a90: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 69      /* If the ri
8aa0: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73  ght-hand side is
8ab0: 20 61 6c 73 6f 20 61 20 63 6f 6c 75 6d 6e 2c 20   also a column, 
8ac0: 74 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74  then the affinit
8ad0: 69 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ies.          **
8ae0: 20 6f 66 20 62 6f 74 68 20 72 69 67 68 74 20 61   of both right a
8af0: 6e 64 20 6c 65 66 74 20 73 69 64 65 73 20 6d 75  nd left sides mu
8b00: 73 74 20 62 65 20 73 75 63 68 20 74 68 61 74 20  st be such that 
8b10: 6e 6f 20 74 79 70 65 0a 20 20 20 20 20 20 20 20  no type.        
8b20: 20 20 2a 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 73    ** conversions
8b30: 20 61 72 65 20 72 65 71 75 69 72 65 64 20 6f 6e   are required on
8b40: 20 74 68 65 20 72 69 67 68 74 2e 20 20 28 54 69   the right.  (Ti
8b50: 63 6b 65 74 20 23 32 32 34 39 29 0a 20 20 20 20  cket #2249).    
8b60: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
8b70: 20 20 20 61 66 66 52 69 67 68 74 20 3d 20 73 71     affRight = sq
8b80: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
8b90: 79 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72  y(pOrTerm->pExpr
8ba0: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
8bb0: 20 20 20 20 20 61 66 66 4c 65 66 74 20 3d 20 73       affLeft = s
8bc0: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
8bd0: 74 79 28 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70  ty(pOrTerm->pExp
8be0: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
8bf0: 20 20 20 20 20 69 66 28 20 61 66 66 52 69 67 68       if( affRigh
8c00: 74 21 3d 30 20 26 26 20 61 66 66 52 69 67 68 74  t!=0 && affRight
8c10: 21 3d 61 66 66 4c 65 66 74 20 29 7b 0a 20 20 20  !=affLeft ){.   
8c20: 20 20 20 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e           okToChn
8c30: 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20  gToIN = 0;.     
8c40: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8c50: 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d          pOrTerm-
8c60: 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
8c70: 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  _OR_OK;.        
8c80: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
8c90: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
8ca0: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
8cb0: 74 2c 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20  t, okToChngToIN 
8cc0: 69 73 20 74 72 75 65 20 69 66 20 6f 72 69 67 69  is true if origi
8cd0: 6e 61 6c 20 70 54 65 72 6d 20 73 61 74 69 73 66  nal pTerm satisf
8ce0: 69 65 73 0a 20 20 20 20 2a 2a 20 63 61 73 65 20  ies.    ** case 
8cf0: 31 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65  1.  In that case
8d00: 2c 20 63 6f 6e 73 74 72 75 63 74 20 61 20 6e 65  , construct a ne
8d10: 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 74  w virtual term t
8d20: 68 61 74 20 69 73 20 0a 20 20 20 20 2a 2a 20 70  hat is .    ** p
8d30: 54 65 72 6d 20 63 6f 6e 76 65 72 74 65 64 20 69  Term converted i
8d40: 6e 74 6f 20 61 6e 20 49 4e 20 6f 70 65 72 61 74  nto an IN operat
8d50: 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  or..    */.    i
8d60: 66 28 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20  f( okToChngToIN 
8d70: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
8d80: 44 75 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  Dup;            
8d90: 2f 2a 20 41 20 74 72 61 6e 73 69 65 6e 74 20 64  /* A transient d
8da0: 75 70 6c 69 63 61 74 65 20 65 78 70 72 65 73 73  uplicate express
8db0: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  ion */.      Exp
8dc0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 30  rList *pList = 0
8dd0: 3b 20 20 20 2f 2a 20 54 68 65 20 52 48 53 20 6f  ;   /* The RHS o
8de0: 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
8df0: 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  r */.      Expr 
8e00: 2a 70 4c 65 66 74 20 3d 20 30 3b 20 20 20 20 20  *pLeft = 0;     
8e10: 20 20 2f 2a 20 54 68 65 20 4c 48 53 20 6f 66 20    /* The LHS of 
8e20: 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
8e30: 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
8e40: 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
8e50: 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20  /* The complete 
8e60: 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 0a  IN operator */..
8e70: 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4f 72 57        for(i=pOrW
8e80: 63 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54  c->nTerm-1, pOrT
8e90: 65 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e  erm=pOrWc->a; i>
8ea0: 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d  =0; i--, pOrTerm
8eb0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
8ec0: 20 28 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61   (pOrTerm->wtFla
8ed0: 67 73 20 26 20 54 45 52 4d 5f 4f 52 5f 4f 4b 29  gs & TERM_OR_OK)
8ee0: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
8ef0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
8f00: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
8f10: 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20  or & WO_EQ );.  
8f20: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
8f30: 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  rTerm->leftCurso
8f40: 72 3d 3d 69 43 75 72 73 6f 72 20 29 3b 0a 20 20  r==iCursor );.  
8f50: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
8f60: 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  rTerm->u.leftCol
8f70: 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 3b 0a  umn==iColumn );.
8f80: 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 73          pDup = s
8f90: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
8fa0: 2c 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72  , pOrTerm->pExpr
8fb0: 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20  ->pRight, 0);.  
8fc0: 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71        pList = sq
8fd0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
8fe0: 65 6e 64 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72  end(pWInfo->pPar
8ff0: 73 65 2c 20 70 4c 69 73 74 2c 20 70 44 75 70 29  se, pList, pDup)
9000: 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 66 74 20  ;.        pLeft 
9010: 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72  = pOrTerm->pExpr
9020: 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 7d  ->pLeft;.      }
9030: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9040: 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  Left!=0 );.     
9050: 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45   pDup = sqlite3E
9060: 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74  xprDup(db, pLeft
9070: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  , 0);.      pNew
9080: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
9090: 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e 2c 20 70  pParse, TK_IN, p
90a0: 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Dup, 0, 0);.    
90b0: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
90c0: 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77        int idxNew
90d0: 3b 0a 20 20 20 20 20 20 20 20 74 72 61 6e 73 66  ;.        transf
90e0: 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70  erJoinMarkings(p
90f0: 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  New, pExpr);.   
9100: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
9110: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e  prHasProperty(pN
9120: 65 77 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  ew, EP_xIsSelect
9130: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  ) );.        pNe
9140: 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69  w->x.pList = pLi
9150: 73 74 3b 0a 20 20 20 20 20 20 20 20 69 64 78 4e  st;.        idxN
9160: 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65  ew = whereClause
9170: 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77  Insert(pWC, pNew
9180: 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  , TERM_VIRTUAL|T
9190: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
91a0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
91b0: 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20  idxNew==0 );.   
91c0: 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65       exprAnalyze
91d0: 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e  (pSrc, pWC, idxN
91e0: 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65  ew);.        pTe
91f0: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
9200: 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20 70  Term];.        p
9210: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e 69 50  WC->a[idxNew].iP
9220: 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b  arent = idxTerm;
9230: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  .        pTerm->
9240: 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20  nChild = 1;.    
9250: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9260: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
9270: 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74  Delete(db, pList
9280: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
9290: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
92a0: 72 20 3d 20 57 4f 5f 4e 4f 4f 50 3b 20 20 2f 2a  r = WO_NOOP;  /*
92b0: 20 63 61 73 65 20 31 20 74 72 75 6d 70 73 20 63   case 1 trumps c
92c0: 61 73 65 20 32 20 2a 2f 0a 20 20 20 20 7d 0a 20  ase 2 */.    }. 
92d0: 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21   }.}.#endif /* !
92e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f  SQLITE_OMIT_OR_O
92f0: 50 54 49 4d 49 5a 41 54 49 4f 4e 20 26 26 20 21  PTIMIZATION && !
9300: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
9310: 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  UERY */../*.** T
9320: 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68 69 73  he input to this
9330: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 57   routine is an W
9340: 68 65 72 65 54 65 72 6d 20 73 74 72 75 63 74 75  hereTerm structu
9350: 72 65 20 77 69 74 68 20 6f 6e 6c 79 20 74 68 65  re with only the
9360: 0a 2a 2a 20 22 70 45 78 70 72 22 20 66 69 65 6c  .** "pExpr" fiel
9370: 64 20 66 69 6c 6c 65 64 20 69 6e 2e 20 20 54 68  d filled in.  Th
9380: 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f  e job of this ro
9390: 75 74 69 6e 65 20 69 73 20 74 6f 20 61 6e 61 6c  utine is to anal
93a0: 79 7a 65 20 74 68 65 0a 2a 2a 20 73 75 62 65 78  yze the.** subex
93b0: 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70 6f 70  pression and pop
93c0: 75 6c 61 74 65 20 61 6c 6c 20 74 68 65 20 6f 74  ulate all the ot
93d0: 68 65 72 20 66 69 65 6c 64 73 20 6f 66 20 74 68  her fields of th
93e0: 65 20 57 68 65 72 65 54 65 72 6d 0a 2a 2a 20 73  e WhereTerm.** s
93f0: 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20  tructure..**.** 
9400: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
9410: 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  n is of the form
9420: 20 22 3c 65 78 70 72 3e 20 3c 6f 70 3e 20 58 22   "<expr> <op> X"
9430: 20 69 74 20 67 65 74 73 20 63 6f 6d 6d 75 74 65   it gets commute
9440: 64 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 6e  d.** to the stan
9450: 64 61 72 64 20 66 6f 72 6d 20 6f 66 20 22 58 20  dard form of "X 
9460: 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 2e 0a 2a 2a  <op> <expr>"..**
9470: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
9480: 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20  ssion is of the 
9490: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59 22 20  form "X <op> Y" 
94a0: 77 68 65 72 65 20 62 6f 74 68 20 58 20 61 6e 64  where both X and
94b0: 20 59 20 61 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e   Y are.** column
94c0: 73 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67  s, then the orig
94d0: 69 6e 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 20  inal expression 
94e0: 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  is unchanged and
94f0: 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 0a 2a   a new virtual.*
9500: 2a 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f  * term of the fo
9510: 72 6d 20 22 59 20 3c 6f 70 3e 20 58 22 20 69 73  rm "Y <op> X" is
9520: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 57 48   added to the WH
9530: 45 52 45 20 63 6c 61 75 73 65 20 61 6e 64 0a 2a  ERE clause and.*
9540: 2a 20 61 6e 61 6c 79 7a 65 64 20 73 65 70 61 72  * analyzed separ
9550: 61 74 65 6c 79 2e 20 20 54 68 65 20 6f 72 69 67  ately.  The orig
9560: 69 6e 61 6c 20 74 65 72 6d 20 69 73 20 6d 61 72  inal term is mar
9570: 6b 65 64 20 77 69 74 68 20 54 45 52 4d 5f 43 4f  ked with TERM_CO
9580: 50 49 45 44 0a 2a 2a 20 61 6e 64 20 74 68 65 20  PIED.** and the 
9590: 6e 65 77 20 74 65 72 6d 20 69 73 20 6d 61 72 6b  new term is mark
95a0: 65 64 20 77 69 74 68 20 54 45 52 4d 5f 44 59 4e  ed with TERM_DYN
95b0: 41 4d 49 43 20 28 62 65 63 61 75 73 65 20 69 74  AMIC (because it
95c0: 27 73 20 70 45 78 70 72 0a 2a 2a 20 6e 65 65 64  's pExpr.** need
95d0: 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 77 69  s to be freed wi
95e0: 74 68 20 74 68 65 20 57 68 65 72 65 43 6c 61 75  th the WhereClau
95f0: 73 65 29 20 61 6e 64 20 54 45 52 4d 5f 56 49 52  se) and TERM_VIR
9600: 54 55 41 4c 20 28 62 65 63 61 75 73 65 20 69 74  TUAL (because it
9610: 0a 2a 2a 20 69 73 20 61 20 63 6f 6d 6d 75 74 65  .** is a commute
9620: 64 20 63 6f 70 79 20 6f 66 20 61 20 70 72 69 6f  d copy of a prio
9630: 72 20 74 65 72 6d 2e 29 20 20 54 68 65 20 6f 72  r term.)  The or
9640: 69 67 69 6e 61 6c 20 74 65 72 6d 20 68 61 73 20  iginal term has 
9650: 6e 43 68 69 6c 64 3d 31 0a 2a 2a 20 61 6e 64 20  nChild=1.** and 
9660: 74 68 65 20 63 6f 70 79 20 68 61 73 20 69 64 78  the copy has idx
9670: 50 61 72 65 6e 74 20 73 65 74 20 74 6f 20 74 68  Parent set to th
9680: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6f  e index of the o
9690: 72 69 67 69 6e 61 6c 20 74 65 72 6d 2e 0a 2a 2f  riginal term..*/
96a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
96b0: 72 41 6e 61 6c 79 7a 65 28 0a 20 20 53 72 63 4c  rAnalyze(.  SrcL
96c0: 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20  ist *pSrc,      
96d0: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f        /* the FRO
96e0: 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  M clause */.  Wh
96f0: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
9700: 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 57          /* the W
9710: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
9720: 20 69 6e 74 20 69 64 78 54 65 72 6d 20 20 20 20   int idxTerm    
9730: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
9740: 64 65 78 20 6f 66 20 74 68 65 20 74 65 72 6d 20  dex of the term 
9750: 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a  to be analyzed *
9760: 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  /.){.  WhereInfo
9770: 20 2a 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e   *pWInfo = pWC->
9780: 70 57 49 6e 66 6f 3b 20 2f 2a 20 57 48 45 52 45  pWInfo; /* WHERE
9790: 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
97a0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
97b0: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
97c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
97d0: 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 74 6f 20   /* The term to 
97e0: 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20  be analyzed */. 
97f0: 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70   WhereMaskSet *p
9800: 4d 61 73 6b 53 65 74 3b 20 20 20 20 20 20 20 20  MaskSet;        
9810: 20 20 2f 2a 20 53 65 74 20 6f 66 20 74 61 62 6c    /* Set of tabl
9820: 65 20 69 6e 64 65 78 20 6d 61 73 6b 73 20 2a 2f  e index masks */
9830: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20  .  Expr *pExpr; 
9840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9850: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
9860: 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 6e 61 6c  ssion to be anal
9870: 79 7a 65 64 20 2a 2f 0a 20 20 42 69 74 6d 61 73  yzed */.  Bitmas
9880: 6b 20 70 72 65 72 65 71 4c 65 66 74 3b 20 20 20  k prereqLeft;   
9890: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
98a0: 65 72 65 71 75 65 73 69 74 65 73 20 6f 66 20 74  erequesites of t
98b0: 68 65 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  he pExpr->pLeft 
98c0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65  */.  Bitmask pre
98d0: 72 65 71 41 6c 6c 3b 20 20 20 20 20 20 20 20 20  reqAll;         
98e0: 20 20 20 20 20 20 2f 2a 20 50 72 65 72 65 71 75        /* Prerequ
98f0: 65 73 69 74 65 73 20 6f 66 20 70 45 78 70 72 20  esites of pExpr 
9900: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65 78 74  */.  Bitmask ext
9910: 72 61 52 69 67 68 74 20 3d 20 30 3b 20 20 20 20  raRight = 0;    
9920: 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 64        /* Extra d
9930: 65 70 65 6e 64 65 6e 63 69 65 73 20 6f 6e 20 4c  ependencies on L
9940: 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a 20 20 45 78  EFT JOIN */.  Ex
9950: 70 72 20 2a 70 53 74 72 31 20 3d 20 30 3b 20 20  pr *pStr1 = 0;  
9960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9970: 2a 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c  * RHS of LIKE/GL
9980: 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  OB operator */. 
9990: 20 69 6e 74 20 69 73 43 6f 6d 70 6c 65 74 65 20   int isComplete 
99a0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
99b0: 20 20 2f 2a 20 52 48 53 20 6f 66 20 4c 49 4b 45    /* RHS of LIKE
99c0: 2f 47 4c 4f 42 20 65 6e 64 73 20 77 69 74 68 20  /GLOB ends with 
99d0: 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20 20 69 6e  wildcard */.  in
99e0: 74 20 6e 6f 43 61 73 65 20 3d 20 30 3b 20 20 20  t noCase = 0;   
99f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9a00: 2a 20 4c 49 4b 45 2f 47 4c 4f 42 20 64 69 73 74  * LIKE/GLOB dist
9a10: 69 6e 67 75 69 73 68 65 73 20 63 61 73 65 20 2a  inguishes case *
9a20: 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20  /.  int op;     
9a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a40: 20 20 20 20 20 2f 2a 20 54 6f 70 2d 6c 65 76 65       /* Top-leve
9a50: 6c 20 6f 70 65 72 61 74 6f 72 2e 20 20 70 45 78  l operator.  pEx
9a60: 70 72 2d 3e 6f 70 20 2a 2f 0a 20 20 50 61 72 73  pr->op */.  Pars
9a70: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e  e *pParse = pWIn
9a80: 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20 2f 2a 20  fo->pParse;  /* 
9a90: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
9aa0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
9ab0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
9ac0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
9ad0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
9ae0: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
9af0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  cFailed ){.    r
9b00: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 65  eturn;.  }.  pTe
9b10: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
9b20: 54 65 72 6d 5d 3b 0a 20 20 70 4d 61 73 6b 53 65  Term];.  pMaskSe
9b30: 74 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  t = &pWInfo->sMa
9b40: 73 6b 53 65 74 3b 0a 20 20 70 45 78 70 72 20 3d  skSet;.  pExpr =
9b50: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
9b60: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
9b70: 6f 70 21 3d 54 4b 5f 41 53 20 26 26 20 70 45 78  op!=TK_AS && pEx
9b80: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 4c 41  pr->op!=TK_COLLA
9b90: 54 45 20 29 3b 0a 20 20 70 72 65 72 65 71 4c 65  TE );.  prereqLe
9ba0: 66 74 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73  ft = exprTableUs
9bb0: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45  age(pMaskSet, pE
9bc0: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 6f  xpr->pLeft);.  o
9bd0: 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20  p = pExpr->op;. 
9be0: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29   if( op==TK_IN )
9bf0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  {.    assert( pE
9c00: 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  xpr->pRight==0 )
9c10: 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  ;.    if( ExprHa
9c20: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
9c30: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
9c40: 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70  {.      pTerm->p
9c50: 72 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70  rereqRight = exp
9c60: 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67  rSelectTableUsag
9c70: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70  e(pMaskSet, pExp
9c80: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20  r->x.pSelect);. 
9c90: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9ca0: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
9cb0: 68 74 20 3d 20 65 78 70 72 4c 69 73 74 54 61 62  ht = exprListTab
9cc0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
9cd0: 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  , pExpr->x.pList
9ce0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
9cf0: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55   if( op==TK_ISNU
9d00: 4c 4c 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d  LL ){.    pTerm-
9d10: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 30  >prereqRight = 0
9d20: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
9d30: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
9d40: 74 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61  t = exprTableUsa
9d50: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78  ge(pMaskSet, pEx
9d60: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d  pr->pRight);.  }
9d70: 0a 20 20 70 72 65 72 65 71 41 6c 6c 20 3d 20 65  .  prereqAll = e
9d80: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
9d90: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 29 3b 0a  askSet, pExpr);.
9da0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
9db0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
9dc0: 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20  FromJoin) ){.   
9dd0: 20 42 69 74 6d 61 73 6b 20 78 20 3d 20 67 65 74   Bitmask x = get
9de0: 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
9df0: 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  Expr->iRightJoin
9e00: 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 72 65 72  Table);.    prer
9e10: 65 71 41 6c 6c 20 7c 3d 20 78 3b 0a 20 20 20 20  eqAll |= x;.    
9e20: 65 78 74 72 61 52 69 67 68 74 20 3d 20 78 2d 31  extraRight = x-1
9e30: 3b 20 20 2f 2a 20 4f 4e 20 63 6c 61 75 73 65 20  ;  /* ON clause 
9e40: 74 65 72 6d 73 20 6d 61 79 20 6e 6f 74 20 62 65  terms may not be
9e50: 20 75 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e   used with an in
9e60: 64 65 78 0a 20 20 20 20 20 20 20 20 20 20 20 20  dex.            
9e70: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e             ** on
9e80: 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20 61   left table of a
9e90: 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 20 54 69 63   LEFT JOIN.  Tic
9ea0: 6b 65 74 20 23 33 30 31 35 20 2a 2f 0a 20 20 7d  ket #3015 */.  }
9eb0: 0a 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  .  pTerm->prereq
9ec0: 41 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b  All = prereqAll;
9ed0: 0a 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  .  pTerm->leftCu
9ee0: 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70 54 65  rsor = -1;.  pTe
9ef0: 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31  rm->iParent = -1
9f00: 3b 0a 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  ;.  pTerm->eOper
9f10: 61 74 6f 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  ator = 0;.  if( 
9f20: 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20 29 7b  allowedOp(op) ){
9f30: 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74  .    Expr *pLeft
9f40: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
9f50: 69 70 43 6f 6c 6c 61 74 65 28 70 45 78 70 72 2d  ipCollate(pExpr-
9f60: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 45 78 70  >pLeft);.    Exp
9f70: 72 20 2a 70 52 69 67 68 74 20 3d 20 73 71 6c 69  r *pRight = sqli
9f80: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
9f90: 74 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  te(pExpr->pRight
9fa0: 29 3b 0a 20 20 20 20 75 31 36 20 6f 70 4d 61 73  );.    u16 opMas
9fb0: 6b 20 3d 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  k = (pTerm->prer
9fc0: 65 71 52 69 67 68 74 20 26 20 70 72 65 72 65 71  eqRight & prereq
9fd0: 4c 65 66 74 29 3d 3d 30 20 3f 20 57 4f 5f 41 4c  Left)==0 ? WO_AL
9fe0: 4c 20 3a 20 57 4f 5f 45 51 55 49 56 3b 0a 20 20  L : WO_EQUIV;.  
9ff0: 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d    if( pLeft->op=
a000: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  =TK_COLUMN ){.  
a010: 20 20 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43      pTerm->leftC
a020: 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69  ursor = pLeft->i
a030: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 54 65  Table;.      pTe
a040: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
a050: 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d   = pLeft->iColum
a060: 6e 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  n;.      pTerm->
a070: 65 4f 70 65 72 61 74 6f 72 20 3d 20 6f 70 65 72  eOperator = oper
a080: 61 74 6f 72 4d 61 73 6b 28 6f 70 29 20 26 20 6f  atorMask(op) & o
a090: 70 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  pMask;.    }.   
a0a0: 20 69 66 28 20 70 52 69 67 68 74 20 26 26 20 70   if( pRight && p
a0b0: 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  Right->op==TK_CO
a0c0: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 57 68  LUMN ){.      Wh
a0d0: 65 72 65 54 65 72 6d 20 2a 70 4e 65 77 3b 0a 20  ereTerm *pNew;. 
a0e0: 20 20 20 20 20 45 78 70 72 20 2a 70 44 75 70 3b       Expr *pDup;
a0f0: 0a 20 20 20 20 20 20 75 31 36 20 65 45 78 74 72  .      u16 eExtr
a100: 61 4f 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20  aOp = 0;        
a110: 2f 2a 20 45 78 74 72 61 20 62 69 74 73 20 66 6f  /* Extra bits fo
a120: 72 20 70 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f  r pNew->eOperato
a130: 72 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  r */.      if( p
a140: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
a150: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  >=0 ){.        i
a160: 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20  nt idxNew;.     
a170: 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65     pDup = sqlite
a180: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78  3ExprDup(db, pEx
a190: 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  pr, 0);.        
a1a0: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
a1b0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  iled ){.        
a1c0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
a1d0: 65 74 65 28 64 62 2c 20 70 44 75 70 29 3b 0a 20  ete(db, pDup);. 
a1e0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b           return;
a1f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a200: 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72     idxNew = wher
a210: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
a220: 43 2c 20 70 44 75 70 2c 20 54 45 52 4d 5f 56 49  C, pDup, TERM_VI
a230: 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d  RTUAL|TERM_DYNAM
a240: 49 43 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  IC);.        if(
a250: 20 69 64 78 4e 65 77 3d 3d 30 20 29 20 72 65 74   idxNew==0 ) ret
a260: 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  urn;.        pNe
a270: 77 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e  w = &pWC->a[idxN
a280: 65 77 5d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  ew];.        pNe
a290: 77 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64 78  w->iParent = idx
a2a0: 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 54  Term;.        pT
a2b0: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
a2c0: 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20  xTerm];.        
a2d0: 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20  pTerm->nChild = 
a2e0: 31 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  1;.        pTerm
a2f0: 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
a300: 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20  M_COPIED;.      
a310: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
a320: 3d 54 4b 5f 45 51 0a 20 20 20 20 20 20 20 20 20  =TK_EQ.         
a330: 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  && !ExprHasPrope
a340: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72  rty(pExpr, EP_Fr
a350: 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 20 20 20  omJoin).        
a360: 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
a370: 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  Enabled(db, SQLI
a380: 54 45 5f 54 72 61 6e 73 69 74 69 76 65 29 0a 20  TE_Transitive). 
a390: 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
a3a0: 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72      pTerm->eOper
a3b0: 61 74 6f 72 20 7c 3d 20 57 4f 5f 45 51 55 49 56  ator |= WO_EQUIV
a3c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 65 45 78 74  ;.          eExt
a3d0: 72 61 4f 70 20 3d 20 57 4f 5f 45 51 55 49 56 3b  raOp = WO_EQUIV;
a3e0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a3f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a400: 70 44 75 70 20 3d 20 70 45 78 70 72 3b 0a 20 20  pDup = pExpr;.  
a410: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70 54 65        pNew = pTe
a420: 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rm;.      }.    
a430: 20 20 65 78 70 72 43 6f 6d 6d 75 74 65 28 70 50    exprCommute(pP
a440: 61 72 73 65 2c 20 70 44 75 70 29 3b 0a 20 20 20  arse, pDup);.   
a450: 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74     pLeft = sqlit
a460: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
a470: 65 28 70 44 75 70 2d 3e 70 4c 65 66 74 29 3b 0a  e(pDup->pLeft);.
a480: 20 20 20 20 20 20 70 4e 65 77 2d 3e 6c 65 66 74        pNew->left
a490: 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e  Cursor = pLeft->
a4a0: 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e  iTable;.      pN
a4b0: 65 77 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  ew->u.leftColumn
a4c0: 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d   = pLeft->iColum
a4d0: 6e 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  n;.      testcas
a4e0: 65 28 20 28 70 72 65 72 65 71 4c 65 66 74 20 7c  e( (prereqLeft |
a4f0: 20 65 78 74 72 61 52 69 67 68 74 29 20 21 3d 20   extraRight) != 
a500: 70 72 65 72 65 71 4c 65 66 74 20 29 3b 0a 20 20  prereqLeft );.  
a510: 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
a520: 52 69 67 68 74 20 3d 20 70 72 65 72 65 71 4c 65  Right = prereqLe
a530: 66 74 20 7c 20 65 78 74 72 61 52 69 67 68 74 3b  ft | extraRight;
a540: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65  .      pNew->pre
a550: 72 65 71 41 6c 6c 20 3d 20 70 72 65 72 65 71 41  reqAll = prereqA
a560: 6c 6c 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  ll;.      pNew->
a570: 65 4f 70 65 72 61 74 6f 72 20 3d 20 28 6f 70 65  eOperator = (ope
a580: 72 61 74 6f 72 4d 61 73 6b 28 70 44 75 70 2d 3e  ratorMask(pDup->
a590: 6f 70 29 20 2b 20 65 45 78 74 72 61 4f 70 29 20  op) + eExtraOp) 
a5a0: 26 20 6f 70 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a  & opMask;.    }.
a5b0: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
a5c0: 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e  ITE_OMIT_BETWEEN
a5d0: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20  _OPTIMIZATION.  
a5e0: 2f 2a 20 49 66 20 61 20 74 65 72 6d 20 69 73 20  /* If a term is 
a5f0: 74 68 65 20 42 45 54 57 45 45 4e 20 6f 70 65 72  the BETWEEN oper
a600: 61 74 6f 72 2c 20 63 72 65 61 74 65 20 74 77 6f  ator, create two
a610: 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72   new virtual ter
a620: 6d 73 0a 20 20 2a 2a 20 74 68 61 74 20 64 65 66  ms.  ** that def
a630: 69 6e 65 20 74 68 65 20 72 61 6e 67 65 20 74 68  ine the range th
a640: 61 74 20 74 68 65 20 42 45 54 57 45 45 4e 20 69  at the BETWEEN i
a650: 6d 70 6c 65 6d 65 6e 74 73 2e 20 20 46 6f 72 20  mplements.  For 
a660: 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20  example:.  **.  
a670: 2a 2a 20 20 20 20 20 20 61 20 42 45 54 57 45 45  **      a BETWEE
a680: 4e 20 62 20 41 4e 44 20 63 0a 20 20 2a 2a 0a 20  N b AND c.  **. 
a690: 20 2a 2a 20 69 73 20 63 6f 6e 76 65 72 74 65 64   ** is converted
a6a0: 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   into:.  **.  **
a6b0: 20 20 20 20 20 20 28 61 20 42 45 54 57 45 45 4e        (a BETWEEN
a6c0: 20 62 20 41 4e 44 20 63 29 20 41 4e 44 20 28 61   b AND c) AND (a
a6d0: 3e 3d 62 29 20 41 4e 44 20 28 61 3c 3d 63 29 0a  >=b) AND (a<=c).
a6e0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 74 77    **.  ** The tw
a6f0: 6f 20 6e 65 77 20 74 65 72 6d 73 20 61 72 65 20  o new terms are 
a700: 61 64 64 65 64 20 6f 6e 74 6f 20 74 68 65 20 65  added onto the e
a710: 6e 64 20 6f 66 20 74 68 65 20 57 68 65 72 65 43  nd of the WhereC
a720: 6c 61 75 73 65 20 6f 62 6a 65 63 74 2e 0a 20 20  lause object..  
a730: 2a 2a 20 54 68 65 20 6e 65 77 20 74 65 72 6d 73  ** The new terms
a740: 20 61 72 65 20 22 64 79 6e 61 6d 69 63 22 20 61   are "dynamic" a
a750: 6e 64 20 61 72 65 20 63 68 69 6c 64 72 65 6e 20  nd are children 
a760: 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  of the original 
a770: 42 45 54 57 45 45 4e 0a 20 20 2a 2a 20 74 65 72  BETWEEN.  ** ter
a780: 6d 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 20 74  m.  That means t
a790: 68 61 74 20 69 66 20 74 68 65 20 42 45 54 57 45  hat if the BETWE
a7a0: 45 4e 20 74 65 72 6d 20 69 73 20 63 6f 64 65 64  EN term is coded
a7b0: 2c 20 74 68 65 20 63 68 69 6c 64 72 65 6e 20 61  , the children a
a7c0: 72 65 0a 20 20 2a 2a 20 73 6b 69 70 70 65 64 2e  re.  ** skipped.
a7d0: 20 20 4f 72 2c 20 69 66 20 74 68 65 20 63 68 69    Or, if the chi
a7e0: 6c 64 72 65 6e 20 61 72 65 20 73 61 74 69 73 66  ldren are satisf
a7f0: 69 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 2c  ied by an index,
a800: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20   the original.  
a810: 2a 2a 20 42 45 54 57 45 45 4e 20 74 65 72 6d 20  ** BETWEEN term 
a820: 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f  is skipped..  */
a830: 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45 78 70  .  else if( pExp
a840: 72 2d 3e 6f 70 3d 3d 54 4b 5f 42 45 54 57 45 45  r->op==TK_BETWEE
a850: 4e 20 26 26 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b  N && pWC->op==TK
a860: 5f 41 4e 44 20 29 7b 0a 20 20 20 20 45 78 70 72  _AND ){.    Expr
a870: 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45  List *pList = pE
a880: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
a890: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 61    int i;.    sta
a8a0: 74 69 63 20 63 6f 6e 73 74 20 75 38 20 6f 70 73  tic const u8 ops
a8b0: 5b 5d 20 3d 20 7b 54 4b 5f 47 45 2c 20 54 4b 5f  [] = {TK_GE, TK_
a8c0: 4c 45 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  LE};.    assert(
a8d0: 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20   pList!=0 );.   
a8e0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
a8f0: 6e 45 78 70 72 3d 3d 32 20 29 3b 0a 20 20 20 20  nExpr==2 );.    
a900: 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b  for(i=0; i<2; i+
a910: 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
a920: 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20  pNewExpr;.      
a930: 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20  int idxNew;.    
a940: 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c    pNewExpr = sql
a950: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
a960: 2c 20 6f 70 73 5b 69 5d 2c 20 0a 20 20 20 20 20  , ops[i], .     
a970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a980: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
a990: 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72  xprDup(db, pExpr
a9a0: 2d 3e 70 4c 65 66 74 2c 20 30 29 2c 0a 20 20 20  ->pLeft, 0),.   
a9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9c0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
a9d0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 69  3ExprDup(db, pLi
a9e0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
a9f0: 30 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 74 72  0), 0);.      tr
aa00: 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e  ansferJoinMarkin
aa10: 67 73 28 70 4e 65 77 45 78 70 72 2c 20 70 45 78  gs(pNewExpr, pEx
aa20: 70 72 29 3b 0a 20 20 20 20 20 20 69 64 78 4e 65  pr);.      idxNe
aa30: 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  w = whereClauseI
aa40: 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45  nsert(pWC, pNewE
aa50: 78 70 72 2c 20 54 45 52 4d 5f 56 49 52 54 55 41  xpr, TERM_VIRTUA
aa60: 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b  L|TERM_DYNAMIC);
aa70: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
aa80: 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20   idxNew==0 );.  
aa90: 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28      exprAnalyze(
aaa0: 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65  pSrc, pWC, idxNe
aab0: 77 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20  w);.      pTerm 
aac0: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72  = &pWC->a[idxTer
aad0: 6d 5d 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61  m];.      pWC->a
aae0: 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74  [idxNew].iParent
aaf0: 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20   = idxTerm;.    
ab00: 7d 0a 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68  }.    pTerm->nCh
ab10: 69 6c 64 20 3d 20 32 3b 0a 20 20 7d 0a 23 65 6e  ild = 2;.  }.#en
ab20: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
ab30: 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d  IT_BETWEEN_OPTIM
ab40: 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 20  IZATION */..#if 
ab50: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
ab60: 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
ab70: 54 49 4f 4e 29 20 26 26 20 21 64 65 66 69 6e 65  TION) && !define
ab80: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
ab90: 42 51 55 45 52 59 29 0a 20 20 2f 2a 20 41 6e 61  BQUERY).  /* Ana
aba0: 6c 79 7a 65 20 61 20 74 65 72 6d 20 74 68 61 74  lyze a term that
abb0: 20 69 73 20 63 6f 6d 70 6f 73 65 64 20 6f 66 20   is composed of 
abc0: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 75 62 74  two or more subt
abd0: 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62  erms connected b
abe0: 79 0a 20 20 2a 2a 20 61 6e 20 4f 52 20 6f 70 65  y.  ** an OR ope
abf0: 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 65 6c  rator..  */.  el
ac00: 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  se if( pExpr->op
ac10: 3d 3d 54 4b 5f 4f 52 20 29 7b 0a 20 20 20 20 61  ==TK_OR ){.    a
ac20: 73 73 65 72 74 28 20 70 57 43 2d 3e 6f 70 3d 3d  ssert( pWC->op==
ac30: 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20 65 78  TK_AND );.    ex
ac40: 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28  prAnalyzeOrTerm(
ac50: 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 54 65  pSrc, pWC, idxTe
ac60: 72 6d 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d  rm);.    pTerm =
ac70: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
ac80: 5d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  ];.  }.#endif /*
ac90: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f   SQLITE_OMIT_OR_
aca0: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a  OPTIMIZATION */.
acb0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
acc0: 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49  OMIT_LIKE_OPTIMI
acd0: 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 41 64 64 20  ZATION.  /* Add 
ace0: 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 72  constraints to r
acf0: 65 64 75 63 65 20 74 68 65 20 73 65 61 72 63 68  educe the search
ad00: 20 73 70 61 63 65 20 6f 6e 20 61 20 4c 49 4b 45   space on a LIKE
ad10: 20 6f 72 20 47 4c 4f 42 0a 20 20 2a 2a 20 6f 70   or GLOB.  ** op
ad20: 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a  erator..  **.  *
ad30: 2a 20 41 20 6c 69 6b 65 20 70 61 74 74 65 72 6e  * A like pattern
ad40: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 78 20   of the form "x 
ad50: 4c 49 4b 45 20 27 61 62 63 25 27 22 20 69 73 20  LIKE 'abc%'" is 
ad60: 63 68 61 6e 67 65 64 20 69 6e 74 6f 20 63 6f 6e  changed into con
ad70: 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 0a 20 20  straints.  **.  
ad80: 2a 2a 20 20 20 20 20 20 20 20 20 20 78 3e 3d 27  **          x>='
ad90: 61 62 63 27 20 41 4e 44 20 78 3c 27 61 62 64 27  abc' AND x<'abd'
ada0: 20 41 4e 44 20 78 20 4c 49 4b 45 20 27 61 62 63   AND x LIKE 'abc
adb0: 25 27 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  %'.  **.  ** The
adc0: 20 6c 61 73 74 20 63 68 61 72 61 63 74 65 72 20   last character 
add0: 6f 66 20 74 68 65 20 70 72 65 66 69 78 20 22 61  of the prefix "a
ade0: 62 63 22 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  bc" is increment
adf0: 65 64 20 74 6f 20 66 6f 72 6d 20 74 68 65 0a 20  ed to form the. 
ae00: 20 2a 2a 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20   ** termination 
ae10: 63 6f 6e 64 69 74 69 6f 6e 20 22 61 62 64 22 2e  condition "abd".
ae20: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 43 2d  .  */.  if( pWC-
ae30: 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 0a 20 20 20  >op==TK_AND .   
ae40: 26 26 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28  && isLikeOrGlob(
ae50: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26  pParse, pExpr, &
ae60: 70 53 74 72 31 2c 20 26 69 73 43 6f 6d 70 6c 65  pStr1, &isComple
ae70: 74 65 2c 20 26 6e 6f 43 61 73 65 29 0a 20 20 29  te, &noCase).  )
ae80: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66  {.    Expr *pLef
ae90: 74 3b 20 20 20 20 20 20 20 2f 2a 20 4c 48 53 20  t;       /* LHS 
aea0: 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65  of LIKE/GLOB ope
aeb0: 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70  rator */.    Exp
aec0: 72 20 2a 70 53 74 72 32 3b 20 20 20 20 20 20 20  r *pStr2;       
aed0: 2f 2a 20 43 6f 70 79 20 6f 66 20 70 53 74 72 31  /* Copy of pStr1
aee0: 20 2d 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47   - RHS of LIKE/G
aef0: 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  LOB operator */.
af00: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78      Expr *pNewEx
af10: 70 72 31 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  pr1;.    Expr *p
af20: 4e 65 77 45 78 70 72 32 3b 0a 20 20 20 20 69 6e  NewExpr2;.    in
af30: 74 20 69 64 78 4e 65 77 31 3b 0a 20 20 20 20 69  t idxNew1;.    i
af40: 6e 74 20 69 64 78 4e 65 77 32 3b 0a 20 20 20 20  nt idxNew2;.    
af50: 54 6f 6b 65 6e 20 73 43 6f 6c 6c 53 65 71 4e 61  Token sCollSeqNa
af60: 6d 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  me;  /* Name of 
af70: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
af80: 63 65 20 2a 2f 0a 0a 20 20 20 20 70 4c 65 66 74  ce */..    pLeft
af90: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
afa0: 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20  t->a[1].pExpr;. 
afb0: 20 20 20 70 53 74 72 32 20 3d 20 73 71 6c 69 74     pStr2 = sqlit
afc0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53  e3ExprDup(db, pS
afd0: 74 72 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  tr1, 0);.    if(
afe0: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
aff0: 65 64 20 29 7b 0a 20 20 20 20 20 20 75 38 20 63  ed ){.      u8 c
b000: 2c 20 2a 70 43 3b 20 20 20 20 20 20 20 2f 2a 20  , *pC;       /* 
b010: 4c 61 73 74 20 63 68 61 72 61 63 74 65 72 20 62  Last character b
b020: 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20  efore the first 
b030: 77 69 6c 64 63 61 72 64 20 2a 2f 0a 20 20 20 20  wildcard */.    
b040: 20 20 70 43 20 3d 20 28 75 38 2a 29 26 70 53 74    pC = (u8*)&pSt
b050: 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 73 71 6c  r2->u.zToken[sql
b060: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 53 74  ite3Strlen30(pSt
b070: 72 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2d 31 5d  r2->u.zToken)-1]
b080: 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a 70 43 3b  ;.      c = *pC;
b090: 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43 61 73  .      if( noCas
b0a0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
b0b0: 54 68 65 20 70 6f 69 6e 74 20 69 73 20 74 6f 20  The point is to 
b0c0: 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 6c 61  increment the la
b0d0: 73 74 20 63 68 61 72 61 63 74 65 72 20 62 65 66  st character bef
b0e0: 6f 72 65 20 74 68 65 20 66 69 72 73 74 0a 20 20  ore the first.  
b0f0: 20 20 20 20 20 20 2a 2a 20 77 69 6c 64 63 61 72        ** wildcar
b100: 64 2e 20 20 42 75 74 20 69 66 20 77 65 20 69 6e  d.  But if we in
b110: 63 72 65 6d 65 6e 74 20 27 40 27 2c 20 74 68 61  crement '@', tha
b120: 74 20 77 69 6c 6c 20 70 75 73 68 20 69 74 20 69  t will push it i
b130: 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20  nto the.        
b140: 2a 2a 20 61 6c 70 68 61 62 65 74 69 63 20 72 61  ** alphabetic ra
b150: 6e 67 65 20 77 68 65 72 65 20 63 61 73 65 20 63  nge where case c
b160: 6f 6e 76 65 72 73 69 6f 6e 73 20 77 69 6c 6c 20  onversions will 
b170: 6d 65 73 73 20 75 70 20 74 68 65 20 0a 20 20 20  mess up the .   
b180: 20 20 20 20 20 2a 2a 20 69 6e 65 71 75 61 6c 69       ** inequali
b190: 74 79 2e 20 20 54 6f 20 61 76 6f 69 64 20 74 68  ty.  To avoid th
b1a0: 69 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 6f  is, make sure to
b1b0: 20 61 6c 73 6f 20 72 75 6e 20 74 68 65 20 66 75   also run the fu
b1c0: 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 4c 49  ll.        ** LI
b1d0: 4b 45 20 6f 6e 20 61 6c 6c 20 63 61 6e 64 69 64  KE on all candid
b1e0: 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ate expressions 
b1f0: 62 79 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20  by clearing the 
b200: 69 73 43 6f 6d 70 6c 65 74 65 20 66 6c 61 67 0a  isComplete flag.
b210: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
b220: 20 20 20 69 66 28 20 63 3d 3d 27 41 27 2d 31 20     if( c=='A'-1 
b230: 29 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30  ) isComplete = 0
b240: 3b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 73 71  ;.        c = sq
b250: 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65  lite3UpperToLowe
b260: 72 5b 63 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  r[c];.      }.  
b270: 20 20 20 20 2a 70 43 20 3d 20 63 20 2b 20 31 3b      *pC = c + 1;
b280: 0a 20 20 20 20 7d 0a 20 20 20 20 73 43 6f 6c 6c  .    }.    sColl
b290: 53 65 71 4e 61 6d 65 2e 7a 20 3d 20 6e 6f 43 61  SeqName.z = noCa
b2a0: 73 65 20 3f 20 22 4e 4f 43 41 53 45 22 20 3a 20  se ? "NOCASE" : 
b2b0: 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 73 43  "BINARY";.    sC
b2c0: 6f 6c 6c 53 65 71 4e 61 6d 65 2e 6e 20 3d 20 36  ollSeqName.n = 6
b2d0: 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72 31 20  ;.    pNewExpr1 
b2e0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
b2f0: 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a  (db, pLeft, 0);.
b300: 20 20 20 20 70 4e 65 77 45 78 70 72 31 20 3d 20      pNewExpr1 = 
b310: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
b320: 72 73 65 2c 20 54 4b 5f 47 45 2c 20 0a 20 20 20  rse, TK_GE, .   
b330: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
b340: 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b  xprAddCollateTok
b350: 65 6e 28 70 50 61 72 73 65 2c 70 4e 65 77 45 78  en(pParse,pNewEx
b360: 70 72 31 2c 26 73 43 6f 6c 6c 53 65 71 4e 61 6d  pr1,&sCollSeqNam
b370: 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  e),.           p
b380: 53 74 72 31 2c 20 30 29 3b 0a 20 20 20 20 74 72  Str1, 0);.    tr
b390: 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e  ansferJoinMarkin
b3a0: 67 73 28 70 4e 65 77 45 78 70 72 31 2c 20 70 45  gs(pNewExpr1, pE
b3b0: 78 70 72 29 3b 0a 20 20 20 20 69 64 78 4e 65 77  xpr);.    idxNew
b3c0: 31 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  1 = whereClauseI
b3d0: 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45  nsert(pWC, pNewE
b3e0: 78 70 72 31 2c 20 54 45 52 4d 5f 56 49 52 54 55  xpr1, TERM_VIRTU
b3f0: 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29  AL|TERM_DYNAMIC)
b400: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
b410: 69 64 78 4e 65 77 31 3d 3d 30 20 29 3b 0a 20 20  idxNew1==0 );.  
b420: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53    exprAnalyze(pS
b430: 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 31  rc, pWC, idxNew1
b440: 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72 32  );.    pNewExpr2
b450: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
b460: 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b  p(db, pLeft, 0);
b470: 0a 20 20 20 20 70 4e 65 77 45 78 70 72 32 20 3d  .    pNewExpr2 =
b480: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
b490: 61 72 73 65 2c 20 54 4b 5f 4c 54 2c 0a 20 20 20  arse, TK_LT,.   
b4a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
b4b0: 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b  xprAddCollateTok
b4c0: 65 6e 28 70 50 61 72 73 65 2c 70 4e 65 77 45 78  en(pParse,pNewEx
b4d0: 70 72 32 2c 26 73 43 6f 6c 6c 53 65 71 4e 61 6d  pr2,&sCollSeqNam
b4e0: 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  e),.           p
b4f0: 53 74 72 32 2c 20 30 29 3b 0a 20 20 20 20 74 72  Str2, 0);.    tr
b500: 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e  ansferJoinMarkin
b510: 67 73 28 70 4e 65 77 45 78 70 72 32 2c 20 70 45  gs(pNewExpr2, pE
b520: 78 70 72 29 3b 0a 20 20 20 20 69 64 78 4e 65 77  xpr);.    idxNew
b530: 32 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  2 = whereClauseI
b540: 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45  nsert(pWC, pNewE
b550: 78 70 72 32 2c 20 54 45 52 4d 5f 56 49 52 54 55  xpr2, TERM_VIRTU
b560: 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29  AL|TERM_DYNAMIC)
b570: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
b580: 69 64 78 4e 65 77 32 3d 3d 30 20 29 3b 0a 20 20  idxNew2==0 );.  
b590: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53    exprAnalyze(pS
b5a0: 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 32  rc, pWC, idxNew2
b5b0: 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26  );.    pTerm = &
b5c0: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
b5d0: 0a 20 20 20 20 69 66 28 20 69 73 43 6f 6d 70 6c  .    if( isCompl
b5e0: 65 74 65 20 29 7b 0a 20 20 20 20 20 20 70 57 43  ete ){.      pWC
b5f0: 2d 3e 61 5b 69 64 78 4e 65 77 31 5d 2e 69 50 61  ->a[idxNew1].iPa
b600: 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a  rent = idxTerm;.
b610: 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78        pWC->a[idx
b620: 4e 65 77 32 5d 2e 69 50 61 72 65 6e 74 20 3d 20  New2].iParent = 
b630: 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  idxTerm;.      p
b640: 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 32  Term->nChild = 2
b650: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
b660: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
b670: 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54  T_LIKE_OPTIMIZAT
b680: 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ION */..#ifndef 
b690: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
b6a0: 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 41 64  UALTABLE.  /* Ad
b6b0: 64 20 61 20 57 4f 5f 4d 41 54 43 48 20 61 75 78  d a WO_MATCH aux
b6c0: 69 6c 69 61 72 79 20 74 65 72 6d 20 74 6f 20 74  iliary term to t
b6d0: 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 73 65  he constraint se
b6e0: 74 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 63 75  t if the.  ** cu
b6f0: 72 72 65 6e 74 20 65 78 70 72 65 73 73 69 6f 6e  rrent expression
b700: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   is of the form:
b710: 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48 20 65    column MATCH e
b720: 78 70 72 2e 0a 20 20 2a 2a 20 54 68 69 73 20 69  xpr..  ** This i
b730: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
b740: 65 64 20 62 79 20 74 68 65 20 78 42 65 73 74 49  ed by the xBestI
b750: 6e 64 65 78 20 6d 65 74 68 6f 64 73 20 6f 66 0a  ndex methods of.
b760: 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62    ** virtual tab
b770: 6c 65 73 2e 20 20 54 68 65 20 6e 61 74 69 76 65  les.  The native
b780: 20 71 75 65 72 79 20 6f 70 74 69 6d 69 7a 65 72   query optimizer
b790: 20 64 6f 65 73 20 6e 6f 74 20 61 74 74 65 6d 70   does not attemp
b7a0: 74 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 61 6e 79  t.  ** to do any
b7b0: 74 68 69 6e 67 20 77 69 74 68 20 4d 41 54 43 48  thing with MATCH
b7c0: 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f   functions..  */
b7d0: 0a 20 20 69 66 28 20 69 73 4d 61 74 63 68 4f 66  .  if( isMatchOf
b7e0: 43 6f 6c 75 6d 6e 28 70 45 78 70 72 29 20 29 7b  Column(pExpr) ){
b7f0: 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b  .    int idxNew;
b800: 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68  .    Expr *pRigh
b810: 74 2c 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20 57  t, *pLeft;.    W
b820: 68 65 72 65 54 65 72 6d 20 2a 70 4e 65 77 54 65  hereTerm *pNewTe
b830: 72 6d 3b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20  rm;.    Bitmask 
b840: 70 72 65 72 65 71 43 6f 6c 75 6d 6e 2c 20 70 72  prereqColumn, pr
b850: 65 72 65 71 45 78 70 72 3b 0a 0a 20 20 20 20 70  ereqExpr;..    p
b860: 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78  Right = pExpr->x
b870: 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  .pList->a[0].pEx
b880: 70 72 3b 0a 20 20 20 20 70 4c 65 66 74 20 3d 20  pr;.    pLeft = 
b890: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
b8a0: 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[1].pExpr;.    
b8b0: 70 72 65 72 65 71 45 78 70 72 20 3d 20 65 78 70  prereqExpr = exp
b8c0: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
b8d0: 6b 53 65 74 2c 20 70 52 69 67 68 74 29 3b 0a 20  kSet, pRight);. 
b8e0: 20 20 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 20     prereqColumn 
b8f0: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
b900: 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c 65 66 74  (pMaskSet, pLeft
b910: 29 3b 0a 20 20 20 20 69 66 28 20 28 70 72 65 72  );.    if( (prer
b920: 65 71 45 78 70 72 20 26 20 70 72 65 72 65 71 43  eqExpr & prereqC
b930: 6f 6c 75 6d 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  olumn)==0 ){.   
b940: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70     Expr *pNewExp
b950: 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 45 78 70  r;.      pNewExp
b960: 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
b970: 28 70 50 61 72 73 65 2c 20 54 4b 5f 4d 41 54 43  (pParse, TK_MATC
b980: 48 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  H, .            
b990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9a0: 20 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72    0, sqlite3Expr
b9b0: 44 75 70 28 64 62 2c 20 70 52 69 67 68 74 2c 20  Dup(db, pRight, 
b9c0: 30 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 64  0), 0);.      id
b9d0: 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
b9e0: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e  seInsert(pWC, pN
b9f0: 65 77 45 78 70 72 2c 20 54 45 52 4d 5f 56 49 52  ewExpr, TERM_VIR
ba00: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
ba10: 43 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  C);.      testca
ba20: 73 65 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b  se( idxNew==0 );
ba30: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 20  .      pNewTerm 
ba40: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77  = &pWC->a[idxNew
ba50: 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  ];.      pNewTer
ba60: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d  m->prereqRight =
ba70: 20 70 72 65 72 65 71 45 78 70 72 3b 0a 20 20 20   prereqExpr;.   
ba80: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 6c 65 66     pNewTerm->lef
ba90: 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d  tCursor = pLeft-
baa0: 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70  >iTable;.      p
bab0: 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  NewTerm->u.leftC
bac0: 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69  olumn = pLeft->i
bad0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 4e  Column;.      pN
bae0: 65 77 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  ewTerm->eOperato
baf0: 72 20 3d 20 57 4f 5f 4d 41 54 43 48 3b 0a 20 20  r = WO_MATCH;.  
bb00: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 69 50      pNewTerm->iP
bb10: 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b  arent = idxTerm;
bb20: 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26  .      pTerm = &
bb30: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
bb40: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43  .      pTerm->nC
bb50: 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  hild = 1;.      
bb60: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  pTerm->wtFlags |
bb70: 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20  = TERM_COPIED;. 
bb80: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70       pNewTerm->p
bb90: 72 65 72 65 71 41 6c 6c 20 3d 20 70 54 65 72 6d  rereqAll = pTerm
bba0: 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20  ->prereqAll;.   
bbb0: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a   }.  }.#endif /*
bbc0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
bbd0: 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69  TUALTABLE */..#i
bbe0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
bbf0: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
bc00: 34 0a 20 20 2f 2a 20 57 68 65 6e 20 73 71 6c 69  4.  /* When sqli
bc10: 74 65 5f 73 74 61 74 33 20 68 69 73 74 6f 67 72  te_stat3 histogr
bc20: 61 6d 20 64 61 74 61 20 69 73 20 61 76 61 69 6c  am data is avail
bc30: 61 62 6c 65 20 61 6e 20 6f 70 65 72 61 74 6f 72  able an operator
bc40: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66 6f 72   of the.  ** for
bc50: 6d 20 22 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c  m "x IS NOT NULL
bc60: 22 20 63 61 6e 20 73 6f 6d 65 74 69 6d 65 73 20  " can sometimes 
bc70: 62 65 20 65 76 61 6c 75 61 74 65 64 20 6d 6f 72  be evaluated mor
bc80: 65 20 65 66 66 69 63 69 65 6e 74 6c 79 0a 20 20  e efficiently.  
bc90: 2a 2a 20 61 73 20 22 78 3e 4e 55 4c 4c 22 20 69  ** as "x>NULL" i
bca0: 66 20 78 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e  f x is not an IN
bcb0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
bcc0: 59 2e 20 20 53 6f 20 63 6f 6e 73 74 72 75 63 74  Y.  So construct
bcd0: 20 61 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20   a.  ** virtual 
bce0: 74 65 72 6d 20 6f 66 20 74 68 61 74 20 66 6f 72  term of that for
bcf0: 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74  m..  **.  ** Not
bd00: 65 20 74 68 61 74 20 74 68 65 20 76 69 72 74 75  e that the virtu
bd10: 61 6c 20 74 65 72 6d 20 6d 75 73 74 20 62 65 20  al term must be 
bd20: 74 61 67 67 65 64 20 77 69 74 68 20 54 45 52 4d  tagged with TERM
bd30: 5f 56 4e 55 4c 4c 2e 20 20 54 68 69 73 0a 20 20  _VNULL.  This.  
bd40: 2a 2a 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 74 61  ** TERM_VNULL ta
bd50: 67 20 77 69 6c 6c 20 73 75 70 70 72 65 73 73 20  g will suppress 
bd60: 74 68 65 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65  the not-null che
bd70: 63 6b 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  ck at the beginn
bd80: 69 6e 67 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  ing.  ** of the 
bd90: 6c 6f 6f 70 2e 20 20 57 69 74 68 6f 75 74 20 74  loop.  Without t
bda0: 68 65 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 66 6c  he TERM_VNULL fl
bdb0: 61 67 2c 20 74 68 65 20 6e 6f 74 2d 6e 75 6c 6c  ag, the not-null
bdc0: 20 63 68 65 63 6b 20 61 74 0a 20 20 2a 2a 20 74   check at.  ** t
bdd0: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
bde0: 6c 6f 6f 70 20 77 69 6c 6c 20 70 72 65 76 65 6e  loop will preven
bdf0: 74 20 61 6e 79 20 72 65 73 75 6c 74 73 20 66 72  t any results fr
be00: 6f 6d 20 62 65 69 6e 67 20 72 65 74 75 72 6e 65  om being returne
be10: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 45  d..  */.  if( pE
be20: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  xpr->op==TK_NOTN
be30: 55 4c 4c 0a 20 20 20 26 26 20 70 45 78 70 72 2d  ULL.   && pExpr-
be40: 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43  >pLeft->op==TK_C
be50: 4f 4c 55 4d 4e 0a 20 20 20 26 26 20 70 45 78 70  OLUMN.   && pExp
be60: 72 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d  r->pLeft->iColum
be70: 6e 3e 3d 30 0a 20 20 20 26 26 20 4f 70 74 69 6d  n>=0.   && Optim
be80: 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64  izationEnabled(d
be90: 62 2c 20 53 51 4c 49 54 45 5f 53 74 61 74 33 29  b, SQLITE_Stat3)
bea0: 0a 20 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  .  ){.    Expr *
beb0: 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 45 78  pNewExpr;.    Ex
bec0: 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
bed0: 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 69 6e  r->pLeft;.    in
bee0: 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 57 68  t idxNew;.    Wh
bef0: 65 72 65 54 65 72 6d 20 2a 70 4e 65 77 54 65 72  ereTerm *pNewTer
bf00: 6d 3b 0a 0a 20 20 20 20 70 4e 65 77 45 78 70 72  m;..    pNewExpr
bf10: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
bf20: 70 50 61 72 73 65 2c 20 54 4b 5f 47 54 2c 0a 20  pParse, TK_GT,. 
bf30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf40: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
bf50: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c  e3ExprDup(db, pL
bf60: 65 66 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 20  eft, 0),.       
bf70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf80: 20 20 20 20 20 73 71 6c 69 74 65 33 50 45 78 70       sqlite3PExp
bf90: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4e 55 4c  r(pParse, TK_NUL
bfa0: 4c 2c 20 30 2c 20 30 2c 20 30 29 2c 20 30 29 3b  L, 0, 0, 0), 0);
bfb0: 0a 0a 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77  ..    idxNew = w
bfc0: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
bfd0: 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 0a  (pWC, pNewExpr,.
bfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 45                TE
c000: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
c010: 44 59 4e 41 4d 49 43 7c 54 45 52 4d 5f 56 4e 55  DYNAMIC|TERM_VNU
c020: 4c 4c 29 3b 0a 20 20 20 20 69 66 28 20 69 64 78  LL);.    if( idx
c030: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  New ){.      pNe
c040: 77 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  wTerm = &pWC->a[
c050: 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70  idxNew];.      p
c060: 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 52  NewTerm->prereqR
c070: 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  ight = 0;.      
c080: 70 4e 65 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75  pNewTerm->leftCu
c090: 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54  rsor = pLeft->iT
c0a0: 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77  able;.      pNew
c0b0: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
c0c0: 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c  mn = pLeft->iCol
c0d0: 75 6d 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  umn;.      pNewT
c0e0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d  erm->eOperator =
c0f0: 20 57 4f 5f 47 54 3b 0a 20 20 20 20 20 20 70 4e   WO_GT;.      pN
c100: 65 77 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20  ewTerm->iParent 
c110: 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20  = idxTerm;.     
c120: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
c130: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20  [idxTerm];.     
c140: 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d   pTerm->nChild =
c150: 20 31 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d   1;.      pTerm-
c160: 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
c170: 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20 70  _COPIED;.      p
c180: 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 41  NewTerm->prereqA
c190: 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72  ll = pTerm->prer
c1a0: 65 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d  eqAll;.    }.  }
c1b0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
c1c0: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
c1d0: 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 20 20 2f 2a  R_STAT4 */..  /*
c1e0: 20 50 72 65 76 65 6e 74 20 4f 4e 20 63 6c 61 75   Prevent ON clau
c1f0: 73 65 20 74 65 72 6d 73 20 6f 66 20 61 20 4c 45  se terms of a LE
c200: 46 54 20 4a 4f 49 4e 20 66 72 6f 6d 20 62 65 69  FT JOIN from bei
c210: 6e 67 20 75 73 65 64 20 74 6f 20 64 72 69 76 65  ng used to drive
c220: 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 66  .  ** an index f
c230: 6f 72 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65  or tables to the
c240: 20 6c 65 66 74 20 6f 66 20 74 68 65 20 6a 6f 69   left of the joi
c250: 6e 2e 0a 20 20 2a 2f 0a 20 20 70 54 65 72 6d 2d  n..  */.  pTerm-
c260: 3e 70 72 65 72 65 71 52 69 67 68 74 20 7c 3d 20  >prereqRight |= 
c270: 65 78 74 72 61 52 69 67 68 74 3b 0a 7d 0a 0a 2f  extraRight;.}../
c280: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
c290: 6f 6e 20 73 65 61 72 63 68 65 73 20 70 4c 69 73  on searches pLis
c2a0: 74 20 66 6f 72 20 61 6e 20 65 6e 74 72 79 20 74  t for an entry t
c2b0: 68 61 74 20 6d 61 74 63 68 65 73 20 74 68 65 20  hat matches the 
c2c0: 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 0a 2a  iCol-th column.*
c2d0: 2a 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78 2e  * of index pIdx.
c2e0: 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61  .**.** If such a
c2f0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  n expression is 
c300: 66 6f 75 6e 64 2c 20 69 74 73 20 69 6e 64 65 78  found, its index
c310: 20 69 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d 20 69   in pList->a[] i
c320: 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 0a 2a  s returned. If.*
c330: 2a 20 6e 6f 20 65 78 70 72 65 73 73 69 6f 6e 20  * no expression 
c340: 69 73 20 66 6f 75 6e 64 2c 20 2d 31 20 69 73 20  is found, -1 is 
c350: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
c360: 74 69 63 20 69 6e 74 20 66 69 6e 64 49 6e 64 65  tic int findInde
c370: 78 43 6f 6c 28 0a 20 20 50 61 72 73 65 20 2a 70  xCol(.  Parse *p
c380: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
c390: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
c3a0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
c3b0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
c3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c3d0: 20 45 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   Expression list
c3e0: 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20   to search */.  
c3f0: 69 6e 74 20 69 42 61 73 65 2c 20 20 20 20 20 20  int iBase,      
c400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c410: 2f 2a 20 43 75 72 73 6f 72 20 66 6f 72 20 74 61  /* Cursor for ta
c420: 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ble associated w
c430: 69 74 68 20 70 49 64 78 20 2a 2f 0a 20 20 49 6e  ith pIdx */.  In
c440: 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20  dex *pIdx,      
c450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c460: 20 49 6e 64 65 78 20 74 6f 20 6d 61 74 63 68 20   Index to match 
c470: 63 6f 6c 75 6d 6e 20 6f 66 20 2a 2f 0a 20 20 69  column of */.  i
c480: 6e 74 20 69 43 6f 6c 20 20 20 20 20 20 20 20 20  nt iCol         
c490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c4a0: 2a 20 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65  * Column of inde
c4b0: 78 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 29 7b  x to match */.){
c4c0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73  .  int i;.  cons
c4d0: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20  t char *zColl = 
c4e0: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 43 6f  pIdx->azColl[iCo
c4f0: 6c 5d 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  l];..  for(i=0; 
c500: 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
c510: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
c520: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  p = sqlite3ExprS
c530: 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74  kipCollate(pList
c540: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
c550: 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b     if( p->op==TK
c560: 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 26 26 20  _COLUMN.     && 
c570: 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78  p->iColumn==pIdx
c580: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d  ->aiColumn[iCol]
c590: 0a 20 20 20 20 20 26 26 20 70 2d 3e 69 54 61 62  .     && p->iTab
c5a0: 6c 65 3d 3d 69 42 61 73 65 0a 20 20 20 20 29 7b  le==iBase.    ){
c5b0: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
c5c0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
c5d0: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
c5e0: 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  e, pList->a[i].p
c5f0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28  Expr);.      if(
c600: 20 41 4c 57 41 59 53 28 70 43 6f 6c 6c 29 20 26   ALWAYS(pColl) &
c610: 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49  & 0==sqlite3StrI
c620: 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  Cmp(pColl->zName
c630: 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20  , zColl) ){.    
c640: 20 20 20 20 72 65 74 75 72 6e 20 69 3b 0a 20 20      return i;.  
c650: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
c660: 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a  .  return -1;.}.
c670: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
c680: 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e  ue if the DISTIN
c690: 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69  CT expression-li
c6a0: 73 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  st passed as the
c6b0: 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 0a   third argument.
c6c0: 2a 2a 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e  ** is redundant.
c6d0: 0a 2a 2a 0a 2a 2a 20 41 20 44 49 53 54 49 4e 43  .**.** A DISTINC
c6e0: 54 20 6c 69 73 74 20 69 73 20 72 65 64 75 6e 64  T list is redund
c6f0: 61 6e 74 20 69 66 20 74 68 65 20 64 61 74 61 62  ant if the datab
c700: 61 73 65 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d  ase contains som
c710: 65 20 73 75 62 73 65 74 20 6f 66 0a 2a 2a 20 63  e subset of.** c
c720: 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20  olumns that are 
c730: 75 6e 69 71 75 65 20 61 6e 64 20 6e 6f 6e 2d 6e  unique and non-n
c740: 75 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ull..*/.static i
c750: 6e 74 20 69 73 44 69 73 74 69 6e 63 74 52 65 64  nt isDistinctRed
c760: 75 6e 64 61 6e 74 28 0a 20 20 50 61 72 73 65 20  undant(.  Parse 
c770: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
c780: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
c790: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
c7a0: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
c7b0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f        /* The FRO
c7c0: 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  M clause */.  Wh
c7d0: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
c7e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
c7f0: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
c800: 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69 73 74   ExprList *pDist
c810: 69 6e 63 74 20 20 20 20 20 20 20 2f 2a 20 54 68  inct       /* Th
c820: 65 20 72 65 73 75 6c 74 20 73 65 74 20 74 68 61  e result set tha
c830: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 44 49  t needs to be DI
c840: 53 54 49 4e 43 54 20 2a 2f 0a 29 7b 0a 20 20 54  STINCT */.){.  T
c850: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e  able *pTab;.  In
c860: 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74  dex *pIdx;.  int
c870: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
c880: 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20               .  
c890: 69 6e 74 20 69 42 61 73 65 3b 0a 0a 20 20 2f 2a  int iBase;..  /*
c8a0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6d 6f 72   If there is mor
c8b0: 65 20 74 68 61 6e 20 6f 6e 65 20 74 61 62 6c 65  e than one table
c8c0: 20 6f 72 20 73 75 62 2d 73 65 6c 65 63 74 20 69   or sub-select i
c8d0: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
c8e0: 65 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 71  e of.  ** this q
c8f0: 75 65 72 79 2c 20 74 68 65 6e 20 69 74 20 77 69  uery, then it wi
c900: 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62  ll not be possib
c910: 6c 65 20 74 6f 20 73 68 6f 77 20 74 68 61 74 20  le to show that 
c920: 74 68 65 20 44 49 53 54 49 4e 43 54 20 0a 20 20  the DISTINCT .  
c930: 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 72 65 64  ** clause is red
c940: 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28  undant. */.  if(
c950: 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 21   pTabList->nSrc!
c960: 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =1 ) return 0;. 
c970: 20 69 42 61 73 65 20 3d 20 70 54 61 62 4c 69 73   iBase = pTabLis
c980: 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b  t->a[0].iCursor;
c990: 0a 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69  .  pTab = pTabLi
c9a0: 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a  st->a[0].pTab;..
c9b0: 20 20 2f 2a 20 49 66 20 61 6e 79 20 6f 66 20 74    /* If any of t
c9c0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69  he expressions i
c9d0: 73 20 61 6e 20 49 50 4b 20 63 6f 6c 75 6d 6e 20  s an IPK column 
c9e0: 6f 6e 20 74 61 62 6c 65 20 69 42 61 73 65 2c 20  on table iBase, 
c9f0: 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 20 20 2a  then return .  *
ca00: 2a 20 74 72 75 65 2e 20 4e 6f 74 65 3a 20 54 68  * true. Note: Th
ca10: 65 20 28 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42  e (p->iTable==iB
ca20: 61 73 65 29 20 70 61 72 74 20 6f 66 20 74 68 69  ase) part of thi
ca30: 73 20 74 65 73 74 20 6d 61 79 20 62 65 20 66 61  s test may be fa
ca40: 6c 73 65 20 69 66 20 74 68 65 0a 20 20 2a 2a 20  lse if the.  ** 
ca50: 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69  current SELECT i
ca60: 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73  s a correlated s
ca70: 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  ub-query..  */. 
ca80: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 44 69 73   for(i=0; i<pDis
ca90: 74 69 6e 63 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  tinct->nExpr; i+
caa0: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20  +){.    Expr *p 
cab0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
cac0: 70 43 6f 6c 6c 61 74 65 28 70 44 69 73 74 69 6e  pCollate(pDistin
cad0: 63 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  ct->a[i].pExpr);
cae0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d  .    if( p->op==
caf0: 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 2d 3e  TK_COLUMN && p->
cb00: 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 20 26 26  iTable==iBase &&
cb10: 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 20   p->iColumn<0 ) 
cb20: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20  return 1;.  }.. 
cb30: 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   /* Loop through
cb40: 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20   all indices on 
cb50: 74 68 65 20 74 61 62 6c 65 2c 20 63 68 65 63 6b  the table, check
cb60: 69 6e 67 20 65 61 63 68 20 74 6f 20 73 65 65 20  ing each to see 
cb70: 69 66 20 69 74 20 6d 61 6b 65 73 0a 20 20 2a 2a  if it makes.  **
cb80: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 71 75   the DISTINCT qu
cb90: 61 6c 69 66 69 65 72 20 72 65 64 75 6e 64 61 6e  alifier redundan
cba0: 74 2e 20 49 74 20 64 6f 65 73 20 73 6f 20 69 66  t. It does so if
cbb0: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e  :.  **.  **   1.
cbc0: 20 54 68 65 20 69 6e 64 65 78 20 69 73 20 69 74   The index is it
cbd0: 73 65 6c 66 20 55 4e 49 51 55 45 2c 20 61 6e 64  self UNIQUE, and
cbe0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20  .  **.  **   2. 
cbf0: 41 6c 6c 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  All of the colum
cc00: 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20  ns in the index 
cc10: 61 72 65 20 65 69 74 68 65 72 20 70 61 72 74 20  are either part 
cc20: 6f 66 20 74 68 65 20 70 44 69 73 74 69 6e 63 74  of the pDistinct
cc30: 0a 20 20 2a 2a 20 20 20 20 20 20 6c 69 73 74 2c  .  **      list,
cc40: 20 6f 72 20 65 6c 73 65 20 74 68 65 20 57 48 45   or else the WHE
cc50: 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69  RE clause contai
cc60: 6e 73 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65  ns a term of the
cc70: 20 66 6f 72 6d 20 22 63 6f 6c 3d 58 22 2c 0a 20   form "col=X",. 
cc80: 20 2a 2a 20 20 20 20 20 20 77 68 65 72 65 20 58   **      where X
cc90: 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 76   is a constant v
cca0: 61 6c 75 65 2e 20 54 68 65 20 63 6f 6c 6c 61 74  alue. The collat
ccb0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20 6f 66  ion sequences of
ccc0: 20 74 68 65 0a 20 20 2a 2a 20 20 20 20 20 20 63   the.  **      c
ccd0: 6f 6d 70 61 72 69 73 6f 6e 20 61 6e 64 20 73 65  omparison and se
cce0: 6c 65 63 74 2d 6c 69 73 74 20 65 78 70 72 65 73  lect-list expres
ccf0: 73 69 6f 6e 73 20 6d 75 73 74 20 6d 61 74 63 68  sions must match
cd00: 20 74 68 6f 73 65 20 6f 66 20 74 68 65 20 69 6e   those of the in
cd10: 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  dex..  **.  **  
cd20: 20 33 2e 20 41 6c 6c 20 6f 66 20 74 68 6f 73 65   3. All of those
cd30: 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 66   index columns f
cd40: 6f 72 20 77 68 69 63 68 20 74 68 65 20 57 48 45  or which the WHE
cd50: 52 45 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e  RE clause does n
cd60: 6f 74 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f 6e  ot.  **      con
cd70: 74 61 69 6e 20 61 20 22 63 6f 6c 3d 58 22 20 74  tain a "col=X" t
cd80: 65 72 6d 20 61 72 65 20 73 75 62 6a 65 63 74 20  erm are subject 
cd90: 74 6f 20 61 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f  to a NOT NULL co
cda0: 6e 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20  nstraint..  */. 
cdb0: 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
cdc0: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
cdd0: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
cde0: 0a 20 20 20 20 69 66 28 20 21 49 73 55 6e 69 71  .    if( !IsUniq
cdf0: 75 65 49 6e 64 65 78 28 70 49 64 78 29 20 29 20  ueIndex(pIdx) ) 
ce00: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f  continue;.    fo
ce10: 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e  r(i=0; i<pIdx->n
ce20: 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  KeyCol; i++){.  
ce30: 20 20 20 20 69 31 36 20 69 43 6f 6c 20 3d 20 70      i16 iCol = p
ce40: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  Idx->aiColumn[i]
ce50: 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 66  ;.      if( 0==f
ce60: 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 42 61  indTerm(pWC, iBa
ce70: 73 65 2c 20 69 43 6f 6c 2c 20 7e 28 42 69 74 6d  se, iCol, ~(Bitm
ce80: 61 73 6b 29 30 2c 20 57 4f 5f 45 51 2c 20 70 49  ask)0, WO_EQ, pI
ce90: 64 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  dx) ){.        i
cea0: 6e 74 20 69 49 64 78 43 6f 6c 20 3d 20 66 69 6e  nt iIdxCol = fin
ceb0: 64 49 6e 64 65 78 43 6f 6c 28 70 50 61 72 73 65  dIndexCol(pParse
cec0: 2c 20 70 44 69 73 74 69 6e 63 74 2c 20 69 42 61  , pDistinct, iBa
ced0: 73 65 2c 20 70 49 64 78 2c 20 69 29 3b 0a 20 20  se, pIdx, i);.  
cee0: 20 20 20 20 20 20 69 66 28 20 69 49 64 78 43 6f        if( iIdxCo
cef0: 6c 3c 30 20 7c 7c 20 70 54 61 62 2d 3e 61 43 6f  l<0 || pTab->aCo
cf00: 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 3d  l[iCol].notNull=
cf10: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
cf20: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
cf30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
cf40: 20 20 20 69 66 28 20 69 3d 3d 70 49 64 78 2d 3e     if( i==pIdx->
cf50: 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20  nKeyCol ){.     
cf60: 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78 20 69   /* This index i
cf70: 6d 70 6c 69 65 73 20 74 68 61 74 20 74 68 65 20  mplies that the 
cf80: 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66 69  DISTINCT qualifi
cf90: 65 72 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e  er is redundant.
cfa0: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
cfb0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   1;.    }.  }.. 
cfc0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f   return 0;.}.../
cfd0: 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68  *.** Estimate th
cfe0: 65 20 6c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74  e logarithm of t
cff0: 68 65 20 69 6e 70 75 74 20 76 61 6c 75 65 20 74  he input value t
d000: 6f 20 62 61 73 65 20 32 2e 0a 2a 2f 0a 73 74 61  o base 2..*/.sta
d010: 74 69 63 20 4c 6f 67 45 73 74 20 65 73 74 4c 6f  tic LogEst estLo
d020: 67 28 4c 6f 67 45 73 74 20 4e 29 7b 0a 20 20 72  g(LogEst N){.  r
d030: 65 74 75 72 6e 20 4e 3c 3d 31 30 20 3f 20 30 20  eturn N<=10 ? 0 
d040: 3a 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  : sqlite3LogEst(
d050: 4e 29 20 2d 20 33 33 3b 0a 7d 0a 0a 2f 2a 0a 2a  N) - 33;.}../*.*
d060: 2a 20 54 77 6f 20 72 6f 75 74 69 6e 65 73 20 66  * Two routines f
d070: 6f 72 20 70 72 69 6e 74 69 6e 67 20 74 68 65 20  or printing the 
d080: 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 73 71  content of an sq
d090: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
d0a0: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20  .** structure.  
d0b0: 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  Used for testing
d0c0: 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
d0d0: 6e 6c 79 2e 20 20 49 66 20 6e 65 69 74 68 65 72  nly.  If neither
d0e0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20  .** SQLITE_TEST 
d0f0: 6f 72 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  or SQLITE_DEBUG 
d100: 61 72 65 20 64 65 66 69 6e 65 64 2c 20 74 68 65  are defined, the
d110: 6e 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73  n these routines
d120: 0a 2a 2a 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a  .** are no-ops..
d130: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
d140: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
d150: 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66  UALTABLE) && def
d160: 69 6e 65 64 28 57 48 45 52 45 54 52 41 43 45 5f  ined(WHERETRACE_
d170: 45 4e 41 42 4c 45 44 29 0a 73 74 61 74 69 63 20  ENABLED).static 
d180: 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58 5f 49  void TRACE_IDX_I
d190: 4e 50 55 54 53 28 73 71 6c 69 74 65 33 5f 69 6e  NPUTS(sqlite3_in
d1a0: 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20  dex_info *p){.  
d1b0: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 73 71  int i;.  if( !sq
d1c0: 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
d1d0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
d1e0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74  i=0; i<p->nConst
d1f0: 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  raint; i++){.   
d200: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
d210: 6e 74 66 28 22 20 20 63 6f 6e 73 74 72 61 69 6e  ntf("  constrain
d220: 74 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 74 65  t[%d]: col=%d te
d230: 72 6d 69 64 3d 25 64 20 6f 70 3d 25 64 20 75 73  rmid=%d op=%d us
d240: 61 62 6c 65 64 3d 25 64 5c 6e 22 2c 0a 20 20 20  abled=%d\n",.   
d250: 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d      i,.       p-
d260: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e  >aConstraint[i].
d270: 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20  iColumn,.       
d280: 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  p->aConstraint[i
d290: 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 2c 0a 20  ].iTermOffset,. 
d2a0: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
d2b0: 61 69 6e 74 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20  aint[i].op,.    
d2c0: 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
d2d0: 74 5b 69 5d 2e 75 73 61 62 6c 65 29 3b 0a 20 20  t[i].usable);.  
d2e0: 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
d2f0: 2d 3e 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29  ->nOrderBy; i++)
d300: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
d310: 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64 65  ugPrintf("  orde
d320: 72 62 79 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20  rby[%d]: col=%d 
d330: 64 65 73 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  desc=%d\n",.    
d340: 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e     i,.       p->
d350: 61 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c  aOrderBy[i].iCol
d360: 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61  umn,.       p->a
d370: 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65 73 63 29  OrderBy[i].desc)
d380: 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  ;.  }.}.static v
d390: 6f 69 64 20 54 52 41 43 45 5f 49 44 58 5f 4f 55  oid TRACE_IDX_OU
d3a0: 54 50 55 54 53 28 73 71 6c 69 74 65 33 5f 69 6e  TPUTS(sqlite3_in
d3b0: 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20  dex_info *p){.  
d3c0: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 73 71  int i;.  if( !sq
d3d0: 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
d3e0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
d3f0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74  i=0; i<p->nConst
d400: 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  raint; i++){.   
d410: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
d420: 6e 74 66 28 22 20 20 75 73 61 67 65 5b 25 64 5d  ntf("  usage[%d]
d430: 3a 20 61 72 67 76 49 64 78 3d 25 64 20 6f 6d 69  : argvIdx=%d omi
d440: 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  t=%d\n",.       
d450: 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  i,.       p->aCo
d460: 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d  nstraintUsage[i]
d470: 2e 61 72 67 76 49 6e 64 65 78 2c 0a 20 20 20 20  .argvIndex,.    
d480: 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
d490: 74 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b  tUsage[i].omit);
d4a0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65  .  }.  sqlite3De
d4b0: 62 75 67 50 72 69 6e 74 66 28 22 20 20 69 64 78  bugPrintf("  idx
d4c0: 4e 75 6d 3d 25 64 5c 6e 22 2c 20 70 2d 3e 69 64  Num=%d\n", p->id
d4d0: 78 4e 75 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33  xNum);.  sqlite3
d4e0: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 69  DebugPrintf("  i
d4f0: 64 78 53 74 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e  dxStr=%s\n", p->
d500: 69 64 78 53 74 72 29 3b 0a 20 20 73 71 6c 69 74  idxStr);.  sqlit
d510: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
d520: 20 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64   orderByConsumed
d530: 3d 25 64 5c 6e 22 2c 20 70 2d 3e 6f 72 64 65 72  =%d\n", p->order
d540: 42 79 43 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 73  ByConsumed);.  s
d550: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
d560: 66 28 22 20 20 65 73 74 69 6d 61 74 65 64 43 6f  f("  estimatedCo
d570: 73 74 3d 25 67 5c 6e 22 2c 20 70 2d 3e 65 73 74  st=%g\n", p->est
d580: 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a 20 20 73  imatedCost);.  s
d590: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
d5a0: 66 28 22 20 20 65 73 74 69 6d 61 74 65 64 52 6f  f("  estimatedRo
d5b0: 77 73 3d 25 6c 6c 64 5c 6e 22 2c 20 70 2d 3e 65  ws=%lld\n", p->e
d5c0: 73 74 69 6d 61 74 65 64 52 6f 77 73 29 3b 0a 7d  stimatedRows);.}
d5d0: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 54  .#else.#define T
d5e0: 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28  RACE_IDX_INPUTS(
d5f0: 41 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45  A).#define TRACE
d600: 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 41 29 0a  _IDX_OUTPUTS(A).
d610: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
d620: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
d630: 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a  MATIC_INDEX./*.*
d640: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
d650: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
d660: 65 20 74 65 72 6d 20 70 54 65 72 6d 20 69 73 20  e term pTerm is 
d670: 6f 66 20 61 20 66 6f 72 6d 20 77 68 65 72 65 20  of a form where 
d680: 69 74 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 75  it.** could be u
d690: 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65  sed with an inde
d6a0: 78 20 74 6f 20 61 63 63 65 73 73 20 70 53 72 63  x to access pSrc
d6b0: 2c 20 61 73 73 75 6d 69 6e 67 20 61 6e 20 61 70  , assuming an ap
d6c0: 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 69 6e 64  propriate.** ind
d6d0: 65 78 20 65 78 69 73 74 65 64 2e 0a 2a 2f 0a 73  ex existed..*/.s
d6e0: 74 61 74 69 63 20 69 6e 74 20 74 65 72 6d 43 61  tatic int termCa
d6f0: 6e 44 72 69 76 65 49 6e 64 65 78 28 0a 20 20 57  nDriveIndex(.  W
d700: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c  hereTerm *pTerm,
d710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d720: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
d730: 72 6d 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20  rm to check */. 
d740: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
d750: 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20  item *pSrc,     
d760: 2f 2a 20 54 61 62 6c 65 20 77 65 20 61 72 65 20  /* Table we are 
d770: 74 72 79 69 6e 67 20 74 6f 20 61 63 63 65 73 73  trying to access
d780: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f   */.  Bitmask no
d790: 74 52 65 61 64 79 20 20 20 20 20 20 20 20 20 20  tReady          
d7a0: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 69       /* Tables i
d7b0: 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20 6f 66  n outer loops of
d7c0: 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a   the join */.){.
d7d0: 20 20 63 68 61 72 20 61 66 66 3b 0a 20 20 69 66    char aff;.  if
d7e0: 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
d7f0: 73 6f 72 21 3d 70 53 72 63 2d 3e 69 43 75 72 73  sor!=pSrc->iCurs
d800: 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  or ) return 0;. 
d810: 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
d820: 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 29 3d  erator & WO_EQ)=
d830: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
d840: 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
d850: 72 65 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65  reqRight & notRe
d860: 61 64 79 29 21 3d 30 20 29 20 72 65 74 75 72 6e  ady)!=0 ) return
d870: 20 30 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 2d   0;.  if( pTerm-
d880: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3c 30 20  >u.leftColumn<0 
d890: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 66  ) return 0;.  af
d8a0: 66 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e  f = pSrc->pTab->
d8b0: 61 43 6f 6c 5b 70 54 65 72 6d 2d 3e 75 2e 6c 65  aCol[pTerm->u.le
d8c0: 66 74 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69  ftColumn].affini
d8d0: 74 79 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74  ty;.  if( !sqlit
d8e0: 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f  e3IndexAffinityO
d8f0: 6b 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  k(pTerm->pExpr, 
d900: 61 66 66 29 20 29 20 72 65 74 75 72 6e 20 30 3b  aff) ) return 0;
d910: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
d920: 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20  endif...#ifndef 
d930: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
d940: 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a  MATIC_INDEX./*.*
d950: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
d960: 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65  to construct the
d970: 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 66 6f   Index object fo
d980: 72 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69  r an automatic i
d990: 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 6f 20 73  ndex.** and to s
d9a0: 65 74 20 75 70 20 74 68 65 20 57 68 65 72 65 4c  et up the WhereL
d9b0: 65 76 65 6c 20 6f 62 6a 65 63 74 20 70 4c 65 76  evel object pLev
d9c0: 65 6c 20 73 6f 20 74 68 61 74 20 74 68 65 20 63  el so that the c
d9d0: 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a  ode generator.**
d9e0: 20 6d 61 6b 65 73 20 75 73 65 20 6f 66 20 74 68   makes use of th
d9f0: 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  e automatic inde
da00: 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
da10: 64 20 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d  d constructAutom
da20: 61 74 69 63 49 6e 64 65 78 28 0a 20 20 50 61 72  aticIndex(.  Par
da30: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
da40: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
da50: 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
da60: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
da70: 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 20   *pWC,          
da80: 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
da90: 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
daa0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
dab0: 53 72 63 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f  Src,  /* The FRO
dac0: 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f  M clause term to
dad0: 20 67 65 74 20 74 68 65 20 6e 65 78 74 20 69 6e   get the next in
dae0: 64 65 78 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  dex */.  Bitmask
daf0: 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20   notReady,      
db00: 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
db10: 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65  cursors that are
db20: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 2a   not available *
db30: 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
db40: 70 4c 65 76 65 6c 20 20 20 20 20 20 20 20 20 20  pLevel          
db50: 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 69 6e 64  /* Write new ind
db60: 65 78 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ex here */.){.  
db70: 69 6e 74 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20  int nKeyCol;    
db80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
db90: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
dba0: 20 69 6e 20 74 68 65 20 63 6f 6e 73 74 72 75 63   in the construc
dbb0: 74 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 57  ted index */.  W
dbc0: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
dbd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
dbe0: 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74  single term of t
dbf0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
dc00: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
dc10: 70 57 43 45 6e 64 3b 20 20 20 20 20 20 20 20 20  pWCEnd;         
dc20: 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e   /* End of pWC->
dc30: 61 5b 5d 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  a[] */.  Index *
dc40: 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
dc50: 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 64       /* Object d
dc60: 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 74 72  escribing the tr
dc70: 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 2a 2f  ansient index */
dc80: 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
dc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dca0: 2a 20 50 72 65 70 61 72 65 64 20 73 74 61 74 65  * Prepared state
dcb0: 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74  ment under const
dcc0: 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ruction */.  int
dcd0: 20 61 64 64 72 49 6e 69 74 3b 20 20 20 20 20 20   addrInit;      
dce0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
dcf0: 65 73 73 20 6f 66 20 74 68 65 20 69 6e 69 74 69  ess of the initi
dd00: 61 6c 69 7a 61 74 69 6f 6e 20 62 79 70 61 73 73  alization bypass
dd10: 20 6a 75 6d 70 20 2a 2f 0a 20 20 54 61 62 6c 65   jump */.  Table
dd20: 20 2a 70 54 61 62 6c 65 3b 20 20 20 20 20 20 20   *pTable;       
dd30: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
dd40: 62 6c 65 20 62 65 69 6e 67 20 69 6e 64 65 78 65  ble being indexe
dd50: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54  d */.  int addrT
dd60: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
dd70: 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65     /* Top of the
dd80: 20 69 6e 64 65 78 20 66 69 6c 6c 20 6c 6f 6f 70   index fill loop
dd90: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63   */.  int regRec
dda0: 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ord;            
ddb0: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
ddc0: 6c 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 72  lding an index r
ddd0: 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  ecord */.  int n
dde0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ddf0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
de00: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
de10: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
de20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
de30: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
de40: 6e 74 20 6d 78 42 69 74 43 6f 6c 3b 20 20 20 20  nt mxBitCol;    
de50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
de60: 78 69 6d 75 6d 20 63 6f 6c 75 6d 6e 20 69 6e 20  ximum column in 
de70: 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 2a 2f  pSrc->colUsed */
de80: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
de90: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
dea0: 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * Collating sequ
deb0: 65 6e 63 65 20 74 6f 20 6f 6e 20 61 20 63 6f 6c  ence to on a col
dec0: 75 6d 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  umn */.  WhereLo
ded0: 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20  op *pLoop;      
dee0: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 6f 6f 70       /* The Loop
def0: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61   object */.  cha
df00: 72 20 2a 7a 4e 6f 74 55 73 65 64 3b 20 20 20 20  r *zNotUsed;    
df10: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
df20: 61 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 65  a space on the e
df30: 6e 64 20 6f 66 20 70 49 64 78 20 2a 2f 0a 20 20  nd of pIdx */.  
df40: 42 69 74 6d 61 73 6b 20 69 64 78 43 6f 6c 73 3b  Bitmask idxCols;
df50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
df60: 69 74 6d 61 70 20 6f 66 20 63 6f 6c 75 6d 6e 73  itmap of columns
df70: 20 75 73 65 64 20 66 6f 72 20 69 6e 64 65 78 69   used for indexi
df80: 6e 67 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ng */.  Bitmask 
df90: 65 78 74 72 61 43 6f 6c 73 3b 20 20 20 20 20 20  extraCols;      
dfa0: 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66      /* Bitmap of
dfb0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75   additional colu
dfc0: 6d 6e 73 20 2a 2f 0a 20 20 75 38 20 73 65 6e 74  mns */.  u8 sent
dfd0: 57 61 72 6e 69 6e 67 20 3d 20 30 3b 20 20 20 20  Warning = 0;    
dfe0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
dff0: 61 20 77 61 72 6e 6e 69 6e 67 20 68 61 73 20 62  a warnning has b
e000: 65 65 6e 20 69 73 73 75 65 64 20 2a 2f 0a 0a 20  een issued */.. 
e010: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
e020: 65 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 74  e to skip over t
e030: 68 65 20 63 72 65 61 74 69 6f 6e 20 61 6e 64 20  he creation and 
e040: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f  initialization o
e050: 66 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73  f the.  ** trans
e060: 69 65 6e 74 20 69 6e 64 65 78 20 6f 6e 20 32 6e  ient index on 2n
e070: 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74  d and subsequent
e080: 20 69 74 65 72 61 74 69 6f 6e 73 20 6f 66 20 74   iterations of t
e090: 68 65 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 76 20  he loop. */.  v 
e0a0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
e0b0: 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
e0c0: 29 3b 0a 20 20 61 64 64 72 49 6e 69 74 20 3d 20  );.  addrInit = 
e0d0: 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28  sqlite3CodeOnce(
e0e0: 70 50 61 72 73 65 29 3b 20 56 64 62 65 43 6f 76  pParse); VdbeCov
e0f0: 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20  erage(v);..  /* 
e100: 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
e110: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74   of columns that
e120: 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74   will be added t
e130: 6f 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a  o the index.  **
e140: 20 61 6e 64 20 75 73 65 64 20 74 6f 20 6d 61 74   and used to mat
e150: 63 68 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ch WHERE clause 
e160: 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20  constraints */. 
e170: 20 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a 20 20   nKeyCol = 0;.  
e180: 70 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70  pTable = pSrc->p
e190: 54 61 62 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20  Tab;.  pWCEnd = 
e1a0: 26 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65  &pWC->a[pWC->nTe
e1b0: 72 6d 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70  rm];.  pLoop = p
e1c0: 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20  Level->pWLoop;. 
e1d0: 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20   idxCols = 0;.  
e1e0: 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
e1f0: 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20  ; pTerm<pWCEnd; 
e200: 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  pTerm++){.    if
e210: 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e  ( termCanDriveIn
e220: 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c  dex(pTerm, pSrc,
e230: 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20   notReady) ){.  
e240: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
e250: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
e260: 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73  mn;.      Bitmas
e270: 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d  k cMask = iCol>=
e280: 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28 42 4d  BMS ? MASKBIT(BM
e290: 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54 28 69  S-1) : MASKBIT(i
e2a0: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Col);.      test
e2b0: 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20  case( iCol==BMS 
e2c0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
e2d0: 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29  e( iCol==BMS-1 )
e2e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 73 65 6e  ;.      if( !sen
e2f0: 74 57 61 72 6e 69 6e 67 20 29 7b 0a 20 20 20 20  tWarning ){.    
e300: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
e310: 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41  SQLITE_WARNING_A
e320: 55 54 4f 49 4e 44 45 58 2c 0a 20 20 20 20 20 20  UTOINDEX,.      
e330: 20 20 20 20 20 20 22 61 75 74 6f 6d 61 74 69 63        "automatic
e340: 20 69 6e 64 65 78 20 6f 6e 20 25 73 28 25 73 29   index on %s(%s)
e350: 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  ", pTable->zName
e360: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 54  ,.            pT
e370: 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  able->aCol[iCol]
e380: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  .zName);.       
e390: 20 73 65 6e 74 57 61 72 6e 69 6e 67 20 3d 20 31   sentWarning = 1
e3a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e3b0: 69 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63  if( (idxCols & c
e3c0: 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Mask)==0 ){.    
e3d0: 20 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f      if( whereLoo
e3e0: 70 52 65 73 69 7a 65 28 70 50 61 72 73 65 2d 3e  pResize(pParse->
e3f0: 64 62 2c 20 70 4c 6f 6f 70 2c 20 6e 4b 65 79 43  db, pLoop, nKeyC
e400: 6f 6c 2b 31 29 20 29 20 72 65 74 75 72 6e 3b 0a  ol+1) ) return;.
e410: 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61          pLoop->a
e420: 4c 54 65 72 6d 5b 6e 4b 65 79 43 6f 6c 2b 2b 5d  LTerm[nKeyCol++]
e430: 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
e440: 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61    idxCols |= cMa
e450: 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  sk;.      }.    
e460: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
e470: 6e 4b 65 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 70  nKeyCol>0 );.  p
e480: 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
e490: 71 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72  q = pLoop->nLTer
e4a0: 6d 20 3d 20 6e 4b 65 79 43 6f 6c 3b 0a 20 20 70  m = nKeyCol;.  p
e4b0: 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20  Loop->wsFlags = 
e4c0: 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20  WHERE_COLUMN_EQ 
e4d0: 7c 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  | WHERE_IDX_ONLY
e4e0: 20 7c 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   | WHERE_INDEXED
e4f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e500: 20 20 20 20 20 20 7c 20 57 48 45 52 45 5f 41 55        | WHERE_AU
e510: 54 4f 5f 49 4e 44 45 58 3b 0a 0a 20 20 2f 2a 20  TO_INDEX;..  /* 
e520: 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
e530: 20 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63   of additional c
e540: 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f  olumns needed to
e550: 20 63 72 65 61 74 65 20 61 0a 20 20 2a 2a 20 63   create a.  ** c
e560: 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20  overing index.  
e570: 41 20 22 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  A "covering inde
e580: 78 22 20 69 73 20 61 6e 20 69 6e 64 65 78 20 74  x" is an index t
e590: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c  hat contains all
e5a0: 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68  .  ** columns th
e5b0: 61 74 20 61 72 65 20 6e 65 65 64 65 64 20 62 79  at are needed by
e5c0: 20 74 68 65 20 71 75 65 72 79 2e 20 20 57 69 74   the query.  Wit
e5d0: 68 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  h a covering ind
e5e0: 65 78 2c 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69  ex, the.  ** ori
e5f0: 67 69 6e 61 6c 20 74 61 62 6c 65 20 6e 65 76 65  ginal table neve
e600: 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 63  r needs to be ac
e610: 63 65 73 73 65 64 2e 20 20 41 75 74 6f 6d 61 74  cessed.  Automat
e620: 69 63 20 69 6e 64 69 63 65 73 20 6d 75 73 74 0a  ic indices must.
e630: 20 20 2a 2a 20 62 65 20 61 20 63 6f 76 65 72 69    ** be a coveri
e640: 6e 67 20 69 6e 64 65 78 20 62 65 63 61 75 73 65  ng index because
e650: 20 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20   the index will 
e660: 6e 6f 74 20 62 65 20 75 70 64 61 74 65 64 20 69  not be updated i
e670: 66 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69  f the.  ** origi
e680: 6e 61 6c 20 74 61 62 6c 65 20 63 68 61 6e 67 65  nal table change
e690: 73 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20  s and the index 
e6a0: 61 6e 64 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74  and table cannot
e6b0: 20 62 6f 74 68 20 62 65 20 75 73 65 64 0a 20 20   both be used.  
e6c0: 2a 2a 20 69 66 20 74 68 65 79 20 67 6f 20 6f 75  ** if they go ou
e6d0: 74 20 6f 66 20 73 79 6e 63 2e 0a 20 20 2a 2f 0a  t of sync..  */.
e6e0: 20 20 65 78 74 72 61 43 6f 6c 73 20 3d 20 70 53    extraCols = pS
e6f0: 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28 7e  rc->colUsed & (~
e700: 69 64 78 43 6f 6c 73 20 7c 20 4d 41 53 4b 42 49  idxCols | MASKBI
e710: 54 28 42 4d 53 2d 31 29 29 3b 0a 20 20 6d 78 42  T(BMS-1));.  mxB
e720: 69 74 43 6f 6c 20 3d 20 28 70 54 61 62 6c 65 2d  itCol = (pTable-
e730: 3e 6e 43 6f 6c 20 3e 3d 20 42 4d 53 2d 31 29 20  >nCol >= BMS-1) 
e740: 3f 20 42 4d 53 2d 31 20 3a 20 70 54 61 62 6c 65  ? BMS-1 : pTable
e750: 2d 3e 6e 43 6f 6c 3b 0a 20 20 74 65 73 74 63 61  ->nCol;.  testca
e760: 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  se( pTable->nCol
e770: 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 74 65 73  ==BMS-1 );.  tes
e780: 74 63 61 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e  tcase( pTable->n
e790: 43 6f 6c 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20  Col==BMS-2 );.  
e7a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74  for(i=0; i<mxBit
e7b0: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Col; i++){.    i
e7c0: 66 28 20 65 78 74 72 61 43 6f 6c 73 20 26 20 4d  f( extraCols & M
e7d0: 41 53 4b 42 49 54 28 69 29 20 29 20 6e 4b 65 79  ASKBIT(i) ) nKey
e7e0: 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28  Col++;.  }.  if(
e7f0: 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26   pSrc->colUsed &
e800: 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20   MASKBIT(BMS-1) 
e810: 29 7b 0a 20 20 20 20 6e 4b 65 79 43 6f 6c 20 2b  ){.    nKeyCol +
e820: 3d 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 2d  = pTable->nCol -
e830: 20 42 4d 53 20 2b 20 31 3b 0a 20 20 7d 0a 20 20   BMS + 1;.  }.  
e840: 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c  pLoop->wsFlags |
e850: 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  = WHERE_COLUMN_E
e860: 51 20 7c 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  Q | WHERE_IDX_ON
e870: 4c 59 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72  LY;..  /* Constr
e880: 75 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f 62  uct the Index ob
e890: 6a 65 63 74 20 74 6f 20 64 65 73 63 72 69 62 65  ject to describe
e8a0: 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 20   this index */. 
e8b0: 20 70 49 64 78 20 3d 20 73 71 6c 69 74 65 33 41   pIdx = sqlite3A
e8c0: 6c 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a 65  llocateIndexObje
e8d0: 63 74 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e  ct(pParse->db, n
e8e0: 4b 65 79 43 6f 6c 2b 31 2c 20 30 2c 20 26 7a 4e  KeyCol+1, 0, &zN
e8f0: 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 70  otUsed);.  if( p
e900: 49 64 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Idx==0 ) return;
e910: 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  .  pLoop->u.btre
e920: 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b  e.pIndex = pIdx;
e930: 0a 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3d  .  pIdx->zName =
e940: 20 22 61 75 74 6f 2d 69 6e 64 65 78 22 3b 0a 20   "auto-index";. 
e950: 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 20 3d 20   pIdx->pTable = 
e960: 70 54 61 62 6c 65 3b 0a 20 20 6e 20 3d 20 30 3b  pTable;.  n = 0;
e970: 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a  .  idxCols = 0;.
e980: 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
e990: 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64  >a; pTerm<pWCEnd
e9a0: 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; pTerm++){.    
e9b0: 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65  if( termCanDrive
e9c0: 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72  Index(pTerm, pSr
e9d0: 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a  c, notReady) ){.
e9e0: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
e9f0: 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
ea00: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d  lumn;.      Bitm
ea10: 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c  ask cMask = iCol
ea20: 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28  >=BMS ? MASKBIT(
ea30: 42 4d 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54  BMS-1) : MASKBIT
ea40: 28 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65  (iCol);.      te
ea50: 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d  stcase( iCol==BM
ea60: 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73  S-1 );.      tes
ea70: 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53  tcase( iCol==BMS
ea80: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69   );.      if( (i
ea90: 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d  dxCols & cMask)=
eaa0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78  =0 ){.        Ex
eab0: 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e  pr *pX = pTerm->
eac0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69  pExpr;.        i
ead0: 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b  dxCols |= cMask;
eae0: 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61  .        pIdx->a
eaf0: 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 70 54 65  iColumn[n] = pTe
eb00: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
eb10: 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  ;.        pColl 
eb20: 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43  = sqlite3BinaryC
eb30: 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50  ompareCollSeq(pP
eb40: 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c  arse, pX->pLeft,
eb50: 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20   pX->pRight);.  
eb60: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f        pIdx->azCo
eb70: 6c 6c 5b 6e 5d 20 3d 20 41 4c 57 41 59 53 28 70  ll[n] = ALWAYS(p
eb80: 43 6f 6c 6c 29 20 3f 20 70 43 6f 6c 6c 2d 3e 7a  Coll) ? pColl->z
eb90: 4e 61 6d 65 20 3a 20 22 42 49 4e 41 52 59 22 3b  Name : "BINARY";
eba0: 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20  .        n++;.  
ebb0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
ebc0: 20 20 61 73 73 65 72 74 28 20 28 75 33 32 29 6e    assert( (u32)n
ebd0: 3d 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  ==pLoop->u.btree
ebe0: 2e 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 41 64  .nEq );..  /* Ad
ebf0: 64 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c  d additional col
ec00: 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20 6d  umns needed to m
ec10: 61 6b 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69  ake the automati
ec20: 63 20 69 6e 64 65 78 20 69 6e 74 6f 0a 20 20 2a  c index into.  *
ec30: 2a 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  * a covering ind
ec40: 65 78 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  ex */.  for(i=0;
ec50: 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b   i<mxBitCol; i++
ec60: 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72 61  ){.    if( extra
ec70: 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54 28 69  Cols & MASKBIT(i
ec80: 29 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d  ) ){.      pIdx-
ec90: 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69  >aiColumn[n] = i
eca0: 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a  ;.      pIdx->az
ecb0: 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52  Coll[n] = "BINAR
ecc0: 59 22 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20  Y";.      n++;. 
ecd0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
ece0: 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d  Src->colUsed & M
ecf0: 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 29 7b  ASKBIT(BMS-1) ){
ed00: 0a 20 20 20 20 66 6f 72 28 69 3d 42 4d 53 2d 31  .    for(i=BMS-1
ed10: 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  ; i<pTable->nCol
ed20: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 49  ; i++){.      pI
ed30: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20  dx->aiColumn[n] 
ed40: 3d 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78 2d  = i;.      pIdx-
ed50: 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49  >azColl[n] = "BI
ed60: 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 6e 2b 2b  NARY";.      n++
ed70: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
ed80: 73 65 72 74 28 20 6e 3d 3d 6e 4b 65 79 43 6f 6c  sert( n==nKeyCol
ed90: 20 29 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f   );.  pIdx->aiCo
eda0: 6c 75 6d 6e 5b 6e 5d 20 3d 20 2d 31 3b 0a 20 20  lumn[n] = -1;.  
edb0: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20  pIdx->azColl[n] 
edc0: 3d 20 22 42 49 4e 41 52 59 22 3b 0a 0a 20 20 2f  = "BINARY";..  /
edd0: 2a 20 43 72 65 61 74 65 20 74 68 65 20 61 75 74  * Create the aut
ede0: 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 2a 2f 0a  omatic index */.
edf0: 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c    assert( pLevel
ee00: 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a  ->iIdxCur>=0 );.
ee10: 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75    pLevel->iIdxCu
ee20: 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
ee30: 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  ++;.  sqlite3Vdb
ee40: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
ee50: 65 6e 41 75 74 6f 69 6e 64 65 78 2c 20 70 4c 65  enAutoindex, pLe
ee60: 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 6e 4b  vel->iIdxCur, nK
ee70: 65 79 43 6f 6c 2b 31 29 3b 0a 20 20 73 71 6c 69  eyCol+1);.  sqli
ee80: 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49  te3VdbeSetP4KeyI
ee90: 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78  nfo(pParse, pIdx
eea0: 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  );.  VdbeComment
eeb0: 28 28 76 2c 20 22 66 6f 72 20 25 73 22 2c 20 70  ((v, "for %s", p
eec0: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  Table->zName));.
eed0: 0a 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 61  .  /* Fill the a
eee0: 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 77  utomatic index w
eef0: 69 74 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  ith content */. 
ef00: 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74   addrTop = sqlit
ef10: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
ef20: 4f 50 5f 52 65 77 69 6e 64 2c 20 70 4c 65 76 65  OP_Rewind, pLeve
ef30: 6c 2d 3e 69 54 61 62 43 75 72 29 3b 20 56 64 62  l->iTabCur); Vdb
ef40: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
ef50: 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69  regRecord = sqli
ef60: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
ef70: 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  arse);.  sqlite3
ef80: 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79  GenerateIndexKey
ef90: 28 70 50 61 72 73 65 2c 20 70 49 64 78 2c 20 70  (pParse, pIdx, p
efa0: 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20  Level->iTabCur, 
efb0: 72 65 67 52 65 63 6f 72 64 2c 20 30 2c 20 30 2c  regRecord, 0, 0,
efc0: 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   0, 0);.  sqlite
efd0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
efe0: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 4c 65  P_IdxInsert, pLe
eff0: 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 72 65  vel->iIdxCur, re
f000: 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69  gRecord);.  sqli
f010: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
f020: 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45  v, OPFLAG_USESEE
f030: 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69  KRESULT);.  sqli
f040: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
f050: 20 4f 50 5f 4e 65 78 74 2c 20 70 4c 65 76 65 6c   OP_Next, pLevel
f060: 2d 3e 69 54 61 62 43 75 72 2c 20 61 64 64 72 54  ->iTabCur, addrT
f070: 6f 70 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72  op+1); VdbeCover
f080: 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  age(v);.  sqlite
f090: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
f0a0: 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
f0b0: 55 53 5f 41 55 54 4f 49 4e 44 45 58 29 3b 0a 20  US_AUTOINDEX);. 
f0c0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
f0d0: 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70 29  Here(v, addrTop)
f0e0: 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
f0f0: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
f100: 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
f110: 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
f120: 77 68 65 6e 20 73 6b 69 70 70 69 6e 67 20 74 68  when skipping th
f130: 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
f140: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
f150: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
f160: 72 49 6e 69 74 29 3b 0a 7d 0a 23 65 6e 64 69 66  rInit);.}.#endif
f170: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
f180: 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20  AUTOMATIC_INDEX 
f190: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
f1a0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
f1b0: 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ABLE./*.** Alloc
f1c0: 61 74 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  ate and populate
f1d0: 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65   an sqlite3_inde
f1e0: 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
f1f0: 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20  . It is the .** 
f200: 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
f210: 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
f220: 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61  eventually relea
f230: 73 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65  se the structure
f240: 0a 2a 2a 20 62 79 20 70 61 73 73 69 6e 67 20 74  .** by passing t
f250: 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
f260: 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ned by this func
f270: 74 69 6f 6e 20 74 6f 20 73 71 6c 69 74 65 33 5f  tion to sqlite3_
f280: 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  free()..*/.stati
f290: 63 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  c sqlite3_index_
f2a0: 69 6e 66 6f 20 2a 61 6c 6c 6f 63 61 74 65 49 6e  info *allocateIn
f2b0: 64 65 78 49 6e 66 6f 28 0a 20 20 50 61 72 73 65  dexInfo(.  Parse
f2c0: 20 2a 70 50 61 72 73 65 2c 0a 20 20 57 68 65 72   *pParse,.  Wher
f2d0: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 0a 20 20  eClause *pWC,.  
f2e0: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
f2f0: 74 65 6d 20 2a 70 53 72 63 2c 0a 20 20 45 78 70  tem *pSrc,.  Exp
f300: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 0a  rList *pOrderBy.
f310: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
f320: 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 73 74   int nTerm;.  st
f330: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
f340: 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70  ex_constraint *p
f350: 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63  IdxCons;.  struc
f360: 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
f370: 6f 72 64 65 72 62 79 20 2a 70 49 64 78 4f 72 64  orderby *pIdxOrd
f380: 65 72 42 79 3b 0a 20 20 73 74 72 75 63 74 20 73  erBy;.  struct s
f390: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
f3a0: 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70  straint_usage *p
f3b0: 55 73 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65  Usage;.  WhereTe
f3c0: 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74  rm *pTerm;.  int
f3d0: 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 73 71 6c   nOrderBy;.  sql
f3e0: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
f3f0: 2a 70 49 64 78 49 6e 66 6f 3b 0a 0a 20 20 2f 2a  *pIdxInfo;..  /*
f400: 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
f410: 72 20 6f 66 20 70 6f 73 73 69 62 6c 65 20 57 48  r of possible WH
f420: 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74  ERE clause const
f430: 72 61 69 6e 74 73 20 72 65 66 65 72 72 69 6e 67  raints referring
f440: 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 76 69  .  ** to this vi
f450: 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20  rtual table */. 
f460: 20 66 6f 72 28 69 3d 6e 54 65 72 6d 3d 30 2c 20   for(i=nTerm=0, 
f470: 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c  pTerm=pWC->a; i<
f480: 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c  pWC->nTerm; i++,
f490: 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69   pTerm++){.    i
f4a0: 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
f4b0: 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43  rsor != pSrc->iC
f4c0: 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65  ursor ) continue
f4d0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 49 73  ;.    assert( Is
f4e0: 50 6f 77 65 72 4f 66 54 77 6f 28 70 54 65 72 6d  PowerOfTwo(pTerm
f4f0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 57  ->eOperator & ~W
f500: 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20 20 20 20  O_EQUIV) );.    
f510: 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
f520: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
f530: 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  IN );.    testca
f540: 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
f550: 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c  ator & WO_ISNULL
f560: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
f570: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
f580: 6f 72 20 26 20 57 4f 5f 41 4c 4c 20 29 3b 0a 20  or & WO_ALL );. 
f590: 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
f5a0: 4f 70 65 72 61 74 6f 72 20 26 20 7e 28 57 4f 5f  Operator & ~(WO_
f5b0: 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51 55 49 56 29  ISNULL|WO_EQUIV)
f5c0: 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )==0 ) continue;
f5d0: 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
f5e0: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
f5f0: 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b  NULL ) continue;
f600: 0a 20 20 20 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20  .    nTerm++;.  
f610: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 4f  }..  /* If the O
f620: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 63  RDER BY clause c
f630: 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c  ontains only col
f640: 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 75 72 72  umns in the curr
f650: 65 6e 74 20 0a 20 20 2a 2a 20 76 69 72 74 75 61  ent .  ** virtua
f660: 6c 20 74 61 62 6c 65 20 74 68 65 6e 20 61 6c 6c  l table then all
f670: 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
f680: 74 68 65 20 61 4f 72 64 65 72 42 79 20 70 61 72  the aOrderBy par
f690: 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73 71  t of.  ** the sq
f6a0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
f6b0: 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2f   structure..  */
f6c0: 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b  .  nOrderBy = 0;
f6d0: 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
f6e0: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70  ){.    int n = p
f6f0: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
f700: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
f710: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  ; i++){.      Ex
f720: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64  pr *pExpr = pOrd
f730: 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
f740: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
f750: 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
f760: 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   || pExpr->iTabl
f770: 65 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  e!=pSrc->iCursor
f780: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
f790: 20 20 20 20 69 66 28 20 69 3d 3d 6e 29 7b 0a 20      if( i==n){. 
f7a0: 20 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20       nOrderBy = 
f7b0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  n;.    }.  }..  
f7c0: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20  /* Allocate the 
f7d0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
f7e0: 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a  fo structure.  *
f7f0: 2f 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 73  /.  pIdxInfo = s
f800: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
f810: 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73  ro(pParse->db, s
f820: 69 7a 65 6f 66 28 2a 70 49 64 78 49 6e 66 6f 29  izeof(*pIdxInfo)
f830: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f840: 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 28 73              + (s
f850: 69 7a 65 6f 66 28 2a 70 49 64 78 43 6f 6e 73 29  izeof(*pIdxCons)
f860: 20 2b 20 73 69 7a 65 6f 66 28 2a 70 55 73 61 67   + sizeof(*pUsag
f870: 65 29 29 2a 6e 54 65 72 6d 0a 20 20 20 20 20 20  e))*nTerm.      
f880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f890: 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 2a 70       + sizeof(*p
f8a0: 49 64 78 4f 72 64 65 72 42 79 29 2a 6e 4f 72 64  IdxOrderBy)*nOrd
f8b0: 65 72 42 79 20 29 3b 0a 20 20 69 66 28 20 70 49  erBy );.  if( pI
f8c0: 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20  dxInfo==0 ){.   
f8d0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
f8e0: 28 70 50 61 72 73 65 2c 20 22 6f 75 74 20 6f 66  (pParse, "out of
f8f0: 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 72   memory");.    r
f900: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
f910: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
f920: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  e structure.  Th
f930: 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
f940: 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 63  info structure c
f950: 6f 6e 74 61 69 6e 73 0a 20 20 2a 2a 20 6d 61 6e  ontains.  ** man
f960: 79 20 66 69 65 6c 64 73 20 74 68 61 74 20 61 72  y fields that ar
f970: 65 20 64 65 63 6c 61 72 65 64 20 22 63 6f 6e 73  e declared "cons
f980: 74 22 20 74 6f 20 70 72 65 76 65 6e 74 20 78 42  t" to prevent xB
f990: 65 73 74 49 6e 64 65 78 20 66 72 6f 6d 0a 20 20  estIndex from.  
f9a0: 2a 2a 20 63 68 61 6e 67 69 6e 67 20 74 68 65 6d  ** changing them
f9b0: 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f  .  We have to do
f9c0: 20 73 6f 6d 65 20 66 75 6e 6b 79 20 63 61 73 74   some funky cast
f9d0: 69 6e 67 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a  ing in order to.
f9e0: 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20    ** initialize 
f9f0: 74 68 6f 73 65 20 66 69 65 6c 64 73 2e 0a 20 20  those fields..  
fa00: 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20  */.  pIdxCons = 
fa10: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
fa20: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
fa30: 2a 29 26 70 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a  *)&pIdxInfo[1];.
fa40: 20 20 70 49 64 78 4f 72 64 65 72 42 79 20 3d 20    pIdxOrderBy = 
fa50: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
fa60: 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 29 26  index_orderby*)&
fa70: 70 49 64 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b  pIdxCons[nTerm];
fa80: 0a 20 20 70 55 73 61 67 65 20 3d 20 28 73 74 72  .  pUsage = (str
fa90: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
faa0: 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
fab0: 67 65 2a 29 26 70 49 64 78 4f 72 64 65 72 42 79  ge*)&pIdxOrderBy
fac0: 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20 2a 28  [nOrderBy];.  *(
fad0: 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  int*)&pIdxInfo->
fae0: 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 54  nConstraint = nT
faf0: 65 72 6d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70  erm;.  *(int*)&p
fb00: 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42  IdxInfo->nOrderB
fb10: 79 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20  y = nOrderBy;.  
fb20: 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
fb30: 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
fb40: 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  t**)&pIdxInfo->a
fb50: 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64  Constraint = pId
fb60: 78 43 6f 6e 73 3b 0a 20 20 2a 28 73 74 72 75 63  xCons;.  *(struc
fb70: 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
fb80: 6f 72 64 65 72 62 79 2a 2a 29 26 70 49 64 78 49  orderby**)&pIdxI
fb90: 6e 66 6f 2d 3e 61 4f 72 64 65 72 42 79 20 3d 20  nfo->aOrderBy = 
fba0: 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 2a  pIdxOrderBy;.  *
fbb0: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
fbc0: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
fbd0: 5f 75 73 61 67 65 2a 2a 29 26 70 49 64 78 49 6e  _usage**)&pIdxIn
fbe0: 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
fbf0: 73 61 67 65 20 3d 0a 20 20 20 20 20 20 20 20 20  sage =.         
fc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc30: 20 20 20 20 20 20 20 20 20 20 70 55 73 61 67 65            pUsage
fc40: 3b 0a 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20  ;..  for(i=j=0, 
fc50: 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c  pTerm=pWC->a; i<
fc60: 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c  pWC->nTerm; i++,
fc70: 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 75   pTerm++){.    u
fc80: 38 20 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 54  8 op;.    if( pT
fc90: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  erm->leftCursor 
fca0: 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  != pSrc->iCursor
fcb0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
fcc0: 20 61 73 73 65 72 74 28 20 49 73 50 6f 77 65 72   assert( IsPower
fcd0: 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70  OfTwo(pTerm->eOp
fce0: 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55  erator & ~WO_EQU
fcf0: 49 56 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63  IV) );.    testc
fd00: 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
fd10: 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b  rator & WO_IN );
fd20: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
fd30: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
fd40: 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  & WO_ISNULL );. 
fd50: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
fd60: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
fd70: 57 4f 5f 41 4c 4c 20 29 3b 0a 20 20 20 20 69 66  WO_ALL );.    if
fd80: 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
fd90: 74 6f 72 20 26 20 7e 28 57 4f 5f 49 53 4e 55 4c  tor & ~(WO_ISNUL
fda0: 4c 7c 57 4f 5f 45 51 55 49 56 29 29 3d 3d 30 20  L|WO_EQUIV))==0 
fdb0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
fdc0: 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  if( pTerm->wtFla
fdd0: 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20  gs & TERM_VNULL 
fde0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
fdf0: 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c  pIdxCons[j].iCol
fe00: 75 6d 6e 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c  umn = pTerm->u.l
fe10: 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70  eftColumn;.    p
fe20: 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d  IdxCons[j].iTerm
fe30: 4f 66 66 73 65 74 20 3d 20 69 3b 0a 20 20 20 20  Offset = i;.    
fe40: 6f 70 20 3d 20 28 75 38 29 70 54 65 72 6d 2d 3e  op = (u8)pTerm->
fe50: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41  eOperator & WO_A
fe60: 4c 4c 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d  LL;.    if( op==
fe70: 57 4f 5f 49 4e 20 29 20 6f 70 20 3d 20 57 4f 5f  WO_IN ) op = WO_
fe80: 45 51 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73  EQ;.    pIdxCons
fe90: 5b 6a 5d 2e 6f 70 20 3d 20 6f 70 3b 0a 20 20 20  [j].op = op;.   
fea0: 20 2f 2a 20 54 68 65 20 64 69 72 65 63 74 20 61   /* The direct a
feb0: 73 73 69 67 6e 6d 65 6e 74 20 69 6e 20 74 68 65  ssignment in the
fec0: 20 70 72 65 76 69 6f 75 73 20 6c 69 6e 65 20 69   previous line i
fed0: 73 20 70 6f 73 73 69 62 6c 65 20 6f 6e 6c 79 20  s possible only 
fee0: 62 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 74  because.    ** t
fef0: 68 65 20 57 4f 5f 20 61 6e 64 20 53 51 4c 49 54  he WO_ and SQLIT
ff00: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
ff10: 4e 54 5f 20 63 6f 64 65 73 20 61 72 65 20 69 64  NT_ codes are id
ff20: 65 6e 74 69 63 61 6c 2e 20 20 54 68 65 0a 20 20  entical.  The.  
ff30: 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61    ** following a
ff40: 73 73 65 72 74 73 20 76 65 72 69 66 79 20 74 68  sserts verify th
ff50: 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 20 20  is fact. */.    
ff60: 61 73 73 65 72 74 28 20 57 4f 5f 45 51 3d 3d 53  assert( WO_EQ==S
ff70: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
ff80: 54 52 41 49 4e 54 5f 45 51 20 29 3b 0a 20 20 20  TRAINT_EQ );.   
ff90: 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 54 3d 3d   assert( WO_LT==
ffa0: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
ffb0: 53 54 52 41 49 4e 54 5f 4c 54 20 29 3b 0a 20 20  STRAINT_LT );.  
ffc0: 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 45 3d    assert( WO_LE=
ffd0: 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
ffe0: 4e 53 54 52 41 49 4e 54 5f 4c 45 20 29 3b 0a 20  NSTRAINT_LE );. 
fff0: 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47 54     assert( WO_GT
10000 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
10010 4f 4e 53 54 52 41 49 4e 54 5f 47 54 20 29 3b 0a  ONSTRAINT_GT );.
10020 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47      assert( WO_G
10030 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  E==SQLITE_INDEX_
10040 43 4f 4e 53 54 52 41 49 4e 54 5f 47 45 20 29 3b  CONSTRAINT_GE );
10050 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f  .    assert( WO_
10060 4d 41 54 43 48 3d 3d 53 51 4c 49 54 45 5f 49 4e  MATCH==SQLITE_IN
10070 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d  DEX_CONSTRAINT_M
10080 41 54 43 48 20 29 3b 0a 20 20 20 20 61 73 73 65  ATCH );.    asse
10090 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  rt( pTerm->eOper
100a0 61 74 6f 72 20 26 20 28 57 4f 5f 49 4e 7c 57 4f  ator & (WO_IN|WO
100b0 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c  _EQ|WO_LT|WO_LE|
100c0 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4d  WO_GT|WO_GE|WO_M
100d0 41 54 43 48 29 20 29 3b 0a 20 20 20 20 6a 2b 2b  ATCH) );.    j++
100e0 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
100f0 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b   i<nOrderBy; i++
10100 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
10110 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  pr = pOrderBy->a
10120 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70  [i].pExpr;.    p
10130 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43  IdxOrderBy[i].iC
10140 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69  olumn = pExpr->i
10150 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78  Column;.    pIdx
10160 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65 73 63 20  OrderBy[i].desc 
10170 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
10180 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a  .sortOrder;.  }.
10190 0a 20 20 72 65 74 75 72 6e 20 70 49 64 78 49 6e  .  return pIdxIn
101a0 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  fo;.}../*.** The
101b0 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65   table object re
101c0 66 65 72 65 6e 63 65 20 70 61 73 73 65 64 20 61  ference passed a
101d0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
101e0 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
101f0 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 72  nction.** must r
10200 65 70 72 65 73 65 6e 74 20 61 20 76 69 72 74 75  epresent a virtu
10210 61 6c 20 74 61 62 6c 65 2e 20 54 68 69 73 20 66  al table. This f
10220 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 73 20  unction invokes 
10230 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 28 29  the xBestIndex()
10240 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20 74 68  .** method of th
10250 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
10260 77 69 74 68 20 74 68 65 20 73 71 6c 69 74 65 33  with the sqlite3
10270 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 6f 62 6a 65  _index_info obje
10280 63 74 20 74 68 61 74 0a 2a 2a 20 63 6f 6d 65 73  ct that.** comes
10290 20 69 6e 20 61 73 20 74 68 65 20 33 72 64 20 61   in as the 3rd a
102a0 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
102b0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
102c0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
102d0 72 73 2c 20 70 50 61 72 73 65 20 69 73 20 70 6f  rs, pParse is po
102e0 70 75 6c 61 74 65 64 20 77 69 74 68 20 61 6e 20  pulated with an 
102f0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61 6e  error message an
10300 64 20 61 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20  d a.** non-zero 
10310 76 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65  value is returne
10320 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30 20  d. Otherwise, 0 
10330 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
10340 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 70 61  the output.** pa
10350 72 74 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  rt of the sqlite
10360 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
10370 75 63 74 75 72 65 20 69 73 20 6c 65 66 74 20 70  ucture is left p
10380 6f 70 75 6c 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  opulated..**.** 
10390 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  Whether or not a
103a0 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  n error is retur
103b0 6e 65 64 2c 20 69 74 20 69 73 20 74 68 65 20 72  ned, it is the r
103c0 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
103d0 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74   the.** caller t
103e0 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65  o eventually fre
103f0 65 20 70 2d 3e 69 64 78 53 74 72 20 69 66 20 70  e p->idxStr if p
10400 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
10410 74 72 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20  tr indicates.** 
10420 74 68 61 74 20 74 68 69 73 20 69 73 20 72 65 71  that this is req
10430 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  uired..*/.static
10440 20 69 6e 74 20 76 74 61 62 42 65 73 74 49 6e 64   int vtabBestInd
10450 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
10460 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 73  , Table *pTab, s
10470 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
10480 6f 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  o *p){.  sqlite3
10490 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20 73  _vtab *pVtab = s
104a0 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28  qlite3GetVTable(
104b0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
104c0 29 2d 3e 70 56 74 61 62 3b 0a 20 20 69 6e 74 20  )->pVtab;.  int 
104d0 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  i;.  int rc;..  
104e0 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53  TRACE_IDX_INPUTS
104f0 28 70 29 3b 0a 20 20 72 63 20 3d 20 70 56 74 61  (p);.  rc = pVta
10500 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 42 65 73  b->pModule->xBes
10510 74 49 6e 64 65 78 28 70 56 74 61 62 2c 20 70 29  tIndex(pVtab, p)
10520 3b 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 4f 55  ;.  TRACE_IDX_OU
10530 54 50 55 54 53 28 70 29 3b 0a 0a 20 20 69 66 28  TPUTS(p);..  if(
10540 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10550 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  {.    if( rc==SQ
10560 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20  LITE_NOMEM ){.  
10570 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e      pParse->db->
10580 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
10590 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
105a0 21 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20  !pVtab->zErrMsg 
105b0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
105c0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
105d0 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72   "%s", sqlite3Er
105e0 72 53 74 72 28 72 63 29 29 3b 0a 20 20 20 20 7d  rStr(rc));.    }
105f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
10600 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
10610 73 65 2c 20 22 25 73 22 2c 20 70 56 74 61 62 2d  se, "%s", pVtab-
10620 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 7d  >zErrMsg);.    }
10630 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
10640 72 65 65 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d  ree(pVtab->zErrM
10650 73 67 29 3b 0a 20 20 70 56 74 61 62 2d 3e 7a 45  sg);.  pVtab->zE
10660 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 66 6f  rrMsg = 0;..  fo
10670 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e  r(i=0; i<p->nCon
10680 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20  straint; i++){. 
10690 20 20 20 69 66 28 20 21 70 2d 3e 61 43 6f 6e 73     if( !p->aCons
106a0 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65  traint[i].usable
106b0 20 26 26 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69   && p->aConstrai
106c0 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49  ntUsage[i].argvI
106d0 6e 64 65 78 3e 30 20 29 7b 0a 20 20 20 20 20 20  ndex>0 ){.      
106e0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
106f0 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
10700 20 20 20 22 74 61 62 6c 65 20 25 73 3a 20 78 42     "table %s: xB
10710 65 73 74 49 6e 64 65 78 20 72 65 74 75 72 6e 65  estIndex returne
10720 64 20 61 6e 20 69 6e 76 61 6c 69 64 20 70 6c 61  d an invalid pla
10730 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  n", pTab->zName)
10740 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
10750 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45  eturn pParse->nE
10760 72 72 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rr;.}.#endif /* 
10770 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
10780 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
10790 45 29 20 2a 2f 0a 0a 0a 23 69 66 64 65 66 20 53  E) */...#ifdef S
107a0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
107b0 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a  T3_OR_STAT4./*.*
107c0 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6c  * Estimate the l
107d0 6f 63 61 74 69 6f 6e 20 6f 66 20 61 20 70 61 72  ocation of a par
107e0 74 69 63 75 6c 61 72 20 6b 65 79 20 61 6d 6f 6e  ticular key amon
107f0 67 20 61 6c 6c 20 6b 65 79 73 20 69 6e 20 61 6e  g all keys in an
10800 0a 2a 2a 20 69 6e 64 65 78 2e 20 20 53 74 6f 72  .** index.  Stor
10810 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
10820 20 61 53 74 61 74 20 61 73 20 66 6f 6c 6c 6f 77   aStat as follow
10830 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61 53 74 61  s:.**.**    aSta
10840 74 5b 30 5d 20 20 20 20 20 20 45 73 74 2e 20 6e  t[0]      Est. n
10850 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6c 65  umber of rows le
10860 73 73 20 74 68 61 6e 20 70 56 61 6c 0a 2a 2a 20  ss than pVal.** 
10870 20 20 20 61 53 74 61 74 5b 31 5d 20 20 20 20 20     aStat[1]     
10880 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20   Est. number of 
10890 72 6f 77 73 20 65 71 75 61 6c 20 74 6f 20 70 56  rows equal to pV
108a0 61 6c 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  al.**.** Return 
108b0 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
108c0 63 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cess..*/.static 
108d0 76 6f 69 64 20 77 68 65 72 65 4b 65 79 53 74 61  void whereKeySta
108e0 74 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ts(.  Parse *pPa
108f0 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
10900 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
10910 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e  nnection */.  In
10920 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20  dex *pIdx,      
10930 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
10940 65 78 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 64  ex to consider d
10950 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a 20 20 55 6e  omain of */.  Un
10960 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 52  packedRecord *pR
10970 65 63 2c 20 20 20 20 20 20 20 2f 2a 20 56 65 63  ec,       /* Vec
10980 74 6f 72 20 6f 66 20 76 61 6c 75 65 73 20 74 6f  tor of values to
10990 20 63 6f 6e 73 69 64 65 72 20 2a 2f 0a 20 20 69   consider */.  i
109a0 6e 74 20 72 6f 75 6e 64 55 70 2c 20 20 20 20 20  nt roundUp,     
109b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
109c0 75 6e 64 20 75 70 20 69 66 20 74 72 75 65 2e 20  und up if true. 
109d0 20 52 6f 75 6e 64 20 64 6f 77 6e 20 69 66 20 66   Round down if f
109e0 61 6c 73 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e  alse */.  tRowcn
109f0 74 20 2a 61 53 74 61 74 20 20 20 20 20 20 20 20  t *aStat        
10a00 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 73 74        /* OUT: st
10a10 61 74 73 20 77 72 69 74 74 65 6e 20 68 65 72 65  ats written here
10a20 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 53 61   */.){.  IndexSa
10a30 6d 70 6c 65 20 2a 61 53 61 6d 70 6c 65 20 3d 20  mple *aSample = 
10a40 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 3b 0a 20  pIdx->aSample;. 
10a50 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20   int iCol;      
10a60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10a70 49 6e 64 65 78 20 6f 66 20 72 65 71 75 69 72 65  Index of require
10a80 64 20 73 74 61 74 73 20 69 6e 20 61 6e 45 71 5b  d stats in anEq[
10a90 5d 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74 20  ] etc. */.  int 
10aa0 69 4d 69 6e 20 3d 20 30 3b 20 20 20 20 20 20 20  iMin = 0;       
10ab0 20 20 20 20 20 20 20 20 2f 2a 20 53 6d 61 6c 6c          /* Small
10ac0 65 73 74 20 73 61 6d 70 6c 65 20 6e 6f 74 20 79  est sample not y
10ad0 65 74 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 69  et tested */.  i
10ae0 6e 74 20 69 20 3d 20 70 49 64 78 2d 3e 6e 53 61  nt i = pIdx->nSa
10af0 6d 70 6c 65 3b 20 20 20 20 20 20 2f 2a 20 53 6d  mple;      /* Sm
10b00 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20 6c 61  allest sample la
10b10 72 67 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  rger than or equ
10b20 61 6c 20 74 6f 20 70 52 65 63 20 2a 2f 0a 20 20  al to pRec */.  
10b30 69 6e 74 20 69 54 65 73 74 3b 20 20 20 20 20 20  int iTest;      
10b40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
10b50 65 78 74 20 73 61 6d 70 6c 65 20 74 6f 20 74 65  ext sample to te
10b60 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 3b  st */.  int res;
10b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b80 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66      /* Result of
10b90 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
10ba0 61 74 69 6f 6e 20 2a 2f 0a 0a 23 69 66 6e 64 65  ation */..#ifnde
10bb0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
10bc0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
10bd0 52 28 20 70 50 61 72 73 65 20 29 3b 0a 23 65 6e  R( pParse );.#en
10be0 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 52  dif.  assert( pR
10bf0 65 63 21 3d 30 20 29 3b 0a 20 20 69 43 6f 6c 20  ec!=0 );.  iCol 
10c00 3d 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 2d  = pRec->nField -
10c10 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49   1;.  assert( pI
10c20 64 78 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b  dx->nSample>0 );
10c30 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 63 2d  .  assert( pRec-
10c40 3e 6e 46 69 65 6c 64 3e 30 20 26 26 20 69 43 6f  >nField>0 && iCo
10c50 6c 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 43  l<pIdx->nSampleC
10c60 6f 6c 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20  ol );.  do{.    
10c70 69 54 65 73 74 20 3d 20 28 69 4d 69 6e 2b 69 29  iTest = (iMin+i)
10c80 2f 32 3b 0a 20 20 20 20 72 65 73 20 3d 20 73 71  /2;.    res = sq
10c90 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
10ca0 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69  ompare(aSample[i
10cb0 54 65 73 74 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65  Test].n, aSample
10cc0 5b 69 54 65 73 74 5d 2e 70 2c 20 70 52 65 63 29  [iTest].p, pRec)
10cd0 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3c 30 20  ;.    if( res<0 
10ce0 29 7b 0a 20 20 20 20 20 20 69 4d 69 6e 20 3d 20  ){.      iMin = 
10cf0 69 54 65 73 74 2b 31 3b 0a 20 20 20 20 7d 65 6c  iTest+1;.    }el
10d00 73 65 7b 0a 20 20 20 20 20 20 69 20 3d 20 69 54  se{.      i = iT
10d10 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68  est;.    }.  }wh
10d20 69 6c 65 28 20 72 65 73 20 26 26 20 69 4d 69 6e  ile( res && iMin
10d30 3c 69 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  <i );..#ifdef SQ
10d40 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
10d50 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  The following as
10d60 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20  sert statements 
10d70 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 62  check that the b
10d80 69 6e 61 72 79 20 73 65 61 72 63 68 20 63 6f 64  inary search cod
10d90 65 0a 20 20 2a 2a 20 61 62 6f 76 65 20 66 6f 75  e.  ** above fou
10da0 6e 64 20 74 68 65 20 72 69 67 68 74 20 61 6e 73  nd the right ans
10db0 77 65 72 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20  wer. This block 
10dc0 73 65 72 76 65 73 20 6e 6f 20 70 75 72 70 6f 73  serves no purpos
10dd0 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 74 68 61  e other.  ** tha
10de0 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20  n to invoke the 
10df0 61 73 73 65 72 74 73 2e 20 20 2a 2f 0a 20 20 69  asserts.  */.  i
10e00 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  f( res==0 ){.   
10e10 20 2f 2a 20 49 66 20 28 72 65 73 3d 3d 30 29 20   /* If (res==0) 
10e20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 73 61  is true, then sa
10e30 6d 70 6c 65 20 24 69 20 6d 75 73 74 20 62 65 20  mple $i must be 
10e40 65 71 75 61 6c 20 74 6f 20 70 52 65 63 20 2a 2f  equal to pRec */
10e50 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 70  .    assert( i<p
10e60 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 3b 0a  Idx->nSample );.
10e70 20 20 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73      assert( 0==s
10e80 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
10e90 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b  Compare(aSample[
10ea0 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d  i].n, aSample[i]
10eb0 2e 70 2c 20 70 52 65 63 29 0a 20 20 20 20 20 20  .p, pRec).      
10ec0 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62     || pParse->db
10ed0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
10ee0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
10ef0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 70 52 65  * Otherwise, pRe
10f00 63 20 6d 75 73 74 20 62 65 20 73 6d 61 6c 6c 65  c must be smalle
10f10 72 20 74 68 61 6e 20 73 61 6d 70 6c 65 20 24 69  r than sample $i
10f20 20 61 6e 64 20 6c 61 72 67 65 72 20 74 68 61 6e   and larger than
10f30 0a 20 20 20 20 2a 2a 20 73 61 6d 70 6c 65 20 28  .    ** sample (
10f40 24 69 2d 31 29 2e 20 20 2a 2f 0a 20 20 20 20 61  $i-1).  */.    a
10f50 73 73 65 72 74 28 20 69 3d 3d 70 49 64 78 2d 3e  ssert( i==pIdx->
10f60 6e 53 61 6d 70 6c 65 20 0a 20 20 20 20 20 20 20  nSample .       
10f70 20 20 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65    || sqlite3Vdbe
10f80 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53  RecordCompare(aS
10f90 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d  ample[i].n, aSam
10fa0 70 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29 3e  ple[i].p, pRec)>
10fb0 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50  0.         || pP
10fc0 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
10fd0 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 61 73  Failed );.    as
10fe0 73 65 72 74 28 20 69 3d 3d 30 0a 20 20 20 20 20  sert( i==0.     
10ff0 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56 64      || sqlite3Vd
11000 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
11010 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 2c 20  aSample[i-1].n, 
11020 61 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 70 2c 20  aSample[i-1].p, 
11030 70 52 65 63 29 3c 30 0a 20 20 20 20 20 20 20 20  pRec)<0.        
11040 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
11050 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
11060 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66    }.#endif /* if
11070 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
11080 20 2a 2f 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69   */..  /* At thi
11090 73 20 70 6f 69 6e 74 2c 20 61 53 61 6d 70 6c 65  s point, aSample
110a0 5b 69 5d 20 69 73 20 74 68 65 20 66 69 72 73 74  [i] is the first
110b0 20 73 61 6d 70 6c 65 20 74 68 61 74 20 69 73 20   sample that is 
110c0 67 72 65 61 74 65 72 20 74 68 61 6e 0a 20 20 2a  greater than.  *
110d0 2a 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 70 56  * or equal to pV
110e0 61 6c 2e 20 20 4f 72 20 69 66 20 69 3d 3d 70 49  al.  Or if i==pI
110f0 64 78 2d 3e 6e 53 61 6d 70 6c 65 2c 20 74 68 65  dx->nSample, the
11100 6e 20 61 6c 6c 20 73 61 6d 70 6c 65 73 20 61 72  n all samples ar
11110 65 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e  e less.  ** than
11120 20 70 56 61 6c 2e 20 20 49 66 20 61 53 61 6d 70   pVal.  If aSamp
11130 6c 65 5b 69 5d 3d 3d 70 56 61 6c 2c 20 74 68 65  le[i]==pVal, the
11140 6e 20 72 65 73 3d 3d 30 2e 0a 20 20 2a 2f 0a 20  n res==0..  */. 
11150 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20   if( res==0 ){. 
11160 20 20 20 61 53 74 61 74 5b 30 5d 20 3d 20 61 53     aStat[0] = aS
11170 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43  ample[i].anLt[iC
11180 6f 6c 5d 3b 0a 20 20 20 20 61 53 74 61 74 5b 31  ol];.    aStat[1
11190 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61  ] = aSample[i].a
111a0 6e 45 71 5b 69 43 6f 6c 5d 3b 0a 20 20 7d 65 6c  nEq[iCol];.  }el
111b0 73 65 7b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20  se{.    tRowcnt 
111c0 69 4c 6f 77 65 72 2c 20 69 55 70 70 65 72 2c 20  iLower, iUpper, 
111d0 69 47 61 70 3b 0a 20 20 20 20 69 66 28 20 69 3d  iGap;.    if( i=
111e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77  =0 ){.      iLow
111f0 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 55  er = 0;.      iU
11200 70 70 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 30  pper = aSample[0
11210 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20  ].anLt[iCol];.  
11220 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
11230 36 34 20 6e 52 6f 77 30 20 3d 20 73 71 6c 69 74  64 nRow0 = sqlit
11240 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70 49  e3LogEstToInt(pI
11250 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b  dx->aiRowLogEst[
11260 30 5d 29 3b 0a 20 20 20 20 20 20 69 55 70 70 65  0]);.      iUppe
11270 72 20 3d 20 69 3e 3d 70 49 64 78 2d 3e 6e 53 61  r = i>=pIdx->nSa
11280 6d 70 6c 65 20 3f 20 6e 52 6f 77 30 20 3a 20 61  mple ? nRow0 : a
11290 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b 69  Sample[i].anLt[i
112a0 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 69 4c 6f 77  Col];.      iLow
112b0 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 69 2d 31  er = aSample[i-1
112c0 5d 2e 61 6e 45 71 5b 69 43 6f 6c 5d 20 2b 20 61  ].anEq[iCol] + a
112d0 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 61 6e 4c 74  Sample[i-1].anLt
112e0 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 20 20  [iCol];.    }.  
112f0 20 20 61 53 74 61 74 5b 31 5d 20 3d 20 70 49 64    aStat[1] = pId
11300 78 2d 3e 61 41 76 67 45 71 5b 69 43 6f 6c 5d 3b  x->aAvgEq[iCol];
11310 0a 20 20 20 20 69 66 28 20 69 4c 6f 77 65 72 3e  .    if( iLower>
11320 3d 69 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20  =iUpper ){.     
11330 20 69 47 61 70 20 3d 20 30 3b 0a 20 20 20 20 7d   iGap = 0;.    }
11340 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70  else{.      iGap
11350 20 3d 20 69 55 70 70 65 72 20 2d 20 69 4c 6f 77   = iUpper - iLow
11360 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  er;.    }.    if
11370 28 20 72 6f 75 6e 64 55 70 20 29 7b 0a 20 20 20  ( roundUp ){.   
11380 20 20 20 69 47 61 70 20 3d 20 28 69 47 61 70 2a     iGap = (iGap*
11390 32 29 2f 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  2)/3;.    }else{
113a0 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 69 47  .      iGap = iG
113b0 61 70 2f 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ap/3;.    }.    
113c0 61 53 74 61 74 5b 30 5d 20 3d 20 69 4c 6f 77 65  aStat[0] = iLowe
113d0 72 20 2b 20 69 47 61 70 3b 0a 20 20 7d 0a 7d 0a  r + iGap;.  }.}.
113e0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
113f0 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
11400 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _STAT4 */../*.**
11410 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55   If it is not NU
11420 4c 4c 2c 20 70 54 65 72 6d 20 69 73 20 61 20 74  LL, pTerm is a t
11430 65 72 6d 20 74 68 61 74 20 70 72 6f 76 69 64 65  erm that provide
11440 73 20 61 6e 20 75 70 70 65 72 20 6f 72 20 6c 6f  s an upper or lo
11450 77 65 72 0a 2a 2a 20 62 6f 75 6e 64 20 6f 6e 20  wer.** bound on 
11460 61 20 72 61 6e 67 65 20 73 63 61 6e 2e 20 57 69  a range scan. Wi
11470 74 68 6f 75 74 20 63 6f 6e 73 69 64 65 72 69 6e  thout considerin
11480 67 20 70 54 65 72 6d 2c 20 69 74 20 69 73 20 65  g pTerm, it is e
11490 73 74 69 6d 61 74 65 64 20 0a 2a 2a 20 74 68 61  stimated .** tha
114a0 74 20 74 68 65 20 73 63 61 6e 20 77 69 6c 6c 20  t the scan will 
114b0 76 69 73 69 74 20 6e 4e 65 77 20 72 6f 77 73 2e  visit nNew rows.
114c0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
114d0 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
114e0 72 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64 20 74  r.** estimated t
114f0 6f 20 62 65 20 76 69 73 69 74 65 64 20 61 66 74  o be visited aft
11500 65 72 20 74 61 6b 69 6e 67 20 70 54 65 72 6d 20  er taking pTerm 
11510 69 6e 74 6f 20 61 63 63 6f 75 6e 74 2e 0a 2a 2a  into account..**
11520 0a 2a 2a 20 49 66 20 74 68 65 20 75 73 65 72 20  .** If the user 
11530 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69  explicitly speci
11540 66 69 65 64 20 61 20 6c 69 6b 65 6c 69 68 6f 6f  fied a likelihoo
11550 64 28 29 20 76 61 6c 75 65 20 66 6f 72 20 74 68  d() value for th
11560 69 73 20 74 65 72 6d 2c 0a 2a 2a 20 74 68 65 6e  is term,.** then
11570 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
11580 65 20 69 73 20 74 68 65 20 6c 69 6b 65 6c 69 68  e is the likelih
11590 6f 6f 64 20 6d 75 6c 74 69 70 6c 69 65 64 20 62  ood multiplied b
115a0 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  y the number of.
115b0 2a 2a 20 69 6e 70 75 74 20 72 6f 77 73 2e 20 4f  ** input rows. O
115c0 74 68 65 72 77 69 73 65 2c 20 74 68 69 73 20 66  therwise, this f
115d0 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20  unction assumes 
115e0 74 68 61 74 20 61 6e 20 22 49 53 20 4e 4f 54 20  that an "IS NOT 
115f0 4e 55 4c 4c 22 20 74 65 72 6d 0a 2a 2a 20 68 61  NULL" term.** ha
11600 73 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6f  s a likelihood o
11610 66 20 30 2e 35 30 2c 20 61 6e 64 20 61 6e 79 20  f 0.50, and any 
11620 6f 74 68 65 72 20 74 65 72 6d 20 61 20 6c 69 6b  other term a lik
11630 65 6c 69 68 6f 6f 64 20 6f 66 20 30 2e 32 35 2e  elihood of 0.25.
11640 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45 73  .*/.static LogEs
11650 74 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a 75  t whereRangeAdju
11660 73 74 28 57 68 65 72 65 54 65 72 6d 20 2a 70 54  st(WhereTerm *pT
11670 65 72 6d 2c 20 4c 6f 67 45 73 74 20 6e 4e 65 77  erm, LogEst nNew
11680 29 7b 0a 20 20 4c 6f 67 45 73 74 20 6e 52 65 74  ){.  LogEst nRet
11690 20 3d 20 6e 4e 65 77 3b 0a 20 20 69 66 28 20 70   = nNew;.  if( p
116a0 54 65 72 6d 20 29 7b 0a 20 20 20 20 69 66 28 20  Term ){.    if( 
116b0 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
116c0 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 52 65  <=0 ){.      nRe
116d0 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74  t += pTerm->trut
116e0 68 50 72 6f 62 3b 0a 20 20 20 20 7d 65 6c 73 65  hProb;.    }else
116f0 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 77 74 46   if( (pTerm->wtF
11700 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c  lags & TERM_VNUL
11710 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  L)==0 ){.      n
11720 52 65 74 20 2d 3d 20 32 30 3b 20 20 20 20 20 20  Ret -= 20;      
11730 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d 73 71    assert( 20==sq
11740 6c 69 74 65 33 4c 6f 67 45 73 74 28 34 29 20 29  lite3LogEst(4) )
11750 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
11760 74 75 72 6e 20 6e 52 65 74 3b 0a 7d 0a 0a 23 69  turn nRet;.}..#i
11770 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
11780 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
11790 34 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75  4./* .** This fu
117a0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
117b0 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65   to estimate the
117c0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
117d0 76 69 73 69 74 65 64 20 62 79 20 61 0a 2a 2a 20  visited by a.** 
117e0 72 61 6e 67 65 2d 73 63 61 6e 20 6f 6e 20 61 20  range-scan on a 
117f0 73 6b 69 70 2d 73 63 61 6e 20 69 6e 64 65 78 2e  skip-scan index.
11800 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a   For example:.**
11810 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44  .**   CREATE IND
11820 45 58 20 69 31 20 4f 4e 20 74 31 28 61 2c 20 62  EX i1 ON t1(a, b
11830 2c 20 63 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43  , c);.**   SELEC
11840 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T * FROM t1 WHER
11850 45 20 61 3d 3f 20 41 4e 44 20 63 20 42 45 54 57  E a=? AND c BETW
11860 45 45 4e 20 3f 20 41 4e 44 20 3f 3b 0a 2a 2a 0a  EEN ? AND ?;.**.
11870 2a 2a 20 56 61 6c 75 65 20 70 4c 6f 6f 70 2d 3e  ** Value pLoop->
11880 6e 4f 75 74 20 69 73 20 63 75 72 72 65 6e 74 6c  nOut is currentl
11890 79 20 73 65 74 20 74 6f 20 74 68 65 20 65 73 74  y set to the est
118a0 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66  imated number of
118b0 20 72 6f 77 73 20 0a 2a 2a 20 76 69 73 69 74 65   rows .** visite
118c0 64 20 66 6f 72 20 73 63 61 6e 6e 69 6e 67 20 28  d for scanning (
118d0 61 3d 3f 20 41 4e 44 20 62 3d 3f 29 2e 20 54 68  a=? AND b=?). Th
118e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 64 75  is function redu
118f0 63 65 73 20 74 68 61 74 20 65 73 74 69 6d 61 74  ces that estimat
11900 65 20 0a 2a 2a 20 62 79 20 73 6f 6d 65 20 66 61  e .** by some fa
11910 63 74 6f 72 20 74 6f 20 61 63 63 6f 75 6e 74 20  ctor to account 
11920 66 6f 72 20 74 68 65 20 28 63 20 42 45 54 57 45  for the (c BETWE
11930 45 4e 20 3f 20 41 4e 44 20 3f 29 20 65 78 70 72  EN ? AND ?) expr
11940 65 73 73 69 6f 6e 20 62 61 73 65 64 0a 2a 2a 20  ession based.** 
11950 6f 6e 20 74 68 65 20 73 74 61 74 34 20 64 61 74  on the stat4 dat
11960 61 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 2e  a for the index.
11970 20 74 68 69 73 20 73 63 61 6e 20 77 69 6c 6c 20   this scan will 
11980 62 65 20 70 65 66 6f 72 6d 65 64 20 6d 75 6c 74  be peformed mult
11990 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 20 28  iple .** times (
119a0 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 28 61  once for each (a
119b0 2c 62 29 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  ,b) combination 
119c0 74 68 61 74 20 6d 61 74 63 68 65 73 20 61 3d 3f  that matches a=?
119d0 29 20 69 73 20 64 65 61 6c 74 20 77 69 74 68 20  ) is dealt with 
119e0 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 65  .** by the calle
119f0 72 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 64 6f 65 73  r..**.** It does
11a00 20 74 68 69 73 20 62 79 20 73 63 61 6e 6e 69 6e   this by scannin
11a10 67 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 73 74  g through all st
11a20 61 74 34 20 73 61 6d 70 6c 65 73 2c 20 63 6f 6d  at4 samples, com
11a30 70 61 72 69 6e 67 20 76 61 6c 75 65 73 0a 2a 2a  paring values.**
11a40 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
11a50 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65  pLower and pUppe
11a60 72 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65  r with the corre
11a70 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 20  sponding column 
11a80 69 6e 20 65 61 63 68 0a 2a 2a 20 73 61 6d 70 6c  in each.** sampl
11a90 65 2e 20 49 66 20 4c 20 61 6e 64 20 55 20 61 72  e. If L and U ar
11aa0 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
11ab0 73 61 6d 70 6c 65 73 20 66 6f 75 6e 64 20 74 6f  samples found to
11ac0 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   be less than or
11ad0 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 20 74 68 65  .** equal to the
11ae0 20 76 61 6c 75 65 73 20 65 78 74 72 61 63 74 65   values extracte
11af0 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20 61 6e  d from pLower an
11b00 64 20 70 55 70 70 65 72 20 72 65 73 70 65 63 74  d pUpper respect
11b10 69 76 65 6c 79 2c 20 61 6e 64 0a 2a 2a 20 4e 20  ively, and.** N 
11b20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  is the total num
11b30 62 65 72 20 6f 66 20 73 61 6d 70 6c 65 73 2c 20  ber of samples, 
11b40 74 68 65 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20  the pLoop->nOut 
11b50 76 61 6c 75 65 20 69 73 20 61 64 6a 75 73 74 65  value is adjuste
11b60 64 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  d.** as follows:
11b70 0a 2a 2a 0a 2a 2a 20 20 20 6e 4f 75 74 20 3d 20  .**.**   nOut = 
11b80 6e 4f 75 74 20 2a 20 28 20 6d 69 6e 28 55 20 2d  nOut * ( min(U -
11b90 20 4c 2c 20 31 29 20 2f 20 4e 20 29 0a 2a 2a 0a   L, 1) / N ).**.
11ba0 2a 2a 20 49 66 20 70 4c 6f 77 65 72 20 69 73 20  ** If pLower is 
11bb0 4e 55 4c 4c 2c 20 6f 72 20 61 20 76 61 6c 75 65  NULL, or a value
11bc0 20 63 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61   cannot be extra
11bd0 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 74 65  cted from the te
11be0 72 6d 2c 20 4c 20 69 73 0a 2a 2a 20 73 65 74 20  rm, L is.** set 
11bf0 74 6f 20 7a 65 72 6f 2e 20 49 66 20 70 55 70 70  to zero. If pUpp
11c00 65 72 20 69 73 20 4e 55 4c 4c 2c 20 6f 72 20 61  er is NULL, or a
11c10 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65   value cannot be
11c20 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
11c30 69 74 2c 0a 2a 2a 20 55 20 69 73 20 73 65 74 20  it,.** U is set 
11c40 74 6f 20 4e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d  to N..**.** Norm
11c50 61 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74  ally, this funct
11c60 69 6f 6e 20 73 65 74 73 20 2a 70 62 44 6f 6e 65  ion sets *pbDone
11c70 20 74 6f 20 31 20 62 65 66 6f 72 65 20 72 65 74   to 1 before ret
11c80 75 72 6e 69 6e 67 2e 20 48 6f 77 65 76 65 72 2c  urning. However,
11c90 0a 2a 2a 20 69 66 20 6e 6f 20 76 61 6c 75 65 20  .** if no value 
11ca0 63 61 6e 20 62 65 20 65 78 74 72 61 63 74 65 64  can be extracted
11cb0 20 66 72 6f 6d 20 65 69 74 68 65 72 20 70 4c 6f   from either pLo
11cc0 77 65 72 20 6f 72 20 70 55 70 70 65 72 20 28 61  wer or pUpper (a
11cd0 6e 64 20 73 6f 20 74 68 65 0a 2a 2a 20 65 73 74  nd so the.** est
11ce0 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d  imate of the num
11cf0 62 65 72 20 6f 66 20 72 6f 77 73 20 64 65 6c 69  ber of rows deli
11d00 76 65 72 65 64 20 72 65 6d 61 69 6e 73 20 75 6e  vered remains un
11d10 63 68 61 6e 67 65 64 29 2c 20 2a 70 62 44 6f 6e  changed), *pbDon
11d20 65 0a 2a 2a 20 69 73 20 6c 65 66 74 20 61 73 20  e.** is left as 
11d30 69 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  is..**.** If an 
11d40 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
11d50 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
11d60 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
11d70 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 53  Otherwise, .** S
11d80 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61  QLITE_OK..*/.sta
11d90 74 69 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e  tic int whereRan
11da0 67 65 53 6b 69 70 53 63 61 6e 45 73 74 28 0a 20  geSkipScanEst(. 
11db0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
11dc0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
11dd0 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69   & code generati
11de0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
11df0 57 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65  WhereTerm *pLowe
11e00 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f  r,   /* Lower bo
11e10 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65  und on the range
11e20 2e 20 65 78 3a 20 22 78 3e 31 32 33 22 20 4d 69  . ex: "x>123" Mi
11e30 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
11e40 20 57 68 65 72 65 54 65 72 6d 20 2a 70 55 70 70   WhereTerm *pUpp
11e50 65 72 2c 20 20 20 2f 2a 20 55 70 70 65 72 20 62  er,   /* Upper b
11e60 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67  ound on the rang
11e70 65 2e 20 65 78 3a 20 22 78 3c 34 35 35 22 20 4d  e. ex: "x<455" M
11e80 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
11e90 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
11ea0 6f 70 2c 20 20 20 20 2f 2a 20 55 70 64 61 74 65  op,    /* Update
11eb0 20 74 68 65 20 2e 6e 4f 75 74 20 76 61 6c 75 65   the .nOut value
11ec0 20 6f 66 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f   of this loop */
11ed0 0a 20 20 69 6e 74 20 2a 70 62 44 6f 6e 65 20 20  .  int *pbDone  
11ee0 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74          /* Set t
11ef0 6f 20 74 72 75 65 20 69 66 20 61 74 20 6c 65 61  o true if at lea
11f00 73 74 20 6f 6e 65 20 65 78 70 72 2e 20 76 61 6c  st one expr. val
11f10 75 65 20 65 78 74 72 61 63 74 65 64 20 2a 2f 0a  ue extracted */.
11f20 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20  ){.  Index *p = 
11f30 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
11f40 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71  Index;.  int nEq
11f50 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
11f60 65 2e 6e 45 71 3b 0a 20 20 73 71 6c 69 74 65 33  e.nEq;.  sqlite3
11f70 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
11f80 62 3b 0a 20 20 69 6e 74 20 6e 4c 6f 77 65 72 20  b;.  int nLower 
11f90 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 6e 55 70 70  = -1;.  int nUpp
11fa0 65 72 20 3d 20 70 2d 3e 6e 53 61 6d 70 6c 65 2b  er = p->nSample+
11fb0 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  1;.  int rc = SQ
11fc0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69  LITE_OK;.  int i
11fd0 43 6f 6c 20 3d 20 70 2d 3e 61 69 43 6f 6c 75 6d  Col = p->aiColum
11fe0 6e 5b 6e 45 71 5d 3b 0a 20 20 75 38 20 61 66 66  n[nEq];.  u8 aff
11ff0 20 3d 20 69 43 6f 6c 3e 3d 30 20 3f 20 70 2d 3e   = iCol>=0 ? p->
12000 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f  pTable->aCol[iCo
12010 6c 5d 2e 61 66 66 69 6e 69 74 79 20 3a 20 53 51  l].affinity : SQ
12020 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
12030 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  ;.  CollSeq *pCo
12040 6c 6c 3b 0a 20 20 0a 20 20 73 71 6c 69 74 65 33  ll;.  .  sqlite3
12050 5f 76 61 6c 75 65 20 2a 70 31 20 3d 20 30 3b 20  _value *p1 = 0; 
12060 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
12070 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  e extracted from
12080 20 70 4c 6f 77 65 72 20 2a 2f 0a 20 20 73 71 6c   pLower */.  sql
12090 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 32 20 3d  ite3_value *p2 =
120a0 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
120b0 56 61 6c 75 65 20 65 78 74 72 61 63 74 65 64 20  Value extracted 
120c0 66 72 6f 6d 20 70 55 70 70 65 72 20 2a 2f 0a 20  from pUpper */. 
120d0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
120e0 70 56 61 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  pVal = 0;       
120f0 20 2f 2a 20 56 61 6c 75 65 20 65 78 74 72 61 63   /* Value extrac
12100 74 65 64 20 66 72 6f 6d 20 72 65 63 6f 72 64 20  ted from record 
12110 2a 2f 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71  */..  pColl = sq
12120 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
12130 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 61 7a  eq(pParse, p->az
12140 43 6f 6c 6c 5b 6e 45 71 5d 29 3b 0a 20 20 69 66  Coll[nEq]);.  if
12150 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20  ( pLower ){.    
12160 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74  rc = sqlite3Stat
12170 34 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70  4ValueFromExpr(p
12180 50 61 72 73 65 2c 20 70 4c 6f 77 65 72 2d 3e 70  Parse, pLower->p
12190 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 61 66  Expr->pRight, af
121a0 66 2c 20 26 70 31 29 3b 0a 20 20 20 20 6e 4c 6f  f, &p1);.    nLo
121b0 77 65 72 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  wer = 0;.  }.  i
121c0 66 28 20 70 55 70 70 65 72 20 26 26 20 72 63 3d  f( pUpper && rc=
121d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
121e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74    rc = sqlite3St
121f0 61 74 34 56 61 6c 75 65 46 72 6f 6d 45 78 70 72  at4ValueFromExpr
12200 28 70 50 61 72 73 65 2c 20 70 55 70 70 65 72 2d  (pParse, pUpper-
12210 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20  >pExpr->pRight, 
12220 61 66 66 2c 20 26 70 32 29 3b 0a 20 20 20 20 6e  aff, &p2);.    n
12230 55 70 70 65 72 20 3d 20 70 32 20 3f 20 30 20 3a  Upper = p2 ? 0 :
12240 20 70 2d 3e 6e 53 61 6d 70 6c 65 3b 0a 20 20 7d   p->nSample;.  }
12250 0a 0a 20 20 69 66 28 20 70 31 20 7c 7c 20 70 32  ..  if( p1 || p2
12260 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
12270 20 20 20 69 6e 74 20 6e 44 69 66 66 3b 0a 20 20     int nDiff;.  
12280 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
12290 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 2d  QLITE_OK && i<p-
122a0 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a  >nSample; i++){.
122b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
122c0 65 33 53 74 61 74 34 43 6f 6c 75 6d 6e 28 64 62  e3Stat4Column(db
122d0 2c 20 70 2d 3e 61 53 61 6d 70 6c 65 5b 69 5d 2e  , p->aSample[i].
122e0 70 2c 20 70 2d 3e 61 53 61 6d 70 6c 65 5b 69 5d  p, p->aSample[i]
122f0 2e 6e 2c 20 6e 45 71 2c 20 26 70 56 61 6c 29 3b  .n, nEq, &pVal);
12300 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
12310 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 31 20 29  QLITE_OK && p1 )
12320 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65  {.        int re
12330 73 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f  s = sqlite3MemCo
12340 6d 70 61 72 65 28 70 31 2c 20 70 56 61 6c 2c 20  mpare(p1, pVal, 
12350 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  pColl);.        
12360 69 66 28 20 72 65 73 3e 3d 30 20 29 20 6e 4c 6f  if( res>=0 ) nLo
12370 77 65 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  wer++;.      }. 
12380 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
12390 49 54 45 5f 4f 4b 20 26 26 20 70 32 20 29 7b 0a  ITE_OK && p2 ){.
123a0 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 73 20          int res 
123b0 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  = sqlite3MemComp
123c0 61 72 65 28 70 32 2c 20 70 56 61 6c 2c 20 70 43  are(p2, pVal, pC
123d0 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66  oll);.        if
123e0 28 20 72 65 73 3e 3d 30 20 29 20 6e 55 70 70 65  ( res>=0 ) nUppe
123f0 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r++;.      }.   
12400 20 7d 0a 20 20 20 20 6e 44 69 66 66 20 3d 20 28   }.    nDiff = (
12410 6e 55 70 70 65 72 20 2d 20 6e 4c 6f 77 65 72 29  nUpper - nLower)
12420 3b 0a 20 20 20 20 69 66 28 20 6e 44 69 66 66 3c  ;.    if( nDiff<
12430 3d 30 20 29 20 6e 44 69 66 66 20 3d 20 31 3b 0a  =0 ) nDiff = 1;.
12440 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
12450 20 69 73 20 62 6f 74 68 20 61 6e 20 75 70 70 65   is both an uppe
12460 72 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f 75 6e  r and lower boun
12470 64 20 73 70 65 63 69 66 69 65 64 2c 20 61 6e 64  d specified, and
12480 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 6f 6d   the .    ** com
12490 70 61 72 69 73 6f 6e 73 20 69 6e 64 69 63 61 74  parisons indicat
124a0 65 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20  e that they are 
124b0 63 6c 6f 73 65 20 74 6f 67 65 74 68 65 72 2c 20  close together, 
124c0 75 73 65 20 74 68 65 20 66 61 6c 6c 62 61 63 6b  use the fallback
124d0 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64 20 28  .    ** method (
124e0 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  assume that the 
124f0 73 63 61 6e 20 76 69 73 69 74 73 20 31 2f 36 34  scan visits 1/64
12500 20 6f 66 20 74 68 65 20 72 6f 77 73 29 20 66 6f   of the rows) fo
12510 72 20 65 73 74 69 6d 61 74 69 6e 67 0a 20 20 20  r estimating.   
12520 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   ** the number o
12530 66 20 72 6f 77 73 20 76 69 73 69 74 65 64 2e 20  f rows visited. 
12540 4f 74 68 65 72 77 69 73 65 2c 20 65 73 74 69 6d  Otherwise, estim
12550 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
12560 66 20 72 6f 77 73 0a 20 20 20 20 2a 2a 20 75 73  f rows.    ** us
12570 69 6e 67 20 74 68 65 20 6d 65 74 68 6f 64 20 64  ing the method d
12580 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 20  escribed in the 
12590 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 66  header comment f
125a0 6f 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  or this function
125b0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 44 69  . */.    if( nDi
125c0 66 66 21 3d 31 20 7c 7c 20 70 55 70 70 65 72 3d  ff!=1 || pUpper=
125d0 3d 30 20 7c 7c 20 70 4c 6f 77 65 72 3d 3d 30 20  =0 || pLower==0 
125e0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 41 64  ){.      int nAd
125f0 6a 75 73 74 20 3d 20 28 73 71 6c 69 74 65 33 4c  just = (sqlite3L
12600 6f 67 45 73 74 28 70 2d 3e 6e 53 61 6d 70 6c 65  ogEst(p->nSample
12610 29 20 2d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  ) - sqlite3LogEs
12620 74 28 6e 44 69 66 66 29 29 3b 0a 20 20 20 20 20  t(nDiff));.     
12630 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2d 3d 20   pLoop->nOut -= 
12640 6e 41 64 6a 75 73 74 3b 0a 20 20 20 20 20 20 2a  nAdjust;.      *
12650 70 62 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20  pbDone = 1;.    
12660 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31    WHERETRACE(0x1
12670 30 2c 20 28 22 72 61 6e 67 65 20 73 6b 69 70 2d  0, ("range skip-
12680 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25 75  scan regions: %u
12690 2e 2e 25 75 20 20 61 64 6a 75 73 74 3d 25 64 20  ..%u  adjust=%d 
126a0 65 73 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  est=%d\n",.     
126b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126c0 20 20 20 20 20 20 6e 4c 6f 77 65 72 2c 20 6e 55        nLower, nU
126d0 70 70 65 72 2c 20 6e 41 64 6a 75 73 74 2a 2d 31  pper, nAdjust*-1
126e0 2c 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 29 29 3b  , pLoop->nOut));
126f0 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b  .    }..  }else{
12700 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 62  .    assert( *pb
12710 44 6f 6e 65 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a  Done==0 );.  }..
12720 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
12730 65 65 28 70 31 29 3b 0a 20 20 73 71 6c 69 74 65  ee(p1);.  sqlite
12740 33 56 61 6c 75 65 46 72 65 65 28 70 32 29 3b 0a  3ValueFree(p2);.
12750 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
12760 65 65 28 70 56 61 6c 29 3b 0a 0a 20 20 72 65 74  ee(pVal);..  ret
12770 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
12780 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
12790 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
127a0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
127b0 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
127c0 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65   to estimate the
127d0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
127e0 74 68 61 74 20 77 69 6c 6c 20 62 65 20 76 69 73  that will be vis
127f0 69 74 65 64 0a 2a 2a 20 62 79 20 73 63 61 6e 6e  ited.** by scann
12800 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 66 6f 72  ing an index for
12810 20 61 20 72 61 6e 67 65 20 6f 66 20 76 61 6c 75   a range of valu
12820 65 73 2e 20 54 68 65 20 72 61 6e 67 65 20 6d 61  es. The range ma
12830 79 20 68 61 76 65 20 61 6e 20 75 70 70 65 72 0a  y have an upper.
12840 2a 2a 20 62 6f 75 6e 64 2c 20 61 20 6c 6f 77 65  ** bound, a lowe
12850 72 20 62 6f 75 6e 64 2c 20 6f 72 20 62 6f 74 68  r bound, or both
12860 2e 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  . The WHERE clau
12870 73 65 20 74 65 72 6d 73 20 74 68 61 74 20 73 65  se terms that se
12880 74 20 74 68 65 20 75 70 70 65 72 0a 2a 2a 20 61  t the upper.** a
12890 6e 64 20 6c 6f 77 65 72 20 62 6f 75 6e 64 73 20  nd lower bounds 
128a0 61 72 65 20 72 65 70 72 65 73 65 6e 74 65 64 20  are represented 
128b0 62 79 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55  by pLower and pU
128c0 70 70 65 72 20 72 65 73 70 65 63 74 69 76 65 6c  pper respectivel
128d0 79 2e 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c  y. For.** exampl
128e0 65 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74  e, assuming that
128f0 20 69 6e 64 65 78 20 70 20 69 73 20 6f 6e 20 74   index p is on t
12900 31 28 61 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e  1(a):.**.**   ..
12910 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  . FROM t1 WHERE 
12920 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20  a > ? AND a < ? 
12930 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ....**          
12940 20 20 20 20 20 20 20 20 20 20 7c 5f 5f 5f 5f 5f            |_____
12950 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a 20 20  |   |_____|.**  
12960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12970 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c       |         |
12980 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
12990 20 20 20 20 20 20 20 20 70 4c 6f 77 65 72 20 20          pLower  
129a0 20 20 70 55 70 70 65 72 0a 2a 2a 0a 2a 2a 20 49    pUpper.**.** I
129b0 66 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  f either of the 
129c0 75 70 70 65 72 20 6f 72 20 6c 6f 77 65 72 20 62  upper or lower b
129d0 6f 75 6e 64 20 69 73 20 6e 6f 74 20 70 72 65 73  ound is not pres
129e0 65 6e 74 2c 20 74 68 65 6e 20 4e 55 4c 4c 20 69  ent, then NULL i
129f0 73 20 70 61 73 73 65 64 20 69 6e 0a 2a 2a 20 70  s passed in.** p
12a00 6c 61 63 65 20 6f 66 20 74 68 65 20 63 6f 72 72  lace of the corr
12a10 65 73 70 6f 6e 64 69 6e 67 20 57 68 65 72 65 54  esponding WhereT
12a20 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76  erm..**.** The v
12a30 61 6c 75 65 20 69 6e 20 28 70 42 75 69 6c 64 65  alue in (pBuilde
12a40 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  r->pNew->u.btree
12a50 2e 6e 45 71 29 20 69 73 20 74 68 65 20 69 6e 64  .nEq) is the ind
12a60 65 78 20 6f 66 20 74 68 65 20 69 6e 64 65 78 0a  ex of the index.
12a70 2a 2a 20 63 6f 6c 75 6d 6e 20 73 75 62 6a 65 63  ** column subjec
12a80 74 20 74 6f 20 74 68 65 20 72 61 6e 67 65 20 63  t to the range c
12a90 6f 6e 73 74 72 61 69 6e 74 2e 20 4f 72 2c 20 65  onstraint. Or, e
12aa0 71 75 69 76 61 6c 65 6e 74 6c 79 2c 20 74 68 65  quivalently, the
12ab0 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 65 71   number of.** eq
12ac0 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
12ad0 74 73 20 6f 70 74 69 6d 69 7a 65 64 20 62 79 20  ts optimized by 
12ae0 74 68 65 20 70 72 6f 70 6f 73 65 64 20 69 6e 64  the proposed ind
12af0 65 78 20 73 63 61 6e 2e 20 46 6f 72 20 65 78 61  ex scan. For exa
12b00 6d 70 6c 65 2c 0a 2a 2a 20 61 73 73 75 6d 69 6e  mple,.** assumin
12b10 67 20 69 6e 64 65 78 20 70 20 69 73 20 6f 6e 20  g index p is on 
12b20 74 31 28 61 2c 20 62 29 2c 20 61 6e 64 20 74 68  t1(a, b), and th
12b30 65 20 53 51 4c 20 71 75 65 72 79 20 69 73 3a 0a  e SQL query is:.
12b40 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d  **.**   ... FROM
12b50 20 74 31 20 57 48 45 52 45 20 61 20 3d 20 3f 20   t1 WHERE a = ? 
12b60 41 4e 44 20 62 20 3e 20 3f 20 41 4e 44 20 62 20  AND b > ? AND b 
12b70 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68  < ? ....**.** th
12b80 65 6e 20 6e 45 71 20 69 73 20 73 65 74 20 74 6f  en nEq is set to
12b90 20 31 20 28 61 73 20 74 68 65 20 72 61 6e 67 65   1 (as the range
12ba0 20 72 65 73 74 72 69 63 74 65 64 20 63 6f 6c 75   restricted colu
12bb0 6d 6e 2c 20 62 2c 20 69 73 20 74 68 65 20 73 65  mn, b, is the se
12bc0 63 6f 6e 64 20 0a 2a 2a 20 6c 65 66 74 2d 6d 6f  cond .** left-mo
12bd0 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  st column of the
12be0 20 69 6e 64 65 78 29 2e 20 4f 72 2c 20 69 66 20   index). Or, if 
12bf0 74 68 65 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a  the query is:.**
12c00 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74  .**   ... FROM t
12c10 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e  1 WHERE a > ? AN
12c20 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a  D a < ? ....**.*
12c30 2a 20 74 68 65 6e 20 6e 45 71 20 69 73 20 73 65  * then nEq is se
12c40 74 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 57 68  t to 0..**.** Wh
12c50 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
12c60 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70 6e 4f   is called, *pnO
12c70 75 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ut is set to the
12c80 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 29   sqlite3LogEst()
12c90 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65   of the.** numbe
12ca0 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 74  r of rows that t
12cb0 68 65 20 69 6e 64 65 78 20 73 63 61 6e 20 69 73  he index scan is
12cc0 20 65 78 70 65 63 74 65 64 20 74 6f 20 76 69 73   expected to vis
12cd0 69 74 20 77 69 74 68 6f 75 74 20 0a 2a 2a 20 63  it without .** c
12ce0 6f 6e 73 69 64 65 72 69 6e 67 20 74 68 65 20 72  onsidering the r
12cf0 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ange constraints
12d00 2e 20 49 66 20 6e 45 71 20 69 73 20 30 2c 20 74  . If nEq is 0, t
12d10 68 69 73 20 69 73 20 74 68 65 20 6e 75 6d 62 65  his is the numbe
12d20 72 20 6f 66 20 0a 2a 2a 20 72 6f 77 73 20 69 6e  r of .** rows in
12d30 20 74 68 65 20 69 6e 64 65 78 2e 20 41 73 73 75   the index. Assu
12d40 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 20 6f 63  ming no error oc
12d50 63 75 72 73 2c 20 2a 70 6e 4f 75 74 20 69 73 20  curs, *pnOut is 
12d60 61 64 6a 75 73 74 65 64 20 28 72 65 64 75 63 65  adjusted (reduce
12d70 64 29 0a 2a 2a 20 74 6f 20 61 63 63 6f 75 6e 74  d).** to account
12d80 20 66 6f 72 20 74 68 65 20 72 61 6e 67 65 20 63   for the range c
12d90 6f 6e 73 74 72 61 69 6e 74 73 20 70 4c 6f 77 65  onstraints pLowe
12da0 72 20 61 6e 64 20 70 55 70 70 65 72 2e 0a 2a 2a  r and pUpper..**
12db0 20 0a 2a 2a 20 49 6e 20 74 68 65 20 61 62 73 65   .** In the abse
12dc0 6e 63 65 20 6f 66 20 73 71 6c 69 74 65 5f 73 74  nce of sqlite_st
12dd0 61 74 34 20 41 4e 41 4c 59 5a 45 20 64 61 74 61  at4 ANALYZE data
12de0 2c 20 6f 72 20 69 66 20 73 75 63 68 20 64 61 74  , or if such dat
12df0 61 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 75  a cannot be.** u
12e00 73 65 64 2c 20 61 20 73 69 6e 67 6c 65 20 72 61  sed, a single ra
12e10 6e 67 65 20 69 6e 65 71 75 61 6c 69 74 79 20 72  nge inequality r
12e20 65 64 75 63 65 73 20 74 68 65 20 73 65 61 72 63  educes the searc
12e30 68 20 73 70 61 63 65 20 62 79 20 61 20 66 61 63  h space by a fac
12e40 74 6f 72 20 6f 66 20 34 2e 20 0a 2a 2a 20 61 6e  tor of 4. .** an
12e50 64 20 61 20 70 61 69 72 20 6f 66 20 63 6f 6e 73  d a pair of cons
12e60 74 72 61 69 6e 74 73 20 28 78 3e 3f 20 41 4e 44  traints (x>? AND
12e70 20 78 3c 3f 29 20 72 65 64 75 63 65 73 20 74 68   x<?) reduces th
12e80 65 20 65 78 70 65 63 74 65 64 20 6e 75 6d 62 65  e expected numbe
12e90 72 20 6f 66 0a 2a 2a 20 72 6f 77 73 20 76 69 73  r of.** rows vis
12ea0 69 74 65 64 20 62 79 20 61 20 66 61 63 74 6f 72  ited by a factor
12eb0 20 6f 66 20 36 34 2e 0a 2a 2f 0a 73 74 61 74 69   of 64..*/.stati
12ec0 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e 67 65  c int whereRange
12ed0 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65  ScanEst(.  Parse
12ee0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
12ef0 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64  /* Parsing & cod
12f00 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
12f10 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c  text */.  WhereL
12f20 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
12f30 6c 64 65 72 2c 0a 20 20 57 68 65 72 65 54 65 72  lder,.  WhereTer
12f40 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20  m *pLower,   /* 
12f50 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74  Lower bound on t
12f60 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78  he range. ex: "x
12f70 3e 31 32 33 22 20 4d 69 67 68 74 20 62 65 20 4e  >123" Might be N
12f80 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ULL */.  WhereTe
12f90 72 6d 20 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a  rm *pUpper,   /*
12fa0 20 55 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20   Upper bound on 
12fb0 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22  the range. ex: "
12fc0 78 3c 34 35 35 22 20 4d 69 67 68 74 20 62 65 20  x<455" Might be 
12fd0 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 4c  NULL */.  WhereL
12fe0 6f 6f 70 20 2a 70 4c 6f 6f 70 20 20 20 20 20 2f  oop *pLoop     /
12ff0 2a 20 4d 6f 64 69 66 79 20 74 68 65 20 2e 6e 4f  * Modify the .nO
13000 75 74 20 61 6e 64 20 6d 61 79 62 65 20 2e 72 52  ut and maybe .rR
13010 75 6e 20 66 69 65 6c 64 73 20 2a 2f 0a 29 7b 0a  un fields */.){.
13020 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
13030 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 4f 75 74  E_OK;.  int nOut
13040 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a   = pLoop->nOut;.
13050 20 20 4c 6f 67 45 73 74 20 6e 4e 65 77 3b 0a 0a    LogEst nNew;..
13060 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
13070 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
13080 41 54 34 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d  AT4.  Index *p =
13090 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
130a0 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45  pIndex;.  int nE
130b0 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  q = pLoop->u.btr
130c0 65 65 2e 6e 45 71 3b 0a 0a 20 20 69 66 28 20 70  ee.nEq;..  if( p
130d0 2d 3e 6e 53 61 6d 70 6c 65 3e 30 0a 20 20 20 26  ->nSample>0.   &
130e0 26 20 6e 45 71 3c 70 2d 3e 6e 53 61 6d 70 6c 65  & nEq<p->nSample
130f0 43 6f 6c 0a 20 20 20 26 26 20 4f 70 74 69 6d 69  Col.   && Optimi
13100 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 50  zationEnabled(pP
13110 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45  arse->db, SQLITE
13120 5f 53 74 61 74 33 29 20 0a 20 20 29 7b 0a 20 20  _Stat3) .  ){.  
13130 20 20 69 66 28 20 6e 45 71 3d 3d 70 42 75 69 6c    if( nEq==pBuil
13140 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 29  der->nRecValid )
13150 7b 0a 20 20 20 20 20 20 55 6e 70 61 63 6b 65 64  {.      Unpacked
13160 52 65 63 6f 72 64 20 2a 70 52 65 63 20 3d 20 70  Record *pRec = p
13170 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20  Builder->pRec;. 
13180 20 20 20 20 20 74 52 6f 77 63 6e 74 20 61 5b 32       tRowcnt a[2
13190 5d 3b 0a 20 20 20 20 20 20 75 38 20 61 66 66 3b  ];.      u8 aff;
131a0 0a 0a 20 20 20 20 20 20 2f 2a 20 56 61 72 69 61  ..      /* Varia
131b0 62 6c 65 20 69 4c 6f 77 65 72 20 77 69 6c 6c 20  ble iLower will 
131c0 62 65 20 73 65 74 20 74 6f 20 74 68 65 20 65 73  be set to the es
131d0 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75  timate of the nu
131e0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
131f0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 69 6e  .      ** the in
13200 64 65 78 20 74 68 61 74 20 61 72 65 20 6c 65 73  dex that are les
13210 73 20 74 68 61 6e 20 74 68 65 20 6c 6f 77 65 72  s than the lower
13220 20 62 6f 75 6e 64 20 6f 66 20 74 68 65 20 72 61   bound of the ra
13230 6e 67 65 20 71 75 65 72 79 2e 20 54 68 65 0a 20  nge query. The. 
13240 20 20 20 20 20 2a 2a 20 6c 6f 77 65 72 20 62 6f       ** lower bo
13250 75 6e 64 20 62 65 69 6e 67 20 74 68 65 20 63 6f  und being the co
13260 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f 66 20 24  ncatenation of $
13270 50 20 61 6e 64 20 24 4c 2c 20 77 68 65 72 65 20  P and $L, where 
13280 24 50 20 69 73 20 74 68 65 0a 20 20 20 20 20 20  $P is the.      
13290 2a 2a 20 6b 65 79 2d 70 72 65 66 69 78 20 66 6f  ** key-prefix fo
132a0 72 6d 65 64 20 62 79 20 74 68 65 20 6e 45 71 20  rmed by the nEq 
132b0 76 61 6c 75 65 73 20 6d 61 74 63 68 65 64 20 61  values matched a
132c0 67 61 69 6e 73 74 20 74 68 65 20 6e 45 71 20 6c  gainst the nEq l
132d0 65 66 74 2d 6d 6f 73 74 0a 20 20 20 20 20 20 2a  eft-most.      *
132e0 2a 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  * columns of the
132f0 20 69 6e 64 65 78 2c 20 61 6e 64 20 24 4c 20 69   index, and $L i
13300 73 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70  s the value in p
13310 4c 6f 77 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a  Lower..      **.
13320 20 20 20 20 20 20 2a 2a 20 4f 72 2c 20 69 66 20        ** Or, if 
13330 70 4c 6f 77 65 72 20 69 73 20 4e 55 4c 4c 20 6f  pLower is NULL o
13340 72 20 24 4c 20 63 61 6e 6e 6f 74 20 62 65 20 65  r $L cannot be e
13350 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69 74  xtracted from it
13360 20 28 62 65 63 61 75 73 65 20 69 74 0a 20 20 20   (because it.   
13370 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 20 73     ** is not a s
13380 69 6d 70 6c 65 20 76 61 72 69 61 62 6c 65 20 6f  imple variable o
13390 72 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 29  r literal value)
133a0 2c 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e  , the lower boun
133b0 64 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a  d of the.      *
133c0 2a 20 72 61 6e 67 65 20 69 73 20 24 50 2e 20 44  * range is $P. D
133d0 75 65 20 74 6f 20 61 20 71 75 69 72 6b 20 69 6e  ue to a quirk in
133e0 20 74 68 65 20 77 61 79 20 77 68 65 72 65 4b 65   the way whereKe
133f0 79 53 74 61 74 73 28 29 20 77 6f 72 6b 73 2c 20  yStats() works, 
13400 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 69 66  even.      ** if
13410 20 24 4c 20 69 73 20 61 76 61 69 6c 61 62 6c 65   $L is available
13420 2c 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28  , whereKeyStats(
13430 29 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20  ) is called for 
13440 62 6f 74 68 20 28 24 50 29 20 61 6e 64 20 0a 20  both ($P) and . 
13450 20 20 20 20 20 2a 2a 20 28 24 50 3a 24 4c 29 20       ** ($P:$L) 
13460 61 6e 64 20 74 68 65 20 6c 61 72 67 65 72 20 6f  and the larger o
13470 66 20 74 68 65 20 74 77 6f 20 72 65 74 75 72 6e  f the two return
13480 65 64 20 76 61 6c 75 65 73 20 75 73 65 64 2e 0a  ed values used..
13490 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
134a0 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20 69 55 70  * Similarly, iUp
134b0 70 65 72 20 69 73 20 74 6f 20 62 65 20 73 65 74  per is to be set
134c0 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65   to the estimate
134d0 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
134e0 66 20 72 6f 77 73 0a 20 20 20 20 20 20 2a 2a 20  f rows.      ** 
134f0 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 75 70  less than the up
13500 70 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65  per bound of the
13510 20 72 61 6e 67 65 20 71 75 65 72 79 2e 20 57 68   range query. Wh
13520 65 72 65 20 74 68 65 20 75 70 70 65 72 20 62 6f  ere the upper bo
13530 75 6e 64 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  und.      ** is 
13540 65 69 74 68 65 72 20 28 24 50 29 20 6f 72 20 28  either ($P) or (
13550 24 50 3a 24 55 29 2e 20 41 67 61 69 6e 2c 20 65  $P:$U). Again, e
13560 76 65 6e 20 69 66 20 24 55 20 69 73 20 61 76 61  ven if $U is ava
13570 69 6c 61 62 6c 65 2c 20 62 6f 74 68 20 76 61 6c  ilable, both val
13580 75 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ues.      ** of 
13590 69 55 70 70 65 72 20 61 72 65 20 72 65 71 75 65  iUpper are reque
135a0 73 74 65 64 20 6f 66 20 77 68 65 72 65 4b 65 79  sted of whereKey
135b0 53 74 61 74 73 28 29 20 61 6e 64 20 74 68 65 20  Stats() and the 
135c0 73 6d 61 6c 6c 65 72 20 75 73 65 64 2e 0a 20 20  smaller used..  
135d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 52 6f      */.      tRo
135e0 77 63 6e 74 20 69 4c 6f 77 65 72 3b 0a 20 20 20  wcnt iLower;.   
135f0 20 20 20 74 52 6f 77 63 6e 74 20 69 55 70 70 65     tRowcnt iUppe
13600 72 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 52  r;..      if( pR
13610 65 63 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65  ec ){.        te
13620 73 74 63 61 73 65 28 20 70 52 65 63 2d 3e 6e 46  stcase( pRec->nF
13630 69 65 6c 64 21 3d 70 42 75 69 6c 64 65 72 2d 3e  ield!=pBuilder->
13640 6e 52 65 63 56 61 6c 69 64 20 29 3b 0a 20 20 20  nRecValid );.   
13650 20 20 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c       pRec->nFiel
13660 64 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52  d = pBuilder->nR
13670 65 63 56 61 6c 69 64 3b 0a 20 20 20 20 20 20 7d  ecValid;.      }
13680 0a 20 20 20 20 20 20 69 66 28 20 6e 45 71 3d 3d  .      if( nEq==
13690 70 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20  p->nKeyCol ){.  
136a0 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
136b0 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a  TE_AFF_INTEGER;.
136c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
136d0 20 20 20 20 20 61 66 66 20 3d 20 70 2d 3e 70 54       aff = p->pT
136e0 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69  able->aCol[p->ai
136f0 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 5d 2e 61 66 66  Column[nEq]].aff
13700 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 7d 0a 20  inity;.      }. 
13710 20 20 20 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e       /* Determin
13720 65 20 69 4c 6f 77 65 72 20 61 6e 64 20 69 55 70  e iLower and iUp
13730 70 65 72 20 75 73 69 6e 67 20 28 24 50 29 20 6f  per using ($P) o
13740 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  nly. */.      if
13750 28 20 6e 45 71 3d 3d 30 20 29 7b 0a 20 20 20 20  ( nEq==0 ){.    
13760 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 30 3b 0a      iLower = 0;.
13770 20 20 20 20 20 20 20 20 69 55 70 70 65 72 20 3d          iUpper =
13780 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f   sqlite3LogEstTo
13790 49 6e 74 28 70 2d 3e 61 69 52 6f 77 4c 6f 67 45  Int(p->aiRowLogE
137a0 73 74 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65  st[0]);.      }e
137b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
137c0 4e 6f 74 65 3a 20 74 68 69 73 20 63 61 6c 6c 20  Note: this call 
137d0 63 6f 75 6c 64 20 62 65 20 6f 70 74 69 6d 69 7a  could be optimiz
137e0 65 64 20 61 77 61 79 20 2d 20 73 69 6e 63 65 20  ed away - since 
137f0 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 73 20  the same values 
13800 6d 75 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  must .        **
13810 20 68 61 76 65 20 62 65 65 6e 20 72 65 71 75 65   have been reque
13820 73 74 65 64 20 77 68 65 6e 20 74 65 73 74 69 6e  sted when testin
13830 67 20 6b 65 79 20 24 50 20 69 6e 20 77 68 65 72  g key $P in wher
13840 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 29 2e  eEqualScanEst().
13850 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 77 68 65    */.        whe
13860 72 65 4b 65 79 53 74 61 74 73 28 70 50 61 72 73  reKeyStats(pPars
13870 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c 20 61  e, p, pRec, 0, a
13880 29 3b 0a 20 20 20 20 20 20 20 20 69 4c 6f 77 65  );.        iLowe
13890 72 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20  r = a[0];.      
138a0 20 20 69 55 70 70 65 72 20 3d 20 61 5b 30 5d 20    iUpper = a[0] 
138b0 2b 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 0a  + a[1];.      }.
138c0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 6f 73  .      /* If pos
138d0 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65 20 6f  sible, improve o
138e0 6e 20 74 68 65 20 69 4c 6f 77 65 72 20 65 73 74  n the iLower est
138f0 69 6d 61 74 65 20 75 73 69 6e 67 20 28 24 50 3a  imate using ($P:
13900 24 4c 29 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  $L). */.      if
13910 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20  ( pLower ){.    
13920 20 20 20 20 69 6e 74 20 62 4f 6b 3b 20 20 20 20      int bOk;    
13930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13940 2f 2a 20 54 72 75 65 20 69 66 20 76 61 6c 75 65  /* True if value
13950 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
13960 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20 20 20  om pExpr */.    
13970 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
13980 3d 20 70 4c 6f 77 65 72 2d 3e 70 45 78 70 72 2d  = pLower->pExpr-
13990 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  >pRight;.       
139a0 20 61 73 73 65 72 74 28 20 28 70 4c 6f 77 65 72   assert( (pLower
139b0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
139c0 4f 5f 47 54 7c 57 4f 5f 47 45 29 29 21 3d 30 20  O_GT|WO_GE))!=0 
139d0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
139e0 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62  sqlite3Stat4Prob
139f0 65 53 65 74 56 61 6c 75 65 28 70 50 61 72 73 65  eSetValue(pParse
13a00 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70  , p, &pRec, pExp
13a10 72 2c 20 61 66 66 2c 20 6e 45 71 2c 20 26 62 4f  r, aff, nEq, &bO
13a20 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  k);.        if( 
13a30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
13a40 20 62 4f 6b 20 29 7b 0a 20 20 20 20 20 20 20 20   bOk ){.        
13a50 20 20 74 52 6f 77 63 6e 74 20 69 4e 65 77 3b 0a    tRowcnt iNew;.
13a60 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 4b            whereK
13a70 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20  eyStats(pParse, 
13a80 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a  p, pRec, 0, a);.
13a90 20 20 20 20 20 20 20 20 20 20 69 4e 65 77 20 3d            iNew =
13aa0 20 61 5b 30 5d 20 2b 20 28 28 70 4c 6f 77 65 72   a[0] + ((pLower
13ab0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
13ac0 5f 47 54 29 20 3f 20 61 5b 31 5d 20 3a 20 30 29  _GT) ? a[1] : 0)
13ad0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
13ae0 69 4e 65 77 3e 69 4c 6f 77 65 72 20 29 20 69 4c  iNew>iLower ) iL
13af0 6f 77 65 72 20 3d 20 69 4e 65 77 3b 0a 20 20 20  ower = iNew;.   
13b00 20 20 20 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20         nOut--;. 
13b10 20 20 20 20 20 20 20 20 20 70 4c 6f 77 65 72 20           pLower 
13b20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
13b30 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
13b40 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 6d   If possible, im
13b50 70 72 6f 76 65 20 6f 6e 20 74 68 65 20 69 55 70  prove on the iUp
13b60 70 65 72 20 65 73 74 69 6d 61 74 65 20 75 73 69  per estimate usi
13b70 6e 67 20 28 24 50 3a 24 55 29 2e 20 2a 2f 0a 20  ng ($P:$U). */. 
13b80 20 20 20 20 20 69 66 28 20 70 55 70 70 65 72 20       if( pUpper 
13b90 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62  ){.        int b
13ba0 4f 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Ok;             
13bb0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
13bc0 66 20 76 61 6c 75 65 20 69 73 20 65 78 74 72 61  f value is extra
13bd0 63 74 65 64 20 66 72 6f 6d 20 70 45 78 70 72 20  cted from pExpr 
13be0 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  */.        Expr 
13bf0 2a 70 45 78 70 72 20 3d 20 70 55 70 70 65 72 2d  *pExpr = pUpper-
13c00 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  >pExpr->pRight;.
13c10 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
13c20 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74  (pUpper->eOperat
13c30 6f 72 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c  or & (WO_LT|WO_L
13c40 45 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  E))!=0 );.      
13c50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74    rc = sqlite3St
13c60 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65  at4ProbeSetValue
13c70 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65  (pParse, p, &pRe
13c80 63 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 6e  c, pExpr, aff, n
13c90 45 71 2c 20 26 62 4f 6b 29 3b 0a 20 20 20 20 20  Eq, &bOk);.     
13ca0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
13cb0 45 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b 0a 20  E_OK && bOk ){. 
13cc0 20 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74           tRowcnt
13cd0 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20   iNew;.         
13ce0 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 70   whereKeyStats(p
13cf0 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20  Parse, p, pRec, 
13d00 31 2c 20 61 29 3b 0a 20 20 20 20 20 20 20 20 20  1, a);.         
13d10 20 69 4e 65 77 20 3d 20 61 5b 30 5d 20 2b 20 28   iNew = a[0] + (
13d20 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74  (pUpper->eOperat
13d30 6f 72 20 26 20 57 4f 5f 4c 45 29 20 3f 20 61 5b  or & WO_LE) ? a[
13d40 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20  1] : 0);.       
13d50 20 20 20 69 66 28 20 69 4e 65 77 3c 69 55 70 70     if( iNew<iUpp
13d60 65 72 20 29 20 69 55 70 70 65 72 20 3d 20 69 4e  er ) iUpper = iN
13d70 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f  ew;.          nO
13d80 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20  ut--;.          
13d90 70 55 70 70 65 72 20 3d 20 30 3b 0a 20 20 20 20  pUpper = 0;.    
13da0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
13db0 20 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 70       pBuilder->p
13dc0 52 65 63 20 3d 20 70 52 65 63 3b 0a 20 20 20 20  Rec = pRec;.    
13dd0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
13de0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
13df0 66 28 20 69 55 70 70 65 72 3e 69 4c 6f 77 65 72  f( iUpper>iLower
13e00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4e   ){.          nN
13e10 65 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ew = sqlite3LogE
13e20 73 74 28 69 55 70 70 65 72 20 2d 20 69 4c 6f 77  st(iUpper - iLow
13e30 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  er);.        }el
13e40 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4e  se{.          nN
13e50 65 77 20 3d 20 31 30 3b 20 20 20 20 20 20 20 20  ew = 10;        
13e60 61 73 73 65 72 74 28 20 31 30 3d 3d 73 71 6c 69  assert( 10==sqli
13e70 74 65 33 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a  te3LogEst(2) );.
13e80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13e90 20 20 69 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20    if( nNew<nOut 
13ea0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 75  ){.          nOu
13eb0 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20  t = nNew;.      
13ec0 20 20 7d 0a 20 20 20 20 20 20 20 20 57 48 45 52    }.        WHER
13ed0 45 54 52 41 43 45 28 30 78 31 30 2c 20 28 22 53  ETRACE(0x10, ("S
13ee0 54 41 54 34 20 72 61 6e 67 65 20 73 63 61 6e 3a  TAT4 range scan:
13ef0 20 25 75 2e 2e 25 75 20 20 65 73 74 3d 25 64 5c   %u..%u  est=%d\
13f00 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
13f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
13f20 75 33 32 29 69 4c 6f 77 65 72 2c 20 28 75 33 32  u32)iLower, (u32
13f30 29 69 55 70 70 65 72 2c 20 6e 4f 75 74 29 29 3b  )iUpper, nOut));
13f40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
13f50 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 44  se{.      int bD
13f60 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  one = 0;.      r
13f70 63 20 3d 20 77 68 65 72 65 52 61 6e 67 65 53 6b  c = whereRangeSk
13f80 69 70 53 63 61 6e 45 73 74 28 70 50 61 72 73 65  ipScanEst(pParse
13f90 2c 20 70 4c 6f 77 65 72 2c 20 70 55 70 70 65 72  , pLower, pUpper
13fa0 2c 20 70 4c 6f 6f 70 2c 20 26 62 44 6f 6e 65 29  , pLoop, &bDone)
13fb0 3b 0a 20 20 20 20 20 20 69 66 28 20 62 44 6f 6e  ;.      if( bDon
13fc0 65 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  e ) return rc;. 
13fd0 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20     }.  }.#else. 
13fe0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
13ff0 52 28 70 50 61 72 73 65 29 3b 0a 20 20 55 4e 55  R(pParse);.  UNU
14000 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 42  SED_PARAMETER(pB
14010 75 69 6c 64 65 72 29 3b 0a 20 20 61 73 73 65 72  uilder);.  asser
14020 74 28 20 70 4c 6f 77 65 72 20 7c 7c 20 70 55 70  t( pLower || pUp
14030 70 65 72 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  per );.#endif.  
14040 61 73 73 65 72 74 28 20 70 55 70 70 65 72 3d 3d  assert( pUpper==
14050 30 20 7c 7c 20 28 70 55 70 70 65 72 2d 3e 77 74  0 || (pUpper->wt
14060 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
14070 4c 4c 29 3d 3d 30 20 29 3b 0a 20 20 6e 4e 65 77  LL)==0 );.  nNew
14080 20 3d 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a   = whereRangeAdj
14090 75 73 74 28 70 4c 6f 77 65 72 2c 20 6e 4f 75 74  ust(pLower, nOut
140a0 29 3b 0a 20 20 6e 4e 65 77 20 3d 20 77 68 65 72  );.  nNew = wher
140b0 65 52 61 6e 67 65 41 64 6a 75 73 74 28 70 55 70  eRangeAdjust(pUp
140c0 70 65 72 2c 20 6e 4e 65 77 29 3b 0a 0a 20 20 2f  per, nNew);..  /
140d0 2a 20 54 55 4e 49 4e 47 3a 20 49 66 20 74 68 65  * TUNING: If the
140e0 72 65 20 69 73 20 62 6f 74 68 20 61 6e 20 75 70  re is both an up
140f0 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 20 6c 69  per and lower li
14100 6d 69 74 2c 20 61 73 73 75 6d 65 20 74 68 65 20  mit, assume the 
14110 72 61 6e 67 65 20 69 73 0a 20 20 2a 2a 20 72 65  range is.  ** re
14120 64 75 63 65 64 20 62 79 20 61 6e 20 61 64 64 69  duced by an addi
14130 74 69 6f 6e 61 6c 20 37 35 25 2e 20 54 68 69 73  tional 75%. This
14140 20 6d 65 61 6e 73 20 74 68 61 74 2c 20 62 79 20   means that, by 
14150 64 65 66 61 75 6c 74 2c 20 61 6e 20 6f 70 65 6e  default, an open
14160 2d 65 6e 64 65 64 0a 20 20 2a 2a 20 72 61 6e 67  -ended.  ** rang
14170 65 20 71 75 65 72 79 20 28 65 2e 67 2e 20 63 6f  e query (e.g. co
14180 6c 20 3e 20 3f 29 20 69 73 20 61 73 73 75 6d 65  l > ?) is assume
14190 64 20 74 6f 20 6d 61 74 63 68 20 31 2f 34 20 6f  d to match 1/4 o
141a0 66 20 74 68 65 20 72 6f 77 73 20 69 6e 20 74 68  f the rows in th
141b0 65 0a 20 20 2a 2a 20 69 6e 64 65 78 2e 20 57 68  e.  ** index. Wh
141c0 69 6c 65 20 61 20 63 6c 6f 73 65 64 20 72 61 6e  ile a closed ran
141d0 67 65 20 28 65 2e 67 2e 20 63 6f 6c 20 42 45 54  ge (e.g. col BET
141e0 57 45 45 4e 20 3f 20 41 4e 44 20 3f 29 20 69 73  WEEN ? AND ?) is
141f0 20 65 73 74 69 6d 61 74 65 64 20 74 6f 0a 20 20   estimated to.  
14200 2a 2a 20 6d 61 74 63 68 20 31 2f 36 34 20 6f 66  ** match 1/64 of
14210 20 74 68 65 20 69 6e 64 65 78 2e 20 2a 2f 20 0a   the index. */ .
14220 20 20 69 66 28 20 70 4c 6f 77 65 72 20 26 26 20    if( pLower && 
14230 70 55 70 70 65 72 20 29 20 6e 4e 65 77 20 2d 3d  pUpper ) nNew -=
14240 20 32 30 3b 0a 0a 20 20 6e 4f 75 74 20 2d 3d 20   20;..  nOut -= 
14250 28 70 4c 6f 77 65 72 21 3d 30 29 20 2b 20 28 70  (pLower!=0) + (p
14260 55 70 70 65 72 21 3d 30 29 3b 0a 20 20 69 66 28  Upper!=0);.  if(
14270 20 6e 4e 65 77 3c 31 30 20 29 20 6e 4e 65 77 20   nNew<10 ) nNew 
14280 3d 20 31 30 3b 0a 20 20 69 66 28 20 6e 4e 65 77  = 10;.  if( nNew
14290 3c 6e 4f 75 74 20 29 20 6e 4f 75 74 20 3d 20 6e  <nOut ) nOut = n
142a0 4e 65 77 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  New;.#if defined
142b0 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42  (WHERETRACE_ENAB
142c0 4c 45 44 29 0a 20 20 69 66 28 20 70 4c 6f 6f 70  LED).  if( pLoop
142d0 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29 7b 0a 20  ->nOut>nOut ){. 
142e0 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
142f0 31 30 2c 28 22 52 61 6e 67 65 20 73 63 61 6e 20  10,("Range scan 
14300 6c 6f 77 65 72 73 20 6e 4f 75 74 20 66 72 6f 6d  lowers nOut from
14310 20 25 64 20 74 6f 20 25 64 5c 6e 22 2c 0a 20 20   %d to %d\n",.  
14320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14330 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 2c 20 6e    pLoop->nOut, n
14340 4f 75 74 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  Out));.  }.#endi
14350 66 0a 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20  f.  pLoop->nOut 
14360 3d 20 28 4c 6f 67 45 73 74 29 6e 4f 75 74 3b 0a  = (LogEst)nOut;.
14370 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
14380 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
14390 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
143a0 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61  AT4./*.** Estima
143b0 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
143c0 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20   rows that will 
143d0 62 65 20 72 65 74 75 72 6e 65 64 20 62 61 73 65  be returned base
143e0 64 20 6f 6e 0a 2a 2a 20 61 6e 20 65 71 75 61 6c  d on.** an equal
143f0 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 78  ity constraint x
14400 3d 56 41 4c 55 45 20 61 6e 64 20 77 68 65 72 65  =VALUE and where
14410 20 74 68 61 74 20 56 41 4c 55 45 20 6f 63 63 75   that VALUE occu
14420 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 68 69 73  rs in.** the his
14430 74 6f 67 72 61 6d 20 64 61 74 61 2e 20 20 54 68  togram data.  Th
14440 69 73 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 77 68  is only works wh
14450 65 6e 20 78 20 69 73 20 74 68 65 20 6c 65 66 74  en x is the left
14460 2d 6d 6f 73 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  -most.** column 
14470 6f 66 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20  of an index and 
14480 73 71 6c 69 74 65 5f 73 74 61 74 33 20 68 69 73  sqlite_stat3 his
14490 74 6f 67 72 61 6d 20 64 61 74 61 20 69 73 20 61  togram data is a
144a0 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 66 6f 72 20  vailable.** for 
144b0 74 68 61 74 20 69 6e 64 65 78 2e 20 20 57 68 65  that index.  Whe
144c0 6e 20 70 45 78 70 72 3d 3d 4e 55 4c 4c 20 74 68  n pExpr==NULL th
144d0 61 74 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6e  at means the con
144e0 73 74 72 61 69 6e 74 20 69 73 0a 2a 2a 20 22 78  straint is.** "x
144f0 20 49 53 20 4e 55 4c 4c 22 20 69 6e 73 74 65 61   IS NULL" instea
14500 64 20 6f 66 20 22 78 3d 56 41 4c 55 45 22 2e 0a  d of "x=VALUE"..
14510 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  **.** Write the 
14520 65 73 74 69 6d 61 74 65 64 20 72 6f 77 20 63 6f  estimated row co
14530 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20  unt into *pnRow 
14540 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
14550 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61  E_OK. .** If una
14560 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65  ble to make an e
14570 73 74 69 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a  stimate, leave *
14580 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65 64 20  pnRow unchanged 
14590 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f  and return.** no
145a0 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68  n-zero..**.** Th
145b0 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 66  is routine can f
145c0 61 69 6c 20 69 66 20 69 74 20 69 73 20 75 6e 61  ail if it is una
145d0 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f  ble to load a co
145e0 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
145f0 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 66 6f 72  .** required for
14600 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 69 73   string comparis
14610 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62 6c 65  on, or if unable
14620 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d   to allocate mem
14630 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46  ory.** for a UTF
14640 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65 71 75   conversion requ
14650 69 72 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69  ired for compari
14660 73 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f 72 20  son.  The error 
14670 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  is stored.** in 
14680 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63  the pParse struc
14690 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
146a0 69 6e 74 20 77 68 65 72 65 45 71 75 61 6c 53 63  int whereEqualSc
146b0 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a  anEst(.  Parse *
146c0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
146d0 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20   Parsing & code 
146e0 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
146f0 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  xt */.  WhereLoo
14700 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
14710 65 72 2c 0a 20 20 45 78 70 72 20 2a 70 45 78 70  er,.  Expr *pExp
14720 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78  r,         /* Ex
14730 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 56 41 4c  pression for VAL
14740 55 45 20 69 6e 20 74 68 65 20 78 3d 56 41 4c 55  UE in the x=VALU
14750 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  E constraint */.
14760 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e 52 6f 77    tRowcnt *pnRow
14770 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
14780 74 68 65 20 72 65 76 69 73 65 64 20 72 6f 77 20  the revised row 
14790 65 73 74 69 6d 61 74 65 20 68 65 72 65 20 2a 2f  estimate here */
147a0 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d  .){.  Index *p =
147b0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d   pBuilder->pNew-
147c0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
147d0 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 42 75  .  int nEq = pBu
147e0 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62  ilder->pNew->u.b
147f0 74 72 65 65 2e 6e 45 71 3b 0a 20 20 55 6e 70 61  tree.nEq;.  Unpa
14800 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 52 65 63  ckedRecord *pRec
14810 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65   = pBuilder->pRe
14820 63 3b 0a 20 20 75 38 20 61 66 66 3b 20 20 20 20  c;.  u8 aff;    
14830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14840 2a 20 43 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74  * Column affinit
14850 79 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  y */.  int rc;  
14860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14870 20 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20   /* Subfunction 
14880 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
14890 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 20 20   tRowcnt a[2];  
148a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
148b0 61 74 69 73 74 69 63 73 20 2a 2f 0a 20 20 69 6e  atistics */.  in
148c0 74 20 62 4f 6b 3b 0a 0a 20 20 61 73 73 65 72 74  t bOk;..  assert
148d0 28 20 6e 45 71 3e 3d 31 20 29 3b 0a 20 20 61 73  ( nEq>=1 );.  as
148e0 73 65 72 74 28 20 6e 45 71 3c 3d 70 2d 3e 6e 43  sert( nEq<=p->nC
148f0 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72  olumn );.  asser
14900 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30  t( p->aSample!=0
14910 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
14920 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20  >nSample>0 );.  
14930 61 73 73 65 72 74 28 20 70 42 75 69 6c 64 65 72  assert( pBuilder
14940 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 6e 45 71 20  ->nRecValid<nEq 
14950 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 76 61 6c 75  );..  /* If valu
14960 65 73 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c  es are not avail
14970 61 62 6c 65 20 66 6f 72 20 61 6c 6c 20 66 69 65  able for all fie
14980 6c 64 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  lds of the index
14990 20 74 6f 20 74 68 65 20 6c 65 66 74 0a 20 20 2a   to the left.  *
149a0 2a 20 6f 66 20 74 68 69 73 20 6f 6e 65 2c 20 6e  * of this one, n
149b0 6f 20 65 73 74 69 6d 61 74 65 20 63 61 6e 20 62  o estimate can b
149c0 65 20 6d 61 64 65 2e 20 52 65 74 75 72 6e 20 53  e made. Return S
149d0 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 2e 20  QLITE_NOTFOUND. 
149e0 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65  */.  if( pBuilde
149f0 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 28 6e 45  r->nRecValid<(nE
14a00 71 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75  q-1) ){.    retu
14a10 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  rn SQLITE_NOTFOU
14a20 4e 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  ND;.  }..  /* Th
14a30 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  is is an optimiz
14a40 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 54 68 65 20  ation only. The 
14a50 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 53  call to sqlite3S
14a60 74 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75  tat4ProbeSetValu
14a70 65 28 29 0a 20 20 2a 2a 20 62 65 6c 6f 77 20 77  e().  ** below w
14a80 6f 75 6c 64 20 72 65 74 75 72 6e 20 74 68 65 20  ould return the 
14a90 73 61 6d 65 20 76 61 6c 75 65 2e 20 20 2a 2f 0a  same value.  */.
14aa0 20 20 69 66 28 20 6e 45 71 3e 3d 70 2d 3e 6e 43    if( nEq>=p->nC
14ab0 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 2a 70 6e  olumn ){.    *pn
14ac0 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  Row = 1;.    ret
14ad0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
14ae0 20 7d 0a 0a 20 20 61 66 66 20 3d 20 70 2d 3e 70   }..  aff = p->p
14af0 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61  Table->aCol[p->a
14b00 69 43 6f 6c 75 6d 6e 5b 6e 45 71 2d 31 5d 5d 2e  iColumn[nEq-1]].
14b10 61 66 66 69 6e 69 74 79 3b 0a 20 20 72 63 20 3d  affinity;.  rc =
14b20 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f   sqlite3Stat4Pro
14b30 62 65 53 65 74 56 61 6c 75 65 28 70 50 61 72 73  beSetValue(pPars
14b40 65 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78  e, p, &pRec, pEx
14b50 70 72 2c 20 61 66 66 2c 20 6e 45 71 2d 31 2c 20  pr, aff, nEq-1, 
14b60 26 62 4f 6b 29 3b 0a 20 20 70 42 75 69 6c 64 65  &bOk);.  pBuilde
14b70 72 2d 3e 70 52 65 63 20 3d 20 70 52 65 63 3b 0a  r->pRec = pRec;.
14b80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
14b90 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
14ba0 0a 20 20 69 66 28 20 62 4f 6b 3d 3d 30 20 29 20  .  if( bOk==0 ) 
14bb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
14bc0 54 46 4f 55 4e 44 3b 0a 20 20 70 42 75 69 6c 64  TFOUND;.  pBuild
14bd0 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20  er->nRecValid = 
14be0 6e 45 71 3b 0a 0a 20 20 77 68 65 72 65 4b 65 79  nEq;..  whereKey
14bf0 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c  Stats(pParse, p,
14c00 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20   pRec, 0, a);.  
14c10 57 48 45 52 45 54 52 41 43 45 28 30 78 31 30 2c  WHERETRACE(0x10,
14c20 28 22 65 71 75 61 6c 69 74 79 20 73 63 61 6e 20  ("equality scan 
14c30 72 65 67 69 6f 6e 73 3a 20 25 64 5c 6e 22 2c 20  regions: %d\n", 
14c40 28 69 6e 74 29 61 5b 31 5d 29 29 3b 0a 20 20 2a  (int)a[1]));.  *
14c50 70 6e 52 6f 77 20 3d 20 61 5b 31 5d 3b 0a 20 20  pnRow = a[1];.  
14c60 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
14c70 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
14c80 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
14c90 5f 53 54 41 54 34 20 2a 2f 0a 0a 23 69 66 64 65  _STAT4 */..#ifde
14ca0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
14cb0 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f  STAT3_OR_STAT4./
14cc0 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68  *.** Estimate th
14cd0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
14ce0 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65   that will be re
14cf0 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a  turned based on.
14d00 2a 2a 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61  ** an IN constra
14d10 69 6e 74 20 77 68 65 72 65 20 74 68 65 20 72 69  int where the ri
14d20 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  ght-hand side of
14d30 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
14d40 0a 2a 2a 20 69 73 20 61 20 6c 69 73 74 20 6f 66  .** is a list of
14d50 20 76 61 6c 75 65 73 2e 20 20 45 78 61 6d 70 6c   values.  Exampl
14d60 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  e:.**.**        
14d70 57 48 45 52 45 20 78 20 49 4e 20 28 31 2c 32 2c  WHERE x IN (1,2,
14d80 33 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65  3,4).**.** Write
14d90 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 72   the estimated r
14da0 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70  ow count into *p
14db0 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20  nRow and return 
14dc0 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49  SQLITE_OK. .** I
14dd0 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65  f unable to make
14de0 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65   an estimate, le
14df0 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61  ave *pnRow uncha
14e00 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a  nged and return.
14e10 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a  ** non-zero..**.
14e20 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
14e30 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69  can fail if it i
14e40 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64  s unable to load
14e50 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71   a collating seq
14e60 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65  uence.** require
14e70 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d  d for string com
14e80 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75  parison, or if u
14e90 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74  nable to allocat
14ea0 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20  e memory.** for 
14eb0 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e  a UTF conversion
14ec0 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f   required for co
14ed0 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65  mparison.  The e
14ee0 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a  rror is stored.*
14ef0 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20  * in the pParse 
14f00 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
14f10 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 49 6e  atic int whereIn
14f20 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65  ScanEst(.  Parse
14f30 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
14f40 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64  /* Parsing & cod
14f50 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
14f60 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c  text */.  WhereL
14f70 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
14f80 6c 64 65 72 2c 0a 20 20 45 78 70 72 4c 69 73 74  lder,.  ExprList
14f90 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20   *pList,     /* 
14fa0 54 68 65 20 76 61 6c 75 65 20 6c 69 73 74 20 6f  The value list o
14fb0 6e 20 74 68 65 20 52 48 53 20 6f 66 20 22 78 20  n the RHS of "x 
14fc0 49 4e 20 28 76 31 2c 76 32 2c 76 33 2c 2e 2e 2e  IN (v1,v2,v3,...
14fd0 29 22 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  )" */.  tRowcnt 
14fe0 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a 20  *pnRow       /* 
14ff0 57 72 69 74 65 20 74 68 65 20 72 65 76 69 73 65  Write the revise
15000 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68  d row estimate h
15010 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65  ere */.){.  Inde
15020 78 20 2a 70 20 3d 20 70 42 75 69 6c 64 65 72 2d  x *p = pBuilder-
15030 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70  >pNew->u.btree.p
15040 49 6e 64 65 78 3b 0a 20 20 69 36 34 20 6e 52 6f  Index;.  i64 nRo
15050 77 30 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  w0 = sqlite3LogE
15060 73 74 54 6f 49 6e 74 28 70 2d 3e 61 69 52 6f 77  stToInt(p->aiRow
15070 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a 20 20 69 6e  LogEst[0]);.  in
15080 74 20 6e 52 65 63 56 61 6c 69 64 20 3d 20 70 42  t nRecValid = pB
15090 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
150a0 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
150b0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20  LITE_OK;     /* 
150c0 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  Subfunction retu
150d0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f  rn code */.  tRo
150e0 77 63 6e 74 20 6e 45 73 74 3b 20 20 20 20 20 20  wcnt nEst;      
150f0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
15100 66 20 72 6f 77 73 20 66 6f 72 20 61 20 73 69 6e  f rows for a sin
15110 67 6c 65 20 74 65 72 6d 20 2a 2f 0a 20 20 74 52  gle term */.  tR
15120 6f 77 63 6e 74 20 6e 52 6f 77 45 73 74 20 3d 20  owcnt nRowEst = 
15130 30 3b 20 20 20 20 2f 2a 20 4e 65 77 20 65 73 74  0;    /* New est
15140 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d  imate of the num
15150 62 65 72 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 20  ber of rows */. 
15160 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
15170 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
15180 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61   counter */..  a
15190 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c  ssert( p->aSampl
151a0 65 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d  e!=0 );.  for(i=
151b0 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
151c0 20 26 26 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78   && i<pList->nEx
151d0 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 45  pr; i++){.    nE
151e0 73 74 20 3d 20 6e 52 6f 77 30 3b 0a 20 20 20 20  st = nRow0;.    
151f0 72 63 20 3d 20 77 68 65 72 65 45 71 75 61 6c 53  rc = whereEqualS
15200 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70  canEst(pParse, p
15210 42 75 69 6c 64 65 72 2c 20 70 4c 69 73 74 2d 3e  Builder, pList->
15220 61 5b 69 5d 2e 70 45 78 70 72 2c 20 26 6e 45 73  a[i].pExpr, &nEs
15230 74 29 3b 0a 20 20 20 20 6e 52 6f 77 45 73 74 20  t);.    nRowEst 
15240 2b 3d 20 6e 45 73 74 3b 0a 20 20 20 20 70 42 75  += nEst;.    pBu
15250 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
15260 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20   = nRecValid;.  
15270 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
15280 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
15290 28 20 6e 52 6f 77 45 73 74 20 3e 20 6e 52 6f 77  ( nRowEst > nRow
152a0 30 20 29 20 6e 52 6f 77 45 73 74 20 3d 20 6e 52  0 ) nRowEst = nR
152b0 6f 77 30 3b 0a 20 20 20 20 2a 70 6e 52 6f 77 20  ow0;.    *pnRow 
152c0 3d 20 6e 52 6f 77 45 73 74 3b 0a 20 20 20 20 57  = nRowEst;.    W
152d0 48 45 52 45 54 52 41 43 45 28 30 78 31 30 2c 28  HERETRACE(0x10,(
152e0 22 49 4e 20 72 6f 77 20 65 73 74 69 6d 61 74 65  "IN row estimate
152f0 3a 20 65 73 74 3d 25 64 5c 6e 22 2c 20 6e 52 6f  : est=%d\n", nRo
15300 77 45 73 74 29 29 3b 0a 20 20 7d 0a 20 20 61 73  wEst));.  }.  as
15310 73 65 72 74 28 20 70 42 75 69 6c 64 65 72 2d 3e  sert( pBuilder->
15320 6e 52 65 63 56 61 6c 69 64 3d 3d 6e 52 65 63 56  nRecValid==nRecV
15330 61 6c 69 64 20 29 3b 0a 20 20 72 65 74 75 72 6e  alid );.  return
15340 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
15350 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
15360 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f  TAT3_OR_STAT4 */
15370 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c 65 20  ../*.** Disable 
15380 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48  a term in the WH
15390 45 52 45 20 63 6c 61 75 73 65 2e 20 20 45 78 63  ERE clause.  Exc
153a0 65 70 74 2c 20 64 6f 20 6e 6f 74 20 64 69 73 61  ept, do not disa
153b0 62 6c 65 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20  ble the term.** 
153c0 69 66 20 69 74 20 63 6f 6e 74 72 6f 6c 73 20 61  if it controls a
153d0 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
153e0 20 61 6e 64 20 69 74 20 64 69 64 20 6e 6f 74 20   and it did not 
153f0 6f 72 69 67 69 6e 61 74 65 20 69 6e 20 74 68 65  originate in the
15400 20 4f 4e 0a 2a 2a 20 6f 72 20 55 53 49 4e 47 20   ON.** or USING 
15410 63 6c 61 75 73 65 20 6f 66 20 74 68 61 74 20 6a  clause of that j
15420 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 69  oin..**.** Consi
15430 64 65 72 20 74 68 65 20 74 65 72 6d 20 74 32 2e  der the term t2.
15440 7a 3d 27 6f 6b 27 20 69 6e 20 74 68 65 20 66 6f  z='ok' in the fo
15450 6c 6c 6f 77 69 6e 67 20 71 75 65 72 69 65 73 3a  llowing queries:
15460 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 53 45  .**.**   (1)  SE
15470 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c  LECT * FROM t1 L
15480 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74  EFT JOIN t2 ON t
15490 31 2e 61 3d 74 32 2e 78 20 57 48 45 52 45 20 74  1.a=t2.x WHERE t
154a0 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 32  2.z='ok'.**   (2
154b0 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  )  SELECT * FROM
154c0 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32   t1 LEFT JOIN t2
154d0 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e   ON t1.a=t2.x AN
154e0 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20  D t2.z='ok'.**  
154f0 20 28 33 29 20 20 53 45 4c 45 43 54 20 2a 20 46   (3)  SELECT * F
15500 52 4f 4d 20 74 31 2c 20 74 32 20 57 48 45 52 45  ROM t1, t2 WHERE
15510 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74   t1.a=t2.x AND t
15520 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54  2.z='ok'.**.** T
15530 68 65 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 73 20  he t2.z='ok' is 
15540 64 69 73 61 62 6c 65 64 20 69 6e 20 74 68 65 20  disabled in the 
15550 69 6e 20 28 32 29 20 62 65 63 61 75 73 65 20 69  in (2) because i
15560 74 20 6f 72 69 67 69 6e 61 74 65 73 0a 2a 2a 20  t originates.** 
15570 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65  in the ON clause
15580 2e 20 20 54 68 65 20 74 65 72 6d 20 69 73 20 64  .  The term is d
15590 69 73 61 62 6c 65 64 20 69 6e 20 28 33 29 20 62  isabled in (3) b
155a0 65 63 61 75 73 65 20 69 74 20 69 73 20 6e 6f 74  ecause it is not
155b0 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61 20 4c 45   part.** of a LE
155c0 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2e 20 20  FT OUTER JOIN.  
155d0 49 6e 20 28 31 29 2c 20 74 68 65 20 74 65 72 6d  In (1), the term
155e0 20 69 73 20 6e 6f 74 20 64 69 73 61 62 6c 65 64   is not disabled
155f0 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 61 62 6c 69 6e  ..**.** Disablin
15600 67 20 61 20 74 65 72 6d 20 63 61 75 73 65 73 20  g a term causes 
15610 74 68 61 74 20 74 65 72 6d 20 74 6f 20 6e 6f 74  that term to not
15620 20 62 65 20 74 65 73 74 65 64 20 69 6e 20 74 68   be tested in th
15630 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20  e inner loop.** 
15640 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 44 69  of the join.  Di
15650 73 61 62 6c 69 6e 67 20 69 73 20 61 6e 20 6f 70  sabling is an op
15660 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 57 68 65  timization.  Whe
15670 6e 20 74 65 72 6d 73 20 61 72 65 20 73 61 74 69  n terms are sati
15680 73 66 69 65 64 0a 2a 2a 20 62 79 20 69 6e 64 69  sfied.** by indi
15690 63 65 73 2c 20 77 65 20 64 69 73 61 62 6c 65 20  ces, we disable 
156a0 74 68 65 6d 20 74 6f 20 70 72 65 76 65 6e 74 20  them to prevent 
156b0 72 65 64 75 6e 64 61 6e 74 20 74 65 73 74 73 20  redundant tests 
156c0 69 6e 20 74 68 65 20 69 6e 6e 65 72 0a 2a 2a 20  in the inner.** 
156d0 6c 6f 6f 70 2e 20 20 57 65 20 77 6f 75 6c 64 20  loop.  We would 
156e0 67 65 74 20 74 68 65 20 63 6f 72 72 65 63 74 20  get the correct 
156f0 72 65 73 75 6c 74 73 20 69 66 20 6e 6f 74 68 69  results if nothi
15700 6e 67 20 77 65 72 65 20 65 76 65 72 20 64 69 73  ng were ever dis
15710 61 62 6c 65 64 2c 0a 2a 2a 20 62 75 74 20 6a 6f  abled,.** but jo
15720 69 6e 73 20 6d 69 67 68 74 20 72 75 6e 20 61 20  ins might run a 
15730 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20  little slower.  
15740 54 68 65 20 74 72 69 63 6b 20 69 73 20 74 6f 20  The trick is to 
15750 64 69 73 61 62 6c 65 20 61 73 20 6d 75 63 68 0a  disable as much.
15760 2a 2a 20 61 73 20 77 65 20 63 61 6e 20 77 69 74  ** as we can wit
15770 68 6f 75 74 20 64 69 73 61 62 6c 69 6e 67 20 74  hout disabling t
15780 6f 6f 20 6d 75 63 68 2e 20 20 49 66 20 77 65 20  oo much.  If we 
15790 64 69 73 61 62 6c 65 64 20 69 6e 20 28 31 29 2c  disabled in (1),
157a0 20 77 65 27 64 20 67 65 74 0a 2a 2a 20 74 68 65   we'd get.** the
157b0 20 77 72 6f 6e 67 20 61 6e 73 77 65 72 2e 20 20   wrong answer.  
157c0 53 65 65 20 74 69 63 6b 65 74 20 23 38 31 33 2e  See ticket #813.
157d0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
157e0 64 69 73 61 62 6c 65 54 65 72 6d 28 57 68 65 72  disableTerm(Wher
157f0 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20  eLevel *pLevel, 
15800 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
15810 29 7b 0a 20 20 69 66 28 20 70 54 65 72 6d 0a 20  ){.  if( pTerm. 
15820 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e       && (pTerm->
15830 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43  wtFlags & TERM_C
15840 4f 44 45 44 29 3d 3d 30 0a 20 20 20 20 20 20 26  ODED)==0.      &
15850 26 20 28 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  & (pLevel->iLeft
15860 4a 6f 69 6e 3d 3d 30 20 7c 7c 20 45 78 70 72 48  Join==0 || ExprH
15870 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d  asProperty(pTerm
15880 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  ->pExpr, EP_From
15890 4a 6f 69 6e 29 29 0a 20 20 20 20 20 20 26 26 20  Join)).      && 
158a0 28 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64  (pLevel->notRead
158b0 79 20 26 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  y & pTerm->prere
158c0 71 41 6c 6c 29 3d 3d 30 0a 20 20 29 7b 0a 20 20  qAll)==0.  ){.  
158d0 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73    pTerm->wtFlags
158e0 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a   |= TERM_CODED;.
158f0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 69      if( pTerm->i
15900 50 61 72 65 6e 74 3e 3d 30 20 29 7b 0a 20 20 20  Parent>=0 ){.   
15910 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f     WhereTerm *pO
15920 74 68 65 72 20 3d 20 26 70 54 65 72 6d 2d 3e 70  ther = &pTerm->p
15930 57 43 2d 3e 61 5b 70 54 65 72 6d 2d 3e 69 50 61  WC->a[pTerm->iPa
15940 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20 69 66 28  rent];.      if(
15950 20 28 2d 2d 70 4f 74 68 65 72 2d 3e 6e 43 68 69   (--pOther->nChi
15960 6c 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ld)==0 ){.      
15970 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
15980 65 76 65 6c 2c 20 70 4f 74 68 65 72 29 3b 0a 20  evel, pOther);. 
15990 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
159a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61  .}../*.** Code a
159b0 6e 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70  n OP_Affinity op
159c0 63 6f 64 65 20 74 6f 20 61 70 70 6c 79 20 74 68  code to apply th
159d0 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74  e column affinit
159e0 79 20 73 74 72 69 6e 67 20 7a 41 66 66 0a 2a 2a  y string zAff.**
159f0 20 74 6f 20 74 68 65 20 6e 20 72 65 67 69 73 74   to the n regist
15a00 65 72 73 20 73 74 61 72 74 69 6e 67 20 61 74 20  ers starting at 
15a10 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 41 73 20  base. .**.** As 
15a20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c  an optimization,
15a30 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
15a40 20 65 6e 74 72 69 65 73 20 28 77 68 69 63 68 20   entries (which 
15a50 61 72 65 20 6e 6f 2d 6f 70 73 29 20 61 74 20 74  are no-ops) at t
15a60 68 65 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20  he.** beginning 
15a70 61 6e 64 20 65 6e 64 20 6f 66 20 7a 41 66 66 20  and end of zAff 
15a80 61 72 65 20 69 67 6e 6f 72 65 64 2e 20 20 49 66  are ignored.  If
15a90 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 20   all entries in 
15aa0 7a 41 66 66 20 61 72 65 0a 2a 2a 20 53 51 4c 49  zAff are.** SQLI
15ab0 54 45 5f 41 46 46 5f 4e 4f 4e 45 2c 20 74 68 65  TE_AFF_NONE, the
15ac0 6e 20 6e 6f 20 63 6f 64 65 20 67 65 74 73 20 67  n no code gets g
15ad0 65 6e 65 72 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  enerated..**.** 
15ae0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b  This routine mak
15af0 65 73 20 69 74 73 20 6f 77 6e 20 63 6f 70 79 20  es its own copy 
15b00 6f 66 20 7a 41 66 66 20 73 6f 20 74 68 61 74 20  of zAff so that 
15b10 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 66 72  the caller is fr
15b20 65 65 0a 2a 2a 20 74 6f 20 6d 6f 64 69 66 79 20  ee.** to modify 
15b30 7a 41 66 66 20 61 66 74 65 72 20 74 68 69 73 20  zAff after this 
15b40 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2e  routine returns.
15b50 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
15b60 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74  codeApplyAffinit
15b70 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
15b80 20 69 6e 74 20 62 61 73 65 2c 20 69 6e 74 20 6e   int base, int n
15b90 2c 20 63 68 61 72 20 2a 7a 41 66 66 29 7b 0a 20  , char *zAff){. 
15ba0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
15bb0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20  e->pVdbe;.  if( 
15bc0 7a 41 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61  zAff==0 ){.    a
15bd0 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64  ssert( pParse->d
15be0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
15bf0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
15c00 20 7d 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d   }.  assert( v!=
15c10 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 6a 75 73  0 );..  /* Adjus
15c20 74 20 62 61 73 65 20 61 6e 64 20 6e 20 74 6f 20  t base and n to 
15c30 73 6b 69 70 20 6f 76 65 72 20 53 51 4c 49 54 45  skip over SQLITE
15c40 5f 41 46 46 5f 4e 4f 4e 45 20 65 6e 74 72 69 65  _AFF_NONE entrie
15c50 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  s at the beginni
15c60 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 65 6e 64 20  ng.  ** and end 
15c70 6f 66 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  of the affinity 
15c80 73 74 72 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 77  string..  */.  w
15c90 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a 41 66  hile( n>0 && zAf
15ca0 66 5b 30 5d 3d 3d 53 51 4c 49 54 45 5f 41 46 46  f[0]==SQLITE_AFF
15cb0 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 6e 2d 2d  _NONE ){.    n--
15cc0 3b 0a 20 20 20 20 62 61 73 65 2b 2b 3b 0a 20 20  ;.    base++;.  
15cd0 20 20 7a 41 66 66 2b 2b 3b 0a 20 20 7d 0a 20 20    zAff++;.  }.  
15ce0 77 68 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a 41  while( n>1 && zA
15cf0 66 66 5b 6e 2d 31 5d 3d 3d 53 51 4c 49 54 45 5f  ff[n-1]==SQLITE_
15d00 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  AFF_NONE ){.    
15d10 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  n--;.  }..  /* C
15d20 6f 64 65 20 74 68 65 20 4f 50 5f 41 66 66 69 6e  ode the OP_Affin
15d30 69 74 79 20 6f 70 63 6f 64 65 20 69 66 20 74 68  ity opcode if th
15d40 65 72 65 20 69 73 20 61 6e 79 74 68 69 6e 67 20  ere is anything 
15d50 6c 65 66 74 20 74 6f 20 64 6f 2e 20 2a 2f 0a 20  left to do. */. 
15d60 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20   if( n>0 ){.    
15d70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15d80 32 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79  2(v, OP_Affinity
15d90 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20 20 20  , base, n);.    
15da0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
15db0 65 50 34 28 76 2c 20 2d 31 2c 20 7a 41 66 66 2c  eP4(v, -1, zAff,
15dc0 20 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   n);.    sqlite3
15dd0 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
15de0 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
15df0 62 61 73 65 2c 20 6e 29 3b 0a 20 20 7d 0a 7d 0a  base, n);.  }.}.
15e00 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
15e10 20 63 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67   code for a sing
15e20 6c 65 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d  le equality term
15e30 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
15e40 61 75 73 65 2e 20 20 41 6e 20 65 71 75 61 6c 69  ause.  An equali
15e50 74 79 0a 2a 2a 20 74 65 72 6d 20 63 61 6e 20 62  ty.** term can b
15e60 65 20 65 69 74 68 65 72 20 58 3d 65 78 70 72 20  e either X=expr 
15e70 6f 72 20 58 20 49 4e 20 28 2e 2e 2e 29 2e 20 20  or X IN (...).  
15e80 20 70 54 65 72 6d 20 69 73 20 74 68 65 20 74 65   pTerm is the te
15e90 72 6d 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 64  rm to be .** cod
15ea0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 75  ed..**.** The cu
15eb0 72 72 65 6e 74 20 76 61 6c 75 65 20 66 6f 72 20  rrent value for 
15ec0 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  the constraint i
15ed0 73 20 6c 65 66 74 20 69 6e 20 72 65 67 69 73 74  s left in regist
15ee0 65 72 20 69 52 65 67 2e 0a 2a 2a 0a 2a 2a 20 46  er iReg..**.** F
15ef0 6f 72 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20  or a constraint 
15f00 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 3d 65 78  of the form X=ex
15f10 70 72 2c 20 74 68 65 20 65 78 70 72 65 73 73 69  pr, the expressi
15f20 6f 6e 20 69 73 20 65 76 61 6c 75 61 74 65 64 20  on is evaluated 
15f30 61 6e 64 20 69 74 73 0a 2a 2a 20 72 65 73 75 6c  and its.** resul
15f40 74 20 69 73 20 6c 65 66 74 20 6f 6e 20 74 68 65  t is left on the
15f50 20 73 74 61 63 6b 2e 20 20 46 6f 72 20 63 6f 6e   stack.  For con
15f60 73 74 72 61 69 6e 74 73 20 6f 66 20 74 68 65 20  straints of the 
15f70 66 6f 72 6d 20 58 20 49 4e 20 28 2e 2e 2e 29 0a  form X IN (...).
15f80 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
15f90 73 65 74 73 20 75 70 20 61 20 6c 6f 6f 70 20 74  sets up a loop t
15fa0 68 61 74 20 77 69 6c 6c 20 69 74 65 72 61 74 65  hat will iterate
15fb0 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c 75 65 73   over all values
15fc0 20 6f 66 20 58 2e 0a 2a 2f 0a 73 74 61 74 69 63   of X..*/.static
15fd0 20 69 6e 74 20 63 6f 64 65 45 71 75 61 6c 69 74   int codeEqualit
15fe0 79 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a  yTerm(.  Parse *
15ff0 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
16000 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
16010 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ext */.  WhereTe
16020 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20 2f 2a 20  rm *pTerm,   /* 
16030 54 68 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20  The term of the 
16040 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
16050 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68  be coded */.  Wh
16060 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
16070 2c 20 2f 2a 20 54 68 65 20 6c 65 76 65 6c 20 6f  , /* The level o
16080 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
16090 65 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67  e we are working
160a0 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 45 71   on */.  int iEq
160b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
160c0 49 6e 64 65 78 20 6f 66 20 74 68 65 20 65 71 75  Index of the equ
160d0 61 6c 69 74 79 20 74 65 72 6d 20 77 69 74 68 69  ality term withi
160e0 6e 20 74 68 69 73 20 6c 65 76 65 6c 20 2a 2f 0a  n this level */.
160f0 20 20 69 6e 74 20 62 52 65 76 2c 20 20 20 20 20    int bRev,     
16100 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
16110 72 20 72 65 76 65 72 73 65 2d 6f 72 64 65 72 20  r reverse-order 
16120 49 4e 20 6f 70 65 72 61 74 69 6f 6e 73 20 2a 2f  IN operations */
16130 0a 20 20 69 6e 74 20 69 54 61 72 67 65 74 20 20  .  int iTarget  
16140 20 20 20 20 20 20 20 2f 2a 20 41 74 74 65 6d 70         /* Attemp
16150 74 20 74 6f 20 6c 65 61 76 65 20 72 65 73 75 6c  t to leave resul
16160 74 73 20 69 6e 20 74 68 69 73 20 72 65 67 69 73  ts in this regis
16170 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  ter */.){.  Expr
16180 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45   *pX = pTerm->pE
16190 78 70 72 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d  xpr;.  Vdbe *v =
161a0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
161b0 20 20 69 6e 74 20 69 52 65 67 3b 20 20 20 20 20    int iReg;     
161c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
161d0 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
161e0 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a 20 20 61   results */..  a
161f0 73 73 65 72 74 28 20 69 54 61 72 67 65 74 3e 30  ssert( iTarget>0
16200 20 29 3b 0a 20 20 69 66 28 20 70 58 2d 3e 6f 70   );.  if( pX->op
16210 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20 20 20 20 69  ==TK_EQ ){.    i
16220 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Reg = sqlite3Exp
16230 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
16240 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20  se, pX->pRight, 
16250 69 54 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73  iTarget);.  }els
16260 65 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b  e if( pX->op==TK
16270 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69  _ISNULL ){.    i
16280 52 65 67 20 3d 20 69 54 61 72 67 65 74 3b 0a 20  Reg = iTarget;. 
16290 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
162a0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
162b0 20 30 2c 20 69 52 65 67 29 3b 0a 23 69 66 6e 64   0, iReg);.#ifnd
162c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
162d0 55 42 51 55 45 52 59 0a 20 20 7d 65 6c 73 65 7b  UBQUERY.  }else{
162e0 0a 20 20 20 20 69 6e 74 20 65 54 79 70 65 3b 0a  .    int eType;.
162f0 20 20 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20      int iTab;.  
16300 20 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20    struct InLoop 
16310 2a 70 49 6e 3b 0a 20 20 20 20 57 68 65 72 65 4c  *pIn;.    WhereL
16320 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d 20 70 4c 65  oop *pLoop = pLe
16330 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 0a 20 20  vel->pWLoop;..  
16340 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73    if( (pLoop->ws
16350 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
16360 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 0a 20  RTUALTABLE)==0. 
16370 20 20 20 20 20 26 26 20 70 4c 6f 6f 70 2d 3e 75       && pLoop->u
16380 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 21 3d 30  .btree.pIndex!=0
16390 0a 20 20 20 20 20 20 26 26 20 70 4c 6f 6f 70 2d  .      && pLoop-
163a0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d  >u.btree.pIndex-
163b0 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 45 71 5d  >aSortOrder[iEq]
163c0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 74 65  .    ){.      te
163d0 73 74 63 61 73 65 28 20 69 45 71 3d 3d 30 20 29  stcase( iEq==0 )
163e0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
163f0 28 20 62 52 65 76 20 29 3b 0a 20 20 20 20 20 20  ( bRev );.      
16400 62 52 65 76 20 3d 20 21 62 52 65 76 3b 0a 20 20  bRev = !bRev;.  
16410 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
16420 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b  pX->op==TK_IN );
16430 0a 20 20 20 20 69 52 65 67 20 3d 20 69 54 61 72  .    iReg = iTar
16440 67 65 74 3b 0a 20 20 20 20 65 54 79 70 65 20 3d  get;.    eType =
16450 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e   sqlite3FindInIn
16460 64 65 78 28 70 50 61 72 73 65 2c 20 70 58 2c 20  dex(pParse, pX, 
16470 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 2c 20 30  IN_INDEX_LOOP, 0
16480 29 3b 0a 20 20 20 20 69 66 28 20 65 54 79 70 65  );.    if( eType
16490 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58  ==IN_INDEX_INDEX
164a0 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 20 20 74  _DESC ){.      t
164b0 65 73 74 63 61 73 65 28 20 62 52 65 76 20 29 3b  estcase( bRev );
164c0 0a 20 20 20 20 20 20 62 52 65 76 20 3d 20 21 62  .      bRev = !b
164d0 52 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  Rev;.    }.    i
164e0 54 61 62 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65  Tab = pX->iTable
164f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
16500 65 41 64 64 4f 70 32 28 76 2c 20 62 52 65 76 20  eAddOp2(v, bRev 
16510 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f 52  ? OP_Last : OP_R
16520 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b  ewind, iTab, 0);
16530 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
16540 65 49 66 28 76 2c 20 62 52 65 76 29 3b 0a 20 20  eIf(v, bRev);.  
16550 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
16560 28 76 2c 20 21 62 52 65 76 29 3b 0a 20 20 20 20  (v, !bRev);.    
16570 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e  assert( (pLoop->
16580 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
16590 4d 55 4c 54 49 5f 4f 52 29 3d 3d 30 20 29 3b 0a  MULTI_OR)==0 );.
165a0 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61      pLoop->wsFla
165b0 67 73 20 7c 3d 20 57 48 45 52 45 5f 49 4e 5f 41  gs |= WHERE_IN_A
165c0 42 4c 45 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  BLE;.    if( pLe
165d0 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3d 3d 30  vel->u.in.nIn==0
165e0 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c   ){.      pLevel
165f0 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73 71 6c 69  ->addrNxt = sqli
16600 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
16610 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  (v);.    }.    p
16620 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2b  Level->u.in.nIn+
16630 2b 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75  +;.    pLevel->u
16640 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 20 3d 0a 20 20  .in.aInLoop =.  
16650 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 52 65       sqlite3DbRe
16660 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 50 61 72  allocOrFree(pPar
16670 73 65 2d 3e 64 62 2c 20 70 4c 65 76 65 6c 2d 3e  se->db, pLevel->
16680 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 2c 0a 20 20  u.in.aInLoop,.  
16690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166a0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
166b0 6f 66 28 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  of(pLevel->u.in.
166c0 61 49 6e 4c 6f 6f 70 5b 30 5d 29 2a 70 4c 65 76  aInLoop[0])*pLev
166d0 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 29 3b 0a 20  el->u.in.nIn);. 
166e0 20 20 20 70 49 6e 20 3d 20 70 4c 65 76 65 6c 2d     pIn = pLevel-
166f0 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 3b 0a 20  >u.in.aInLoop;. 
16700 20 20 20 69 66 28 20 70 49 6e 20 29 7b 0a 20 20     if( pIn ){.  
16710 20 20 20 20 70 49 6e 20 2b 3d 20 70 4c 65 76 65      pIn += pLeve
16720 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 2d 20 31 3b  l->u.in.nIn - 1;
16730 0a 20 20 20 20 20 20 70 49 6e 2d 3e 69 43 75 72  .      pIn->iCur
16740 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 20 20 69   = iTab;.      i
16750 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  f( eType==IN_IND
16760 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20  EX_ROWID ){.    
16770 20 20 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54      pIn->addrInT
16780 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
16790 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
167a0 69 64 2c 20 69 54 61 62 2c 20 69 52 65 67 29 3b  id, iTab, iReg);
167b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
167c0 20 20 20 20 20 20 70 49 6e 2d 3e 61 64 64 72 49        pIn->addrI
167d0 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  nTop = sqlite3Vd
167e0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
167f0 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 30 2c 20  olumn, iTab, 0, 
16800 69 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  iReg);.      }. 
16810 20 20 20 20 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f       pIn->eEndLo
16820 6f 70 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50  opOp = bRev ? OP
16830 5f 50 72 65 76 49 66 4f 70 65 6e 20 3a 20 4f 50  _PrevIfOpen : OP
16840 5f 4e 65 78 74 49 66 4f 70 65 6e 3b 0a 20 20 20  _NextIfOpen;.   
16850 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16860 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp1(v, OP_IsNul
16870 6c 2c 20 69 52 65 67 29 3b 20 56 64 62 65 43 6f  l, iReg); VdbeCo
16880 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d  verage(v);.    }
16890 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76  else{.      pLev
168a0 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 3d 20 30  el->u.in.nIn = 0
168b0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
168c0 20 7d 0a 20 20 64 69 73 61 62 6c 65 54 65 72 6d   }.  disableTerm
168d0 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b  (pLevel, pTerm);
168e0 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a  .  return iReg;.
168f0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
16900 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
16910 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 3d 3d   evaluate all ==
16920 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61 69   and IN constrai
16930 6e 74 73 20 66 6f 72 20 61 6e 0a 2a 2a 20 69 6e  nts for an.** in
16940 64 65 78 20 73 63 61 6e 2e 0a 2a 2a 0a 2a 2a 20  dex scan..**.** 
16950 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 63 6f 6e  For example, con
16960 73 69 64 65 72 20 74 61 62 6c 65 20 74 31 28 61  sider table t1(a
16970 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 77 69 74 68  ,b,c,d,e,f) with
16980 20 69 6e 64 65 78 20 69 31 28 61 2c 62 2c 63 29   index i1(a,b,c)
16990 2e 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65  ..** Suppose the
169a0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73   WHERE clause is
169b0 20 74 68 69 73 3a 20 20 61 3d 3d 35 20 41 4e 44   this:  a==5 AND
169c0 20 62 20 49 4e 20 28 31 2c 32 2c 33 29 20 41 4e   b IN (1,2,3) AN
169d0 44 20 63 3e 35 20 41 4e 44 20 63 3c 31 30 0a 2a  D c>5 AND c<10.*
169e0 2a 20 54 68 65 20 69 6e 64 65 78 20 68 61 73 20  * The index has 
169f0 61 73 20 6d 61 6e 79 20 61 73 20 74 68 72 65 65  as many as three
16a00 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
16a10 61 69 6e 74 73 2c 20 62 75 74 20 69 6e 20 74 68  aints, but in th
16a20 69 73 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 74  is.** example, t
16a30 68 65 20 74 68 69 72 64 20 22 63 22 20 76 61 6c  he third "c" val
16a40 75 65 20 69 73 20 61 6e 20 69 6e 65 71 75 61 6c  ue is an inequal
16a50 69 74 79 2e 20 20 53 6f 20 6f 6e 6c 79 20 74 77  ity.  So only tw
16a60 6f 20 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74  o .** constraint
16a70 73 20 61 72 65 20 63 6f 64 65 64 2e 20 20 54 68  s are coded.  Th
16a80 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
16a90 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  generate code to
16aa0 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20 61 3d 3d   evaluate.** a==
16ab0 35 20 61 6e 64 20 62 20 49 4e 20 28 31 2c 32 2c  5 and b IN (1,2,
16ac0 33 29 2e 20 20 54 68 65 20 63 75 72 72 65 6e 74  3).  The current
16ad0 20 76 61 6c 75 65 73 20 66 6f 72 20 61 20 61 6e   values for a an
16ae0 64 20 62 20 77 69 6c 6c 20 62 65 20 73 74 6f 72  d b will be stor
16af0 65 64 0a 2a 2a 20 69 6e 20 63 6f 6e 73 65 63 75  ed.** in consecu
16b00 74 69 76 65 20 72 65 67 69 73 74 65 72 73 20 61  tive registers a
16b10 6e 64 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  nd the index of 
16b20 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74  the first regist
16b30 65 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  er is returned..
16b40 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78 61  **.** In the exa
16b50 6d 70 6c 65 20 61 62 6f 76 65 20 6e 45 71 3d 3d  mple above nEq==
16b60 32 2e 20 20 42 75 74 20 74 68 69 73 20 73 75 62  2.  But this sub
16b70 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 66 6f  routine works fo
16b80 72 20 61 6e 79 20 76 61 6c 75 65 0a 2a 2a 20 6f  r any value.** o
16b90 66 20 6e 45 71 20 69 6e 63 6c 75 64 69 6e 67 20  f nEq including 
16ba0 30 2e 20 20 49 66 20 6e 45 71 3d 3d 30 2c 20 74  0.  If nEq==0, t
16bb0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
16bc0 65 61 72 6c 79 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  early a no-op..*
16bd0 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  * The only thing
16be0 20 69 74 20 64 6f 65 73 20 69 73 20 61 6c 6c 6f   it does is allo
16bf0 63 61 74 65 20 74 68 65 20 70 4c 65 76 65 6c 2d  cate the pLevel-
16c00 3e 69 4d 65 6d 20 6d 65 6d 6f 72 79 20 63 65 6c  >iMem memory cel
16c10 6c 20 61 6e 64 0a 2a 2a 20 63 6f 6d 70 75 74 65  l and.** compute
16c20 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73 74   the affinity st
16c30 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ring..**.** The 
16c40 6e 45 78 74 72 61 52 65 67 20 70 61 72 61 6d 65  nExtraReg parame
16c50 74 65 72 20 69 73 20 30 20 6f 72 20 31 2e 20 20  ter is 0 or 1.  
16c60 49 74 20 69 73 20 30 20 69 66 20 61 6c 6c 20 57  It is 0 if all W
16c70 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73  HERE clause cons
16c80 74 72 61 69 6e 74 73 0a 2a 2a 20 61 72 65 20 3d  traints.** are =
16c90 3d 20 6f 72 20 49 4e 20 61 6e 64 20 61 72 65 20  = or IN and are 
16ca0 63 6f 76 65 72 65 64 20 62 79 20 74 68 65 20 6e  covered by the n
16cb0 45 71 2e 20 20 6e 45 78 74 72 61 52 65 67 20 69  Eq.  nExtraReg i
16cc0 73 20 31 20 69 66 20 74 68 65 72 65 20 69 73 0a  s 1 if there is.
16cd0 2a 2a 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79  ** an inequality
16ce0 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 73 75 63   constraint (suc
16cf0 68 20 61 73 20 74 68 65 20 22 63 3e 3d 35 20 41  h as the "c>=5 A
16d00 4e 44 20 63 3c 31 30 22 20 69 6e 20 74 68 65 20  ND c<10" in the 
16d10 65 78 61 6d 70 6c 65 29 20 74 68 61 74 0a 2a 2a  example) that.**
16d20 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 74 68   occurs after th
16d30 65 20 6e 45 71 20 71 75 61 6c 69 74 79 20 63 6f  e nEq quality co
16d40 6e 73 74 72 61 69 6e 74 73 2e 0a 2a 2a 0a 2a 2a  nstraints..**.**
16d50 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   This routine al
16d60 6c 6f 63 61 74 65 73 20 61 20 72 61 6e 67 65 20  locates a range 
16d70 6f 66 20 6e 45 71 2b 6e 45 78 74 72 61 52 65 67  of nEq+nExtraReg
16d80 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 6e   memory cells an
16d90 64 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65  d returns.** the
16da0 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 66 69   index of the fi
16db0 72 73 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  rst memory cell 
16dc0 69 6e 20 74 68 61 74 20 72 61 6e 67 65 2e 20 54  in that range. T
16dd0 68 65 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20  he code that.** 
16de0 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
16df0 6e 65 20 77 69 6c 6c 20 75 73 65 20 74 68 61 74  ne will use that
16e00 20 6d 65 6d 6f 72 79 20 72 61 6e 67 65 20 74 6f   memory range to
16e10 20 73 74 6f 72 65 20 6b 65 79 73 20 66 6f 72 0a   store keys for.
16e20 2a 2a 20 73 74 61 72 74 20 61 6e 64 20 74 65 72  ** start and ter
16e30 6d 69 6e 61 74 69 6f 6e 20 63 6f 6e 64 69 74 69  mination conditi
16e40 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  ons of the loop.
16e50 0a 2a 2a 20 6b 65 79 20 76 61 6c 75 65 20 6f 66  .** key value of
16e60 20 74 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20 6f   the loop.  If o
16e70 6e 65 20 6f 72 20 6d 6f 72 65 20 49 4e 20 6f 70  ne or more IN op
16e80 65 72 61 74 6f 72 73 20 61 70 70 65 61 72 2c 20  erators appear, 
16e90 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75  then.** this rou
16ea0 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61  tine allocates a
16eb0 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 45 71  n additional nEq
16ec0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f   memory cells fo
16ed0 72 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75 73  r internal.** us
16ee0 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20  e..**.** Before 
16ef0 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 41 66  returning, *pzAf
16f00 66 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  f is set to poin
16f10 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  t to a buffer co
16f20 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 63 6f  ntaining a.** co
16f30 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  py of the column
16f40 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   affinity string
16f50 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6c   of the index al
16f60 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 0a 2a 2a  located using.**
16f70 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
16f80 28 29 2e 20 45 78 63 65 70 74 2c 20 65 6e 74 72  (). Except, entr
16f90 69 65 73 20 69 6e 20 74 68 65 20 63 6f 70 79 20  ies in the copy 
16fa0 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20 61 73  of the string as
16fb0 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68  sociated.** with
16fc0 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
16fd0 61 69 6e 74 73 20 74 68 61 74 20 75 73 65 20 4e  aints that use N
16fe0 4f 4e 45 20 61 66 66 69 6e 69 74 79 20 61 72 65  ONE affinity are
16ff0 20 73 65 74 20 74 6f 0a 2a 2a 20 53 51 4c 49 54   set to.** SQLIT
17000 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 54 68 69 73  E_AFF_NONE. This
17010 20 69 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68   is to deal with
17020 20 53 51 4c 20 73 75 63 68 20 61 73 20 74 68 65   SQL such as the
17030 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
17040 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  *   CREATE TABLE
17050 20 74 31 28 61 20 54 45 58 54 20 50 52 49 4d 41   t1(a TEXT PRIMA
17060 52 59 20 4b 45 59 2c 20 62 29 3b 0a 2a 2a 20 20  RY KEY, b);.**  
17070 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d   SELECT ... FROM
17080 20 74 31 20 41 53 20 74 32 2c 20 74 31 20 57 48   t1 AS t2, t1 WH
17090 45 52 45 20 74 31 2e 61 20 3d 20 74 32 2e 62 3b  ERE t1.a = t2.b;
170a0 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78  .**.** In the ex
170b0 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74 68 65  ample above, the
170c0 20 69 6e 64 65 78 20 6f 6e 20 74 31 28 61 29 20   index on t1(a) 
170d0 68 61 73 20 54 45 58 54 20 61 66 66 69 6e 69 74  has TEXT affinit
170e0 79 2e 20 42 75 74 20 73 69 6e 63 65 0a 2a 2a 20  y. But since.** 
170f0 74 68 65 20 72 69 67 68 74 20 68 61 6e 64 20 73  the right hand s
17100 69 64 65 20 6f 66 20 74 68 65 20 65 71 75 61 6c  ide of the equal
17110 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 28  ity constraint (
17120 74 32 2e 62 29 20 68 61 73 20 4e 4f 4e 45 20 61  t2.b) has NONE a
17130 66 66 69 6e 69 74 79 2c 0a 2a 2a 20 6e 6f 20 63  ffinity,.** no c
17140 6f 6e 76 65 72 73 69 6f 6e 20 73 68 6f 75 6c 64  onversion should
17150 20 62 65 20 61 74 74 65 6d 70 74 65 64 20 62 65   be attempted be
17160 66 6f 72 65 20 75 73 69 6e 67 20 61 20 74 32 2e  fore using a t2.
17170 62 20 76 61 6c 75 65 20 61 73 20 70 61 72 74 20  b value as part 
17180 6f 66 0a 2a 2a 20 61 20 6b 65 79 20 74 6f 20 73  of.** a key to s
17190 65 61 72 63 68 20 74 68 65 20 69 6e 64 65 78 2e  earch the index.
171a0 20 48 65 6e 63 65 20 74 68 65 20 66 69 72 73 74   Hence the first
171b0 20 62 79 74 65 20 69 6e 20 74 68 65 20 72 65 74   byte in the ret
171c0 75 72 6e 65 64 20 61 66 66 69 6e 69 74 79 0a 2a  urned affinity.*
171d0 2a 20 73 74 72 69 6e 67 20 69 6e 20 74 68 69 73  * string in this
171e0 20 65 78 61 6d 70 6c 65 20 77 6f 75 6c 64 20 62   example would b
171f0 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  e set to SQLITE_
17200 41 46 46 5f 4e 4f 4e 45 2e 0a 2a 2f 0a 73 74 61  AFF_NONE..*/.sta
17210 74 69 63 20 69 6e 74 20 63 6f 64 65 41 6c 6c 45  tic int codeAllE
17220 71 75 61 6c 69 74 79 54 65 72 6d 73 28 0a 20 20  qualityTerms(.  
17230 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
17240 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
17250 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
17260 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
17270 2c 20 20 20 2f 2a 20 57 68 69 63 68 20 6e 65 73  ,   /* Which nes
17280 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20  ted loop of the 
17290 46 52 4f 4d 20 77 65 20 61 72 65 20 63 6f 64 69  FROM we are codi
172a0 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76  ng */.  int bRev
172b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
172c0 20 52 65 76 65 72 73 65 20 74 68 65 20 6f 72 64   Reverse the ord
172d0 65 72 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f  er of IN operato
172e0 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  rs */.  int nExt
172f0 72 61 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a  raReg,        /*
17300 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61   Number of extra
17310 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c   registers to al
17320 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68 61 72  locate */.  char
17330 20 2a 2a 70 7a 41 66 66 20 20 20 20 20 20 20 20   **pzAff        
17340 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 74 6f    /* OUT: Set to
17350 20 70 6f 69 6e 74 20 74 6f 20 61 66 66 69 6e 69   point to affini
17360 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a  ty string */.){.
17370 20 20 75 31 36 20 6e 45 71 3b 20 20 20 20 20 20    u16 nEq;      
17380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17390 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
173a0 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72   == or IN constr
173b0 61 69 6e 74 73 20 74 6f 20 63 6f 64 65 20 2a 2f  aints to code */
173c0 0a 20 20 75 31 36 20 6e 53 6b 69 70 3b 20 20 20  .  u16 nSkip;   
173d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173e0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65   /* Number of le
173f0 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73 20  ft-most columns 
17400 74 6f 20 73 6b 69 70 20 2a 2f 0a 20 20 56 64 62  to skip */.  Vdb
17410 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
17420 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54 68  Vdbe;      /* Th
17430 65 20 76 6d 20 75 6e 64 65 72 20 63 6f 6e 73 74  e vm under const
17440 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64  ruction */.  Ind
17450 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
17460 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
17470 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 75 73  e index being us
17480 65 64 20 66 6f 72 20 74 68 69 73 20 6c 6f 6f 70  ed for this loop
17490 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
174a0 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  *pTerm;         
174b0 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
174c0 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 20  constraint term 
174d0 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
174e0 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  pLoop;          
174f0 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c     /* The WhereL
17500 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  oop object */.  
17510 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20  int j;          
17520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17530 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
17540 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20  .  int regBase; 
17550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17560 20 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74 65   /* Base registe
17570 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67 3b  r */.  int nReg;
17580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17590 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
175a0 66 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 61  f registers to a
175b0 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68 61  llocate */.  cha
175c0 72 20 2a 7a 41 66 66 3b 20 20 20 20 20 20 20 20  r *zAff;        
175d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66             /* Af
175e0 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 74 6f  finity string to
175f0 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 2f 2a   return */..  /*
17600 20 54 68 69 73 20 6d 6f 64 75 6c 65 20 69 73 20   This module is 
17610 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 6f 6e 20 71  only called on q
17620 75 65 72 79 20 70 6c 61 6e 73 20 74 68 61 74 20  uery plans that 
17630 75 73 65 20 61 6e 20 69 6e 64 65 78 2e 20 2a 2f  use an index. */
17640 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65  .  pLoop = pLeve
17650 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 61 73 73  l->pWLoop;.  ass
17660 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46  ert( (pLoop->wsF
17670 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
17680 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b  TUALTABLE)==0 );
17690 0a 20 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e  .  nEq = pLoop->
176a0 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 6e  u.btree.nEq;.  n
176b0 53 6b 69 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e  Skip = pLoop->u.
176c0 62 74 72 65 65 2e 6e 53 6b 69 70 3b 0a 20 20 70  btree.nSkip;.  p
176d0 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  Idx = pLoop->u.b
176e0 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 61  tree.pIndex;.  a
176f0 73 73 65 72 74 28 20 70 49 64 78 21 3d 30 20 29  ssert( pIdx!=0 )
17700 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  ;..  /* Figure o
17710 75 74 20 68 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f  ut how many memo
17720 72 79 20 63 65 6c 6c 73 20 77 65 20 77 69 6c 6c  ry cells we will
17730 20 6e 65 65 64 20 74 68 65 6e 20 61 6c 6c 6f 63   need then alloc
17740 61 74 65 20 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20  ate them..  */. 
17750 20 72 65 67 42 61 73 65 20 3d 20 70 50 61 72 73   regBase = pPars
17760 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 6e  e->nMem + 1;.  n
17770 52 65 67 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  Reg = pLoop->u.b
17780 74 72 65 65 2e 6e 45 71 20 2b 20 6e 45 78 74 72  tree.nEq + nExtr
17790 61 52 65 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e  aReg;.  pParse->
177a0 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 0a 20  nMem += nReg;.. 
177b0 20 7a 41 66 66 20 3d 20 73 71 6c 69 74 65 33 44   zAff = sqlite3D
177c0 62 53 74 72 44 75 70 28 70 50 61 72 73 65 2d 3e  bStrDup(pParse->
177d0 64 62 2c 20 73 71 6c 69 74 65 33 49 6e 64 65 78  db, sqlite3Index
177e0 41 66 66 69 6e 69 74 79 53 74 72 28 76 2c 20 70  AffinityStr(v, p
177f0 49 64 78 29 29 3b 0a 20 20 69 66 28 20 21 7a 41  Idx));.  if( !zA
17800 66 66 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  ff ){.    pParse
17810 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
17820 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 69  ed = 1;.  }..  i
17830 66 28 20 6e 53 6b 69 70 20 29 7b 0a 20 20 20 20  f( nSkip ){.    
17840 69 6e 74 20 69 49 64 78 43 75 72 20 3d 20 70 4c  int iIdxCur = pL
17850 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20  evel->iIdxCur;. 
17860 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17870 64 4f 70 31 28 76 2c 20 28 62 52 65 76 3f 4f 50  dOp1(v, (bRev?OP
17880 5f 4c 61 73 74 3a 4f 50 5f 52 65 77 69 6e 64 29  _Last:OP_Rewind)
17890 2c 20 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20  , iIdxCur);.    
178a0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
178b0 2c 20 62 52 65 76 3d 3d 30 29 3b 0a 20 20 20 20  , bRev==0);.    
178c0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
178d0 2c 20 62 52 65 76 21 3d 30 29 3b 0a 20 20 20 20  , bRev!=0);.    
178e0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
178f0 22 62 65 67 69 6e 20 73 6b 69 70 2d 73 63 61 6e  "begin skip-scan
17900 20 6f 6e 20 25 73 22 2c 20 70 49 64 78 2d 3e 7a   on %s", pIdx->z
17910 4e 61 6d 65 29 29 3b 0a 20 20 20 20 6a 20 3d 20  Name));.    j = 
17920 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17930 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20  0(v, OP_Goto);. 
17940 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53     pLevel->addrS
17950 6b 69 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  kip = sqlite3Vdb
17960 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 28 62  eAddOp4Int(v, (b
17970 52 65 76 3f 4f 50 5f 53 65 65 6b 4c 54 3a 4f 50  Rev?OP_SeekLT:OP
17980 5f 53 65 65 6b 47 54 29 2c 0a 20 20 20 20 20 20  _SeekGT),.      
17990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179a0 20 20 20 20 20 20 69 49 64 78 43 75 72 2c 20 30        iIdxCur, 0
179b0 2c 20 72 65 67 42 61 73 65 2c 20 6e 53 6b 69 70  , regBase, nSkip
179c0 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
179d0 61 67 65 49 66 28 76 2c 20 62 52 65 76 3d 3d 30  ageIf(v, bRev==0
179e0 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
179f0 61 67 65 49 66 28 76 2c 20 62 52 65 76 21 3d 30  ageIf(v, bRev!=0
17a00 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
17a10 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 29  beJumpHere(v, j)
17a20 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
17a30 3c 6e 53 6b 69 70 3b 20 6a 2b 2b 29 7b 0a 20 20  <nSkip; j++){.  
17a40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17a50 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
17a60 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20 6a 2c 20  mn, iIdxCur, j, 
17a70 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20  regBase+j);.    
17a80 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
17a90 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3e 3d 30 20 29  aiColumn[j]>=0 )
17aa0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
17ab0 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49  ent((v, "%s", pI
17ac0 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  dx->pTable->aCol
17ad0 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  [pIdx->aiColumn[
17ae0 6a 5d 5d 2e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  j]].zName));.   
17af0 20 7d 0a 20 20 7d 20 20 20 20 0a 0a 20 20 2f 2a   }.  }    ..  /*
17b00 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 65 71   Evaluate the eq
17b10 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
17b20 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ts.  */.  assert
17b30 28 20 7a 41 66 66 3d 3d 30 20 7c 7c 20 28 69 6e  ( zAff==0 || (in
17b40 74 29 73 74 72 6c 65 6e 28 7a 41 66 66 29 3e 3d  t)strlen(zAff)>=
17b50 6e 45 71 20 29 3b 0a 20 20 66 6f 72 28 6a 3d 6e  nEq );.  for(j=n
17b60 53 6b 69 70 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b  Skip; j<nEq; j++
17b70 29 7b 0a 20 20 20 20 69 6e 74 20 72 31 3b 0a 20  ){.    int r1;. 
17b80 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70     pTerm = pLoop
17b90 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20  ->aLTerm[j];.   
17ba0 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d   assert( pTerm!=
17bb0 30 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20  0 );.    /* The 
17bc0 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 63 61  following testca
17bd0 73 65 20 69 73 20 74 72 75 65 20 66 6f 72 20 69  se is true for i
17be0 6e 64 69 63 65 73 20 77 69 74 68 20 72 65 64 75  ndices with redu
17bf0 6e 64 61 6e 74 20 63 6f 6c 75 6d 6e 73 2e 20 0a  ndant columns. .
17c00 20 20 20 20 2a 2a 20 45 78 3a 20 43 52 45 41 54      ** Ex: CREAT
17c10 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31  E INDEX i1 ON t1
17c20 28 61 2c 62 2c 61 29 3b 20 53 45 4c 45 43 54 20  (a,b,a); SELECT 
17c30 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
17c40 61 3d 30 20 41 4e 44 20 62 3d 30 3b 20 2a 2f 0a  a=0 AND b=0; */.
17c50 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
17c60 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
17c70 54 45 52 4d 5f 43 4f 44 45 44 29 21 3d 30 20 29  TERM_CODED)!=0 )
17c80 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
17c90 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
17ca0 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
17cb0 0a 20 20 20 20 72 31 20 3d 20 63 6f 64 65 45 71  .    r1 = codeEq
17cc0 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73  ualityTerm(pPars
17cd0 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c  e, pTerm, pLevel
17ce0 2c 20 6a 2c 20 62 52 65 76 2c 20 72 65 67 42 61  , j, bRev, regBa
17cf0 73 65 2b 6a 29 3b 0a 20 20 20 20 69 66 28 20 72  se+j);.    if( r
17d00 31 21 3d 72 65 67 42 61 73 65 2b 6a 20 29 7b 0a  1!=regBase+j ){.
17d10 20 20 20 20 20 20 69 66 28 20 6e 52 65 67 3d 3d        if( nReg==
17d20 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
17d30 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
17d40 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 42 61  eg(pParse, regBa
17d50 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 67  se);.        reg
17d60 42 61 73 65 20 3d 20 72 31 3b 0a 20 20 20 20 20  Base = r1;.     
17d70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
17d80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17d90 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72  2(v, OP_SCopy, r
17da0 31 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20  1, regBase+j);. 
17db0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
17dc0 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
17dd0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
17de0 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74  _ISNULL );.    t
17df0 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
17e00 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
17e10 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54  N );.    if( (pT
17e20 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
17e30 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49   (WO_ISNULL|WO_I
17e40 4e 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  N))==0 ){.      
17e50 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70  Expr *pRight = p
17e60 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
17e70 67 68 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73  ght;.      if( s
17e80 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e  qlite3ExprCanBeN
17e90 75 6c 6c 28 70 52 69 67 68 74 29 20 29 7b 0a 20  ull(pRight) ){. 
17ea0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
17eb0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
17ec0 73 4e 75 6c 6c 2c 20 72 65 67 42 61 73 65 2b 6a  sNull, regBase+j
17ed0 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72  , pLevel->addrBr
17ee0 6b 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  k);.        Vdbe
17ef0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
17f00 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a     }.      if( z
17f10 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Aff ){.        i
17f20 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72  f( sqlite3Compar
17f30 65 41 66 66 69 6e 69 74 79 28 70 52 69 67 68 74  eAffinity(pRight
17f40 2c 20 7a 41 66 66 5b 6a 5d 29 3d 3d 53 51 4c 49  , zAff[j])==SQLI
17f50 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20  TE_AFF_NONE ){. 
17f60 20 20 20 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d           zAff[j]
17f70 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
17f80 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  NE;.        }.  
17f90 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
17fa0 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69  3ExprNeedsNoAffi
17fb0 6e 69 74 79 43 68 61 6e 67 65 28 70 52 69 67 68  nityChange(pRigh
17fc0 74 2c 20 7a 41 66 66 5b 6a 5d 29 20 29 7b 0a 20  t, zAff[j]) ){. 
17fd0 20 20 20 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d           zAff[j]
17fe0 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
17ff0 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  NE;.        }.  
18000 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
18010 20 20 2a 70 7a 41 66 66 20 3d 20 7a 41 66 66 3b    *pzAff = zAff;
18020 0a 20 20 72 65 74 75 72 6e 20 72 65 67 42 61 73  .  return regBas
18030 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  e;.}..#ifndef SQ
18040 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
18050 4e 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  N./*.** This rou
18060 74 69 6e 65 20 69 73 20 61 20 68 65 6c 70 65 72  tine is a helper
18070 20 66 6f 72 20 65 78 70 6c 61 69 6e 49 6e 64 65   for explainInde
18080 78 52 61 6e 67 65 28 29 20 62 65 6c 6f 77 0a 2a  xRange() below.*
18090 2a 0a 2a 2a 20 70 53 74 72 20 68 6f 6c 64 73 20  *.** pStr holds 
180a0 74 68 65 20 74 65 78 74 20 6f 66 20 61 6e 20 65  the text of an e
180b0 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 77  xpression that w
180c0 65 20 61 72 65 20 62 75 69 6c 64 69 6e 67 20 75  e are building u
180d0 70 20 6f 6e 65 20 74 65 72 6d 0a 2a 2a 20 61 74  p one term.** at
180e0 20 61 20 74 69 6d 65 2e 20 20 54 68 69 73 20 72   a time.  This r
180f0 6f 75 74 69 6e 65 20 61 64 64 73 20 61 20 6e 65  outine adds a ne
18100 77 20 74 65 72 6d 20 74 6f 20 74 68 65 20 65 6e  w term to the en
18110 64 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  d of the express
18120 69 6f 6e 2e 0a 2a 2a 20 54 65 72 6d 73 20 61 72  ion..** Terms ar
18130 65 20 73 65 70 61 72 61 74 65 64 20 62 79 20 41  e separated by A
18140 4e 44 20 73 6f 20 61 64 64 20 74 68 65 20 22 41  ND so add the "A
18150 4e 44 22 20 74 65 78 74 20 66 6f 72 20 73 65 63  ND" text for sec
18160 6f 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75 65  ond and subseque
18170 6e 74 0a 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c 79  nt.** terms only
18180 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
18190 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65   explainAppendTe
181a0 72 6d 28 0a 20 20 53 74 72 41 63 63 75 6d 20 2a  rm(.  StrAccum *
181b0 70 53 74 72 2c 20 20 20 20 20 20 20 20 20 20 20  pStr,           
181c0 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20 65 78    /* The text ex
181d0 70 72 65 73 73 69 6f 6e 20 62 65 69 6e 67 20 62  pression being b
181e0 75 69 6c 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54  uilt */.  int iT
181f0 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  erm,            
18200 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
18210 66 20 74 68 69 73 20 74 65 72 6d 2e 20 20 46 69  f this term.  Fi
18220 72 73 74 20 69 73 20 7a 65 72 6f 20 2a 2f 0a 20  rst is zero */. 
18230 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
18240 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20  lumn,        /* 
18250 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75  Name of the colu
18260 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  mn */.  const ch
18270 61 72 20 2a 7a 4f 70 20 20 20 20 20 20 20 20 20  ar *zOp         
18280 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
18290 68 65 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 29  he operator */.)
182a0 7b 0a 20 20 69 66 28 20 69 54 65 72 6d 20 29 20  {.  if( iTerm ) 
182b0 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
182c0 70 70 65 6e 64 28 70 53 74 72 2c 20 22 20 41 4e  ppend(pStr, " AN
182d0 44 20 22 2c 20 35 29 3b 0a 20 20 73 71 6c 69 74  D ", 5);.  sqlit
182e0 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
182f0 41 6c 6c 28 70 53 74 72 2c 20 7a 43 6f 6c 75 6d  All(pStr, zColum
18300 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72  n);.  sqlite3Str
18310 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72  AccumAppend(pStr
18320 2c 20 7a 4f 70 2c 20 31 29 3b 0a 20 20 73 71 6c  , zOp, 1);.  sql
18330 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
18340 6e 64 28 70 53 74 72 2c 20 22 3f 22 2c 20 31 29  nd(pStr, "?", 1)
18350 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d  ;.}../*.** Argum
18360 65 6e 74 20 70 4c 65 76 65 6c 20 64 65 73 63 72  ent pLevel descr
18370 69 62 65 73 20 61 20 73 74 72 61 74 65 67 79 20  ibes a strategy 
18380 66 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 61 62  for scanning tab
18390 6c 65 20 70 54 61 62 2e 20 54 68 69 73 20 0a 2a  le pTab. This .*
183a0 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  * function retur
183b0 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
183c0 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20  a string buffer 
183d0 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 64 65 73  containing a des
183e0 63 72 69 70 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74  cription.** of t
183f0 68 65 20 73 75 62 73 65 74 20 6f 66 20 74 61 62  he subset of tab
18400 6c 65 20 72 6f 77 73 20 73 63 61 6e 6e 65 64 20  le rows scanned 
18410 62 79 20 74 68 65 20 73 74 72 61 74 65 67 79 20  by the strategy 
18420 69 6e 20 74 68 65 20 66 6f 72 6d 20 6f 66 20 61  in the form of a
18430 6e 0a 2a 2a 20 53 51 4c 20 65 78 70 72 65 73 73  n.** SQL express
18440 69 6f 6e 2e 20 4f 72 2c 20 69 66 20 61 6c 6c 20  ion. Or, if all 
18450 72 6f 77 73 20 61 72 65 20 73 63 61 6e 6e 65 64  rows are scanned
18460 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  , NULL is return
18470 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78  ed..**.** For ex
18480 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 71 75  ample, if the qu
18490 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c  ery:.**.**   SEL
184a0 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
184b0 45 52 45 20 61 3d 31 20 41 4e 44 20 62 3e 32 3b  ERE a=1 AND b>2;
184c0 0a 2a 2a 0a 2a 2a 20 69 73 20 72 75 6e 20 61 6e  .**.** is run an
184d0 64 20 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e  d there is an in
184e0 64 65 78 20 6f 6e 20 28 61 2c 20 62 29 2c 20 74  dex on (a, b), t
184f0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
18500 6e 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20 73  n returns a.** s
18510 74 72 69 6e 67 20 73 69 6d 69 6c 61 72 20 74 6f  tring similar to
18520 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 61 3d 3f 20 41  :.**.**   "a=? A
18530 4e 44 20 62 3e 3f 22 0a 2a 2a 0a 2a 2a 20 54 68  ND b>?".**.** Th
18540 65 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74  e returned point
18550 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 6d 65 6d  er points to mem
18560 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
18570 6d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  m sqlite3DbMallo
18580 63 28 29 2e 0a 2a 2a 20 49 74 20 69 73 20 74 68  c()..** It is th
18590 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
185a0 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
185b0 6f 20 66 72 65 65 20 74 68 65 20 62 75 66 66 65  o free the buffe
185c0 72 20 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20  r when it is.** 
185d0 6e 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72  no longer requir
185e0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ed..*/.static ch
185f0 61 72 20 2a 65 78 70 6c 61 69 6e 49 6e 64 65 78  ar *explainIndex
18600 52 61 6e 67 65 28 73 71 6c 69 74 65 33 20 2a 64  Range(sqlite3 *d
18610 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  b, WhereLoop *pL
18620 6f 6f 70 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  oop, Table *pTab
18630 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  ){.  Index *pInd
18640 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  ex = pLoop->u.bt
18650 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 75 31  ree.pIndex;.  u1
18660 36 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75  6 nEq = pLoop->u
18670 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 75 31  .btree.nEq;.  u1
18680 36 20 6e 53 6b 69 70 20 3d 20 70 4c 6f 6f 70 2d  6 nSkip = pLoop-
18690 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70 3b 0a  >u.btree.nSkip;.
186a0 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 43 6f    int i, j;.  Co
186b0 6c 75 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70 54 61  lumn *aCol = pTa
186c0 62 2d 3e 61 43 6f 6c 3b 0a 20 20 69 31 36 20 2a  b->aCol;.  i16 *
186d0 61 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65  aiColumn = pInde
186e0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 3b 0a 20 20 53  x->aiColumn;.  S
186f0 74 72 41 63 63 75 6d 20 74 78 74 3b 0a 0a 20 20  trAccum txt;..  
18700 69 66 28 20 6e 45 71 3d 3d 30 20 26 26 20 28 70  if( nEq==0 && (p
18710 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
18720 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54  (WHERE_BTM_LIMIT
18730 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54  |WHERE_TOP_LIMIT
18740 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ))==0 ){.    ret
18750 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  urn 0;.  }.  sql
18760 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74  ite3StrAccumInit
18770 28 26 74 78 74 2c 20 30 2c 20 30 2c 20 53 51 4c  (&txt, 0, 0, SQL
18780 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 29 3b  ITE_MAX_LENGTH);
18790 0a 20 20 74 78 74 2e 64 62 20 3d 20 64 62 3b 0a  .  txt.db = db;.
187a0 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
187b0 6d 41 70 70 65 6e 64 28 26 74 78 74 2c 20 22 20  mAppend(&txt, " 
187c0 28 22 2c 20 32 29 3b 0a 20 20 66 6f 72 28 69 3d  (", 2);.  for(i=
187d0 30 3b 20 69 3c 6e 45 71 3b 20 69 2b 2b 29 7b 0a  0; i<nEq; i++){.
187e0 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 69      char *z = ai
187f0 43 6f 6c 75 6d 6e 5b 69 5d 20 3c 20 30 20 3f 20  Column[i] < 0 ? 
18800 22 72 6f 77 69 64 22 20 3a 20 61 43 6f 6c 5b 61  "rowid" : aCol[a
18810 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 7a 4e 61 6d  iColumn[i]].zNam
18820 65 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d 6e 53  e;.    if( i>=nS
18830 6b 69 70 20 29 7b 0a 20 20 20 20 20 20 65 78 70  kip ){.      exp
18840 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 26  lainAppendTerm(&
18850 74 78 74 2c 20 69 2c 20 7a 2c 20 22 3d 22 29 3b  txt, i, z, "=");
18860 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
18870 20 20 69 66 28 20 69 20 29 20 73 71 6c 69 74 65    if( i ) sqlite
18880 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28  3StrAccumAppend(
18890 26 74 78 74 2c 20 22 20 41 4e 44 20 22 2c 20 35  &txt, " AND ", 5
188a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
188b0 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26  StrAccumAppend(&
188c0 74 78 74 2c 20 22 41 4e 59 28 22 2c 20 34 29 3b  txt, "ANY(", 4);
188d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74  .      sqlite3St
188e0 72 41 63 63 75 6d 41 70 70 65 6e 64 41 6c 6c 28  rAccumAppendAll(
188f0 26 74 78 74 2c 20 7a 29 3b 0a 20 20 20 20 20 20  &txt, z);.      
18900 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
18910 70 70 65 6e 64 28 26 74 78 74 2c 20 22 29 22 2c  ppend(&txt, ")",
18920 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   1);.    }.  }..
18930 20 20 6a 20 3d 20 69 3b 0a 20 20 69 66 28 20 70    j = i;.  if( p
18940 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57 48  Loop->wsFlags&WH
18950 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b  ERE_BTM_LIMIT ){
18960 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61  .    char *z = a
18970 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3c 20 30 20 3f  iColumn[j] < 0 ?
18980 20 22 72 6f 77 69 64 22 20 3a 20 61 43 6f 6c 5b   "rowid" : aCol[
18990 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61  aiColumn[j]].zNa
189a0 6d 65 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 41  me;.    explainA
189b0 70 70 65 6e 64 54 65 72 6d 28 26 74 78 74 2c 20  ppendTerm(&txt, 
189c0 69 2b 2b 2c 20 7a 2c 20 22 3e 22 29 3b 0a 20 20  i++, z, ">");.  
189d0 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77  }.  if( pLoop->w
189e0 73 46 6c 61 67 73 26 57 48 45 52 45 5f 54 4f 50  sFlags&WHERE_TOP
189f0 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 63 68  _LIMIT ){.    ch
18a00 61 72 20 2a 7a 20 3d 20 61 69 43 6f 6c 75 6d 6e  ar *z = aiColumn
18a10 5b 6a 5d 20 3c 20 30 20 3f 20 22 72 6f 77 69 64  [j] < 0 ? "rowid
18a20 22 20 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d  " : aCol[aiColum
18a30 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  n[j]].zName;.   
18a40 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65   explainAppendTe
18a50 72 6d 28 26 74 78 74 2c 20 69 2c 20 7a 2c 20 22  rm(&txt, i, z, "
18a60 3c 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  <");.  }.  sqlit
18a70 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
18a80 28 26 74 78 74 2c 20 22 29 22 2c 20 31 29 3b 0a  (&txt, ")", 1);.
18a90 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
18aa0 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26  StrAccumFinish(&
18ab0 74 78 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  txt);.}../*.** T
18ac0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
18ad0 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 63  a no-op unless c
18ae0 75 72 72 65 6e 74 6c 79 20 70 72 6f 63 65 73 73  urrently process
18af0 69 6e 67 20 61 6e 20 45 58 50 4c 41 49 4e 20 51  ing an EXPLAIN Q
18b00 55 45 52 59 20 50 4c 41 4e 0a 2a 2a 20 63 6f 6d  UERY PLAN.** com
18b10 6d 61 6e 64 2e 20 49 66 20 74 68 65 20 71 75 65  mand. If the que
18b20 72 79 20 62 65 69 6e 67 20 63 6f 6d 70 69 6c 65  ry being compile
18b30 64 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 20  d is an EXPLAIN 
18b40 51 55 45 52 59 20 50 4c 41 4e 2c 20 61 20 73 69  QUERY PLAN, a si
18b50 6e 67 6c 65 0a 2a 2a 20 72 65 63 6f 72 64 20 69  ngle.** record i
18b60 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6f  s added to the o
18b70 75 74 70 75 74 20 74 6f 20 64 65 73 63 72 69 62  utput to describ
18b80 65 20 74 68 65 20 74 61 62 6c 65 20 73 63 61 6e  e the table scan
18b90 20 73 74 72 61 74 65 67 79 20 69 6e 20 0a 2a 2a   strategy in .**
18ba0 20 70 4c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74   pLevel..*/.stat
18bb0 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 4f  ic void explainO
18bc0 6e 65 53 63 61 6e 28 0a 20 20 50 61 72 73 65 20  neScan(.  Parse 
18bd0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
18be0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
18bf0 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  se context */.  
18c00 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
18c10 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
18c20 2f 2a 20 54 61 62 6c 65 20 6c 69 73 74 20 74 68  /* Table list th
18c30 69 73 20 6c 6f 6f 70 20 72 65 66 65 72 73 20 74  is loop refers t
18c40 6f 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65  o */.  WhereLeve
18c50 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20 20 20 20  l *pLevel,      
18c60 20 20 20 20 20 20 20 2f 2a 20 53 63 61 6e 20 74         /* Scan t
18c70 6f 20 77 72 69 74 65 20 4f 50 5f 45 78 70 6c 61  o write OP_Expla
18c80 69 6e 20 6f 70 63 6f 64 65 20 66 6f 72 20 2a 2f  in opcode for */
18c90 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20  .  int iLevel,  
18ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18cb0 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20     /* Value for 
18cc0 22 6c 65 76 65 6c 22 20 63 6f 6c 75 6d 6e 20 6f  "level" column o
18cd0 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e  f output */.  in
18ce0 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20  t iFrom,        
18cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18d00 20 56 61 6c 75 65 20 66 6f 72 20 22 66 72 6f 6d   Value for "from
18d10 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74 70  " column of outp
18d20 75 74 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72  ut */.  u16 wctr
18d30 6c 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  lFlags          
18d40 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
18d50 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74   passed to sqlit
18d60 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a  e3WhereBegin() *
18d70 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  /.){.#ifndef SQL
18d80 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20  ITE_DEBUG.  if( 
18d90 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d  pParse->explain=
18da0 3d 32 20 29 0a 23 65 6e 64 69 66 0a 20 20 7b 0a  =2 ).#endif.  {.
18db0 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
18dc0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
18dd0 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c   &pTabList->a[pL
18de0 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
18df0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
18e00 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20  se->pVdbe;      
18e10 2f 2a 20 56 4d 20 62 65 69 6e 67 20 63 6f 6e 73  /* VM being cons
18e20 74 72 75 63 74 65 64 20 2a 2f 0a 20 20 20 20 73  tructed */.    s
18e30 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
18e40 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 2f 2a 20  rse->db;     /* 
18e50 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  Database handle 
18e60 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73  */.    char *zMs
18e70 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
18e80 20 20 20 20 20 2f 2a 20 54 65 78 74 20 74 6f 20       /* Text to 
18e90 61 64 64 20 74 6f 20 45 51 50 20 6f 75 74 70 75  add to EQP outpu
18ea0 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64  t */.    int iId
18eb0 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65   = pParse->iSele
18ec0 63 74 49 64 3b 20 20 2f 2a 20 53 65 6c 65 63 74  ctId;  /* Select
18ed0 20 69 64 20 28 6c 65 66 74 2d 6d 6f 73 74 20 6f   id (left-most o
18ee0 75 74 70 75 74 20 63 6f 6c 75 6d 6e 29 20 2a 2f  utput column) */
18ef0 0a 20 20 20 20 69 6e 74 20 69 73 53 65 61 72 63  .    int isSearc
18f00 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
18f10 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
18f20 20 53 45 41 52 43 48 2e 20 46 61 6c 73 65 20 66   SEARCH. False f
18f30 6f 72 20 53 43 41 4e 2e 20 2a 2f 0a 20 20 20 20  or SCAN. */.    
18f40 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
18f50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
18f60 20 54 68 65 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67   The controlling
18f70 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
18f80 74 20 2a 2f 0a 20 20 20 20 75 33 32 20 66 6c 61  t */.    u32 fla
18f90 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
18fa0 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
18fb0 74 68 61 74 20 64 65 73 63 72 69 62 65 20 74 68  that describe th
18fc0 69 73 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20  is loop */..    
18fd0 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e  pLoop = pLevel->
18fe0 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 66 6c 61 67  pWLoop;.    flag
18ff0 73 20 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  s = pLoop->wsFla
19000 67 73 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61  gs;.    if( (fla
19010 67 73 26 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f  gs&WHERE_MULTI_O
19020 52 29 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67  R) || (wctrlFlag
19030 73 26 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  s&WHERE_ONETABLE
19040 5f 4f 4e 4c 59 29 20 29 20 72 65 74 75 72 6e 3b  _ONLY) ) return;
19050 0a 0a 20 20 20 20 69 73 53 65 61 72 63 68 20 3d  ..    isSearch =
19060 20 28 66 6c 61 67 73 26 28 57 48 45 52 45 5f 42   (flags&(WHERE_B
19070 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54  TM_LIMIT|WHERE_T
19080 4f 50 5f 4c 49 4d 49 54 29 29 21 3d 30 0a 20 20  OP_LIMIT))!=0.  
19090 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 66            || ((f
190a0 6c 61 67 73 26 57 48 45 52 45 5f 56 49 52 54 55  lags&WHERE_VIRTU
190b0 41 4c 54 41 42 4c 45 29 3d 3d 30 20 26 26 20 28  ALTABLE)==0 && (
190c0 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
190d0 45 71 3e 30 29 29 0a 20 20 20 20 20 20 20 20 20  Eq>0)).         
190e0 20 20 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67     || (wctrlFlag
190f0 73 26 28 57 48 45 52 45 5f 4f 52 44 45 52 42 59  s&(WHERE_ORDERBY
19100 5f 4d 49 4e 7c 57 48 45 52 45 5f 4f 52 44 45 52  _MIN|WHERE_ORDER
19110 42 59 5f 4d 41 58 29 29 3b 0a 0a 20 20 20 20 7a  BY_MAX));..    z
19120 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
19130 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20 69  intf(db, "%s", i
19140 73 53 65 61 72 63 68 3f 22 53 45 41 52 43 48 22  sSearch?"SEARCH"
19150 3a 22 53 43 41 4e 22 29 3b 0a 20 20 20 20 69 66  :"SCAN");.    if
19160 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  ( pItem->pSelect
19170 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d   ){.      zMsg =
19180 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
19190 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 53  (db, zMsg, "%s S
191a0 55 42 51 55 45 52 59 20 25 64 22 2c 20 7a 4d 73  UBQUERY %d", zMs
191b0 67 2c 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74  g,pItem->iSelect
191c0 49 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Id);.    }else{.
191d0 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
191e0 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
191f0 20 7a 4d 73 67 2c 20 22 25 73 20 54 41 42 4c 45   zMsg, "%s TABLE
19200 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49 74 65   %s", zMsg, pIte
19210 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  m->zName);.    }
19220 0a 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  ..    if( pItem-
19230 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20  >zAlias ){.     
19240 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
19250 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
19260 2c 20 22 25 73 20 41 53 20 25 73 22 2c 20 7a 4d  , "%s AS %s", zM
19270 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  sg, pItem->zAlia
19280 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  s);.    }.    if
19290 28 20 28 66 6c 61 67 73 20 26 20 28 57 48 45 52  ( (flags & (WHER
192a0 45 5f 49 50 4b 7c 57 48 45 52 45 5f 56 49 52 54  E_IPK|WHERE_VIRT
192b0 55 41 4c 54 41 42 4c 45 29 29 3d 3d 30 0a 20 20  UALTABLE))==0.  
192c0 20 20 20 26 26 20 41 4c 57 41 59 53 28 70 4c 6f     && ALWAYS(pLo
192d0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
192e0 65 78 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20  ex!=0).    ){.  
192f0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
19300 7a 46 6d 74 3b 0a 20 20 20 20 20 20 49 6e 64 65  zFmt;.      Inde
19310 78 20 2a 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d  x *pIdx = pLoop-
19320 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
19330 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 57 68  .      char *zWh
19340 65 72 65 20 3d 20 65 78 70 6c 61 69 6e 49 6e 64  ere = explainInd
19350 65 78 52 61 6e 67 65 28 64 62 2c 20 70 4c 6f 6f  exRange(db, pLoo
19360 70 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b  p, pItem->pTab);
19370 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
19380 28 66 6c 61 67 73 26 57 48 45 52 45 5f 41 55 54  (flags&WHERE_AUT
19390 4f 5f 49 4e 44 45 58 29 20 7c 7c 20 28 66 6c 61  O_INDEX) || (fla
193a0 67 73 26 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  gs&WHERE_IDX_ONL
193b0 59 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Y) );.      if( 
193c0 21 48 61 73 52 6f 77 69 64 28 70 49 74 65 6d 2d  !HasRowid(pItem-
193d0 3e 70 54 61 62 29 20 26 26 20 49 73 50 72 69 6d  >pTab) && IsPrim
193e0 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78  aryKeyIndex(pIdx
193f0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 46 6d  ) ){.        zFm
19400 74 20 3d 20 7a 57 68 65 72 65 20 3f 20 22 25 73  t = zWhere ? "%s
19410 20 55 53 49 4e 47 20 50 52 49 4d 41 52 59 20 4b   USING PRIMARY K
19420 45 59 25 2e 30 73 25 73 22 20 3a 20 22 25 73 25  EY%.0s%s" : "%s%
19430 2e 30 73 25 73 22 3b 0a 20 20 20 20 20 20 7d 65  .0s%s";.      }e
19440 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20  lse if( flags & 
19450 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
19460 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 46 6d 74   ){.        zFmt
19470 20 3d 20 22 25 73 20 55 53 49 4e 47 20 41 55 54   = "%s USING AUT
19480 4f 4d 41 54 49 43 20 43 4f 56 45 52 49 4e 47 20  OMATIC COVERING 
19490 49 4e 44 45 58 25 2e 30 73 25 73 22 3b 0a 20 20  INDEX%.0s%s";.  
194a0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c      }else if( fl
194b0 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
194c0 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20  ONLY ){.        
194d0 7a 46 6d 74 20 3d 20 22 25 73 20 55 53 49 4e 47  zFmt = "%s USING
194e0 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 20   COVERING INDEX 
194f0 25 73 25 73 22 3b 0a 20 20 20 20 20 20 7d 65 6c  %s%s";.      }el
19500 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 46 6d 74  se{.        zFmt
19510 20 3d 20 22 25 73 20 55 53 49 4e 47 20 49 4e 44   = "%s USING IND
19520 45 58 20 25 73 25 73 22 3b 0a 20 20 20 20 20 20  EX %s%s";.      
19530 7d 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73  }.      zMsg = s
19540 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
19550 62 2c 20 7a 4d 73 67 2c 20 7a 46 6d 74 2c 20 7a  b, zMsg, zFmt, z
19560 4d 73 67 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  Msg, pIdx->zName
19570 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 20 20 20  , zWhere);.     
19580 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
19590 62 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 20 20  b, zWhere);.    
195a0 7d 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73  }else if( (flags
195b0 20 26 20 57 48 45 52 45 5f 49 50 4b 29 21 3d 30   & WHERE_IPK)!=0
195c0 20 26 26 20 28 66 6c 61 67 73 20 26 20 57 48 45   && (flags & WHE
195d0 52 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29 21 3d  RE_CONSTRAINT)!=
195e0 30 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20  0 ){.      zMsg 
195f0 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
19600 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
19610 55 53 49 4e 47 20 49 4e 54 45 47 45 52 20 50 52  USING INTEGER PR
19620 49 4d 41 52 59 20 4b 45 59 22 2c 20 7a 4d 73 67  IMARY KEY", zMsg
19630 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 66 6c  );..      if( fl
19640 61 67 73 26 28 57 48 45 52 45 5f 43 4f 4c 55 4d  ags&(WHERE_COLUM
19650 4e 5f 45 51 7c 57 48 45 52 45 5f 43 4f 4c 55 4d  N_EQ|WHERE_COLUM
19660 4e 5f 49 4e 29 20 29 7b 0a 20 20 20 20 20 20 20  N_IN) ){.       
19670 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
19680 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
19690 2c 20 22 25 73 20 28 72 6f 77 69 64 3d 3f 29 22  , "%s (rowid=?)"
196a0 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d  , zMsg);.      }
196b0 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 26  else if( (flags&
196c0 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54  WHERE_BOTH_LIMIT
196d0 29 3d 3d 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49  )==WHERE_BOTH_LI
196e0 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  MIT ){.        z
196f0 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
19700 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
19710 22 25 73 20 28 72 6f 77 69 64 3e 3f 20 41 4e 44  "%s (rowid>? AND
19720 20 72 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d 73 67   rowid<?)", zMsg
19730 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
19740 66 28 20 66 6c 61 67 73 26 57 48 45 52 45 5f 42  f( flags&WHERE_B
19750 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  TM_LIMIT ){.    
19760 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
19770 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
19780 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3e  Msg, "%s (rowid>
19790 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20  ?)", zMsg);.    
197a0 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41    }else if( ALWA
197b0 59 53 28 66 6c 61 67 73 26 57 48 45 52 45 5f 54  YS(flags&WHERE_T
197c0 4f 50 5f 4c 49 4d 49 54 29 20 29 7b 0a 20 20 20  OP_LIMIT) ){.   
197d0 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
197e0 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
197f0 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64  zMsg, "%s (rowid
19800 3c 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20  <?)", zMsg);.   
19810 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64     }.    }.#ifnd
19820 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
19830 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
19840 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 20  else if( (flags 
19850 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
19860 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20  ABLE)!=0 ){.    
19870 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
19880 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
19890 67 2c 20 22 25 73 20 56 49 52 54 55 41 4c 20 54  g, "%s VIRTUAL T
198a0 41 42 4c 45 20 49 4e 44 45 58 20 25 64 3a 25 73  ABLE INDEX %d:%s
198b0 22 2c 20 7a 4d 73 67 2c 0a 20 20 20 20 20 20 20  ", zMsg,.       
198c0 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70             pLoop
198d0 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c  ->u.vtab.idxNum,
198e0 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69   pLoop->u.vtab.i
198f0 64 78 53 74 72 29 3b 0a 20 20 20 20 7d 0a 23 65  dxStr);.    }.#e
19900 6e 64 69 66 0a 20 20 20 20 7a 4d 73 67 20 3d 20  ndif.    zMsg = 
19910 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
19920 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 22 2c 20  db, zMsg, "%s", 
19930 7a 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  zMsg);.    sqlit
19940 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
19950 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 69 49 64 2c  OP_Explain, iId,
19960 20 69 4c 65 76 65 6c 2c 20 69 46 72 6f 6d 2c 20   iLevel, iFrom, 
19970 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43  zMsg, P4_DYNAMIC
19980 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23  );.  }.}.#else.#
19990 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 4f   define explainO
199a0 6e 65 53 63 61 6e 28 75 2c 76 2c 77 2c 78 2c 79  neScan(u,v,w,x,y
199b0 2c 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ,z).#endif /* SQ
199c0 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
199d0 4e 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  N */.../*.** Gen
199e0 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
199f0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
19a00 69 4c 65 76 65 6c 2d 74 68 20 6c 6f 6f 70 20 69  iLevel-th loop i
19a10 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
19a20 73 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61  se.** implementa
19a30 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 62  tion described b
19a40 79 20 70 57 49 6e 66 6f 2e 0a 2a 2f 0a 73 74 61  y pWInfo..*/.sta
19a50 74 69 63 20 42 69 74 6d 61 73 6b 20 63 6f 64 65  tic Bitmask code
19a60 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28 0a 20 20  OneLoopStart(.  
19a70 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
19a80 6f 2c 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65  o,   /* Complete
19a90 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
19aa0 75 74 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  ut the WHERE cla
19ab0 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  use */.  int iLe
19ac0 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  vel,          /*
19ad0 20 57 68 69 63 68 20 6c 65 76 65 6c 20 6f 66 20   Which level of 
19ae0 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 73 68 6f 75  pWInfo->a[] shou
19af0 6c 64 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  ld be coded */. 
19b00 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
19b10 79 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 74  y     /* Which t
19b20 61 62 6c 65 73 20 61 72 65 20 63 75 72 72 65 6e  ables are curren
19b30 74 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f  tly available */
19b40 0a 29 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b 20  .){.  int j, k; 
19b50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
19b60 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
19b70 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20   int iCur;      
19b80 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
19b90 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  E cursor for the
19ba0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
19bb0 61 64 64 72 4e 78 74 3b 20 20 20 20 20 20 20 20  addrNxt;        
19bc0 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a 75 6d   /* Where to jum
19bd0 70 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69  p to continue wi
19be0 74 68 20 74 68 65 20 6e 65 78 74 20 49 4e 20 63  th the next IN c
19bf0 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6d 69  ase */.  int omi
19c00 74 54 61 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a  tTable;       /*
19c10 20 54 72 75 65 20 69 66 20 77 65 20 75 73 65 20   True if we use 
19c20 74 68 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2a  the index only *
19c30 2f 0a 20 20 69 6e 74 20 62 52 65 76 3b 20 20 20  /.  int bRev;   
19c40 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
19c50 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 73   if we need to s
19c60 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f  can in reverse o
19c70 72 64 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c  rder */.  WhereL
19c80 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 2f  evel *pLevel;  /
19c90 2a 20 54 68 65 20 77 68 65 72 65 20 6c 65 76 65  * The where leve
19ca0 6c 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  l to be coded */
19cb0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
19cc0 6f 6f 70 3b 20 20 20 20 2f 2a 20 54 68 65 20 57  oop;    /* The W
19cd0 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20  hereLoop object 
19ce0 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
19cf0 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
19d00 43 3b 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f  C;    /* Decompo
19d10 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 6e  sition of the en
19d20 74 69 72 65 20 57 48 45 52 45 20 63 6c 61 75 73  tire WHERE claus
19d30 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  e */.  WhereTerm
19d40 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
19d50 20 20 20 20 20 20 20 2f 2a 20 41 20 57 48 45 52         /* A WHER
19d60 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f  E clause term */
19d70 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
19d80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19d90 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
19da0 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74  ntext */.  sqlit
19db0 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
19dc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
19dd0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
19de0 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  n */.  Vdbe *v; 
19df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e00 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72         /* The pr
19e10 65 70 61 72 65 64 20 73 74 6d 74 20 75 6e 64 65  epared stmt unde
19e20 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 73 20  r constructions 
19e30 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
19e40 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74  ist_item *pTabIt
19e50 65 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61  em;  /* FROM cla
19e60 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20 63  use term being c
19e70 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64  oded */.  int ad
19e80 64 72 42 72 6b 3b 20 20 20 20 20 20 20 20 20 20  drBrk;          
19e90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
19ea0 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20  p here to break 
19eb0 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  out of the loop 
19ec0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e  */.  int addrCon
19ed0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
19ee0 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
19ef0 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69  e to continue wi
19f00 74 68 20 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f  th next cycle */
19f10 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 52 65 67  .  int iRowidReg
19f20 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
19f30 52 6f 77 69 64 20 69 73 20 73 74 6f 72 65 64 20  Rowid is stored 
19f40 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72  in this register
19f50 2c 20 69 66 20 6e 6f 74 20 7a 65 72 6f 20 2a 2f  , if not zero */
19f60 0a 20 20 69 6e 74 20 69 52 65 6c 65 61 73 65 52  .  int iReleaseR
19f70 65 67 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  eg = 0;      /* 
19f80 54 65 6d 70 20 72 65 67 69 73 74 65 72 20 74 6f  Temp register to
19f90 20 66 72 65 65 20 62 65 66 6f 72 65 20 72 65 74   free before ret
19fa0 75 72 6e 69 6e 67 20 2a 2f 0a 0a 20 20 70 50 61  urning */..  pPa
19fb0 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  rse = pWInfo->pP
19fc0 61 72 73 65 3b 0a 20 20 76 20 3d 20 70 50 61 72  arse;.  v = pPar
19fd0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 70 57 43  se->pVdbe;.  pWC
19fe0 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b   = &pWInfo->sWC;
19ff0 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
1a000 64 62 3b 0a 20 20 70 4c 65 76 65 6c 20 3d 20 26  db;.  pLevel = &
1a010 70 57 49 6e 66 6f 2d 3e 61 5b 69 4c 65 76 65 6c  pWInfo->a[iLevel
1a020 5d 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65  ];.  pLoop = pLe
1a030 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 70  vel->pWLoop;.  p
1a040 54 61 62 49 74 65 6d 20 3d 20 26 70 57 49 6e 66  TabItem = &pWInf
1a050 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  o->pTabList->a[p
1a060 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20  Level->iFrom];. 
1a070 20 69 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d   iCur = pTabItem
1a080 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 4c 65  ->iCursor;.  pLe
1a090 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 20 3d 20  vel->notReady = 
1a0a0 6e 6f 74 52 65 61 64 79 20 26 20 7e 67 65 74 4d  notReady & ~getM
1a0b0 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  ask(&pWInfo->sMa
1a0c0 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a 20 20  skSet, iCur);.  
1a0d0 62 52 65 76 20 3d 20 28 70 57 49 6e 66 6f 2d 3e  bRev = (pWInfo->
1a0e0 72 65 76 4d 61 73 6b 3e 3e 69 4c 65 76 65 6c 29  revMask>>iLevel)
1a0f0 26 31 3b 0a 20 20 6f 6d 69 74 54 61 62 6c 65 20  &1;.  omitTable 
1a100 3d 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  = (pLoop->wsFlag
1a110 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
1a120 4c 59 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20  LY)!=0 .        
1a130 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77     && (pWInfo->w
1a140 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
1a150 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 29 3d 3d  E_FORCE_TABLE)==
1a160 30 3b 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65 43  0;.  VdbeModuleC
1a170 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69  omment((v, "Begi
1a180 6e 20 57 48 45 52 45 2d 6c 6f 6f 70 25 64 3a 20  n WHERE-loop%d: 
1a190 25 73 22 2c 69 4c 65 76 65 6c 2c 70 54 61 62 49  %s",iLevel,pTabI
1a1a0 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
1a1b0 29 29 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65  ));..  /* Create
1a1c0 20 6c 61 62 65 6c 73 20 66 6f 72 20 74 68 65 20   labels for the 
1a1d0 22 62 72 65 61 6b 22 20 61 6e 64 20 22 63 6f 6e  "break" and "con
1a1e0 74 69 6e 75 65 22 20 69 6e 73 74 72 75 63 74 69  tinue" instructi
1a1f0 6f 6e 73 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  ons.  ** for the
1a200 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 2e 20 20   current loop.  
1a210 4a 75 6d 70 20 74 6f 20 61 64 64 72 42 72 6b 20  Jump to addrBrk 
1a220 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20  to break out of 
1a230 61 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 4a 75 6d  a loop..  ** Jum
1a240 70 20 74 6f 20 63 6f 6e 74 20 74 6f 20 67 6f 20  p to cont to go 
1a250 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 74  immediately to t
1a260 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f  he next iteratio
1a270 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f  n of the.  ** lo
1a280 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  op..  **.  ** Wh
1a290 65 6e 20 74 68 65 72 65 20 69 73 20 61 6e 20 49  en there is an I
1a2a0 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77 65 20 61  N operator, we a
1a2b0 6c 73 6f 20 68 61 76 65 20 61 20 22 61 64 64 72  lso have a "addr
1a2c0 4e 78 74 22 20 6c 61 62 65 6c 20 74 68 61 74 0a  Nxt" label that.
1a2d0 20 20 2a 2a 20 6d 65 61 6e 73 20 74 6f 20 63 6f    ** means to co
1a2e0 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68 65 20  ntinue with the 
1a2f0 6e 65 78 74 20 49 4e 20 76 61 6c 75 65 20 63 6f  next IN value co
1a300 6d 62 69 6e 61 74 69 6f 6e 2e 20 20 57 68 65 6e  mbination.  When
1a310 0a 20 20 2a 2a 20 74 68 65 72 65 20 61 72 65 20  .  ** there are 
1a320 6e 6f 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20  no IN operators 
1a330 69 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  in the constrain
1a340 74 73 2c 20 74 68 65 20 22 61 64 64 72 4e 78 74  ts, the "addrNxt
1a350 22 20 6c 61 62 65 6c 0a 20 20 2a 2a 20 69 73 20  " label.  ** is 
1a360 74 68 65 20 73 61 6d 65 20 61 73 20 22 61 64 64  the same as "add
1a370 72 42 72 6b 22 2e 0a 20 20 2a 2f 0a 20 20 61 64  rBrk"..  */.  ad
1a380 64 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e  drBrk = pLevel->
1a390 61 64 64 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c  addrBrk = pLevel
1a3a0 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73 71 6c 69  ->addrNxt = sqli
1a3b0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1a3c0 28 76 29 3b 0a 20 20 61 64 64 72 43 6f 6e 74 20  (v);.  addrCont 
1a3d0 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f  = pLevel->addrCo
1a3e0 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
1a3f0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20  MakeLabel(v);.. 
1a400 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   /* If this is t
1a410 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f  he right table o
1a420 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  f a LEFT OUTER J
1a430 4f 49 4e 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e  OIN, allocate an
1a440 64 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a  d.  ** initializ
1a450 65 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  e a memory cell 
1a460 74 68 61 74 20 72 65 63 6f 72 64 73 20 69 66 20  that records if 
1a470 74 68 69 73 20 74 61 62 6c 65 20 6d 61 74 63 68  this table match
1a480 65 73 20 61 6e 79 0a 20 20 2a 2a 20 72 6f 77 20  es any.  ** row 
1a490 6f 66 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c  of the left tabl
1a4a0 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20  e of the join.. 
1a4b0 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76 65 6c   */.  if( pLevel
1a4c0 2d 3e 69 46 72 6f 6d 3e 30 20 26 26 20 28 70 54  ->iFrom>0 && (pT
1a4d0 61 62 49 74 65 6d 5b 30 5d 2e 6a 6f 69 6e 74 79  abItem[0].jointy
1a4e0 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30  pe & JT_LEFT)!=0
1a4f0 20 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e   ){.    pLevel->
1a500 69 4c 65 66 74 4a 6f 69 6e 20 3d 20 2b 2b 70 50  iLeftJoin = ++pP
1a510 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
1a520 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a530 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
1a540 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66   0, pLevel->iLef
1a550 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62 65  tJoin);.    Vdbe
1a560 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 69  Comment((v, "ini
1a570 74 20 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f 2d 6d  t LEFT JOIN no-m
1a580 61 74 63 68 20 66 6c 61 67 22 29 29 3b 0a 20 20  atch flag"));.  
1a590 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20  }..  /* Special 
1a5a0 63 61 73 65 20 6f 66 20 61 20 46 52 4f 4d 20 63  case of a FROM c
1a5b0 6c 61 75 73 65 20 73 75 62 71 75 65 72 79 20 69  lause subquery i
1a5c0 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20  mplemented as a 
1a5d0 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  co-routine */.  
1a5e0 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 76 69  if( pTabItem->vi
1a5f0 61 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20  aCoroutine ){.  
1a600 20 20 69 6e 74 20 72 65 67 59 69 65 6c 64 20 3d    int regYield =
1a610 20 70 54 61 62 49 74 65 6d 2d 3e 72 65 67 52 65   pTabItem->regRe
1a620 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  turn;.    sqlite
1a630 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1a640 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c  P_InitCoroutine,
1a650 20 72 65 67 59 69 65 6c 64 2c 20 30 2c 20 70 54   regYield, 0, pT
1a660 61 62 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c  abItem->addrFill
1a670 53 75 62 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c  Sub);.    pLevel
1a680 2d 3e 70 32 20 3d 20 20 73 71 6c 69 74 65 33 56  ->p2 =  sqlite3V
1a690 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a6a0 59 69 65 6c 64 2c 20 72 65 67 59 69 65 6c 64 2c  Yield, regYield,
1a6b0 20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 56   addrBrk);.    V
1a6c0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1a6d0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
1a6e0 28 76 2c 20 22 6e 65 78 74 20 72 6f 77 20 6f 66  (v, "next row of
1a6f0 20 5c 22 25 73 5c 22 22 2c 20 70 54 61 62 49 74   \"%s\"", pTabIt
1a700 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
1a710 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  );.    pLevel->o
1a720 70 20 3d 20 4f 50 5f 47 6f 74 6f 3b 0a 20 20 7d  p = OP_Goto;.  }
1a730 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51  else..#ifndef SQ
1a740 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
1a750 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 20 28 70  LTABLE.  if(  (p
1a760 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
1a770 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
1a780 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  LE)!=0 ){.    /*
1a790 20 43 61 73 65 20 31 3a 20 20 54 68 65 20 74 61   Case 1:  The ta
1a7a0 62 6c 65 20 69 73 20 61 20 76 69 72 74 75 61 6c  ble is a virtual
1a7b0 2d 74 61 62 6c 65 2e 20 20 55 73 65 20 74 68 65  -table.  Use the
1a7c0 20 56 46 69 6c 74 65 72 20 61 6e 64 20 56 4e 65   VFilter and VNe
1a7d0 78 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  xt.    **       
1a7e0 20 20 20 74 6f 20 61 63 63 65 73 73 20 74 68 65     to access the
1a7f0 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20   data..    */.  
1a800 20 20 69 6e 74 20 69 52 65 67 3b 20 20 20 2f 2a    int iReg;   /*
1a810 20 50 33 20 56 61 6c 75 65 20 66 6f 72 20 4f 50   P3 Value for OP
1a820 5f 56 46 69 6c 74 65 72 20 2a 2f 0a 20 20 20 20  _VFilter */.    
1a830 69 6e 74 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64  int addrNotFound
1a840 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74  ;.    int nConst
1a850 72 61 69 6e 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e  raint = pLoop->n
1a860 4c 54 65 72 6d 3b 0a 0a 20 20 20 20 73 71 6c 69  LTerm;..    sqli
1a870 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
1a880 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 52  (pParse);.    iR
1a890 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  eg = sqlite3GetT
1a8a0 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
1a8b0 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b   nConstraint+2);
1a8c0 0a 20 20 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e  .    addrNotFoun
1a8d0 64 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  d = pLevel->addr
1a8e0 42 72 6b 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  Brk;.    for(j=0
1a8f0 3b 20 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  ; j<nConstraint;
1a900 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   j++){.      int
1a910 20 69 54 61 72 67 65 74 20 3d 20 69 52 65 67 2b   iTarget = iReg+
1a920 6a 2b 32 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  j+2;.      pTerm
1a930 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d   = pLoop->aLTerm
1a940 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  [j];.      if( p
1a950 54 65 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  Term==0 ) contin
1a960 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  ue;.      if( pT
1a970 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
1a980 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20   WO_IN ){.      
1a990 20 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65    codeEqualityTe
1a9a0 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d  rm(pParse, pTerm
1a9b0 2c 20 70 4c 65 76 65 6c 2c 20 6a 2c 20 62 52 65  , pLevel, j, bRe
1a9c0 76 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20 20  v, iTarget);.   
1a9d0 20 20 20 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e       addrNotFoun
1a9e0 64 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  d = pLevel->addr
1a9f0 4e 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Nxt;.      }else
1aa00 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1aa10 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
1aa20 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  , pTerm->pExpr->
1aa30 70 52 69 67 68 74 2c 20 69 54 61 72 67 65 74 29  pRight, iTarget)
1aa40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1aa50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1aa60 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
1aa70 67 65 72 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74  ger, pLoop->u.vt
1aa80 61 62 2e 69 64 78 4e 75 6d 2c 20 69 52 65 67 29  ab.idxNum, iReg)
1aa90 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1aaa0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
1aab0 74 65 67 65 72 2c 20 6e 43 6f 6e 73 74 72 61 69  teger, nConstrai
1aac0 6e 74 2c 20 69 52 65 67 2b 31 29 3b 0a 20 20 20  nt, iReg+1);.   
1aad0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1aae0 70 34 28 76 2c 20 4f 50 5f 56 46 69 6c 74 65 72  p4(v, OP_VFilter
1aaf0 2c 20 69 43 75 72 2c 20 61 64 64 72 4e 6f 74 46  , iCur, addrNotF
1ab00 6f 75 6e 64 2c 20 69 52 65 67 2c 0a 20 20 20 20  ound, iReg,.    
1ab10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e    pLoop->u.vtab.
1ab30 69 64 78 53 74 72 2c 0a 20 20 20 20 20 20 20 20  idxStr,.        
1ab40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
1ab50 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  oop->u.vtab.need
1ab60 46 72 65 65 20 3f 20 50 34 5f 4d 50 52 49 4e 54  Free ? P4_MPRINT
1ab70 46 20 3a 20 50 34 5f 53 54 41 54 49 43 29 3b 0a  F : P4_STATIC);.
1ab80 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1ab90 28 76 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  (v);.    pLoop->
1aba0 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
1abb0 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  = 0;.    for(j=0
1abc0 3b 20 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 20  ; j<nConstraint 
1abd0 26 26 20 6a 3c 31 36 3b 20 6a 2b 2b 29 7b 0a 20  && j<16; j++){. 
1abe0 20 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d       if( (pLoop-
1abf0 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b  >u.vtab.omitMask
1ac00 3e 3e 6a 29 26 31 20 29 7b 0a 20 20 20 20 20 20  >>j)&1 ){.      
1ac10 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
1ac20 65 76 65 6c 2c 20 70 4c 6f 6f 70 2d 3e 61 4c 54  evel, pLoop->aLT
1ac30 65 72 6d 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 7d  erm[j]);.      }
1ac40 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65  .    }.    pLeve
1ac50 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 56 4e 65 78 74  l->op = OP_VNext
1ac60 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31  ;.    pLevel->p1
1ac70 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65   = iCur;.    pLe
1ac80 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65  vel->p2 = sqlite
1ac90 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
1aca0 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
1acb0 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
1acc0 28 70 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e  (pParse, iReg, n
1acd0 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20  Constraint+2);. 
1ace0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1acf0 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  chePop(pParse);.
1ad00 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f    }else.#endif /
1ad10 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
1ad20 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20  RTUALTABLE */.. 
1ad30 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
1ad40 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b  lags & WHERE_IPK
1ad50 29 21 3d 30 0a 20 20 20 26 26 20 28 70 4c 6f 6f  )!=0.   && (pLoo
1ad60 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48  p->wsFlags & (WH
1ad70 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48  ERE_COLUMN_IN|WH
1ad80 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 29 21  ERE_COLUMN_EQ))!
1ad90 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 43  =0.  ){.    /* C
1ada0 61 73 65 20 32 3a 20 20 57 65 20 63 61 6e 20 64  ase 2:  We can d
1adb0 69 72 65 63 74 6c 79 20 72 65 66 65 72 65 6e 63  irectly referenc
1adc0 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 75  e a single row u
1add0 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 20  sing an.    **  
1ade0 20 20 20 20 20 20 20 20 65 71 75 61 6c 69 74 79          equality
1adf0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69   comparison agai
1ae00 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20 66 69  nst the ROWID fi
1ae10 65 6c 64 2e 20 20 4f 72 0a 20 20 20 20 2a 2a 20  eld.  Or.    ** 
1ae20 20 20 20 20 20 20 20 20 20 77 65 20 72 65 66 65           we refe
1ae30 72 65 6e 63 65 20 6d 75 6c 74 69 70 6c 65 20 72  rence multiple r
1ae40 6f 77 73 20 75 73 69 6e 67 20 61 20 22 72 6f 77  ows using a "row
1ae50 69 64 20 49 4e 20 28 2e 2e 2e 29 22 0a 20 20 20  id IN (...)".   
1ae60 20 2a 2a 20 20 20 20 20 20 20 20 20 20 63 6f 6e   **          con
1ae70 73 74 72 75 63 74 2e 0a 20 20 20 20 2a 2f 0a 20  struct..    */. 
1ae80 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70     assert( pLoop
1ae90 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3d 3d 31  ->u.btree.nEq==1
1aea0 20 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20   );.    pTerm = 
1aeb0 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d  pLoop->aLTerm[0]
1aec0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
1aed0 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  erm!=0 );.    as
1aee0 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78  sert( pTerm->pEx
1aef0 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  pr!=0 );.    ass
1af00 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d  ert( omitTable==
1af10 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  0 );.    testcas
1af20 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  e( pTerm->wtFlag
1af30 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
1af40 20 29 3b 0a 20 20 20 20 69 52 65 6c 65 61 73 65   );.    iRelease
1af50 52 65 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Reg = ++pParse->
1af60 6e 4d 65 6d 3b 0a 20 20 20 20 69 52 6f 77 69 64  nMem;.    iRowid
1af70 52 65 67 20 3d 20 63 6f 64 65 45 71 75 61 6c 69  Reg = codeEquali
1af80 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70  tyTerm(pParse, p
1af90 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 30 2c  Term, pLevel, 0,
1afa0 20 62 52 65 76 2c 20 69 52 65 6c 65 61 73 65 52   bRev, iReleaseR
1afb0 65 67 29 3b 0a 20 20 20 20 69 66 28 20 69 52 6f  eg);.    if( iRo
1afc0 77 69 64 52 65 67 21 3d 69 52 65 6c 65 61 73 65  widReg!=iRelease
1afd0 52 65 67 20 29 20 73 71 6c 69 74 65 33 52 65 6c  Reg ) sqlite3Rel
1afe0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
1aff0 73 65 2c 20 69 52 65 6c 65 61 73 65 52 65 67 29  se, iReleaseReg)
1b000 3b 0a 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20  ;.    addrNxt = 
1b010 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b  pLevel->addrNxt;
1b020 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1b030 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73  AddOp2(v, OP_Mus
1b040 74 42 65 49 6e 74 2c 20 69 52 6f 77 69 64 52 65  tBeInt, iRowidRe
1b050 67 2c 20 61 64 64 72 4e 78 74 29 3b 20 56 64 62  g, addrNxt); Vdb
1b060 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1b070 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b080 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69  Op3(v, OP_NotExi
1b090 73 74 73 2c 20 69 43 75 72 2c 20 61 64 64 72 4e  sts, iCur, addrN
1b0a0 78 74 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a  xt, iRowidReg);.
1b0b0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1b0c0 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
1b0d0 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
1b0e0 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
1b0f0 69 52 6f 77 69 64 52 65 67 2c 20 31 29 3b 0a 20  iRowidReg, 1);. 
1b100 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1b110 63 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c  cheStore(pParse,
1b120 20 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69   iCur, -1, iRowi
1b130 64 52 65 67 29 3b 0a 20 20 20 20 56 64 62 65 43  dReg);.    VdbeC
1b140 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29  omment((v, "pk")
1b150 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  );.    pLevel->o
1b160 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 7d  p = OP_Noop;.  }
1b170 65 6c 73 65 20 69 66 28 20 28 70 4c 6f 6f 70 2d  else if( (pLoop-
1b180 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
1b190 5f 49 50 4b 29 21 3d 30 0a 20 20 20 20 20 20 20  _IPK)!=0.       
1b1a0 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46    && (pLoop->wsF
1b1b0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c  lags & WHERE_COL
1b1c0 55 4d 4e 5f 52 41 4e 47 45 29 21 3d 30 0a 20 20  UMN_RANGE)!=0.  
1b1d0 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 33  ){.    /* Case 3
1b1e0 3a 20 20 57 65 20 68 61 76 65 20 61 6e 20 69 6e  :  We have an in
1b1f0 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69  equality compari
1b200 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20  son against the 
1b210 52 4f 57 49 44 20 66 69 65 6c 64 2e 0a 20 20 20  ROWID field..   
1b220 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 65 73 74   */.    int test
1b230 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  Op = OP_Noop;.  
1b240 20 20 69 6e 74 20 73 74 61 72 74 3b 0a 20 20 20    int start;.   
1b250 20 69 6e 74 20 6d 65 6d 45 6e 64 56 61 6c 75 65   int memEndValue
1b260 20 3d 20 30 3b 0a 20 20 20 20 57 68 65 72 65 54   = 0;.    WhereT
1b270 65 72 6d 20 2a 70 53 74 61 72 74 2c 20 2a 70 45  erm *pStart, *pE
1b280 6e 64 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  nd;..    assert(
1b290 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b   omitTable==0 );
1b2a0 0a 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20  .    j = 0;.    
1b2b0 70 53 74 61 72 74 20 3d 20 70 45 6e 64 20 3d 20  pStart = pEnd = 
1b2c0 30 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70  0;.    if( pLoop
1b2d0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
1b2e0 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 20 70 53  E_BTM_LIMIT ) pS
1b2f0 74 61 72 74 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c  tart = pLoop->aL
1b300 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 69  Term[j++];.    i
1b310 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
1b320 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49  s & WHERE_TOP_LI
1b330 4d 49 54 20 29 20 70 45 6e 64 20 3d 20 70 4c 6f  MIT ) pEnd = pLo
1b340 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b  op->aLTerm[j++];
1b350 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74  .    assert( pSt
1b360 61 72 74 21 3d 30 20 7c 7c 20 70 45 6e 64 21 3d  art!=0 || pEnd!=
1b370 30 20 29 3b 0a 20 20 20 20 69 66 28 20 62 52 65  0 );.    if( bRe
1b380 76 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d  v ){.      pTerm
1b390 20 3d 20 70 53 74 61 72 74 3b 0a 20 20 20 20 20   = pStart;.     
1b3a0 20 70 53 74 61 72 74 20 3d 20 70 45 6e 64 3b 0a   pStart = pEnd;.
1b3b0 20 20 20 20 20 20 70 45 6e 64 20 3d 20 70 54 65        pEnd = pTe
1b3c0 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rm;.    }.    if
1b3d0 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20  ( pStart ){.    
1b3e0 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20    Expr *pX;     
1b3f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65          /* The e
1b400 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 64  xpression that d
1b410 65 66 69 6e 65 73 20 74 68 65 20 73 74 61 72 74  efines the start
1b420 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20   bound */.      
1b430 69 6e 74 20 72 31 2c 20 72 54 65 6d 70 3b 20 20  int r1, rTemp;  
1b440 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
1b450 72 73 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20 74  rs for holding t
1b460 68 65 20 73 74 61 72 74 20 62 6f 75 6e 64 61 72  he start boundar
1b470 79 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54  y */..      /* T
1b480 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e  he following con
1b490 73 74 61 6e 74 20 6d 61 70 73 20 54 4b 5f 78 78  stant maps TK_xx
1b4a0 20 63 6f 64 65 73 20 69 6e 74 6f 20 63 6f 72 72   codes into corr
1b4b0 65 73 70 6f 6e 64 69 6e 67 20 0a 20 20 20 20 20  esponding .     
1b4c0 20 2a 2a 20 73 65 65 6b 20 6f 70 63 6f 64 65 73   ** seek opcodes
1b4d0 2e 20 20 49 74 20 64 65 70 65 6e 64 73 20 6f 6e  .  It depends on
1b4e0 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 6f 72   a particular or
1b4f0 64 65 72 69 6e 67 20 6f 66 20 54 4b 5f 78 78 0a  dering of TK_xx.
1b500 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
1b510 6f 6e 73 74 20 75 38 20 61 4d 6f 76 65 4f 70 5b  onst u8 aMoveOp[
1b520 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ] = {.          
1b530 20 2f 2a 20 54 4b 5f 47 54 20 2a 2f 20 20 4f 50   /* TK_GT */  OP
1b540 5f 53 65 65 6b 47 54 2c 0a 20 20 20 20 20 20 20  _SeekGT,.       
1b550 20 20 20 20 2f 2a 20 54 4b 5f 4c 45 20 2a 2f 20      /* TK_LE */ 
1b560 20 4f 50 5f 53 65 65 6b 4c 45 2c 0a 20 20 20 20   OP_SeekLE,.    
1b570 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 54 20         /* TK_LT 
1b580 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 54 2c 0a 20  */  OP_SeekLT,. 
1b590 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f            /* TK_
1b5a0 47 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 45  GE */  OP_SeekGE
1b5b0 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20  .      };.      
1b5c0 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 54  assert( TK_LE==T
1b5d0 4b 5f 47 54 2b 31 20 29 3b 20 20 20 20 20 20 2f  K_GT+1 );      /
1b5e0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
1b5f0 6f 72 64 65 72 69 6e 67 2e 2e 20 2a 2f 0a 20 20  ordering.. */.  
1b600 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
1b610 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 20 20 20  T==TK_GT+2 );   
1b620 20 20 20 2f 2a 20 20 2e 2e 2e 20 6f 66 20 74 68     /*  ... of th
1b630 65 20 54 4b 5f 78 78 20 76 61 6c 75 65 73 2e 2e  e TK_xx values..
1b640 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
1b650 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 47 54 2b  t( TK_GE==TK_GT+
1b660 33 20 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e  3 );      /*  ..
1b670 2e 20 69 73 20 63 6f 72 72 65 63 63 74 2e 20 2a  . is correcct. *
1b680 2f 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  /..      assert(
1b690 20 28 70 53 74 61 72 74 2d 3e 77 74 46 6c 61 67   (pStart->wtFlag
1b6a0 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d  s & TERM_VNULL)=
1b6b0 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
1b6c0 63 61 73 65 28 20 70 53 74 61 72 74 2d 3e 77 74  case( pStart->wt
1b6d0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
1b6e0 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 70 58  TUAL );.      pX
1b6f0 20 3d 20 70 53 74 61 72 74 2d 3e 70 45 78 70 72   = pStart->pExpr
1b700 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1b710 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  pX!=0 );.      t
1b720 65 73 74 63 61 73 65 28 20 70 53 74 61 72 74 2d  estcase( pStart-
1b730 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75  >leftCursor!=iCu
1b740 72 20 29 3b 20 2f 2a 20 74 72 61 6e 73 69 74 69  r ); /* transiti
1b750 76 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  ve constraints *
1b760 2f 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  /.      r1 = sql
1b770 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1b780 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69  (pParse, pX->pRi
1b790 67 68 74 2c 20 26 72 54 65 6d 70 29 3b 0a 20 20  ght, &rTemp);.  
1b7a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1b7b0 64 64 4f 70 33 28 76 2c 20 61 4d 6f 76 65 4f 70  ddOp3(v, aMoveOp
1b7c0 5b 70 58 2d 3e 6f 70 2d 54 4b 5f 47 54 5d 2c 20  [pX->op-TK_GT], 
1b7d0 69 43 75 72 2c 20 61 64 64 72 42 72 6b 2c 20 72  iCur, addrBrk, r
1b7e0 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  1);.      VdbeCo
1b7f0 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29  mment((v, "pk"))
1b800 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
1b810 72 61 67 65 49 66 28 76 2c 20 70 58 2d 3e 6f 70  rageIf(v, pX->op
1b820 3d 3d 54 4b 5f 47 54 29 3b 0a 20 20 20 20 20 20  ==TK_GT);.      
1b830 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1b840 2c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 29  , pX->op==TK_LE)
1b850 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
1b860 72 61 67 65 49 66 28 76 2c 20 70 58 2d 3e 6f 70  rageIf(v, pX->op
1b870 3d 3d 54 4b 5f 4c 54 29 3b 0a 20 20 20 20 20 20  ==TK_LT);.      
1b880 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1b890 2c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 29  , pX->op==TK_GE)
1b8a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1b8b0 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
1b8c0 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
1b8d0 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, 1);.      sql
1b8e0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1b8f0 65 67 28 70 50 61 72 73 65 2c 20 72 54 65 6d 70  eg(pParse, rTemp
1b900 29 3b 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65  );.      disable
1b910 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 53 74  Term(pLevel, pSt
1b920 61 72 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  art);.    }else{
1b930 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1b940 62 65 41 64 64 4f 70 32 28 76 2c 20 62 52 65 76  beAddOp2(v, bRev
1b950 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f   ? OP_Last : OP_
1b960 52 65 77 69 6e 64 2c 20 69 43 75 72 2c 20 61 64  Rewind, iCur, ad
1b970 64 72 42 72 6b 29 3b 0a 20 20 20 20 20 20 56 64  drBrk);.      Vd
1b980 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1b990 62 52 65 76 3d 3d 30 29 3b 0a 20 20 20 20 20 20  bRev==0);.      
1b9a0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1b9b0 2c 20 62 52 65 76 21 3d 30 29 3b 0a 20 20 20 20  , bRev!=0);.    
1b9c0 7d 0a 20 20 20 20 69 66 28 20 70 45 6e 64 20 29  }.    if( pEnd )
1b9d0 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58  {.      Expr *pX
1b9e0 3b 0a 20 20 20 20 20 20 70 58 20 3d 20 70 45 6e  ;.      pX = pEn
1b9f0 64 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  d->pExpr;.      
1ba00 61 73 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b  assert( pX!=0 );
1ba10 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
1ba20 70 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20  pEnd->wtFlags & 
1ba30 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29  TERM_VNULL)==0 )
1ba40 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1ba50 28 20 70 45 6e 64 2d 3e 6c 65 66 74 43 75 72 73  ( pEnd->leftCurs
1ba60 6f 72 21 3d 69 43 75 72 20 29 3b 20 2f 2a 20 54  or!=iCur ); /* T
1ba70 72 61 6e 73 69 74 69 76 65 20 63 6f 6e 73 74 72  ransitive constr
1ba80 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 74  aints */.      t
1ba90 65 73 74 63 61 73 65 28 20 70 45 6e 64 2d 3e 77  estcase( pEnd->w
1baa0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
1bab0 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 6d  RTUAL );.      m
1bac0 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20 2b 2b 70  emEndValue = ++p
1bad0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
1bae0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1baf0 64 65 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  de(pParse, pX->p
1bb00 52 69 67 68 74 2c 20 6d 65 6d 45 6e 64 56 61 6c  Right, memEndVal
1bb10 75 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ue);.      if( p
1bb20 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20  X->op==TK_LT || 
1bb30 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b  pX->op==TK_GT ){
1bb40 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20  .        testOp 
1bb50 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 65 20 3a  = bRev ? OP_Le :
1bb60 20 4f 50 5f 47 65 3b 0a 20 20 20 20 20 20 7d 65   OP_Ge;.      }e
1bb70 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73  lse{.        tes
1bb80 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f  tOp = bRev ? OP_
1bb90 4c 74 20 3a 20 4f 50 5f 47 74 3b 0a 20 20 20 20  Lt : OP_Gt;.    
1bba0 20 20 7d 0a 20 20 20 20 20 20 64 69 73 61 62 6c    }.      disabl
1bbb0 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 45  eTerm(pLevel, pE
1bbc0 6e 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  nd);.    }.    s
1bbd0 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
1bbe0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
1bbf0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70  ;.    pLevel->op
1bc00 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65   = bRev ? OP_Pre
1bc10 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20  v : OP_Next;.   
1bc20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43   pLevel->p1 = iC
1bc30 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ur;.    pLevel->
1bc40 70 32 20 3d 20 73 74 61 72 74 3b 0a 20 20 20 20  p2 = start;.    
1bc50 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e  assert( pLevel->
1bc60 70 35 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  p5==0 );.    if(
1bc70 20 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70   testOp!=OP_Noop
1bc80 20 29 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64   ){.      iRowid
1bc90 52 65 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Reg = ++pParse->
1bca0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69  nMem;.      sqli
1bcb0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1bcc0 20 4f 50 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c   OP_Rowid, iCur,
1bcd0 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20   iRowidReg);.   
1bce0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1bcf0 63 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c  cheStore(pParse,
1bd00 20 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69   iCur, -1, iRowi
1bd10 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  dReg);.      sql
1bd20 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1bd30 2c 20 74 65 73 74 4f 70 2c 20 6d 65 6d 45 6e 64  , testOp, memEnd
1bd40 56 61 6c 75 65 2c 20 61 64 64 72 42 72 6b 2c 20  Value, addrBrk, 
1bd50 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20  iRowidReg);.    
1bd60 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1bd70 28 76 2c 20 74 65 73 74 4f 70 3d 3d 4f 50 5f 4c  (v, testOp==OP_L
1bd80 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  e);.      VdbeCo
1bd90 76 65 72 61 67 65 49 66 28 76 2c 20 74 65 73 74  verageIf(v, test
1bda0 4f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20  Op==OP_Lt);.    
1bdb0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1bdc0 28 76 2c 20 74 65 73 74 4f 70 3d 3d 4f 50 5f 47  (v, testOp==OP_G
1bdd0 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  e);.      VdbeCo
1bde0 76 65 72 61 67 65 49 66 28 76 2c 20 74 65 73 74  verageIf(v, test
1bdf0 4f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20  Op==OP_Gt);.    
1be00 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
1be10 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f  ngeP5(v, SQLITE_
1be20 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 20 53 51  AFF_NUMERIC | SQ
1be30 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
1be40 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
1be50 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
1be60 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
1be70 45 44 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73  ED ){.    /* Cas
1be80 65 20 34 3a 20 41 20 73 63 61 6e 20 75 73 69 6e  e 4: A scan usin
1be90 67 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 20 20  g an index..    
1bea0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
1beb0 20 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75    The WHERE clau
1bec0 73 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 7a  se may contain z
1bed0 65 72 6f 20 6f 72 20 6d 6f 72 65 20 65 71 75 61  ero or more equa
1bee0 6c 69 74 79 20 0a 20 20 20 20 2a 2a 20 20 20 20  lity .    **    
1bef0 20 20 20 20 20 74 65 72 6d 73 20 28 22 3d 3d 22       terms ("=="
1bf00 20 6f 72 20 22 49 4e 22 20 6f 70 65 72 61 74 6f   or "IN" operato
1bf10 72 73 29 20 74 68 61 74 20 72 65 66 65 72 20 74  rs) that refer t
1bf20 6f 20 74 68 65 20 4e 0a 20 20 20 20 2a 2a 20 20  o the N.    **  
1bf30 20 20 20 20 20 20 20 6c 65 66 74 2d 6d 6f 73 74         left-most
1bf40 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
1bf50 69 6e 64 65 78 2e 20 49 74 20 6d 61 79 20 61 6c  index. It may al
1bf60 73 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a  so contain.    *
1bf70 2a 20 20 20 20 20 20 20 20 20 69 6e 65 71 75 61  *         inequa
1bf80 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
1bf90 20 28 3e 2c 20 3c 2c 20 3e 3d 20 6f 72 20 3c 3d   (>, <, >= or <=
1bfa0 29 20 6f 6e 20 74 68 65 20 69 6e 64 65 78 65 64  ) on the indexed
1bfb0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1bfc0 63 6f 6c 75 6d 6e 20 74 68 61 74 20 69 6d 6d 65  column that imme
1bfd0 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 20  diately follows 
1bfe0 74 68 65 20 4e 20 65 71 75 61 6c 69 74 69 65 73  the N equalities
1bff0 2e 20 4f 6e 6c 79 20 0a 20 20 20 20 2a 2a 20 20  . Only .    **  
1c000 20 20 20 20 20 20 20 74 68 65 20 72 69 67 68 74         the right
1c010 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 63 61 6e  -most column can
1c020 20 62 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74   be an inequalit
1c030 79 20 2d 20 74 68 65 20 72 65 73 74 20 6d 75 73  y - the rest mus
1c040 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  t.    **        
1c050 20 75 73 65 20 74 68 65 20 22 3d 3d 22 20 61 6e   use the "==" an
1c060 64 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73  d "IN" operators
1c070 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  . For example, i
1c080 66 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 20 20  f the .    **   
1c090 20 20 20 20 20 20 69 6e 64 65 78 20 69 73 20 6f        index is o
1c0a0 6e 20 28 78 2c 79 2c 7a 29 2c 20 74 68 65 6e 20  n (x,y,z), then 
1c0b0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6c  the following cl
1c0c0 61 75 73 65 73 20 61 72 65 20 61 6c 6c 20 0a 20  auses are all . 
1c0d0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6f 70     **         op
1c0e0 74 69 6d 69 7a 65 64 3a 0a 20 20 20 20 2a 2a 0a  timized:.    **.
1c0f0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1c100 20 20 78 3d 35 0a 20 20 20 20 2a 2a 20 20 20 20    x=5.    **    
1c110 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20          x=5 AND 
1c120 79 3d 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20  y=10.    **     
1c130 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79         x=5 AND y
1c140 3c 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  <10.    **      
1c150 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3e        x=5 AND y>
1c160 35 20 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a  5 AND y<10.    *
1c170 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35  *            x=5
1c180 20 41 4e 44 20 79 3d 35 20 41 4e 44 20 7a 3c 3d   AND y=5 AND z<=
1c190 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  10.    **.    **
1c1a0 20 20 20 20 20 20 20 20 20 54 68 65 20 7a 3c 31           The z<1
1c1b0 30 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f  0 term of the fo
1c1c0 6c 6c 6f 77 69 6e 67 20 63 61 6e 6e 6f 74 20 62  llowing cannot b
1c1d0 65 20 75 73 65 64 2c 20 6f 6e 6c 79 0a 20 20 20  e used, only.   
1c1e0 20 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20   **         the 
1c1f0 78 3d 35 20 74 65 72 6d 3a 0a 20 20 20 20 2a 2a  x=5 term:.    **
1c200 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1c210 20 20 20 78 3d 35 20 41 4e 44 20 7a 3c 31 30 0a     x=5 AND z<10.
1c220 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1c230 20 20 20 20 20 20 4e 20 6d 61 79 20 62 65 20 7a        N may be z
1c240 65 72 6f 20 69 66 20 74 68 65 72 65 20 61 72 65  ero if there are
1c250 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
1c260 74 72 61 69 6e 74 73 2e 0a 20 20 20 20 2a 2a 20  traints..    ** 
1c270 20 20 20 20 20 20 20 20 49 66 20 74 68 65 72 65          If there
1c280 20 61 72 65 20 6e 6f 20 69 6e 65 71 75 61 6c 69   are no inequali
1c290 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20  ty constraints, 
1c2a0 74 68 65 6e 20 4e 20 69 73 20 61 74 0a 20 20 20  then N is at.   
1c2b0 20 2a 2a 20 20 20 20 20 20 20 20 20 6c 65 61 73   **         leas
1c2c0 74 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  t one..    **.  
1c2d0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 69    **         Thi
1c2e0 73 20 63 61 73 65 20 69 73 20 61 6c 73 6f 20 75  s case is also u
1c2f0 73 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 61  sed when there a
1c300 72 65 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75  re no WHERE clau
1c310 73 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  se.    **       
1c320 20 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 75    constraints bu
1c330 74 20 61 6e 20 69 6e 64 65 78 20 69 73 20 73 65  t an index is se
1c340 6c 65 63 74 65 64 20 61 6e 79 77 61 79 2c 20 69  lected anyway, i
1c350 6e 20 6f 72 64 65 72 0a 20 20 20 20 2a 2a 20 20  n order.    **  
1c360 20 20 20 20 20 20 20 74 6f 20 66 6f 72 63 65 20         to force 
1c370 74 68 65 20 6f 75 74 70 75 74 20 6f 72 64 65 72  the output order
1c380 20 74 6f 20 63 6f 6e 66 6f 72 6d 20 74 6f 20 61   to conform to a
1c390 6e 20 4f 52 44 45 52 20 42 59 2e 0a 20 20 20 20  n ORDER BY..    
1c3a0 2a 2f 20 20 0a 20 20 20 20 73 74 61 74 69 63 20  */  .    static 
1c3b0 63 6f 6e 73 74 20 75 38 20 61 53 74 61 72 74 4f  const u8 aStartO
1c3c0 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 30 2c  p[] = {.      0,
1c3d0 0a 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20  .      0,.      
1c3e0 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 20  OP_Rewind,      
1c3f0 20 20 20 20 20 2f 2a 20 32 3a 20 28 21 73 74 61       /* 2: (!sta
1c400 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26  rt_constraints &
1c410 26 20 73 74 61 72 74 45 71 20 26 26 20 20 21 62  & startEq &&  !b
1c420 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  Rev) */.      OP
1c430 5f 4c 61 73 74 2c 20 20 20 20 20 20 20 20 20 20  _Last,          
1c440 20 20 20 2f 2a 20 33 3a 20 28 21 73 74 61 72 74     /* 3: (!start
1c450 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20  _constraints && 
1c460 73 74 61 72 74 45 71 20 26 26 20 20 20 62 52 65  startEq &&   bRe
1c470 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53  v) */.      OP_S
1c480 65 65 6b 47 54 2c 20 20 20 20 20 20 20 20 20 20  eekGT,          
1c490 20 2f 2a 20 34 3a 20 28 73 74 61 72 74 5f 63 6f   /* 4: (start_co
1c4a0 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 21 73  nstraints  && !s
1c4b0 74 61 72 74 45 71 20 26 26 20 21 62 52 65 76 29  tartEq && !bRev)
1c4c0 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65   */.      OP_See
1c4d0 6b 4c 54 2c 20 20 20 20 20 20 20 20 20 20 20 2f  kLT,           /
1c4e0 2a 20 35 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73  * 5: (start_cons
1c4f0 74 72 61 69 6e 74 73 20 20 26 26 20 21 73 74 61  traints  && !sta
1c500 72 74 45 71 20 26 26 20 20 62 52 65 76 29 20 2a  rtEq &&  bRev) *
1c510 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 47  /.      OP_SeekG
1c520 45 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  E,           /* 
1c530 36 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72  6: (start_constr
1c540 61 69 6e 74 73 20 20 26 26 20 20 73 74 61 72 74  aints  &&  start
1c550 45 71 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a  Eq && !bRev) */.
1c560 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c 45 20        OP_SeekLE 
1c570 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 37 3a             /* 7:
1c580 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69   (start_constrai
1c590 6e 74 73 20 20 26 26 20 20 73 74 61 72 74 45 71  nts  &&  startEq
1c5a0 20 26 26 20 20 62 52 65 76 29 20 2a 2f 0a 20 20   &&  bRev) */.  
1c5b0 20 20 7d 3b 0a 20 20 20 20 73 74 61 74 69 63 20    };.    static 
1c5c0 63 6f 6e 73 74 20 75 38 20 61 45 6e 64 4f 70 5b  const u8 aEndOp[
1c5d0 5d 20 3d 20 7b 0a 20 20 20 20 20 20 4f 50 5f 49  ] = {.      OP_I
1c5e0 64 78 47 45 2c 20 20 20 20 20 20 20 20 20 20 20  dxGE,           
1c5f0 20 2f 2a 20 30 3a 20 28 65 6e 64 5f 63 6f 6e 73   /* 0: (end_cons
1c600 74 72 61 69 6e 74 73 20 26 26 20 21 62 52 65 76  traints && !bRev
1c610 20 26 26 20 21 65 6e 64 45 71 29 20 2a 2f 0a 20   && !endEq) */. 
1c620 20 20 20 20 20 4f 50 5f 49 64 78 47 54 2c 20 20       OP_IdxGT,  
1c630 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 3a 20            /* 1: 
1c640 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73  (end_constraints
1c650 20 26 26 20 21 62 52 65 76 20 26 26 20 20 65 6e   && !bRev &&  en
1c660 64 45 71 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  dEq) */.      OP
1c670 5f 49 64 78 4c 45 2c 20 20 20 20 20 20 20 20 20  _IdxLE,         
1c680 20 20 20 2f 2a 20 32 3a 20 28 65 6e 64 5f 63 6f     /* 2: (end_co
1c690 6e 73 74 72 61 69 6e 74 73 20 26 26 20 20 62 52  nstraints &&  bR
1c6a0 65 76 20 26 26 20 21 65 6e 64 45 71 29 20 2a 2f  ev && !endEq) */
1c6b0 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 4c 54 2c  .      OP_IdxLT,
1c6c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 33              /* 3
1c6d0 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e  : (end_constrain
1c6e0 74 73 20 26 26 20 20 62 52 65 76 20 26 26 20 20  ts &&  bRev &&  
1c6f0 65 6e 64 45 71 29 20 2a 2f 0a 20 20 20 20 7d 3b  endEq) */.    };
1c700 0a 20 20 20 20 75 31 36 20 6e 45 71 20 3d 20 70  .    u16 nEq = p
1c710 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
1c720 71 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  q;     /* Number
1c730 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 74 65 72   of == or IN ter
1c740 6d 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65  ms */.    int re
1c750 67 42 61 73 65 3b 20 20 20 20 20 20 20 20 20 20  gBase;          
1c760 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72         /* Base r
1c770 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
1c780 63 6f 6e 73 74 72 61 69 6e 74 20 76 61 6c 75 65  constraint value
1c790 73 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65  s */.    WhereTe
1c7a0 72 6d 20 2a 70 52 61 6e 67 65 53 74 61 72 74 20  rm *pRangeStart 
1c7b0 3d 20 30 3b 20 20 2f 2a 20 49 6e 65 71 75 61 6c  = 0;  /* Inequal
1c7c0 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61  ity constraint a
1c7d0 74 20 72 61 6e 67 65 20 73 74 61 72 74 20 2a 2f  t range start */
1c7e0 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
1c7f0 70 52 61 6e 67 65 45 6e 64 20 3d 20 30 3b 20 20  pRangeEnd = 0;  
1c800 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79 20    /* Inequality 
1c810 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 72 61  constraint at ra
1c820 6e 67 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20 69  nge end */.    i
1c830 6e 74 20 73 74 61 72 74 45 71 3b 20 20 20 20 20  nt startEq;     
1c840 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1c850 72 75 65 20 69 66 20 72 61 6e 67 65 20 73 74 61  rue if range sta
1c860 72 74 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f  rt uses ==, >= o
1c870 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20  r <= */.    int 
1c880 65 6e 64 45 71 3b 20 20 20 20 20 20 20 20 20 20  endEq;          
1c890 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1c8a0 20 69 66 20 72 61 6e 67 65 20 65 6e 64 20 75 73   if range end us
1c8b0 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20  es ==, >= or <= 
1c8c0 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74  */.    int start
1c8d0 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3b 20 20 20  _constraints;   
1c8e0 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20      /* Start of 
1c8f0 72 61 6e 67 65 20 69 73 20 63 6f 6e 73 74 72 61  range is constra
1c900 69 6e 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ined */.    int 
1c910 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 20 20 20  nConstraint;    
1c920 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1c930 65 72 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74  er of constraint
1c940 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 49 6e   terms */.    In
1c950 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
1c960 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1c970 65 20 69 6e 64 65 78 20 77 65 20 77 69 6c 6c 20  e index we will 
1c980 62 65 20 75 73 69 6e 67 20 2a 2f 0a 20 20 20 20  be using */.    
1c990 69 6e 74 20 69 49 64 78 43 75 72 3b 20 20 20 20  int iIdxCur;    
1c9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c9b0 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
1c9c0 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 2a 2f  for the index */
1c9d0 0a 20 20 20 20 69 6e 74 20 6e 45 78 74 72 61 52  .    int nExtraR
1c9e0 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  eg = 0;         
1c9f0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
1ca00 78 74 72 61 20 72 65 67 69 73 74 65 72 73 20 6e  xtra registers n
1ca10 65 65 64 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74  eeded */.    int
1ca20 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   op;            
1ca30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73            /* Ins
1ca40 74 72 75 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20  truction opcode 
1ca50 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74  */.    char *zSt
1ca60 61 72 74 41 66 66 3b 20 20 20 20 20 20 20 20 20  artAff;         
1ca70 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20      /* Affinity 
1ca80 66 6f 72 20 73 74 61 72 74 20 6f 66 20 72 61 6e  for start of ran
1ca90 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  ge constraint */
1caa0 0a 20 20 20 20 63 68 61 72 20 63 45 6e 64 41 66  .    char cEndAf
1cab0 66 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  f = 0;          
1cac0 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 66 6f    /* Affinity fo
1cad0 72 20 65 6e 64 20 6f 66 20 72 61 6e 67 65 20 63  r end of range c
1cae0 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20  onstraint */.   
1caf0 20 75 38 20 62 53 65 65 6b 50 61 73 74 4e 75 6c   u8 bSeekPastNul
1cb00 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  l = 0;        /*
1cb10 20 54 72 75 65 20 74 6f 20 73 65 65 6b 20 70 61   True to seek pa
1cb20 73 74 20 69 6e 69 74 69 61 6c 20 6e 75 6c 6c 73  st initial nulls
1cb30 20 2a 2f 0a 20 20 20 20 75 38 20 62 53 74 6f 70   */.    u8 bStop
1cb40 41 74 4e 75 6c 6c 20 3d 20 30 3b 20 20 20 20 20  AtNull = 0;     
1cb50 20 20 20 20 20 2f 2a 20 41 64 64 20 63 6f 6e 64       /* Add cond
1cb60 69 74 69 6f 6e 20 74 6f 20 74 65 72 6d 69 6e 61  ition to termina
1cb70 74 65 20 61 74 20 4e 55 4c 4c 73 20 2a 2f 0a 0a  te at NULLs */..
1cb80 20 20 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70      pIdx = pLoop
1cb90 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
1cba0 3b 0a 20 20 20 20 69 49 64 78 43 75 72 20 3d 20  ;.    iIdxCur = 
1cbb0 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b  pLevel->iIdxCur;
1cbc0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 45 71  .    assert( nEq
1cbd0 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  >=pLoop->u.btree
1cbe0 2e 6e 53 6b 69 70 20 29 3b 0a 0a 20 20 20 20 2f  .nSkip );..    /
1cbf0 2a 20 49 66 20 74 68 69 73 20 6c 6f 6f 70 20 73  * If this loop s
1cc00 61 74 69 73 66 69 65 73 20 61 20 73 6f 72 74 20  atisfies a sort 
1cc10 6f 72 64 65 72 20 28 70 4f 72 64 65 72 42 79 29  order (pOrderBy)
1cc20 20 72 65 71 75 65 73 74 20 74 68 61 74 20 0a 20   request that . 
1cc30 20 20 20 2a 2a 20 77 61 73 20 70 61 73 73 65 64     ** was passed
1cc40 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
1cc50 6e 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61  n to implement a
1cc60 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20   "SELECT min(x) 
1cc70 2e 2e 2e 22 20 0a 20 20 20 20 2a 2a 20 71 75 65  ..." .    ** que
1cc80 72 79 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c  ry, then the cal
1cc90 6c 65 72 20 77 69 6c 6c 20 6f 6e 6c 79 20 61 6c  ler will only al
1cca0 6c 6f 77 20 74 68 65 20 6c 6f 6f 70 20 74 6f 20  low the loop to 
1ccb0 72 75 6e 20 66 6f 72 0a 20 20 20 20 2a 2a 20 61  run for.    ** a
1ccc0 20 73 69 6e 67 6c 65 20 69 74 65 72 61 74 69 6f   single iteratio
1ccd0 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  n. This means th
1cce0 61 74 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  at the first row
1ccf0 20 72 65 74 75 72 6e 65 64 0a 20 20 20 20 2a 2a   returned.    **
1cd00 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65   should not have
1cd10 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 73 74   a NULL value st
1cd20 6f 72 65 64 20 69 6e 20 27 78 27 2e 20 49 66 20  ored in 'x'. If 
1cd30 63 6f 6c 75 6d 6e 20 27 78 27 20 69 73 0a 20 20  column 'x' is.  
1cd40 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f    ** the first o
1cd50 6e 65 20 61 66 74 65 72 20 74 68 65 20 6e 45 71  ne after the nEq
1cd60 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
1cd70 61 69 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64  aints in the ind
1cd80 65 78 2c 0a 20 20 20 20 2a 2a 20 74 68 69 73 20  ex,.    ** this 
1cd90 72 65 71 75 69 72 65 73 20 73 6f 6d 65 20 73 70  requires some sp
1cda0 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a  ecial handling..
1cdb0 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
1cdc0 74 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  t( pWInfo->pOrde
1cdd0 72 42 79 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  rBy==0.         
1cde0 7c 7c 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  || pWInfo->pOrde
1cdf0 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 31 0a 20 20  rBy->nExpr==1.  
1ce00 20 20 20 20 20 20 20 7c 7c 20 28 70 57 49 6e 66         || (pWInf
1ce10 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 26 57 48  o->wctrlFlags&WH
1ce20 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 29  ERE_ORDERBY_MIN)
1ce30 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28  ==0 );.    if( (
1ce40 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
1ce50 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42 59  gs&WHERE_ORDERBY
1ce60 5f 4d 49 4e 29 21 3d 30 0a 20 20 20 20 20 26 26  _MIN)!=0.     &&
1ce70 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3e   pWInfo->nOBSat>
1ce80 30 0a 20 20 20 20 20 26 26 20 28 70 49 64 78 2d  0.     && (pIdx-
1ce90 3e 6e 4b 65 79 43 6f 6c 3e 6e 45 71 29 0a 20 20  >nKeyCol>nEq).  
1cea0 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72    ){.      asser
1ceb0 74 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  t( pLoop->u.btre
1cec0 65 2e 6e 53 6b 69 70 3d 3d 30 20 29 3b 0a 20 20  e.nSkip==0 );.  
1ced0 20 20 20 20 62 53 65 65 6b 50 61 73 74 4e 75 6c      bSeekPastNul
1cee0 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 6e 45 78  l = 1;.      nEx
1cef0 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20  traReg = 1;.    
1cf00 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 61  }..    /* Find a
1cf10 6e 79 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  ny inequality co
1cf20 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20 66  nstraint terms f
1cf30 6f 72 20 74 68 65 20 73 74 61 72 74 20 61 6e 64  or the start and
1cf40 20 65 6e 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20   end .    ** of 
1cf50 74 68 65 20 72 61 6e 67 65 2e 20 0a 20 20 20 20  the range. .    
1cf60 2a 2f 0a 20 20 20 20 6a 20 3d 20 6e 45 71 3b 0a  */.    j = nEq;.
1cf70 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
1cf80 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42  sFlags & WHERE_B
1cf90 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  TM_LIMIT ){.    
1cfa0 20 20 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20    pRangeStart = 
1cfb0 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b  pLoop->aLTerm[j+
1cfc0 2b 5d 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61  +];.      nExtra
1cfd0 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  Reg = 1;.    }. 
1cfe0 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73     if( pLoop->ws
1cff0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f  Flags & WHERE_TO
1d000 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20  P_LIMIT ){.     
1d010 20 70 52 61 6e 67 65 45 6e 64 20 3d 20 70 4c 6f   pRangeEnd = pLo
1d020 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b  op->aLTerm[j++];
1d030 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65 67  .      nExtraReg
1d040 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   = 1;.      if( 
1d050 70 52 61 6e 67 65 53 74 61 72 74 3d 3d 30 0a 20  pRangeStart==0. 
1d060 20 20 20 20 20 20 26 26 20 28 6a 20 3d 20 70 49        && (j = pI
1d070 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71  dx->aiColumn[nEq
1d080 5d 29 3e 3d 30 20 0a 20 20 20 20 20 20 20 26 26  ])>=0 .       &&
1d090 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61   pIdx->pTable->a
1d0a0 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d  Col[j].notNull==
1d0b0 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  0.      ){.     
1d0c0 20 20 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c     bSeekPastNull
1d0d0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
1d0e0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
1d0f0 70 52 61 6e 67 65 45 6e 64 3d 3d 30 20 7c 7c 20  pRangeEnd==0 || 
1d100 28 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c  (pRangeEnd->wtFl
1d110 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
1d120 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  )==0 );..    /* 
1d130 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
1d140 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 63 6f   evaluate all co
1d150 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20 75  nstraint terms u
1d160 73 69 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a 20 20  sing == or IN.  
1d170 20 20 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74    ** and store t
1d180 68 65 20 76 61 6c 75 65 73 20 6f 66 20 74 68 6f  he values of tho
1d190 73 65 20 74 65 72 6d 73 20 69 6e 20 61 6e 20 61  se terms in an a
1d1a0 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
1d1b0 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e  s.    ** startin
1d1c0 67 20 61 74 20 72 65 67 42 61 73 65 2e 0a 20 20  g at regBase..  
1d1d0 20 20 2a 2f 0a 20 20 20 20 72 65 67 42 61 73 65    */.    regBase
1d1e0 20 3d 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69   = codeAllEquali
1d1f0 74 79 54 65 72 6d 73 28 70 50 61 72 73 65 2c 70  tyTerms(pParse,p
1d200 4c 65 76 65 6c 2c 62 52 65 76 2c 6e 45 78 74 72  Level,bRev,nExtr
1d210 61 52 65 67 2c 26 7a 53 74 61 72 74 41 66 66 29  aReg,&zStartAff)
1d220 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 53  ;.    assert( zS
1d230 74 61 72 74 41 66 66 3d 3d 30 20 7c 7c 20 73 71  tartAff==0 || sq
1d240 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 53  lite3Strlen30(zS
1d250 74 61 72 74 41 66 66 29 3e 3d 6e 45 71 20 29 3b  tartAff)>=nEq );
1d260 0a 20 20 20 20 69 66 28 20 7a 53 74 61 72 74 41  .    if( zStartA
1d270 66 66 20 29 20 63 45 6e 64 41 66 66 20 3d 20 7a  ff ) cEndAff = z
1d280 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 3b 0a 20  StartAff[nEq];. 
1d290 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65     addrNxt = pLe
1d2a0 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 0a 20  vel->addrNxt;.. 
1d2b0 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20     /* If we are 
1d2c0 64 6f 69 6e 67 20 61 20 72 65 76 65 72 73 65 20  doing a reverse 
1d2d0 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e 20 61 6e  order scan on an
1d2e0 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78   ascending index
1d2f0 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 66 6f  , or.    ** a fo
1d300 72 77 61 72 64 20 6f 72 64 65 72 20 73 63 61 6e  rward order scan
1d310 20 6f 6e 20 61 20 64 65 73 63 65 6e 64 69 6e 67   on a descending
1d320 20 69 6e 64 65 78 2c 20 69 6e 74 65 72 63 68 61   index, intercha
1d330 6e 67 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  nge the .    ** 
1d340 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20 74 65  start and end te
1d350 72 6d 73 20 28 70 52 61 6e 67 65 53 74 61 72 74  rms (pRangeStart
1d360 20 61 6e 64 20 70 52 61 6e 67 65 45 6e 64 29 2e   and pRangeEnd).
1d370 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1d380 28 6e 45 71 3c 70 49 64 78 2d 3e 6e 4b 65 79 43  (nEq<pIdx->nKeyC
1d390 6f 6c 20 26 26 20 62 52 65 76 3d 3d 28 70 49 64  ol && bRev==(pId
1d3a0 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45  x->aSortOrder[nE
1d3b0 71 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53  q]==SQLITE_SO_AS
1d3c0 43 29 29 0a 20 20 20 20 20 7c 7c 20 28 62 52 65  C)).     || (bRe
1d3d0 76 20 26 26 20 70 49 64 78 2d 3e 6e 4b 65 79 43  v && pIdx->nKeyC
1d3e0 6f 6c 3d 3d 6e 45 71 29 0a 20 20 20 20 29 7b 0a  ol==nEq).    ){.
1d3f0 20 20 20 20 20 20 53 57 41 50 28 57 68 65 72 65        SWAP(Where
1d400 54 65 72 6d 20 2a 2c 20 70 52 61 6e 67 65 45 6e  Term *, pRangeEn
1d410 64 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b  d, pRangeStart);
1d420 0a 20 20 20 20 20 20 53 57 41 50 28 75 38 2c 20  .      SWAP(u8, 
1d430 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 2c 20 62  bSeekPastNull, b
1d440 53 74 6f 70 41 74 4e 75 6c 6c 29 3b 0a 20 20 20  StopAtNull);.   
1d450 20 7d 0a 0a 20 20 20 20 74 65 73 74 63 61 73 65   }..    testcase
1d460 28 20 70 52 61 6e 67 65 53 74 61 72 74 20 26 26  ( pRangeStart &&
1d470 20 28 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65   (pRangeStart->e
1d480 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45  Operator & WO_LE
1d490 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74  )!=0 );.    test
1d4a0 63 61 73 65 28 20 70 52 61 6e 67 65 53 74 61 72  case( pRangeStar
1d4b0 74 20 26 26 20 28 70 52 61 6e 67 65 53 74 61 72  t && (pRangeStar
1d4c0 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  t->eOperator & W
1d4d0 4f 5f 47 45 29 21 3d 30 20 29 3b 0a 20 20 20 20  O_GE)!=0 );.    
1d4e0 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65  testcase( pRange
1d4f0 45 6e 64 20 26 26 20 28 70 52 61 6e 67 65 45 6e  End && (pRangeEn
1d500 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  d->eOperator & W
1d510 4f 5f 4c 45 29 21 3d 30 20 29 3b 0a 20 20 20 20  O_LE)!=0 );.    
1d520 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65  testcase( pRange
1d530 45 6e 64 20 26 26 20 28 70 52 61 6e 67 65 45 6e  End && (pRangeEn
1d540 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  d->eOperator & W
1d550 4f 5f 47 45 29 21 3d 30 20 29 3b 0a 20 20 20 20  O_GE)!=0 );.    
1d560 73 74 61 72 74 45 71 20 3d 20 21 70 52 61 6e 67  startEq = !pRang
1d570 65 53 74 61 72 74 20 7c 7c 20 70 52 61 6e 67 65  eStart || pRange
1d580 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72  Start->eOperator
1d590 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29   & (WO_LE|WO_GE)
1d5a0 3b 0a 20 20 20 20 65 6e 64 45 71 20 3d 20 20 20  ;.    endEq =   
1d5b0 21 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20 70 52  !pRangeEnd || pR
1d5c0 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74  angeEnd->eOperat
1d5d0 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47  or & (WO_LE|WO_G
1d5e0 45 29 3b 0a 20 20 20 20 73 74 61 72 74 5f 63 6f  E);.    start_co
1d5f0 6e 73 74 72 61 69 6e 74 73 20 3d 20 70 52 61 6e  nstraints = pRan
1d600 67 65 53 74 61 72 74 20 7c 7c 20 6e 45 71 3e 30  geStart || nEq>0
1d610 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20 74  ;..    /* Seek t
1d620 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20  he index cursor 
1d630 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
1d640 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20  the range. */.  
1d650 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20    nConstraint = 
1d660 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70 52 61  nEq;.    if( pRa
1d670 6e 67 65 53 74 61 72 74 20 29 7b 0a 20 20 20 20  ngeStart ){.    
1d680 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d    Expr *pRight =
1d690 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 70 45   pRangeStart->pE
1d6a0 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
1d6b0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1d6c0 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  de(pParse, pRigh
1d6d0 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b  t, regBase+nEq);
1d6e0 0a 20 20 20 20 20 20 69 66 28 20 28 70 52 61 6e  .      if( (pRan
1d6f0 67 65 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73  geStart->wtFlags
1d700 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d   & TERM_VNULL)==
1d710 30 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69  0.       && sqli
1d720 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c  te3ExprCanBeNull
1d730 28 70 52 69 67 68 74 29 0a 20 20 20 20 20 20 29  (pRight).      )
1d740 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1d750 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1d760 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 42 61 73  P_IsNull, regBas
1d770 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74 29 3b  e+nEq, addrNxt);
1d780 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
1d790 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
1d7a0 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 53 74 61  }.      if( zSta
1d7b0 72 74 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20  rtAff ){.       
1d7c0 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70   if( sqlite3Comp
1d7d0 61 72 65 41 66 66 69 6e 69 74 79 28 70 52 69 67  areAffinity(pRig
1d7e0 68 74 2c 20 7a 53 74 61 72 74 41 66 66 5b 6e 45  ht, zStartAff[nE
1d7f0 71 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  q])==SQLITE_AFF_
1d800 4e 4f 4e 45 29 7b 0a 20 20 20 20 20 20 20 20 20  NONE){.         
1d810 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 63 6f   /* Since the co
1d820 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 6f 20 62  mparison is to b
1d830 65 20 70 65 72 66 6f 72 6d 65 64 20 77 69 74 68  e performed with
1d840 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a   no conversions.
1d850 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70            ** app
1d860 6c 69 65 64 20 74 6f 20 74 68 65 20 6f 70 65 72  lied to the oper
1d870 61 6e 64 73 2c 20 73 65 74 20 74 68 65 20 61 66  ands, set the af
1d880 66 69 6e 69 74 79 20 74 6f 20 61 70 70 6c 79 20  finity to apply 
1d890 74 6f 20 70 52 69 67 68 74 20 74 6f 20 0a 20 20  to pRight to .  
1d8a0 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54          ** SQLIT
1d8b0 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a  E_AFF_NONE.  */.
1d8c0 20 20 20 20 20 20 20 20 20 20 7a 53 74 61 72 74            zStart
1d8d0 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54  Aff[nEq] = SQLIT
1d8e0 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
1d8f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1d900 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65  ( sqlite3ExprNee
1d910 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e  dsNoAffinityChan
1d920 67 65 28 70 52 69 67 68 74 2c 20 7a 53 74 61 72  ge(pRight, zStar
1d930 74 41 66 66 5b 6e 45 71 5d 29 20 29 7b 0a 20 20  tAff[nEq]) ){.  
1d940 20 20 20 20 20 20 20 20 7a 53 74 61 72 74 41 66          zStartAf
1d950 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f  f[nEq] = SQLITE_
1d960 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  AFF_NONE;.      
1d970 20 20 7d 0a 20 20 20 20 20 20 7d 20 20 0a 20 20    }.      }  .  
1d980 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b      nConstraint+
1d990 2b 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  +;.      testcas
1d9a0 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e  e( pRangeStart->
1d9b0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
1d9c0 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 7d 65  IRTUAL );.    }e
1d9d0 6c 73 65 20 69 66 28 20 62 53 65 65 6b 50 61 73  lse if( bSeekPas
1d9e0 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73  tNull ){.      s
1d9f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1da00 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
1da10 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20  regBase+nEq);.  
1da20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b      nConstraint+
1da30 2b 3b 0a 20 20 20 20 20 20 73 74 61 72 74 45 71  +;.      startEq
1da40 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 61 72   = 0;.      star
1da50 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20  t_constraints = 
1da60 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f 64  1;.    }.    cod
1da70 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70  eApplyAffinity(p
1da80 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20  Parse, regBase, 
1da90 6e 43 6f 6e 73 74 72 61 69 6e 74 20 2d 20 62 53  nConstraint - bS
1daa0 65 65 6b 50 61 73 74 4e 75 6c 6c 2c 20 7a 53 74  eekPastNull, zSt
1dab0 61 72 74 41 66 66 29 3b 0a 20 20 20 20 6f 70 20  artAff);.    op 
1dac0 3d 20 61 53 74 61 72 74 4f 70 5b 28 73 74 61 72  = aStartOp[(star
1dad0 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3c 3c 32  t_constraints<<2
1dae0 29 20 2b 20 28 73 74 61 72 74 45 71 3c 3c 31 29  ) + (startEq<<1)
1daf0 20 2b 20 62 52 65 76 5d 3b 0a 20 20 20 20 61 73   + bRev];.    as
1db00 73 65 72 74 28 20 6f 70 21 3d 30 20 29 3b 0a 20  sert( op!=0 );. 
1db10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1db20 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69  dOp4Int(v, op, i
1db30 49 64 78 43 75 72 2c 20 61 64 64 72 4e 78 74 2c  IdxCur, addrNxt,
1db40 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74   regBase, nConst
1db50 72 61 69 6e 74 29 3b 0a 20 20 20 20 56 64 62 65  raint);.    Vdbe
1db60 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1db70 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1db80 76 2c 20 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64  v, op==OP_Rewind
1db90 29 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f 70  );  testcase( op
1dba0 3d 3d 4f 50 5f 52 65 77 69 6e 64 20 29 3b 0a 20  ==OP_Rewind );. 
1dbb0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
1dbc0 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4c 61 73 74  f(v, op==OP_Last
1dbd0 29 3b 20 20 20 20 74 65 73 74 63 61 73 65 28 20  );    testcase( 
1dbe0 6f 70 3d 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a 20  op==OP_Last );. 
1dbf0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
1dc00 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b  f(v, op==OP_Seek
1dc10 47 54 29 3b 20 20 74 65 73 74 63 61 73 65 28 20  GT);  testcase( 
1dc20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 54 20 29 3b  op==OP_SeekGT );
1dc30 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
1dc40 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65  eIf(v, op==OP_Se
1dc50 65 6b 47 45 29 3b 20 20 74 65 73 74 63 61 73 65  ekGE);  testcase
1dc60 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 45 20  ( op==OP_SeekGE 
1dc70 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
1dc80 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
1dc90 53 65 65 6b 4c 45 29 3b 20 20 74 65 73 74 63 61  SeekLE);  testca
1dca0 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c  se( op==OP_SeekL
1dcb0 45 20 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  E );.    VdbeCov
1dcc0 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
1dcd0 50 5f 53 65 65 6b 4c 54 29 3b 20 20 74 65 73 74  P_SeekLT);  test
1dce0 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65  case( op==OP_See
1dcf0 6b 4c 54 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c  kLT );..    /* L
1dd00 6f 61 64 20 74 68 65 20 76 61 6c 75 65 20 66 6f  oad the value fo
1dd10 72 20 74 68 65 20 69 6e 65 71 75 61 6c 69 74 79  r the inequality
1dd20 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 74   constraint at t
1dd30 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20  he end of the.  
1dd40 20 20 2a 2a 20 72 61 6e 67 65 20 28 69 66 20 61    ** range (if a
1dd50 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ny)..    */.    
1dd60 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45  nConstraint = nE
1dd70 71 3b 0a 20 20 20 20 69 66 28 20 70 52 61 6e 67  q;.    if( pRang
1dd80 65 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 45 78  eEnd ){.      Ex
1dd90 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 52 61  pr *pRight = pRa
1dda0 6e 67 65 45 6e 64 2d 3e 70 45 78 70 72 2d 3e 70  ngeEnd->pExpr->p
1ddb0 52 69 67 68 74 3b 0a 20 20 20 20 20 20 73 71 6c  Right;.      sql
1ddc0 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d  ite3ExprCacheRem
1ddd0 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 42  ove(pParse, regB
1dde0 61 73 65 2b 6e 45 71 2c 20 31 29 3b 0a 20 20 20  ase+nEq, 1);.   
1ddf0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1de00 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  de(pParse, pRigh
1de10 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b  t, regBase+nEq);
1de20 0a 20 20 20 20 20 20 69 66 28 20 28 70 52 61 6e  .      if( (pRan
1de30 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26  geEnd->wtFlags &
1de40 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 0a   TERM_VNULL)==0.
1de50 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
1de60 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70  3ExprCanBeNull(p
1de70 52 69 67 68 74 29 0a 20 20 20 20 20 20 29 7b 0a  Right).      ){.
1de80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1de90 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1dea0 49 73 4e 75 6c 6c 2c 20 72 65 67 42 61 73 65 2b  IsNull, regBase+
1deb0 6e 45 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20  nEq, addrNxt);. 
1dec0 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
1ded0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a  age(v);.      }.
1dee0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1def0 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
1df00 28 70 52 69 67 68 74 2c 20 63 45 6e 64 41 66 66  (pRight, cEndAff
1df10 29 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  )!=SQLITE_AFF_NO
1df20 4e 45 0a 20 20 20 20 20 20 20 26 26 20 21 73 71  NE.       && !sq
1df30 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f  lite3ExprNeedsNo
1df40 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
1df50 52 69 67 68 74 2c 20 63 45 6e 64 41 66 66 29 0a  Right, cEndAff).
1df60 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
1df70 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69   codeApplyAffini
1df80 74 79 28 70 50 61 72 73 65 2c 20 72 65 67 42 61  ty(pParse, regBa
1df90 73 65 2b 6e 45 71 2c 20 31 2c 20 26 63 45 6e 64  se+nEq, 1, &cEnd
1dfa0 41 66 66 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Aff);.      }.  
1dfb0 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b      nConstraint+
1dfc0 2b 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  +;.      testcas
1dfd0 65 28 20 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74  e( pRangeEnd->wt
1dfe0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
1dff0 54 55 41 4c 20 29 3b 0a 20 20 20 20 7d 65 6c 73  TUAL );.    }els
1e000 65 20 69 66 28 20 62 53 74 6f 70 41 74 4e 75 6c  e if( bStopAtNul
1e010 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
1e020 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1e030 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 42  OP_Null, 0, regB
1e040 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20  ase+nEq);.      
1e050 65 6e 64 45 71 20 3d 20 30 3b 0a 20 20 20 20 20  endEq = 0;.     
1e060 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a   nConstraint++;.
1e070 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1e080 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74 61  3DbFree(db, zSta
1e090 72 74 41 66 66 29 3b 0a 0a 20 20 20 20 2f 2a 20  rtAff);..    /* 
1e0a0 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  Top of the loop 
1e0b0 62 6f 64 79 20 2a 2f 0a 20 20 20 20 70 4c 65 76  body */.    pLev
1e0c0 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33  el->p2 = sqlite3
1e0d0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
1e0e0 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  v);..    /* Chec
1e0f0 6b 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 63  k if the index c
1e100 75 72 73 6f 72 20 69 73 20 70 61 73 74 20 74 68  ursor is past th
1e110 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72 61 6e  e end of the ran
1e120 67 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e  ge. */.    if( n
1e130 43 6f 6e 73 74 72 61 69 6e 74 20 29 7b 0a 20 20  Constraint ){.  
1e140 20 20 20 20 6f 70 20 3d 20 61 45 6e 64 4f 70 5b      op = aEndOp[
1e150 62 52 65 76 2a 32 20 2b 20 65 6e 64 45 71 5d 3b  bRev*2 + endEq];
1e160 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1e170 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f  beAddOp4Int(v, o
1e180 70 2c 20 69 49 64 78 43 75 72 2c 20 61 64 64 72  p, iIdxCur, addr
1e190 4e 78 74 2c 20 72 65 67 42 61 73 65 2c 20 6e 43  Nxt, regBase, nC
1e1a0 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 20 20  onstraint);.    
1e1b0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1e1c0 4f 50 5f 49 64 78 47 54 20 29 3b 20 20 56 64 62  OP_IdxGT );  Vdb
1e1d0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
1e1e0 70 3d 3d 4f 50 5f 49 64 78 47 54 20 29 3b 0a 20  p==OP_IdxGT );. 
1e1f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1e200 70 3d 3d 4f 50 5f 49 64 78 47 45 20 29 3b 20 20  p==OP_IdxGE );  
1e210 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1e220 2c 20 6f 70 3d 3d 4f 50 5f 49 64 78 47 45 20 29  , op==OP_IdxGE )
1e230 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1e240 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54 20 29  ( op==OP_IdxLT )
1e250 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ;  VdbeCoverageI
1e260 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c  f(v, op==OP_IdxL
1e270 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
1e280 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c  ase( op==OP_IdxL
1e290 45 20 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61  E );  VdbeCovera
1e2a0 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 49  geIf(v, op==OP_I
1e2b0 64 78 4c 45 20 29 3b 0a 20 20 20 20 7d 0a 0a 20  dxLE );.    }.. 
1e2c0 20 20 20 2f 2a 20 53 65 65 6b 20 74 68 65 20 74     /* Seek the t
1e2d0 61 62 6c 65 20 63 75 72 73 6f 72 2c 20 69 66 20  able cursor, if 
1e2e0 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20  required */.    
1e2f0 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
1e300 65 6c 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29  el, pRangeStart)
1e310 3b 0a 20 20 20 20 64 69 73 61 62 6c 65 54 65 72  ;.    disableTer
1e320 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65  m(pLevel, pRange
1e330 45 6e 64 29 3b 0a 20 20 20 20 69 66 28 20 6f 6d  End);.    if( om
1e340 69 74 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  itTable ){.     
1e350 20 2f 2a 20 70 49 64 78 20 69 73 20 61 20 63 6f   /* pIdx is a co
1e360 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 4e  vering index.  N
1e370 6f 20 6e 65 65 64 20 74 6f 20 61 63 63 65 73 73  o need to access
1e380 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e   the main table.
1e390 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   */.    }else if
1e3a0 28 20 48 61 73 52 6f 77 69 64 28 70 49 64 78 2d  ( HasRowid(pIdx-
1e3b0 3e 70 54 61 62 6c 65 29 20 29 7b 0a 20 20 20 20  >pTable) ){.    
1e3c0 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20 2b 2b    iRowidReg = ++
1e3d0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
1e3e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1e3f0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 52  ddOp2(v, OP_IdxR
1e400 6f 77 69 64 2c 20 69 49 64 78 43 75 72 2c 20 69  owid, iIdxCur, i
1e410 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20  RowidReg);.     
1e420 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1e430 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69  eStore(pParse, i
1e440 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52  Cur, -1, iRowidR
1e450 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  eg);.      sqlit
1e460 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1e470 4f 50 5f 53 65 65 6b 2c 20 69 43 75 72 2c 20 69  OP_Seek, iCur, i
1e480 52 6f 77 69 64 52 65 67 29 3b 20 20 2f 2a 20 44  RowidReg);  /* D
1e490 65 66 65 72 72 65 64 20 73 65 65 6b 20 2a 2f 0a  eferred seek */.
1e4a0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 43      }else if( iC
1e4b0 75 72 21 3d 69 49 64 78 43 75 72 20 29 7b 0a 20  ur!=iIdxCur ){. 
1e4c0 20 20 20 20 20 49 6e 64 65 78 20 2a 70 50 6b 20       Index *pPk 
1e4d0 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  = sqlite3Primary
1e4e0 4b 65 79 49 6e 64 65 78 28 70 49 64 78 2d 3e 70  KeyIndex(pIdx->p
1e4f0 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 69 52  Table);.      iR
1e500 6f 77 69 64 52 65 67 20 3d 20 73 71 6c 69 74 65  owidReg = sqlite
1e510 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
1e520 61 72 73 65 2c 20 70 50 6b 2d 3e 6e 4b 65 79 43  arse, pPk->nKeyC
1e530 6f 6c 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  ol);.      for(j
1e540 3d 30 3b 20 6a 3c 70 50 6b 2d 3e 6e 4b 65 79 43  =0; j<pPk->nKeyC
1e550 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
1e560 20 20 6b 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c    k = sqlite3Col
1e570 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49 64 78 2c  umnOfIndex(pIdx,
1e580 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a   pPk->aiColumn[j
1e590 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ]);.        sqli
1e5a0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1e5b0 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78   OP_Column, iIdx
1e5c0 43 75 72 2c 20 6b 2c 20 69 52 6f 77 69 64 52 65  Cur, k, iRowidRe
1e5d0 67 2b 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  g+j);.      }.  
1e5e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1e5f0 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e  ddOp4Int(v, OP_N
1e600 6f 74 46 6f 75 6e 64 2c 20 69 43 75 72 2c 20 61  otFound, iCur, a
1e610 64 64 72 43 6f 6e 74 2c 0a 20 20 20 20 20 20 20  ddrCont,.       
1e620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e630 20 20 20 20 69 52 6f 77 69 64 52 65 67 2c 20 70      iRowidReg, p
1e640 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56 64  Pk->nKeyCol); Vd
1e650 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1e660 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 63     }..    /* Rec
1e670 6f 72 64 20 74 68 65 20 69 6e 73 74 72 75 63 74  ord the instruct
1e680 69 6f 6e 20 75 73 65 64 20 74 6f 20 74 65 72 6d  ion used to term
1e690 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20  inate the loop. 
1e6a0 44 69 73 61 62 6c 65 20 0a 20 20 20 20 2a 2a 20  Disable .    ** 
1e6b0 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
1e6c0 6d 73 20 6d 61 64 65 20 72 65 64 75 6e 64 61 6e  ms made redundan
1e6d0 74 20 62 79 20 74 68 65 20 69 6e 64 65 78 20 72  t by the index r
1e6e0 61 6e 67 65 20 73 63 61 6e 2e 0a 20 20 20 20 2a  ange scan..    *
1e6f0 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d  /.    if( pLoop-
1e700 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
1e710 5f 4f 4e 45 52 4f 57 20 29 7b 0a 20 20 20 20 20  _ONEROW ){.     
1e720 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
1e730 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c 73 65  _Noop;.    }else
1e740 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20   if( bRev ){.   
1e750 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
1e760 4f 50 5f 50 72 65 76 3b 0a 20 20 20 20 7d 65 6c  OP_Prev;.    }el
1e770 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  se{.      pLevel
1e780 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a  ->op = OP_Next;.
1e790 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c      }.    pLevel
1e7a0 2d 3e 70 31 20 3d 20 69 49 64 78 43 75 72 3b 0a  ->p1 = iIdxCur;.
1e7b0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 33 20 3d      pLevel->p3 =
1e7c0 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
1e7d0 26 57 48 45 52 45 5f 55 4e 51 5f 57 41 4e 54 45  &WHERE_UNQ_WANTE
1e7e0 44 29 21 3d 30 20 3f 20 31 3a 30 3b 0a 20 20 20  D)!=0 ? 1:0;.   
1e7f0 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
1e800 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4e  lags & WHERE_CON
1e810 53 54 52 41 49 4e 54 29 3d 3d 30 20 29 7b 0a 20  STRAINT)==0 ){. 
1e820 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20       pLevel->p5 
1e830 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  = SQLITE_STMTSTA
1e840 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45  TUS_FULLSCAN_STE
1e850 50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  P;.    }else{.  
1e860 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 76      assert( pLev
1e870 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 20  el->p5==0 );.   
1e880 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e   }.  }else..#ifn
1e890 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1e8a0 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a  OR_OPTIMIZATION.
1e8b0 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
1e8c0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c  lags & WHERE_MUL
1e8d0 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20 2f 2a 20  TI_OR ){.    /* 
1e8e0 43 61 73 65 20 35 3a 20 20 54 77 6f 20 6f 72 20  Case 5:  Two or 
1e8f0 6d 6f 72 65 20 73 65 70 61 72 61 74 65 6c 79 20  more separately 
1e900 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63 6f  indexed terms co
1e910 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 0a 20 20  nnected by OR.  
1e920 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d    **.    ** Exam
1e930 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ple:.    **.    
1e940 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
1e950 45 20 74 31 28 61 2c 62 2c 63 2c 64 29 3b 0a 20  E t1(a,b,c,d);. 
1e960 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49     **   CREATE I
1e970 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61 29  NDEX i1 ON t1(a)
1e980 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54  ;.    **   CREAT
1e990 45 20 49 4e 44 45 58 20 69 32 20 4f 4e 20 74 31  E INDEX i2 ON t1
1e9a0 28 62 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52  (b);.    **   CR
1e9b0 45 41 54 45 20 49 4e 44 45 58 20 69 33 20 4f 4e  EATE INDEX i3 ON
1e9c0 20 74 31 28 63 29 3b 0a 20 20 20 20 2a 2a 0a 20   t1(c);.    **. 
1e9d0 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a     **   SELECT *
1e9e0 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
1e9f0 3d 35 20 4f 52 20 62 3d 37 20 4f 52 20 28 63 3d  =5 OR b=7 OR (c=
1ea00 31 31 20 41 4e 44 20 64 3d 31 33 29 0a 20 20 20  11 AND d=13).   
1ea10 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68   **.    ** In th
1ea20 65 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 72 65  e example, there
1ea30 20 61 72 65 20 74 68 72 65 65 20 69 6e 64 65 78   are three index
1ea40 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74  ed terms connect
1ea50 65 64 20 62 79 20 4f 52 2e 0a 20 20 20 20 2a 2a  ed by OR..    **
1ea60 20 54 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   The top of the 
1ea70 6c 6f 6f 70 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20  loop looks like 
1ea80 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  this:.    **.   
1ea90 20 2a 2a 20 20 20 20 20 20 20 20 20 20 4e 75 6c   **          Nul
1eaa0 6c 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20  l       1       
1eab0 20 20 20 20 20 20 20 20 20 23 20 5a 65 72 6f 20           # Zero 
1eac0 74 68 65 20 72 6f 77 73 65 74 20 69 6e 20 72 65  the rowset in re
1ead0 67 20 31 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  g 1.    **.    *
1eae0 2a 20 54 68 65 6e 2c 20 66 6f 72 20 65 61 63 68  * Then, for each
1eaf0 20 69 6e 64 65 78 65 64 20 74 65 72 6d 2c 20 74   indexed term, t
1eb00 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 2e 20 54 68  he following. Th
1eb10 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a 20  e arguments to. 
1eb20 20 20 20 2a 2a 20 52 6f 77 53 65 74 54 65 73 74     ** RowSetTest
1eb30 20 61 72 65 20 73 75 63 68 20 74 68 61 74 20 74   are such that t
1eb40 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20  he rowid of the 
1eb50 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20 69  current row is i
1eb60 6e 73 65 72 74 65 64 0a 20 20 20 20 2a 2a 20 69  nserted.    ** i
1eb70 6e 74 6f 20 74 68 65 20 52 6f 77 53 65 74 2e 20  nto the RowSet. 
1eb80 49 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  If it is already
1eb90 20 70 72 65 73 65 6e 74 2c 20 63 6f 6e 74 72 6f   present, contro
1eba0 6c 20 73 6b 69 70 73 20 74 68 65 0a 20 20 20 20  l skips the.    
1ebb0 2a 2a 20 47 6f 73 75 62 20 6f 70 63 6f 64 65 20  ** Gosub opcode 
1ebc0 61 6e 64 20 6a 75 6d 70 73 20 73 74 72 61 69 67  and jumps straig
1ebd0 68 74 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67  ht to the code g
1ebe0 65 6e 65 72 61 74 65 64 20 62 79 20 57 68 65 72  enerated by Wher
1ebf0 65 45 6e 64 28 29 2e 0a 20 20 20 20 2a 2a 0a 20  eEnd()..    **. 
1ec00 20 20 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c     **        sql
1ec10 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 3c  ite3WhereBegin(<
1ec20 74 65 72 6d 3e 29 0a 20 20 20 20 2a 2a 20 20 20  term>).    **   
1ec30 20 20 20 20 20 20 20 52 6f 77 53 65 74 54 65 73         RowSetTes
1ec40 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
1ec50 20 20 20 23 20 49 6e 73 65 72 74 20 72 6f 77 69     # Insert rowi
1ec60 64 20 69 6e 74 6f 20 72 6f 77 73 65 74 0a 20 20  d into rowset.  
1ec70 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47 6f    **          Go
1ec80 73 75 62 20 20 20 20 20 20 32 20 41 0a 20 20 20  sub      2 A.   
1ec90 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c 69 74   **        sqlit
1eca0 65 33 57 68 65 72 65 45 6e 64 28 29 0a 20 20 20  e3WhereEnd().   
1ecb0 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 6c 6c 6f   **.    ** Follo
1ecc0 77 69 6e 67 20 74 68 65 20 61 62 6f 76 65 2c 20  wing the above, 
1ecd0 63 6f 64 65 20 74 6f 20 74 65 72 6d 69 6e 61 74  code to terminat
1ece0 65 20 74 68 65 20 6c 6f 6f 70 2e 20 4c 61 62 65  e the loop. Labe
1ecf0 6c 20 41 2c 20 74 68 65 20 74 61 72 67 65 74 0a  l A, the target.
1ed00 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 47 6f      ** of the Go
1ed10 73 75 62 20 61 62 6f 76 65 2c 20 6a 75 6d 70 73  sub above, jumps
1ed20 20 74 6f 20 74 68 65 20 69 6e 73 74 72 75 63 74   to the instruct
1ed30 69 6f 6e 20 72 69 67 68 74 20 61 66 74 65 72 20  ion right after 
1ed40 74 68 65 20 47 6f 74 6f 2e 0a 20 20 20 20 2a 2a  the Goto..    **
1ed50 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1ed60 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20 20 20   Null       1   
1ed70 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 5a               # Z
1ed80 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74 20 69  ero the rowset i
1ed90 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a 20 20  n reg 1.    **  
1eda0 20 20 20 20 20 20 20 20 47 6f 74 6f 20 20 20 20          Goto    
1edb0 20 20 20 42 20 20 20 20 20 20 20 20 20 20 20 20     B            
1edc0 20 20 20 20 23 20 54 68 65 20 6c 6f 6f 70 20 69      # The loop i
1edd0 73 20 66 69 6e 69 73 68 65 64 2e 0a 20 20 20 20  s finished..    
1ede0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
1edf0 41 3a 20 3c 6c 6f 6f 70 20 62 6f 64 79 3e 20 20  A: <loop body>  
1ee00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
1ee10 20 52 65 74 75 72 6e 20 64 61 74 61 2c 20 77 68   Return data, wh
1ee20 61 74 65 76 65 72 2e 0a 20 20 20 20 2a 2a 0a 20  atever..    **. 
1ee30 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 52     **          R
1ee40 65 74 75 72 6e 20 20 20 20 20 32 20 20 20 20 20  eturn     2     
1ee50 20 20 20 20 20 20 20 20 20 20 20 23 20 4a 75 6d             # Jum
1ee60 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20 47 6f  p back to the Go
1ee70 73 75 62 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  sub.    **.    *
1ee80 2a 20 20 20 20 20 20 20 42 3a 20 3c 61 66 74 65  *       B: <afte
1ee90 72 20 74 68 65 20 6c 6f 6f 70 3e 0a 20 20 20 20  r the loop>.    
1eea0 2a 2a 0a 20 20 20 20 2a 2a 20 41 64 64 65 64 20  **.    ** Added 
1eeb0 32 30 31 34 2d 30 35 2d 32 36 3a 20 49 66 20 74  2014-05-26: If t
1eec0 68 65 20 74 61 62 6c 65 20 69 73 20 61 20 57 49  he table is a WI
1eed0 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
1eee0 65 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 75  e, then.    ** u
1eef0 73 65 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  se an ephemeral 
1ef00 69 6e 64 65 78 20 69 6e 73 74 65 61 64 20 6f 66  index instead of
1ef10 20 61 20 52 6f 77 53 65 74 20 74 6f 20 72 65 63   a RowSet to rec
1ef20 6f 72 64 20 74 68 65 20 70 72 69 6d 61 72 79 0a  ord the primary.
1ef30 20 20 20 20 2a 2a 20 6b 65 79 73 20 6f 66 20 74      ** keys of t
1ef40 68 65 20 72 6f 77 73 20 77 65 20 68 61 76 65 20  he rows we have 
1ef50 61 6c 72 65 61 64 79 20 73 65 65 6e 2e 0a 20 20  already seen..  
1ef60 20 20 2a 2a 0a 20 20 20 20 2a 2f 0a 20 20 20 20    **.    */.    
1ef70 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72  WhereClause *pOr
1ef80 57 63 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52  Wc;    /* The OR
1ef90 2d 63 6c 61 75 73 65 20 62 72 6f 6b 65 6e 20 6f  -clause broken o
1efa0 75 74 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73  ut into subterms
1efb0 20 2a 2f 0a 20 20 20 20 53 72 63 4c 69 73 74 20   */.    SrcList 
1efc0 2a 70 4f 72 54 61 62 3b 20 20 20 20 20 20 20 2f  *pOrTab;       /
1efd0 2a 20 53 68 6f 72 74 65 6e 65 64 20 74 61 62 6c  * Shortened tabl
1efe0 65 20 6c 69 73 74 20 6f 72 20 4f 52 2d 63 6c 61  e list or OR-cla
1eff0 75 73 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a  use generation *
1f000 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 43 6f  /.    Index *pCo
1f010 76 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  v = 0;          
1f020 20 20 20 2f 2a 20 50 6f 74 65 6e 74 69 61 6c 20     /* Potential 
1f030 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 28  covering index (
1f040 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 20 20  or NULL) */.    
1f050 69 6e 74 20 69 43 6f 76 43 75 72 20 3d 20 70 50  int iCovCur = pP
1f060 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 2f  arse->nTab++;  /
1f070 2a 20 43 75 72 73 6f 72 20 75 73 65 64 20 66 6f  * Cursor used fo
1f080 72 20 69 6e 64 65 78 20 73 63 61 6e 73 20 28 69  r index scans (i
1f090 66 20 61 6e 79 29 20 2a 2f 0a 0a 20 20 20 20 69  f any) */..    i
1f0a0 6e 74 20 72 65 67 52 65 74 75 72 6e 20 3d 20 2b  nt regReturn = +
1f0b0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20  +pParse->nMem;  
1f0c0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
1f0d0 73 74 65 72 20 75 73 65 64 20 77 69 74 68 20 4f  ster used with O
1f0e0 50 5f 47 6f 73 75 62 20 2a 2f 0a 20 20 20 20 69  P_Gosub */.    i
1f0f0 6e 74 20 72 65 67 52 6f 77 73 65 74 20 3d 20 30  nt regRowset = 0
1f100 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f110 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
1f120 73 74 65 72 20 66 6f 72 20 52 6f 77 53 65 74 20  ster for RowSet 
1f130 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 69 6e  object */.    in
1f140 74 20 72 65 67 52 6f 77 69 64 20 3d 20 30 3b 20  t regRowid = 0; 
1f150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f160 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
1f170 74 65 72 20 68 6f 6c 64 69 6e 67 20 72 6f 77 69  ter holding rowi
1f180 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4c 6f  d */.    int iLo
1f190 6f 70 42 6f 64 79 20 3d 20 73 71 6c 69 74 65 33  opBody = sqlite3
1f1a0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
1f1b0 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6c  ;  /* Start of l
1f1c0 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20  oop body */.    
1f1d0 69 6e 74 20 69 52 65 74 49 6e 69 74 3b 20 20 20  int iRetInit;   
1f1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f1f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
1f200 72 65 73 73 20 6f 66 20 72 65 67 52 65 74 75 72  ress of regRetur
1f210 6e 20 69 6e 69 74 20 2a 2f 0a 20 20 20 20 69 6e  n init */.    in
1f220 74 20 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20  t untestedTerms 
1f230 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1f240 20 2f 2a 20 53 6f 6d 65 20 74 65 72 6d 73 20 6e   /* Some terms n
1f250 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 74 65  ot completely te
1f260 73 74 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  sted */.    int 
1f270 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
1f280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f290 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
1f2a0 2f 0a 20 20 20 20 75 31 36 20 77 63 74 72 6c 46  /.    u16 wctrlF
1f2b0 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
1f2c0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
1f2d0 73 20 66 6f 72 20 73 75 62 2d 57 48 45 52 45 20  s for sub-WHERE 
1f2e0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 45 78  clause */.    Ex
1f2f0 70 72 20 2a 70 41 6e 64 45 78 70 72 20 3d 20 30  pr *pAndExpr = 0
1f300 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f310 20 2f 2a 20 41 6e 20 22 2e 2e 20 41 4e 44 20 28   /* An ".. AND (
1f320 2e 2e 2e 29 22 20 65 78 70 72 65 73 73 69 6f 6e  ...)" expression
1f330 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   */.    Table *p
1f340 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Tab = pTabItem->
1f350 70 54 61 62 3b 0a 20 20 20 0a 20 20 20 20 70 54  pTab;.   .    pT
1f360 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54  erm = pLoop->aLT
1f370 65 72 6d 5b 30 5d 3b 0a 20 20 20 20 61 73 73 65  erm[0];.    asse
1f380 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a  rt( pTerm!=0 );.
1f390 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
1f3a0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
1f3b0 4f 5f 4f 52 20 29 3b 0a 20 20 20 20 61 73 73 65  O_OR );.    asse
1f3c0 72 74 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c  rt( (pTerm->wtFl
1f3d0 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46  ags & TERM_ORINF
1f3e0 4f 29 21 3d 30 20 29 3b 0a 20 20 20 20 70 4f 72  O)!=0 );.    pOr
1f3f0 57 63 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70  Wc = &pTerm->u.p
1f400 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20  OrInfo->wc;.    
1f410 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
1f420 52 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c 65 76  Return;.    pLev
1f430 65 6c 2d 3e 70 31 20 3d 20 72 65 67 52 65 74 75  el->p1 = regRetu
1f440 72 6e 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20  rn;..    /* Set 
1f450 75 70 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74  up a new SrcList
1f460 20 69 6e 20 70 4f 72 54 61 62 20 63 6f 6e 74 61   in pOrTab conta
1f470 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20  ining the table 
1f480 62 65 69 6e 67 20 73 63 61 6e 6e 65 64 0a 20 20  being scanned.  
1f490 20 20 2a 2a 20 62 79 20 74 68 69 73 20 6c 6f 6f    ** by this loo
1f4a0 70 20 69 6e 20 74 68 65 20 61 5b 30 5d 20 73 6c  p in the a[0] sl
1f4b0 6f 74 20 61 6e 64 20 61 6c 6c 20 6e 6f 74 52 65  ot and all notRe
1f4c0 61 64 79 20 74 61 62 6c 65 73 20 69 6e 20 61 5b  ady tables in a[
1f4d0 31 2e 2e 5d 20 73 6c 6f 74 73 2e 0a 20 20 20 20  1..] slots..    
1f4e0 2a 2a 20 54 68 69 73 20 62 65 63 6f 6d 65 73 20  ** This becomes 
1f4f0 74 68 65 20 53 72 63 4c 69 73 74 20 69 6e 20 74  the SrcList in t
1f500 68 65 20 72 65 63 75 72 73 69 76 65 20 63 61 6c  he recursive cal
1f510 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  l to sqlite3Wher
1f520 65 42 65 67 69 6e 28 29 2e 0a 20 20 20 20 2a 2f  eBegin()..    */
1f530 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  .    if( pWInfo-
1f540 3e 6e 4c 65 76 65 6c 3e 31 20 29 7b 0a 20 20 20  >nLevel>1 ){.   
1f550 20 20 20 69 6e 74 20 6e 4e 6f 74 52 65 61 64 79     int nNotReady
1f560 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f570 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
1f580 6f 66 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c  of notReady tabl
1f590 65 73 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75  es */.      stru
1f5a0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1f5b0 2a 6f 72 69 67 53 72 63 3b 20 20 20 20 20 2f 2a  *origSrc;     /*
1f5c0 20 4f 72 69 67 69 6e 61 6c 20 6c 69 73 74 20 6f   Original list o
1f5d0 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20  f tables */.    
1f5e0 20 20 6e 4e 6f 74 52 65 61 64 79 20 3d 20 70 57    nNotReady = pW
1f5f0 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 2d 20 69  Info->nLevel - i
1f600 4c 65 76 65 6c 20 2d 20 31 3b 0a 20 20 20 20 20  Level - 1;.     
1f610 20 70 4f 72 54 61 62 20 3d 20 73 71 6c 69 74 65   pOrTab = sqlite
1f620 33 53 74 61 63 6b 41 6c 6c 6f 63 52 61 77 28 64  3StackAllocRaw(d
1f630 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
1f640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1f650 69 7a 65 6f 66 28 2a 70 4f 72 54 61 62 29 2b 20  izeof(*pOrTab)+ 
1f660 6e 4e 6f 74 52 65 61 64 79 2a 73 69 7a 65 6f 66  nNotReady*sizeof
1f670 28 70 4f 72 54 61 62 2d 3e 61 5b 30 5d 29 29 3b  (pOrTab->a[0]));
1f680 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 61  .      if( pOrTa
1f690 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 6e 6f  b==0 ) return no
1f6a0 74 52 65 61 64 79 3b 0a 20 20 20 20 20 20 70 4f  tReady;.      pO
1f6b0 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 28  rTab->nAlloc = (
1f6c0 75 38 29 28 6e 4e 6f 74 52 65 61 64 79 20 2b 20  u8)(nNotReady + 
1f6d0 31 29 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62  1);.      pOrTab
1f6e0 2d 3e 6e 53 72 63 20 3d 20 70 4f 72 54 61 62 2d  ->nSrc = pOrTab-
1f6f0 3e 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 6d  >nAlloc;.      m
1f700 65 6d 63 70 79 28 70 4f 72 54 61 62 2d 3e 61 2c  emcpy(pOrTab->a,
1f710 20 70 54 61 62 49 74 65 6d 2c 20 73 69 7a 65 6f   pTabItem, sizeo
1f720 66 28 2a 70 54 61 62 49 74 65 6d 29 29 3b 0a 20  f(*pTabItem));. 
1f730 20 20 20 20 20 6f 72 69 67 53 72 63 20 3d 20 70       origSrc = p
1f740 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
1f750 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d  >a;.      for(k=
1f760 31 3b 20 6b 3c 3d 6e 4e 6f 74 52 65 61 64 79 3b  1; k<=nNotReady;
1f770 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d   k++){.        m
1f780 65 6d 63 70 79 28 26 70 4f 72 54 61 62 2d 3e 61  emcpy(&pOrTab->a
1f790 5b 6b 5d 2c 20 26 6f 72 69 67 53 72 63 5b 70 4c  [k], &origSrc[pL
1f7a0 65 76 65 6c 5b 6b 5d 2e 69 46 72 6f 6d 5d 2c 20  evel[k].iFrom], 
1f7b0 73 69 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e 61  sizeof(pOrTab->a
1f7c0 5b 6b 5d 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  [k]));.      }. 
1f7d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f7e0 70 4f 72 54 61 62 20 3d 20 70 57 49 6e 66 6f 2d  pOrTab = pWInfo-
1f7f0 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 7d  >pTabList;.    }
1f800 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  ..    /* Initial
1f810 69 7a 65 20 74 68 65 20 72 6f 77 73 65 74 20 72  ize the rowset r
1f820 65 67 69 73 74 65 72 20 74 6f 20 63 6f 6e 74 61  egister to conta
1f830 69 6e 20 4e 55 4c 4c 2e 20 41 6e 20 53 51 4c 20  in NULL. An SQL 
1f840 4e 55 4c 4c 20 69 73 20 0a 20 20 20 20 2a 2a 20  NULL is .    ** 
1f850 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 61 6e  equivalent to an
1f860 20 65 6d 70 74 79 20 72 6f 77 73 65 74 2e 20 20   empty rowset.  
1f870 4f 72 2c 20 63 72 65 61 74 65 20 61 6e 20 65 70  Or, create an ep
1f880 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 0a 20 20  hemeral index.  
1f890 20 20 2a 2a 20 63 61 70 61 62 6c 65 20 6f 66 20    ** capable of 
1f8a0 68 6f 6c 64 69 6e 67 20 70 72 69 6d 61 72 79 20  holding primary 
1f8b0 6b 65 79 73 20 69 6e 20 74 68 65 20 63 61 73 65  keys in the case
1f8c0 20 6f 66 20 61 20 57 49 54 48 4f 55 54 20 52 4f   of a WITHOUT RO
1f8d0 57 49 44 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  WID..    **.    
1f8e0 2a 2a 20 41 6c 73 6f 20 69 6e 69 74 69 61 6c 69  ** Also initiali
1f8f0 7a 65 20 72 65 67 52 65 74 75 72 6e 20 74 6f 20  ze regReturn to 
1f900 63 6f 6e 74 61 69 6e 20 74 68 65 20 61 64 64 72  contain the addr
1f910 65 73 73 20 6f 66 20 74 68 65 20 69 6e 73 74 72  ess of the instr
1f920 75 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 69  uction .    ** i
1f930 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
1f940 77 69 6e 67 20 74 68 65 20 4f 50 5f 52 65 74 75  wing the OP_Retu
1f950 72 6e 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d  rn at the bottom
1f960 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 54 68   of the loop. Th
1f970 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 72 65 71  is.    ** is req
1f980 75 69 72 65 64 20 69 6e 20 61 20 66 65 77 20 6f  uired in a few o
1f990 62 73 63 75 72 65 20 4c 45 46 54 20 4a 4f 49 4e  bscure LEFT JOIN
1f9a0 20 63 61 73 65 73 20 77 68 65 72 65 20 63 6f 6e   cases where con
1f9b0 74 72 6f 6c 20 6a 75 6d 70 73 0a 20 20 20 20 2a  trol jumps.    *
1f9c0 2a 20 6f 76 65 72 20 74 68 65 20 74 6f 70 20 6f  * over the top o
1f9d0 66 20 74 68 65 20 6c 6f 6f 70 20 69 6e 74 6f 20  f the loop into 
1f9e0 74 68 65 20 62 6f 64 79 20 6f 66 20 69 74 2e 20  the body of it. 
1f9f0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
1fa00 20 0a 20 20 20 20 2a 2a 20 63 6f 72 72 65 63 74   .    ** correct
1fa10 20 72 65 73 70 6f 6e 73 65 20 66 6f 72 20 74 68   response for th
1fa20 65 20 65 6e 64 2d 6f 66 2d 6c 6f 6f 70 20 63 6f  e end-of-loop co
1fa30 64 65 20 28 74 68 65 20 4f 50 5f 52 65 74 75 72  de (the OP_Retur
1fa40 6e 29 20 69 73 20 74 6f 20 0a 20 20 20 20 2a 2a  n) is to .    **
1fa50 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f   fall through to
1fa60 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
1fa70 63 74 69 6f 6e 2c 20 6a 75 73 74 20 61 73 20 61  ction, just as a
1fa80 6e 20 4f 50 5f 4e 65 78 74 20 64 6f 65 73 20 69  n OP_Next does i
1fa90 66 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 20  f.    ** called 
1faa0 6f 6e 20 61 6e 20 75 6e 69 6e 69 74 69 61 6c 69  on an uninitiali
1fab0 7a 65 64 20 63 75 72 73 6f 72 2e 0a 20 20 20 20  zed cursor..    
1fac0 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 57 49 6e  */.    if( (pWIn
1fad0 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
1fae0 20 57 48 45 52 45 5f 44 55 50 4c 49 43 41 54 45   WHERE_DUPLICATE
1faf0 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  S_OK)==0 ){.    
1fb00 20 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70    if( HasRowid(p
1fb10 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Tab) ){.        
1fb20 72 65 67 52 6f 77 73 65 74 20 3d 20 2b 2b 70 50  regRowset = ++pP
1fb30 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
1fb40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1fb50 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
1fb60 2c 20 30 2c 20 72 65 67 52 6f 77 73 65 74 29 3b  , 0, regRowset);
1fb70 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1fb80 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 50 6b        Index *pPk
1fb90 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72   = sqlite3Primar
1fba0 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b  yKeyIndex(pTab);
1fbb0 0a 20 20 20 20 20 20 20 20 72 65 67 52 6f 77 73  .        regRows
1fbc0 65 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  et = pParse->nTa
1fbd0 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  b++;.        sql
1fbe0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1fbf0 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
1fc00 61 6c 2c 20 72 65 67 52 6f 77 73 65 74 2c 20 70  al, regRowset, p
1fc10 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20  Pk->nKeyCol);.  
1fc20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1fc30 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50  eSetP4KeyInfo(pP
1fc40 61 72 73 65 2c 20 70 50 6b 29 3b 0a 20 20 20 20  arse, pPk);.    
1fc50 20 20 7d 0a 20 20 20 20 20 20 72 65 67 52 6f 77    }.      regRow
1fc60 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  id = ++pParse->n
1fc70 4d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  Mem;.    }.    i
1fc80 52 65 74 49 6e 69 74 20 3d 20 73 71 6c 69 74 65  RetInit = sqlite
1fc90 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1fca0 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
1fcb0 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 20 20 2f  gReturn);..    /
1fcc0 2a 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61  * If the origina
1fcd0 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  l WHERE clause i
1fce0 73 20 7a 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  s z of the form:
1fcf0 20 20 28 78 31 20 4f 52 20 78 32 20 4f 52 20 2e    (x1 OR x2 OR .
1fd00 2e 2e 29 20 41 4e 44 20 79 0a 20 20 20 20 2a 2a  ..) AND y.    **
1fd10 20 54 68 65 6e 20 66 6f 72 20 65 76 65 72 79 20   Then for every 
1fd20 74 65 72 6d 20 78 4e 2c 20 65 76 61 6c 75 61 74  term xN, evaluat
1fd30 65 20 61 73 20 74 68 65 20 73 75 62 65 78 70 72  e as the subexpr
1fd40 65 73 73 69 6f 6e 3a 20 78 4e 20 41 4e 44 20 7a  ession: xN AND z
1fd50 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 77 61 79  .    ** That way
1fd60 2c 20 74 65 72 6d 73 20 69 6e 20 79 20 74 68 61  , terms in y tha
1fd70 74 20 61 72 65 20 66 61 63 74 6f 72 65 64 20 69  t are factored i
1fd80 6e 74 6f 20 74 68 65 20 64 69 73 6a 75 6e 63 74  nto the disjunct
1fd90 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  ion will.    ** 
1fda0 62 65 20 70 69 63 6b 65 64 20 75 70 20 62 79 20  be picked up by 
1fdb0 74 68 65 20 72 65 63 75 72 73 69 76 65 20 63 61  the recursive ca
1fdc0 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 57 68  lls to sqlite3Wh
1fdd0 65 72 65 42 65 67 69 6e 28 29 20 62 65 6c 6f 77  ereBegin() below
1fde0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1fdf0 41 63 74 75 61 6c 6c 79 2c 20 65 61 63 68 20 73  Actually, each s
1fe00 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  ubexpression is 
1fe10 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 22 78 4e  converted to "xN
1fe20 20 41 4e 44 20 77 22 20 77 68 65 72 65 20 77 20   AND w" where w 
1fe30 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 22 69  is.    ** the "i
1fe40 6e 74 65 72 65 73 74 69 6e 67 22 20 74 65 72 6d  nteresting" term
1fe50 73 20 6f 66 20 7a 20 2d 20 74 65 72 6d 73 20 74  s of z - terms t
1fe60 68 61 74 20 64 69 64 20 6e 6f 74 20 6f 72 69 67  hat did not orig
1fe70 69 6e 61 74 65 20 69 6e 20 74 68 65 0a 20 20 20  inate in the.   
1fe80 20 2a 2a 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20   ** ON or USING 
1fe90 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54  clause of a LEFT
1fea0 20 4a 4f 49 4e 2c 20 61 6e 64 20 74 65 72 6d 73   JOIN, and terms
1feb0 20 74 68 61 74 20 61 72 65 20 75 73 61 62 6c 65   that are usable
1fec0 20 61 73 20 0a 20 20 20 20 2a 2a 20 69 6e 64 69   as .    ** indi
1fed0 63 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ces..    **.    
1fee0 2a 2a 20 54 68 69 73 20 6f 70 74 69 6d 69 7a 61  ** This optimiza
1fef0 74 69 6f 6e 20 61 6c 73 6f 20 6f 6e 6c 79 20 61  tion also only a
1ff00 70 70 6c 69 65 73 20 69 66 20 74 68 65 20 28 78  pplies if the (x
1ff10 31 20 4f 52 20 78 32 20 4f 52 20 2e 2e 2e 29 20  1 OR x2 OR ...) 
1ff20 74 65 72 6d 0a 20 20 20 20 2a 2a 20 69 73 20 6e  term.    ** is n
1ff30 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  ot contained in 
1ff40 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66  the ON clause of
1ff50 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 20 20   a LEFT JOIN..  
1ff60 20 20 2a 2a 20 53 65 65 20 74 69 63 6b 65 74 20    ** See ticket 
1ff70 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74  http://www.sqlit
1ff80 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 66  e.org/src/info/f
1ff90 32 33 36 39 33 30 34 65 34 0a 20 20 20 20 2a 2f  2369304e4.    */
1ffa0 0a 20 20 20 20 69 66 28 20 70 57 43 2d 3e 6e 54  .    if( pWC->nT
1ffb0 65 72 6d 3e 31 20 29 7b 0a 20 20 20 20 20 20 69  erm>1 ){.      i
1ffc0 6e 74 20 69 54 65 72 6d 3b 0a 20 20 20 20 20 20  nt iTerm;.      
1ffd0 66 6f 72 28 69 54 65 72 6d 3d 30 3b 20 69 54 65  for(iTerm=0; iTe
1ffe0 72 6d 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69  rm<pWC->nTerm; i
1fff0 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
20000 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
20010 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 70 45 78  WC->a[iTerm].pEx
20020 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  pr;.        if( 
20030 26 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 20 3d  &pWC->a[iTerm] =
20040 3d 20 70 54 65 72 6d 20 29 20 63 6f 6e 74 69 6e  = pTerm ) contin
20050 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
20060 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
20070 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
20080 69 6e 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  in) ) continue;.
20090 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
200a0 28 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e  ( pWC->a[iTerm].
200b0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f  wtFlags & TERM_O
200c0 52 49 4e 46 4f 20 29 3b 0a 20 20 20 20 20 20 20  RINFO );.       
200d0 20 74 65 73 74 63 61 73 65 28 20 70 57 43 2d 3e   testcase( pWC->
200e0 61 5b 69 54 65 72 6d 5d 2e 77 74 46 6c 61 67 73  a[iTerm].wtFlags
200f0 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
20100 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
20110 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 77 74 46  WC->a[iTerm].wtF
20120 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 4f 52 49  lags & (TERM_ORI
20130 4e 46 4f 7c 54 45 52 4d 5f 56 49 52 54 55 41 4c  NFO|TERM_VIRTUAL
20140 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
20150 20 20 20 20 20 20 69 66 28 20 28 70 57 43 2d 3e        if( (pWC->
20160 61 5b 69 54 65 72 6d 5d 2e 65 4f 70 65 72 61 74  a[iTerm].eOperat
20170 6f 72 20 26 20 57 4f 5f 41 4c 4c 29 3d 3d 30 20  or & WO_ALL)==0 
20180 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
20190 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69      pExpr = sqli
201a0 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
201b0 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
201c0 20 20 70 41 6e 64 45 78 70 72 20 3d 20 73 71 6c    pAndExpr = sql
201d0 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20  ite3ExprAnd(db, 
201e0 70 41 6e 64 45 78 70 72 2c 20 70 45 78 70 72 29  pAndExpr, pExpr)
201f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
20200 69 66 28 20 70 41 6e 64 45 78 70 72 20 29 7b 0a  if( pAndExpr ){.
20210 20 20 20 20 20 20 20 20 70 41 6e 64 45 78 70 72          pAndExpr
20220 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
20230 70 50 61 72 73 65 2c 20 54 4b 5f 41 4e 44 2c 20  pParse, TK_AND, 
20240 30 2c 20 70 41 6e 64 45 78 70 72 2c 20 30 29 3b  0, pAndExpr, 0);
20250 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
20260 20 20 20 20 2f 2a 20 52 75 6e 20 61 20 73 65 70      /* Run a sep
20270 61 72 61 74 65 20 57 48 45 52 45 20 63 6c 61 75  arate WHERE clau
20280 73 65 20 66 6f 72 20 65 61 63 68 20 74 65 72 6d  se for each term
20290 20 6f 66 20 74 68 65 20 4f 52 20 63 6c 61 75 73   of the OR claus
202a0 65 2e 20 20 41 66 74 65 72 0a 20 20 20 20 2a 2a  e.  After.    **
202b0 20 65 6c 69 6d 69 6e 61 74 69 6e 67 20 64 75 70   eliminating dup
202c0 6c 69 63 61 74 65 73 20 66 72 6f 6d 20 6f 74 68  licates from oth
202d0 65 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 73  er WHERE clauses
202e0 2c 20 74 68 65 20 61 63 74 69 6f 6e 20 66 6f 72  , the action for
202f0 20 65 61 63 68 0a 20 20 20 20 2a 2a 20 73 75 62   each.    ** sub
20300 2d 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73  -WHERE clause is
20310 20 74 6f 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68   to to invoke th
20320 65 20 6d 61 69 6e 20 6c 6f 6f 70 20 62 6f 64 79  e main loop body
20330 20 61 73 20 61 20 73 75 62 72 6f 75 74 69 6e 65   as a subroutine
20340 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 63 74  ..    */.    wct
20350 72 6c 46 6c 61 67 73 20 3d 20 20 57 48 45 52 45  rlFlags =  WHERE
20360 5f 4f 4d 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45  _OMIT_OPEN_CLOSE
20370 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20380 20 7c 20 57 48 45 52 45 5f 46 4f 52 43 45 5f 54   | WHERE_FORCE_T
20390 41 42 4c 45 0a 20 20 20 20 20 20 20 20 20 20 20  ABLE.           
203a0 20 20 20 20 20 7c 20 57 48 45 52 45 5f 4f 4e 45       | WHERE_ONE
203b0 54 41 42 4c 45 5f 4f 4e 4c 59 3b 0a 20 20 20 20  TABLE_ONLY;.    
203c0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 72  for(ii=0; ii<pOr
203d0 57 63 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29  Wc->nTerm; ii++)
203e0 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  {.      WhereTer
203f0 6d 20 2a 70 4f 72 54 65 72 6d 20 3d 20 26 70 4f  m *pOrTerm = &pO
20400 72 57 63 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20  rWc->a[ii];.    
20410 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c    if( pOrTerm->l
20420 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20  eftCursor==iCur 
20430 7c 7c 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70  || (pOrTerm->eOp
20440 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4e 44 29  erator & WO_AND)
20450 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 57  !=0 ){.        W
20460 68 65 72 65 49 6e 66 6f 20 2a 70 53 75 62 57 49  hereInfo *pSubWI
20470 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f  nfo;           /
20480 2a 20 49 6e 66 6f 20 66 6f 72 20 73 69 6e 67 6c  * Info for singl
20490 65 20 4f 52 2d 74 65 72 6d 20 73 63 61 6e 20 2a  e OR-term scan *
204a0 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  /.        Expr *
204b0 70 4f 72 45 78 70 72 20 3d 20 70 4f 72 54 65 72  pOrExpr = pOrTer
204c0 6d 2d 3e 70 45 78 70 72 3b 20 2f 2a 20 43 75 72  m->pExpr; /* Cur
204d0 72 65 6e 74 20 4f 52 20 63 6c 61 75 73 65 20 74  rent OR clause t
204e0 65 72 6d 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  erm */.        i
204f0 6e 74 20 6a 31 20 3d 20 30 3b 20 20 20 20 20 20  nt j1 = 0;      
20500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20510 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6a 75 6d  * Address of jum
20520 70 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  p operation */. 
20530 20 20 20 20 20 20 20 69 66 28 20 70 41 6e 64 45         if( pAndE
20540 78 70 72 20 26 26 20 21 45 78 70 72 48 61 73 50  xpr && !ExprHasP
20550 72 6f 70 65 72 74 79 28 70 4f 72 45 78 70 72 2c  roperty(pOrExpr,
20560 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b   EP_FromJoin) ){
20570 0a 20 20 20 20 20 20 20 20 20 20 70 41 6e 64 45  .          pAndE
20580 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70 4f 72  xpr->pLeft = pOr
20590 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
205a0 70 4f 72 45 78 70 72 20 3d 20 70 41 6e 64 45 78  pOrExpr = pAndEx
205b0 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  pr;.        }.  
205c0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68        /* Loop th
205d0 72 6f 75 67 68 20 74 61 62 6c 65 20 65 6e 74 72  rough table entr
205e0 69 65 73 20 74 68 61 74 20 6d 61 74 63 68 20 74  ies that match t
205f0 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a  erm pOrTerm. */.
20600 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41          WHERETRA
20610 43 45 28 30 78 66 66 66 66 2c 20 28 22 53 75 62  CE(0xffff, ("Sub
20620 70 6c 61 6e 20 66 6f 72 20 4f 52 2d 63 6c 61 75  plan for OR-clau
20630 73 65 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  se:\n"));.      
20640 20 20 70 53 75 62 57 49 6e 66 6f 20 3d 20 73 71    pSubWInfo = sq
20650 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
20660 70 50 61 72 73 65 2c 20 70 4f 72 54 61 62 2c 20  pParse, pOrTab, 
20670 70 4f 72 45 78 70 72 2c 20 30 2c 20 30 2c 0a 20  pOrExpr, 0, 0,. 
20680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
206a0 20 20 20 20 20 77 63 74 72 6c 46 6c 61 67 73 2c       wctrlFlags,
206b0 20 69 43 6f 76 43 75 72 29 3b 0a 20 20 20 20 20   iCovCur);.     
206c0 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62 57     assert( pSubW
206d0 49 6e 66 6f 20 7c 7c 20 70 50 61 72 73 65 2d 3e  Info || pParse->
206e0 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  nErr || db->mall
206f0 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
20700 20 20 20 20 69 66 28 20 70 53 75 62 57 49 6e 66      if( pSubWInf
20710 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 57  o ){.          W
20720 68 65 72 65 4c 6f 6f 70 20 2a 70 53 75 62 4c 6f  hereLoop *pSubLo
20730 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 65 78  op;.          ex
20740 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20  plainOneScan(.  
20750 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72              pPar
20760 73 65 2c 20 70 4f 72 54 61 62 2c 20 26 70 53 75  se, pOrTab, &pSu
20770 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 69 4c  bWInfo->a[0], iL
20780 65 76 65 6c 2c 20 70 4c 65 76 65 6c 2d 3e 69 46  evel, pLevel->iF
20790 72 6f 6d 2c 20 30 0a 20 20 20 20 20 20 20 20 20  rom, 0.         
207a0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   );.          /*
207b0 20 54 68 69 73 20 69 73 20 74 68 65 20 73 75 62   This is the sub
207c0 2d 57 48 45 52 45 20 63 6c 61 75 73 65 20 62 6f  -WHERE clause bo
207d0 64 79 2e 20 20 46 69 72 73 74 20 73 6b 69 70 20  dy.  First skip 
207e0 6f 76 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a  over.          *
207f0 2a 20 64 75 70 6c 69 63 61 74 65 20 72 6f 77 73  * duplicate rows
20800 20 66 72 6f 6d 20 70 72 69 6f 72 20 73 75 62 2d   from prior sub-
20810 57 48 45 52 45 20 63 6c 61 75 73 65 73 2c 20 61  WHERE clauses, a
20820 6e 64 20 72 65 63 6f 72 64 20 74 68 65 0a 20 20  nd record the.  
20830 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64          ** rowid
20840 20 28 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59   (or PRIMARY KEY
20850 29 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  ) for the curren
20860 74 20 72 6f 77 20 73 6f 20 74 68 61 74 20 74 68  t row so that th
20870 65 20 73 61 6d 65 0a 20 20 20 20 20 20 20 20 20  e same.         
20880 20 2a 2a 20 72 6f 77 20 77 69 6c 6c 20 62 65 20   ** row will be 
20890 73 6b 69 70 70 65 64 20 69 6e 20 73 75 62 73 65  skipped in subse
208a0 71 75 65 6e 74 20 73 75 62 2d 57 48 45 52 45 20  quent sub-WHERE 
208b0 63 6c 61 75 73 65 73 2e 0a 20 20 20 20 20 20 20  clauses..       
208c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
208d0 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74  if( (pWInfo->wct
208e0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
208f0 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29 3d 3d  DUPLICATES_OK)==
20900 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
20910 20 69 6e 74 20 72 3b 0a 20 20 20 20 20 20 20 20   int r;.        
20920 20 20 20 20 69 6e 74 20 69 53 65 74 20 3d 20 28      int iSet = (
20930 28 69 69 3d 3d 70 4f 72 57 63 2d 3e 6e 54 65 72  (ii==pOrWc->nTer
20940 6d 2d 31 29 3f 2d 31 3a 69 69 29 3b 0a 20 20 20  m-1)?-1:ii);.   
20950 20 20 20 20 20 20 20 20 20 69 66 28 20 48 61 73           if( Has
20960 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20  Rowid(pTab) ){. 
20970 20 20 20 20 20 20 20 20 20 20 20 20 20 72 20 3d               r =
20980 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
20990 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  GetColumn(pParse
209a0 2c 20 70 54 61 62 2c 20 2d 31 2c 20 69 43 75 72  , pTab, -1, iCur
209b0 2c 20 72 65 67 52 6f 77 69 64 2c 20 30 29 3b 0a  , regRowid, 0);.
209c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 31                j1
209d0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
209e0 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 52 6f  dOp4Int(v, OP_Ro
209f0 77 53 65 74 54 65 73 74 2c 20 72 65 67 52 6f 77  wSetTest, regRow
20a00 73 65 74 2c 20 30 2c 20 72 2c 69 53 65 74 29 3b  set, 0, r,iSet);
20a10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56  .              V
20a20 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
20a30 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
20a40 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
20a50 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73 71   Index *pPk = sq
20a60 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
20a70 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20  ndex(pTab);.    
20a80 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 50            int nP
20a90 6b 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c  k = pPk->nKeyCol
20aa0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
20ab0 69 6e 74 20 69 50 6b 3b 0a 0a 20 20 20 20 20 20  int iPk;..      
20ac0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20          /* Read 
20ad0 74 68 65 20 50 4b 20 69 6e 74 6f 20 61 6e 20 61  the PK into an a
20ae0 72 72 61 79 20 6f 66 20 74 65 6d 70 20 72 65 67  rray of temp reg
20af0 69 73 74 65 72 73 2e 20 2a 2f 0a 20 20 20 20 20  isters. */.     
20b00 20 20 20 20 20 20 20 20 20 72 20 3d 20 73 71 6c           r = sql
20b10 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
20b20 28 70 50 61 72 73 65 2c 20 6e 50 6b 29 3b 0a 20  (pParse, nPk);. 
20b30 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
20b40 28 69 50 6b 3d 30 3b 20 69 50 6b 3c 6e 50 6b 3b  (iPk=0; iPk<nPk;
20b50 20 69 50 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20   iPk++){.       
20b60 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f           int iCo
20b70 6c 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  l = pPk->aiColum
20b80 6e 5b 69 50 6b 5d 3b 0a 20 20 20 20 20 20 20 20  n[iPk];.        
20b90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
20ba0 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
20bb0 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 69  (pParse, pTab, i
20bc0 43 6f 6c 2c 20 69 43 75 72 2c 20 72 2b 69 50 6b  Col, iCur, r+iPk
20bd0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
20be0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
20bf0 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66       /* Check if
20c00 20 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20   the temp table 
20c10 61 6c 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 73  already contains
20c20 20 74 68 69 73 20 6b 65 79 2e 20 49 66 20 73 6f   this key. If so
20c30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
20c40 2a 2a 20 74 68 65 20 72 6f 77 20 68 61 73 20 61  ** the row has a
20c50 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 6c  lready been incl
20c60 75 64 65 64 20 69 6e 20 74 68 65 20 72 65 73 75  uded in the resu
20c70 6c 74 20 73 65 74 20 61 6e 64 0a 20 20 20 20 20  lt set and.     
20c80 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 20           ** can 
20c90 62 65 20 69 67 6e 6f 72 65 64 20 28 62 79 20 6a  be ignored (by j
20ca0 75 6d 70 69 6e 67 20 70 61 73 74 20 74 68 65 20  umping past the 
20cb0 47 6f 73 75 62 20 62 65 6c 6f 77 29 2e 20 4f 74  Gosub below). Ot
20cc0 68 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20 20  herwise,.       
20cd0 20 20 20 20 20 20 20 2a 2a 20 69 6e 73 65 72 74         ** insert
20ce0 20 74 68 65 20 6b 65 79 20 69 6e 74 6f 20 74 68   the key into th
20cf0 65 20 74 65 6d 70 20 74 61 62 6c 65 20 61 6e 64  e temp table and
20d00 20 70 72 6f 63 65 65 64 20 77 69 74 68 20 70 72   proceed with pr
20d10 6f 63 65 73 73 69 6e 67 0a 20 20 20 20 20 20 20  ocessing.       
20d20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 6f         ** the ro
20d30 77 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  w..             
20d40 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20   **.            
20d50 20 20 2a 2a 20 55 73 65 20 73 6f 6d 65 20 6f 66    ** Use some of
20d60 20 74 68 65 20 73 61 6d 65 20 6f 70 74 69 6d 69   the same optimi
20d70 7a 61 74 69 6f 6e 73 20 61 73 20 4f 50 5f 52 6f  zations as OP_Ro
20d80 77 53 65 74 54 65 73 74 3a 20 49 66 20 69 53 65  wSetTest: If iSe
20d90 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t.              
20da0 2a 2a 20 69 73 20 7a 65 72 6f 2c 20 61 73 73 75  ** is zero, assu
20db0 6d 65 20 74 68 61 74 20 74 68 65 20 6b 65 79 20  me that the key 
20dc0 63 61 6e 6e 6f 74 20 61 6c 72 65 61 64 79 20 62  cannot already b
20dd0 65 20 70 72 65 73 65 6e 74 20 69 6e 0a 20 20 20  e present in.   
20de0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
20df0 65 20 74 65 6d 70 20 74 61 62 6c 65 2e 20 41 6e  e temp table. An
20e00 64 20 69 66 20 69 53 65 74 20 69 73 20 2d 31 2c  d if iSet is -1,
20e10 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
20e20 72 65 20 69 73 20 6e 6f 20 0a 20 20 20 20 20 20  re is no .      
20e30 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 65 64 20          ** need 
20e40 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20 6b 65  to insert the ke
20e50 79 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20  y into the temp 
20e60 74 61 62 6c 65 2c 20 61 73 20 69 74 20 77 69 6c  table, as it wil
20e70 6c 20 6e 65 76 65 72 20 0a 20 20 20 20 20 20 20  l never .       
20e80 20 20 20 20 20 20 20 2a 2a 20 62 65 20 74 65 73         ** be tes
20e90 74 65 64 20 66 6f 72 2e 20 20 2a 2f 20 0a 20 20  ted for.  */ .  
20ea0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
20eb0 69 53 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  iSet ){.        
20ec0 20 20 20 20 20 20 20 20 6a 31 20 3d 20 73 71 6c          j1 = sql
20ed0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
20ee0 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 72  t(v, OP_Found, r
20ef0 65 67 52 6f 77 73 65 74 2c 20 30 2c 20 72 2c 20  egRowset, 0, r, 
20f00 6e 50 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nPk);.          
20f10 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
20f20 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
20f30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
20f40 20 20 20 20 20 69 66 28 20 69 53 65 74 3e 3d 30       if( iSet>=0
20f50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
20f60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
20f70 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
20f80 52 65 63 6f 72 64 2c 20 72 2c 20 6e 50 6b 2c 20  Record, r, nPk, 
20f90 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  regRowid);.     
20fa0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
20fb0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
20fc0 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 72 65  OP_IdxInsert, re
20fd0 67 52 6f 77 73 65 74 2c 20 72 65 67 52 6f 77 69  gRowset, regRowi
20fe0 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  d, 0);.         
20ff0 20 20 20 20 20 20 20 69 66 28 20 69 53 65 74 20         if( iSet 
21000 29 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  ) sqlite3VdbeCha
21010 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
21020 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a  USESEEKRESULT);.
21030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
21040 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  .              /
21050 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 61 72  * Release the ar
21060 72 61 79 20 6f 66 20 74 65 6d 70 20 72 65 67 69  ray of temp regi
21070 73 74 65 72 73 20 2a 2f 0a 20 20 20 20 20 20 20  sters */.       
21080 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
21090 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
210a0 50 61 72 73 65 2c 20 72 2c 20 6e 50 6b 29 3b 0a  Parse, r, nPk);.
210b0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
210c0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
210d0 20 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74       /* Invoke t
210e0 68 65 20 6d 61 69 6e 20 6c 6f 6f 70 20 62 6f 64  he main loop bod
210f0 79 20 61 73 20 61 20 73 75 62 72 6f 75 74 69 6e  y as a subroutin
21100 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73  e */.          s
21110 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
21120 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
21130 67 52 65 74 75 72 6e 2c 20 69 4c 6f 6f 70 42 6f  gReturn, iLoopBo
21140 64 79 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  dy);..          
21150 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 28 73 6b  /* Jump here (sk
21160 69 70 70 69 6e 67 20 74 68 65 20 6d 61 69 6e 20  ipping the main 
21170 6c 6f 6f 70 20 62 6f 64 79 20 73 75 62 72 6f 75  loop body subrou
21180 74 69 6e 65 29 20 69 66 20 74 68 65 0a 20 20 20  tine) if the.   
21190 20 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e         ** curren
211a0 74 20 73 75 62 2d 57 48 45 52 45 20 72 6f 77 20  t sub-WHERE row 
211b0 69 73 20 61 20 64 75 70 6c 69 63 61 74 65 20 66  is a duplicate f
211c0 72 6f 6d 20 70 72 69 6f 72 20 73 75 62 2d 57 48  rom prior sub-WH
211d0 45 52 45 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  EREs. */.       
211e0 20 20 20 69 66 28 20 6a 31 20 29 20 73 71 6c 69     if( j1 ) sqli
211f0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
21200 76 2c 20 6a 31 29 3b 0a 0a 20 20 20 20 20 20 20  v, j1);..       
21210 20 20 20 2f 2a 20 54 68 65 20 70 53 75 62 57 49     /* The pSubWI
21220 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72  nfo->untestedTer
21230 6d 73 20 66 6c 61 67 20 6d 65 61 6e 73 20 74 68  ms flag means th
21240 61 74 20 74 68 69 73 20 4f 52 20 74 65 72 6d 0a  at this OR term.
21250 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e            ** con
21260 74 61 69 6e 65 64 20 6f 6e 65 20 6f 72 20 6d 6f  tained one or mo
21270 72 65 20 41 4e 44 20 74 65 72 6d 20 66 72 6f 6d  re AND term from
21280 20 61 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c   a notReady tabl
21290 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20 20  e.  The.        
212a0 20 20 2a 2a 20 74 65 72 6d 73 20 66 72 6f 6d 20    ** terms from 
212b0 74 68 65 20 6e 6f 74 52 65 61 64 79 20 74 61 62  the notReady tab
212c0 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  le could not be 
212d0 74 65 73 74 65 64 20 61 6e 64 20 77 69 6c 6c 0a  tested and will.
212e0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 65            ** nee
212f0 64 20 74 6f 20 62 65 20 74 65 73 74 65 64 20 6c  d to be tested l
21300 61 74 65 72 2e 0a 20 20 20 20 20 20 20 20 20 20  ater..          
21310 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
21320 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e 74 65   pSubWInfo->unte
21330 73 74 65 64 54 65 72 6d 73 20 29 20 75 6e 74 65  stedTerms ) unte
21340 73 74 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a 0a  stedTerms = 1;..
21350 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
21360 61 6c 6c 20 6f 66 20 74 68 65 20 4f 52 2d 63 6f  all of the OR-co
21370 6e 6e 65 63 74 65 64 20 74 65 72 6d 73 20 61 72  nnected terms ar
21380 65 20 6f 70 74 69 6d 69 7a 65 64 20 75 73 69 6e  e optimized usin
21390 67 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20  g the same.     
213a0 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 2c 20 61       ** index, a
213b0 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  nd the index is 
213c0 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 74 68 65  opened using the
213d0 20 73 61 6d 65 20 63 75 72 73 6f 72 20 6e 75 6d   same cursor num
213e0 62 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ber.          **
213f0 20 62 79 20 65 61 63 68 20 63 61 6c 6c 20 74 6f   by each call to
21400 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
21410 69 6e 28 29 20 6d 61 64 65 20 62 79 20 74 68 69  in() made by thi
21420 73 20 6c 6f 6f 70 2c 20 69 74 20 6d 61 79 0a 20  s loop, it may. 
21430 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20 70           ** be p
21440 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 74  ossible to use t
21450 68 61 74 20 69 6e 64 65 78 20 61 73 20 61 20 63  hat index as a c
21460 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 0a 20  overing index.. 
21470 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20           **.    
21480 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20        ** If the 
21490 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57  call to sqlite3W
214a0 68 65 72 65 42 65 67 69 6e 28 29 20 61 62 6f 76  hereBegin() abov
214b0 65 20 72 65 73 75 6c 74 65 64 20 69 6e 20 61 20  e resulted in a 
214c0 73 63 61 6e 20 74 68 61 74 0a 20 20 20 20 20 20  scan that.      
214d0 20 20 20 20 2a 2a 20 75 73 65 73 20 61 6e 20 69      ** uses an i
214e0 6e 64 65 78 2c 20 61 6e 64 20 74 68 69 73 20 69  ndex, and this i
214f0 73 20 65 69 74 68 65 72 20 74 68 65 20 66 69 72  s either the fir
21500 73 74 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20  st OR-connected 
21510 74 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20 2a  term.          *
21520 2a 20 70 72 6f 63 65 73 73 65 64 20 6f 72 20 74  * processed or t
21530 68 65 20 69 6e 64 65 78 20 69 73 20 74 68 65 20  he index is the 
21540 73 61 6d 65 20 61 73 20 74 68 61 74 20 75 73 65  same as that use
21550 64 20 62 79 20 61 6c 6c 20 70 72 65 76 69 6f 75  d by all previou
21560 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  s.          ** t
21570 65 72 6d 73 2c 20 73 65 74 20 70 43 6f 76 20 74  erms, set pCov t
21580 6f 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 20  o the candidate 
21590 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20  covering index. 
215a0 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74 20 0a  Otherwise, set .
215b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 43 6f            ** pCo
215c0 76 20 74 6f 20 4e 55 4c 4c 20 74 6f 20 69 6e 64  v to NULL to ind
215d0 69 63 61 74 65 20 74 68 61 74 20 6e 6f 20 63 61  icate that no ca
215e0 6e 64 69 64 61 74 65 20 63 6f 76 65 72 69 6e 67  ndidate covering
215f0 20 69 6e 64 65 78 20 77 69 6c 6c 20 0a 20 20 20   index will .   
21600 20 20 20 20 20 20 20 2a 2a 20 62 65 20 61 76 61         ** be ava
21610 69 6c 61 62 6c 65 2e 0a 20 20 20 20 20 20 20 20  ilable..        
21620 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70    */.          p
21630 53 75 62 4c 6f 6f 70 20 3d 20 70 53 75 62 57 49  SubLoop = pSubWI
21640 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70  nfo->a[0].pWLoop
21650 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
21660 72 74 28 20 28 70 53 75 62 4c 6f 6f 70 2d 3e 77  rt( (pSubLoop->w
21670 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41  sFlags & WHERE_A
21680 55 54 4f 5f 49 4e 44 45 58 29 3d 3d 30 20 29 3b  UTO_INDEX)==0 );
21690 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28  .          if( (
216a0 70 53 75 62 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  pSubLoop->wsFlag
216b0 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
216c0 44 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  D)!=0.          
216d0 20 26 26 20 28 69 69 3d 3d 30 20 7c 7c 20 70 53   && (ii==0 || pS
216e0 75 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e  ubLoop->u.btree.
216f0 70 49 6e 64 65 78 3d 3d 70 43 6f 76 29 0a 20 20  pIndex==pCov).  
21700 20 20 20 20 20 20 20 20 20 26 26 20 28 48 61 73           && (Has
21710 52 6f 77 69 64 28 70 54 61 62 29 20 7c 7c 20 21  Rowid(pTab) || !
21720 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  IsPrimaryKeyInde
21730 78 28 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62 74  x(pSubLoop->u.bt
21740 72 65 65 2e 70 49 6e 64 65 78 29 29 0a 20 20 20  ree.pIndex)).   
21750 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
21760 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
21770 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 49  ubWInfo->a[0].iI
21780 64 78 43 75 72 3d 3d 69 43 6f 76 43 75 72 20 29  dxCur==iCovCur )
21790 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  ;.            pC
217a0 6f 76 20 3d 20 70 53 75 62 4c 6f 6f 70 2d 3e 75  ov = pSubLoop->u
217b0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
217c0 20 20 20 20 20 20 20 20 20 20 20 77 63 74 72 6c             wctrl
217d0 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 52  Flags |= WHERE_R
217e0 45 4f 50 45 4e 5f 49 44 58 3b 0a 20 20 20 20 20  EOPEN_IDX;.     
217f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
21800 20 20 20 20 20 20 20 20 70 43 6f 76 20 3d 20 30          pCov = 0
21810 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20  ;.          }.. 
21820 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 69           /* Fini
21830 73 68 20 74 68 65 20 6c 6f 6f 70 20 74 68 72 6f  sh the loop thro
21840 75 67 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65  ugh table entrie
21850 73 20 74 68 61 74 20 6d 61 74 63 68 20 74 65 72  s that match ter
21860 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20  m pOrTerm. */.  
21870 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
21880 68 65 72 65 45 6e 64 28 70 53 75 62 57 49 6e 66  hereEnd(pSubWInf
21890 6f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  o);.        }.  
218a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
218b0 70 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64  pLevel->u.pCovid
218c0 78 20 3d 20 70 43 6f 76 3b 0a 20 20 20 20 69 66  x = pCov;.    if
218d0 28 20 70 43 6f 76 20 29 20 70 4c 65 76 65 6c 2d  ( pCov ) pLevel-
218e0 3e 69 49 64 78 43 75 72 20 3d 20 69 43 6f 76 43  >iIdxCur = iCovC
218f0 75 72 3b 0a 20 20 20 20 69 66 28 20 70 41 6e 64  ur;.    if( pAnd
21900 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70 41  Expr ){.      pA
21910 6e 64 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20  ndExpr->pLeft = 
21920 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
21930 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
21940 41 6e 64 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a  AndExpr);.    }.
21950 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
21960 68 61 6e 67 65 50 31 28 76 2c 20 69 52 65 74 49  hangeP1(v, iRetI
21970 6e 69 74 2c 20 73 71 6c 69 74 65 33 56 64 62 65  nit, sqlite3Vdbe
21980 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 29 3b  CurrentAddr(v));
21990 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
219a0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
219b0 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  o, 0, pLevel->ad
219c0 64 72 42 72 6b 29 3b 0a 20 20 20 20 73 71 6c 69  drBrk);.    sqli
219d0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
219e0 62 65 6c 28 76 2c 20 69 4c 6f 6f 70 42 6f 64 79  bel(v, iLoopBody
219f0 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 57 49 6e  );..    if( pWIn
21a00 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 31 20 29 20 73  fo->nLevel>1 ) s
21a10 71 6c 69 74 65 33 53 74 61 63 6b 46 72 65 65 28  qlite3StackFree(
21a20 64 62 2c 20 70 4f 72 54 61 62 29 3b 0a 20 20 20  db, pOrTab);.   
21a30 20 69 66 28 20 21 75 6e 74 65 73 74 65 64 54 65   if( !untestedTe
21a40 72 6d 73 20 29 20 64 69 73 61 62 6c 65 54 65 72  rms ) disableTer
21a50 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29  m(pLevel, pTerm)
21a60 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
21a70 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
21a80 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  OR_OPTIMIZATION 
21a90 2a 2f 0a 0a 20 20 7b 0a 20 20 20 20 2f 2a 20 43  */..  {.    /* C
21aa0 61 73 65 20 36 3a 20 20 54 68 65 72 65 20 69 73  ase 6:  There is
21ab0 20 6e 6f 20 75 73 61 62 6c 65 20 69 6e 64 65 78   no usable index
21ac0 2e 20 20 57 65 20 6d 75 73 74 20 64 6f 20 61 20  .  We must do a 
21ad0 63 6f 6d 70 6c 65 74 65 0a 20 20 20 20 2a 2a 20  complete.    ** 
21ae0 20 20 20 20 20 20 20 20 20 73 63 61 6e 20 6f 66           scan of
21af0 20 74 68 65 20 65 6e 74 69 72 65 20 74 61 62 6c   the entire tabl
21b00 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74  e..    */.    st
21b10 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53  atic const u8 aS
21b20 74 65 70 5b 5d 20 3d 20 7b 20 4f 50 5f 4e 65 78  tep[] = { OP_Nex
21b30 74 2c 20 4f 50 5f 50 72 65 76 20 7d 3b 0a 20 20  t, OP_Prev };.  
21b40 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
21b50 38 20 61 53 74 61 72 74 5b 5d 20 3d 20 7b 20 4f  8 aStart[] = { O
21b60 50 5f 52 65 77 69 6e 64 2c 20 4f 50 5f 4c 61 73  P_Rewind, OP_Las
21b70 74 20 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t };.    assert(
21b80 20 62 52 65 76 3d 3d 30 20 7c 7c 20 62 52 65 76   bRev==0 || bRev
21b90 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ==1 );.    if( p
21ba0 54 61 62 49 74 65 6d 2d 3e 69 73 52 65 63 75 72  TabItem->isRecur
21bb0 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  sive ){.      /*
21bc0 20 54 61 62 6c 65 73 20 6d 61 72 6b 65 64 20 69   Tables marked i
21bd0 73 52 65 63 75 72 73 69 76 65 20 68 61 76 65 20  sRecursive have 
21be0 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 6f  only a single ro
21bf0 77 20 74 68 61 74 20 69 73 20 73 74 6f 72 65 64  w that is stored
21c00 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 70   in.      ** a p
21c10 73 65 75 64 6f 2d 63 75 72 73 6f 72 2e 20 20 4e  seudo-cursor.  N
21c20 6f 20 6e 65 65 64 20 74 6f 20 52 65 77 69 6e 64  o need to Rewind
21c30 20 6f 72 20 4e 65 78 74 20 73 75 63 68 20 63 75   or Next such cu
21c40 72 73 6f 72 73 2e 20 2a 2f 0a 20 20 20 20 20 20  rsors. */.      
21c50 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
21c60 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Noop;.    }else{
21c70 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  .      pLevel->o
21c80 70 20 3d 20 61 53 74 65 70 5b 62 52 65 76 5d 3b  p = aStep[bRev];
21c90 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  .      pLevel->p
21ca0 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 20 20  1 = iCur;.      
21cb0 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 31 20 2b  pLevel->p2 = 1 +
21cc0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21cd0 70 32 28 76 2c 20 61 53 74 61 72 74 5b 62 52 65  p2(v, aStart[bRe
21ce0 76 5d 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72  v], iCur, addrBr
21cf0 6b 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  k);.      VdbeCo
21d00 76 65 72 61 67 65 49 66 28 76 2c 20 62 52 65 76  verageIf(v, bRev
21d10 3d 3d 30 29 3b 0a 20 20 20 20 20 20 56 64 62 65  ==0);.      Vdbe
21d20 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62 52  CoverageIf(v, bR
21d30 65 76 21 3d 30 29 3b 0a 20 20 20 20 20 20 70 4c  ev!=0);.      pL
21d40 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54  evel->p5 = SQLIT
21d50 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c  E_STMTSTATUS_FUL
21d60 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20 20 20  LSCAN_STEP;.    
21d70 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 73 65  }.  }..  /* Inse
21d80 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20  rt code to test 
21d90 65 76 65 72 79 20 73 75 62 65 78 70 72 65 73 73  every subexpress
21da0 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 62 65 20  ion that can be 
21db0 63 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 2a 2a 20  completely.  ** 
21dc0 63 6f 6d 70 75 74 65 64 20 75 73 69 6e 67 20 74  computed using t
21dd0 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 20 6f  he current set o
21de0 66 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  f tables..  */. 
21df0 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
21e00 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b  a, j=pWC->nTerm;
21e10 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d   j>0; j--, pTerm
21e20 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
21e30 45 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  E;.    testcase(
21e40 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
21e50 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
21e60 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
21e70 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
21e80 20 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20   TERM_CODED );. 
21e90 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
21ea0 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49  Flags & (TERM_VI
21eb0 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44  RTUAL|TERM_CODED
21ec0 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
21ed0 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
21ee0 65 72 65 71 41 6c 6c 20 26 20 70 4c 65 76 65 6c  ereqAll & pLevel
21ef0 2d 3e 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29  ->notReady)!=0 )
21f00 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
21f10 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74  ( pWInfo->untest
21f20 65 64 54 65 72 6d 73 3d 3d 30 0a 20 20 20 20 20  edTerms==0.     
21f30 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57            && (pW
21f40 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
21f50 20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c   & WHERE_ONETABL
21f60 45 5f 4f 4e 4c 59 29 21 3d 30 20 29 3b 0a 20 20  E_ONLY)!=0 );.  
21f70 20 20 20 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65      pWInfo->unte
21f80 73 74 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a 20  stedTerms = 1;. 
21f90 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
21fa0 20 20 20 7d 0a 20 20 20 20 70 45 20 3d 20 70 54     }.    pE = pT
21fb0 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
21fc0 61 73 73 65 72 74 28 20 70 45 21 3d 30 20 29 3b  assert( pE!=0 );
21fd0 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
21fe0 3e 69 4c 65 66 74 4a 6f 69 6e 20 26 26 20 21 45  >iLeftJoin && !E
21ff0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
22000 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  E, EP_FromJoin) 
22010 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  ){.      continu
22020 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  e;.    }.    sql
22030 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
22040 70 50 61 72 73 65 2c 20 70 45 2c 20 61 64 64 72  pParse, pE, addr
22050 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  Cont, SQLITE_JUM
22060 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 54  PIFNULL);.    pT
22070 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20  erm->wtFlags |= 
22080 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 7d 0a  TERM_CODED;.  }.
22090 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f 64  .  /* Insert cod
220a0 65 20 74 6f 20 74 65 73 74 20 66 6f 72 20 69 6d  e to test for im
220b0 70 6c 69 65 64 20 63 6f 6e 73 74 72 61 69 6e 74  plied constraint
220c0 73 20 62 61 73 65 64 20 6f 6e 20 74 72 61 6e 73  s based on trans
220d0 69 74 69 76 69 74 79 0a 20 20 2a 2a 20 6f 66 20  itivity.  ** of 
220e0 74 68 65 20 22 3d 3d 22 20 6f 70 65 72 61 74 6f  the "==" operato
220f0 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61  r..  **.  ** Exa
22100 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 57 48 45  mple: If the WHE
22110 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69  RE clause contai
22120 6e 73 20 22 74 31 2e 61 3d 74 32 2e 62 22 20 61  ns "t1.a=t2.b" a
22130 6e 64 20 22 74 32 2e 62 3d 31 32 33 22 0a 20 20  nd "t2.b=123".  
22140 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20 63 6f  ** and we are co
22150 64 69 6e 67 20 74 68 65 20 74 31 20 6c 6f 6f 70  ding the t1 loop
22160 20 61 6e 64 20 74 68 65 20 74 32 20 6c 6f 6f 70   and the t2 loop
22170 20 68 61 73 20 6e 6f 74 20 79 65 74 20 63 6f 64   has not yet cod
22180 65 64 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 77 65  ed,.  ** then we
22190 20 63 61 6e 6e 6f 74 20 75 73 65 20 74 68 65 20   cannot use the 
221a0 22 74 31 2e 61 3d 74 32 2e 62 22 20 63 6f 6e 73  "t1.a=t2.b" cons
221b0 74 72 61 69 6e 74 2c 20 62 75 74 20 77 65 20 63  traint, but we c
221c0 61 6e 20 63 6f 64 65 0a 20 20 2a 2a 20 74 68 65  an code.  ** the
221d0 20 69 6d 70 6c 69 65 64 20 22 74 31 2e 61 3d 31   implied "t1.a=1
221e0 32 33 22 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a  23" constraint..
221f0 20 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65 72 6d    */.  for(pTerm
22200 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e  =pWC->a, j=pWC->
22210 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c  nTerm; j>0; j--,
22220 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45   pTerm++){.    E
22230 78 70 72 20 2a 70 45 2c 20 2a 70 45 41 6c 74 3b  xpr *pE, *pEAlt;
22240 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
22250 70 41 6c 74 3b 0a 20 20 20 20 69 66 28 20 70 54  pAlt;.    if( pT
22260 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28  erm->wtFlags & (
22270 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
22280 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69  M_CODED) ) conti
22290 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65  nue;.    if( pTe
222a0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d 28  rm->eOperator!=(
222b0 57 4f 5f 45 51 55 49 56 7c 57 4f 5f 45 51 29 20  WO_EQUIV|WO_EQ) 
222c0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
222d0 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  if( pTerm->leftC
222e0 75 72 73 6f 72 21 3d 69 43 75 72 20 29 20 63 6f  ursor!=iCur ) co
222f0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
22300 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
22310 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  n ) continue;.  
22320 20 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45    pE = pTerm->pE
22330 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  xpr;.    assert(
22340 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
22350 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  y(pE, EP_FromJoi
22360 6e 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  n) );.    assert
22370 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
22380 52 69 67 68 74 20 26 20 70 4c 65 76 65 6c 2d 3e  Right & pLevel->
22390 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 3b 0a  notReady)!=0 );.
223a0 20 20 20 20 70 41 6c 74 20 3d 20 66 69 6e 64 54      pAlt = findT
223b0 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 70  erm(pWC, iCur, p
223c0 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
223d0 6d 6e 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f  mn, notReady, WO
223e0 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20  _EQ|WO_IN, 0);. 
223f0 20 20 20 69 66 28 20 70 41 6c 74 3d 3d 30 20 29     if( pAlt==0 )
22400 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
22410 66 28 20 70 41 6c 74 2d 3e 77 74 46 6c 61 67 73  f( pAlt->wtFlags
22420 20 26 20 28 54 45 52 4d 5f 43 4f 44 45 44 29 20   & (TERM_CODED) 
22430 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
22440 74 65 73 74 63 61 73 65 28 20 70 41 6c 74 2d 3e  testcase( pAlt->
22450 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45  eOperator & WO_E
22460 51 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  Q );.    testcas
22470 65 28 20 70 41 6c 74 2d 3e 65 4f 70 65 72 61 74  e( pAlt->eOperat
22480 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20  or & WO_IN );.  
22490 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d    VdbeModuleComm
224a0 65 6e 74 28 28 76 2c 20 22 62 65 67 69 6e 20 74  ent((v, "begin t
224b0 72 61 6e 73 69 74 69 76 65 20 63 6f 6e 73 74 72  ransitive constr
224c0 61 69 6e 74 22 29 29 3b 0a 20 20 20 20 70 45 41  aint"));.    pEA
224d0 6c 74 20 3d 20 73 71 6c 69 74 65 33 53 74 61 63  lt = sqlite3Stac
224e0 6b 41 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  kAllocRaw(db, si
224f0 7a 65 6f 66 28 2a 70 45 41 6c 74 29 29 3b 0a 20  zeof(*pEAlt));. 
22500 20 20 20 69 66 28 20 70 45 41 6c 74 20 29 7b 0a     if( pEAlt ){.
22510 20 20 20 20 20 20 2a 70 45 41 6c 74 20 3d 20 2a        *pEAlt = *
22520 70 41 6c 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20  pAlt->pExpr;.   
22530 20 20 20 70 45 41 6c 74 2d 3e 70 4c 65 66 74 20     pEAlt->pLeft 
22540 3d 20 70 45 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  = pE->pLeft;.   
22550 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
22560 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
22570 41 6c 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53  Alt, addrCont, S
22580 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
22590 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
225a0 53 74 61 63 6b 46 72 65 65 28 64 62 2c 20 70 45  StackFree(db, pE
225b0 41 6c 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Alt);.    }.  }.
225c0 0a 20 20 2f 2a 20 46 6f 72 20 61 20 4c 45 46 54  .  /* For a LEFT
225d0 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 67 65 6e   OUTER JOIN, gen
225e0 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
225f0 77 69 6c 6c 20 72 65 63 6f 72 64 20 74 68 65 20  will record the 
22600 66 61 63 74 20 74 68 61 74 0a 20 20 2a 2a 20 61  fact that.  ** a
22610 74 20 6c 65 61 73 74 20 6f 6e 65 20 72 6f 77 20  t least one row 
22620 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62  of the right tab
22630 6c 65 20 68 61 73 20 6d 61 74 63 68 65 64 20 74  le has matched t
22640 68 65 20 6c 65 66 74 20 74 61 62 6c 65 2e 20 20  he left table.  
22650 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76  .  */.  if( pLev
22660 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b  el->iLeftJoin ){
22670 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64  .    pLevel->add
22680 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33  rFirst = sqlite3
22690 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
226a0 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
226b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
226c0 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 4c 65 76  Integer, 1, pLev
226d0 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a  el->iLeftJoin);.
226e0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
226f0 28 76 2c 20 22 72 65 63 6f 72 64 20 4c 45 46 54  (v, "record LEFT
22700 20 4a 4f 49 4e 20 68 69 74 22 29 29 3b 0a 20 20   JOIN hit"));.  
22710 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
22720 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
22730 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  .    for(pTerm=p
22740 57 43 2d 3e 61 2c 20 6a 3d 30 3b 20 6a 3c 70 57  WC->a, j=0; j<pW
22750 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70  C->nTerm; j++, p
22760 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 74  Term++){.      t
22770 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
22780 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
22790 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20  IRTUAL );.      
227a0 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
227b0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
227c0 43 4f 44 45 44 20 29 3b 0a 20 20 20 20 20 20 69  CODED );.      i
227d0 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  f( pTerm->wtFlag
227e0 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41  s & (TERM_VIRTUA
227f0 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20  L|TERM_CODED) ) 
22800 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
22810 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  if( (pTerm->prer
22820 65 71 41 6c 6c 20 26 20 70 4c 65 76 65 6c 2d 3e  eqAll & pLevel->
22830 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 7b 0a  notReady)!=0 ){.
22840 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
22850 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64  pWInfo->untested
22860 54 65 72 6d 73 20 29 3b 0a 20 20 20 20 20 20 20  Terms );.       
22870 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
22880 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
22890 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b   pTerm->pExpr );
228a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
228b0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
228c0 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  , pTerm->pExpr, 
228d0 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45  addrCont, SQLITE
228e0 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
228f0 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61      pTerm->wtFla
22900 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44  gs |= TERM_CODED
22910 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
22920 65 74 75 72 6e 20 70 4c 65 76 65 6c 2d 3e 6e 6f  eturn pLevel->no
22930 74 52 65 61 64 79 3b 0a 7d 0a 0a 23 69 66 64 65  tReady;.}..#ifde
22940 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
22950 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  BLED./*.** Print
22960 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
22970 61 20 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65  a WhereTerm obje
22980 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ct.*/.static voi
22990 64 20 77 68 65 72 65 54 65 72 6d 50 72 69 6e 74  d whereTermPrint
229a0 28 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72  (WhereTerm *pTer
229b0 6d 2c 20 69 6e 74 20 69 54 65 72 6d 29 7b 0a 20  m, int iTerm){. 
229c0 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 7b   if( pTerm==0 ){
229d0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
229e0 67 50 72 69 6e 74 66 28 22 54 45 52 4d 2d 25 2d  gPrintf("TERM-%-
229f0 33 64 20 4e 55 4c 4c 5c 6e 22 2c 20 69 54 65 72  3d NULL\n", iTer
22a00 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  m);.  }else{.   
22a10 20 63 68 61 72 20 7a 54 79 70 65 5b 34 5d 3b 0a   char zType[4];.
22a20 20 20 20 20 6d 65 6d 63 70 79 28 7a 54 79 70 65      memcpy(zType
22a30 2c 20 22 2e 2e 2e 22 2c 20 34 29 3b 0a 20 20 20  , "...", 4);.   
22a40 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c   if( pTerm->wtFl
22a50 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
22a60 41 4c 20 29 20 7a 54 79 70 65 5b 30 5d 20 3d 20  AL ) zType[0] = 
22a70 27 56 27 3b 0a 20 20 20 20 69 66 28 20 70 54 65  'V';.    if( pTe
22a80 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
22a90 57 4f 5f 45 51 55 49 56 20 20 29 20 7a 54 79 70  WO_EQUIV  ) zTyp
22aa0 65 5b 31 5d 20 3d 20 27 45 27 3b 0a 20 20 20 20  e[1] = 'E';.    
22ab0 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
22ac0 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  rty(pTerm->pExpr
22ad0 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
22ae0 20 7a 54 79 70 65 5b 32 5d 20 3d 20 27 4c 27 3b   zType[2] = 'L';
22af0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
22b00 67 50 72 69 6e 74 66 28 22 54 45 52 4d 2d 25 2d  gPrintf("TERM-%-
22b10 33 64 20 25 70 20 25 73 20 63 75 72 73 6f 72 3d  3d %p %s cursor=
22b20 25 2d 33 64 20 70 72 6f 62 3d 25 2d 33 64 20 6f  %-3d prob=%-3d o
22b30 70 3d 30 78 25 30 33 78 5c 6e 22 2c 0a 20 20 20  p=0x%03x\n",.   
22b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b50 20 20 20 20 69 54 65 72 6d 2c 20 70 54 65 72 6d      iTerm, pTerm
22b60 2c 20 7a 54 79 70 65 2c 20 70 54 65 72 6d 2d 3e  , zType, pTerm->
22b70 6c 65 66 74 43 75 72 73 6f 72 2c 20 70 54 65 72  leftCursor, pTer
22b80 6d 2d 3e 74 72 75 74 68 50 72 6f 62 2c 0a 20 20  m->truthProb,.  
22b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ba0 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65       pTerm->eOpe
22bb0 72 61 74 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69  rator);.    sqli
22bc0 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28  te3TreeViewExpr(
22bd0 30 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  0, pTerm->pExpr,
22be0 20 30 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69   0);.  }.}.#endi
22bf0 66 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54  f..#ifdef WHERET
22c00 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a  RACE_ENABLED./*.
22c10 2a 2a 20 50 72 69 6e 74 20 61 20 57 68 65 72 65  ** Print a Where
22c20 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 66 6f 72 20  Loop object for 
22c30 64 65 62 75 67 67 69 6e 67 20 70 75 72 70 6f 73  debugging purpos
22c40 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  es.*/.static voi
22c50 64 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74  d whereLoopPrint
22c60 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 57  (WhereLoop *p, W
22c70 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 29  hereClause *pWC)
22c80 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
22c90 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49  WInfo = pWC->pWI
22ca0 6e 66 6f 3b 0a 20 20 69 6e 74 20 6e 62 20 3d 20  nfo;.  int nb = 
22cb0 31 2b 28 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  1+(pWInfo->pTabL
22cc0 69 73 74 2d 3e 6e 53 72 63 2b 37 29 2f 38 3b 0a  ist->nSrc+7)/8;.
22cd0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
22ce0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70  _item *pItem = p
22cf0 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
22d00 3e 61 20 2b 20 70 2d 3e 69 54 61 62 3b 0a 20 20  >a + p->iTab;.  
22d10 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49  Table *pTab = pI
22d20 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 73 71 6c  tem->pTab;.  sql
22d30 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
22d40 22 25 63 25 32 64 2e 25 30 2a 6c 6c 78 2e 25 30  "%c%2d.%0*llx.%0
22d50 2a 6c 6c 78 22 2c 20 70 2d 3e 63 49 64 2c 0a 20  *llx", p->cId,. 
22d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d70 20 20 20 20 70 2d 3e 69 54 61 62 2c 20 6e 62 2c      p->iTab, nb,
22d80 20 70 2d 3e 6d 61 73 6b 53 65 6c 66 2c 20 6e 62   p->maskSelf, nb
22d90 2c 20 70 2d 3e 70 72 65 72 65 71 29 3b 0a 20 20  , p->prereq);.  
22da0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
22db0 74 66 28 22 20 25 31 32 73 22 2c 0a 20 20 20 20  tf(" %12s",.    
22dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22dd0 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3f   pItem->zAlias ?
22de0 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3a   pItem->zAlias :
22df0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
22e00 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73   if( (p->wsFlags
22e10 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
22e20 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20  TABLE)==0 ){.   
22e30 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
22e40 6d 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75  me;.    if( p->u
22e50 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 26 26  .btree.pIndex &&
22e60 20 28 7a 4e 61 6d 65 20 3d 20 70 2d 3e 75 2e 62   (zName = p->u.b
22e70 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61  tree.pIndex->zNa
22e80 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)!=0 ){.      
22e90 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 4e 61 6d  if( strncmp(zNam
22ea0 65 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69  e, "sqlite_autoi
22eb0 6e 64 65 78 5f 22 2c 20 31 37 29 3d 3d 30 20 29  ndex_", 17)==0 )
22ec0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 20  {.        int i 
22ed0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
22ee0 30 28 7a 4e 61 6d 65 29 20 2d 20 31 3b 0a 20 20  0(zName) - 1;.  
22ef0 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 4e 61        while( zNa
22f00 6d 65 5b 69 5d 21 3d 27 5f 27 20 29 20 69 2d 2d  me[i]!='_' ) i--
22f10 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  ;.        zName 
22f20 2b 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20  += i;.      }.  
22f30 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
22f40 50 72 69 6e 74 66 28 22 2e 25 2d 31 36 73 20 25  Printf(".%-16s %
22f50 32 64 22 2c 20 7a 4e 61 6d 65 2c 20 70 2d 3e 75  2d", zName, p->u
22f60 2e 62 74 72 65 65 2e 6e 45 71 29 3b 0a 20 20 20  .btree.nEq);.   
22f70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
22f80 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
22f90 28 22 25 32 30 73 22 2c 22 22 29 3b 0a 20 20 20  ("%20s","");.   
22fa0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
22fb0 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69 66 28  char *z;.    if(
22fc0 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74   p->u.vtab.idxSt
22fd0 72 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73  r ){.      z = s
22fe0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
22ff0 28 25 64 2c 5c 22 25 73 5c 22 2c 25 78 29 22 2c  (%d,\"%s\",%x)",
23000 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23010 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75   p->u.vtab.idxNu
23020 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  m, p->u.vtab.idx
23030 53 74 72 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f  Str, p->u.vtab.o
23040 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 65  mitMask);.    }e
23050 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73  lse{.      z = s
23060 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
23070 28 25 64 2c 25 78 29 22 2c 20 70 2d 3e 75 2e 76  (%d,%x)", p->u.v
23080 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75  tab.idxNum, p->u
23090 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b  .vtab.omitMask);
230a0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
230b0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
230c0 25 2d 31 39 73 22 2c 20 7a 29 3b 0a 20 20 20 20  %-19s", z);.    
230d0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
230e0 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 77 73  .  }.  if( p->ws
230f0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53 4b  Flags & WHERE_SK
23100 49 50 53 43 41 4e 20 29 7b 0a 20 20 20 20 73 71  IPSCAN ){.    sq
23110 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
23120 28 22 20 66 20 25 30 35 78 20 25 64 2d 25 64 22  (" f %05x %d-%d"
23130 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20 70 2d  , p->wsFlags, p-
23140 3e 6e 4c 54 65 72 6d 2c 70 2d 3e 75 2e 62 74 72  >nLTerm,p->u.btr
23150 65 65 2e 6e 53 6b 69 70 29 3b 0a 20 20 7d 65 6c  ee.nSkip);.  }el
23160 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  se{.    sqlite3D
23170 65 62 75 67 50 72 69 6e 74 66 28 22 20 66 20 25  ebugPrintf(" f %
23180 30 35 78 20 4e 20 25 64 22 2c 20 70 2d 3e 77 73  05x N %d", p->ws
23190 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d  Flags, p->nLTerm
231a0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
231b0 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 63 6f  DebugPrintf(" co
231c0 73 74 20 25 64 2c 25 64 2c 25 64 5c 6e 22 2c 20  st %d,%d,%d\n", 
231d0 70 2d 3e 72 53 65 74 75 70 2c 20 70 2d 3e 72 52  p->rSetup, p->rR
231e0 75 6e 2c 20 70 2d 3e 6e 4f 75 74 29 3b 0a 20 20  un, p->nOut);.  
231f0 69 66 28 20 70 2d 3e 6e 4c 54 65 72 6d 20 26 26  if( p->nLTerm &&
23200 20 28 73 71 6c 69 74 65 33 57 68 65 72 65 54 72   (sqlite3WhereTr
23210 61 63 65 20 26 20 30 78 31 30 30 29 21 3d 30 20  ace & 0x100)!=0 
23220 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
23230 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
23240 6e 4c 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20  nLTerm; i++){.  
23250 20 20 20 20 77 68 65 72 65 54 65 72 6d 50 72 69      whereTermPri
23260 6e 74 28 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2c  nt(p->aLTerm[i],
23270 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d   i);.    }.  }.}
23280 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
23290 6f 6e 76 65 72 74 20 62 75 6c 6b 20 6d 65 6d 6f  onvert bulk memo
232a0 72 79 20 69 6e 74 6f 20 61 20 76 61 6c 69 64 20  ry into a valid 
232b0 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 63  WhereLoop that c
232c0 61 6e 20 62 65 20 70 61 73 73 65 64 0a 2a 2a 20  an be passed.** 
232d0 74 6f 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  to whereLoopClea
232e0 72 20 68 61 72 6d 6c 65 73 73 6c 79 2e 0a 2a 2f  r harmlessly..*/
232f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
23300 72 65 4c 6f 6f 70 49 6e 69 74 28 57 68 65 72 65  reLoopInit(Where
23310 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 70 2d 3e 61  Loop *p){.  p->a
23320 4c 54 65 72 6d 20 3d 20 70 2d 3e 61 4c 54 65 72  LTerm = p->aLTer
23330 6d 53 70 61 63 65 3b 0a 20 20 70 2d 3e 6e 4c 54  mSpace;.  p->nLT
23340 65 72 6d 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 4c  erm = 0;.  p->nL
23350 53 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65  Slot = ArraySize
23360 28 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 29  (p->aLTermSpace)
23370 3b 0a 20 20 70 2d 3e 77 73 46 6c 61 67 73 20 3d  ;.  p->wsFlags =
23380 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65   0;.}../*.** Cle
23390 61 72 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  ar the WhereLoop
233a0 2e 75 20 75 6e 69 6f 6e 2e 20 20 4c 65 61 76 65  .u union.  Leave
233b0 20 57 68 65 72 65 4c 6f 6f 70 2e 70 4c 54 65 72   WhereLoop.pLTer
233c0 6d 20 69 6e 74 61 63 74 2e 0a 2a 2f 0a 73 74 61  m intact..*/.sta
233d0 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f  tic void whereLo
233e0 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 73 71 6c  opClearUnion(sql
233f0 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c  ite3 *db, WhereL
23400 6f 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  oop *p){.  if( p
23410 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45  ->wsFlags & (WHE
23420 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 7c  RE_VIRTUALTABLE|
23430 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
23440 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d  ) ){.    if( (p-
23450 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
23460 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d  _VIRTUALTABLE)!=
23470 30 20 26 26 20 70 2d 3e 75 2e 76 74 61 62 2e 6e  0 && p->u.vtab.n
23480 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20 20 20  eedFree ){.     
23490 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
234a0 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b  >u.vtab.idxStr);
234b0 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62  .      p->u.vtab
234c0 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
234d0 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69       p->u.vtab.i
234e0 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 7d  dxStr = 0;.    }
234f0 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 77 73 46  else if( (p->wsF
23500 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54  lags & WHERE_AUT
23510 4f 5f 49 4e 44 45 58 29 21 3d 30 20 26 26 20 70  O_INDEX)!=0 && p
23520 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
23530 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
23540 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
23550 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
23560 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 20 20  ->zColAff);.    
23570 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f    sqlite3KeyInfo
23580 55 6e 72 65 66 28 70 2d 3e 75 2e 62 74 72 65 65  Unref(p->u.btree
23590 2e 70 49 6e 64 65 78 2d 3e 70 4b 65 79 49 6e 66  .pIndex->pKeyInf
235a0 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  o);.      sqlite
235b0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75  3DbFree(db, p->u
235c0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29 3b 0a  .btree.pIndex);.
235d0 20 20 20 20 20 20 70 2d 3e 75 2e 62 74 72 65 65        p->u.btree
235e0 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20  .pIndex = 0;.   
235f0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
23600 44 65 61 6c 6c 6f 63 61 74 65 20 69 6e 74 65 72  Deallocate inter
23610 6e 61 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20  nal memory used 
23620 62 79 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f  by a WhereLoop o
23630 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20  bject.*/.static 
23640 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c  void whereLoopCl
23650 65 61 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ear(sqlite3 *db,
23660 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a   WhereLoop *p){.
23670 20 20 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21    if( p->aLTerm!
23680 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 20  =p->aLTermSpace 
23690 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  ) sqlite3DbFree(
236a0 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a  db, p->aLTerm);.
236b0 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72    whereLoopClear
236c0 55 6e 69 6f 6e 28 64 62 2c 20 70 29 3b 0a 20 20  Union(db, p);.  
236d0 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29  whereLoopInit(p)
236e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65  ;.}../*.** Incre
236f0 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61  ase the memory a
23700 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 4c  llocation for pL
23710 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 5d 20 74 6f  oop->aLTerm[] to
23720 20 62 65 20 61 74 20 6c 65 61 73 74 20 6e 2e 0a   be at least n..
23730 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
23740 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 73 71  ereLoopResize(sq
23750 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
23760 4c 6f 6f 70 20 2a 70 2c 20 69 6e 74 20 6e 29 7b  Loop *p, int n){
23770 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 2a 70  .  WhereTerm **p
23780 61 4e 65 77 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  aNew;.  if( p->n
23790 4c 53 6c 6f 74 3e 3d 6e 20 29 20 72 65 74 75 72  LSlot>=n ) retur
237a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6e  n SQLITE_OK;.  n
237b0 20 3d 20 28 6e 2b 37 29 26 7e 37 3b 0a 20 20 70   = (n+7)&~7;.  p
237c0 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  aNew = sqlite3Db
237d0 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
237e0 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b 30  zeof(p->aLTerm[0
237f0 5d 29 2a 6e 29 3b 0a 20 20 69 66 28 20 70 61 4e  ])*n);.  if( paN
23800 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ew==0 ) return S
23810 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d  QLITE_NOMEM;.  m
23820 65 6d 63 70 79 28 70 61 4e 65 77 2c 20 70 2d 3e  emcpy(paNew, p->
23830 61 4c 54 65 72 6d 2c 20 73 69 7a 65 6f 66 28 70  aLTerm, sizeof(p
23840 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 70 2d 3e  ->aLTerm[0])*p->
23850 6e 4c 53 6c 6f 74 29 3b 0a 20 20 69 66 28 20 70  nLSlot);.  if( p
23860 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54  ->aLTerm!=p->aLT
23870 65 72 6d 53 70 61 63 65 20 29 20 73 71 6c 69 74  ermSpace ) sqlit
23880 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
23890 61 4c 54 65 72 6d 29 3b 0a 20 20 70 2d 3e 61 4c  aLTerm);.  p->aL
238a0 54 65 72 6d 20 3d 20 70 61 4e 65 77 3b 0a 20 20  Term = paNew;.  
238b0 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 6e 3b 0a 20  p->nLSlot = n;. 
238c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
238d0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e  K;.}../*.** Tran
238e0 73 66 65 72 20 63 6f 6e 74 65 6e 74 20 66 72 6f  sfer content fro
238f0 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 70 4c 6f  m the second pLo
23900 6f 70 20 69 6e 74 6f 20 74 68 65 20 66 69 72 73  op into the firs
23910 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
23920 20 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 73   whereLoopXfer(s
23930 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
23940 65 4c 6f 6f 70 20 2a 70 54 6f 2c 20 57 68 65 72  eLoop *pTo, Wher
23950 65 4c 6f 6f 70 20 2a 70 46 72 6f 6d 29 7b 0a 20  eLoop *pFrom){. 
23960 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55   whereLoopClearU
23970 6e 69 6f 6e 28 64 62 2c 20 70 54 6f 29 3b 0a 20  nion(db, pTo);. 
23980 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65   if( whereLoopRe
23990 73 69 7a 65 28 64 62 2c 20 70 54 6f 2c 20 70 46  size(db, pTo, pF
239a0 72 6f 6d 2d 3e 6e 4c 54 65 72 6d 29 20 29 7b 0a  rom->nLTerm) ){.
239b0 20 20 20 20 6d 65 6d 73 65 74 28 26 70 54 6f 2d      memset(&pTo-
239c0 3e 75 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 54  >u, 0, sizeof(pT
239d0 6f 2d 3e 75 29 29 3b 0a 20 20 20 20 72 65 74 75  o->u));.    retu
239e0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
239f0 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 70 54  .  }.  memcpy(pT
23a00 6f 2c 20 70 46 72 6f 6d 2c 20 57 48 45 52 45 5f  o, pFrom, WHERE_
23a10 4c 4f 4f 50 5f 58 46 45 52 5f 53 5a 29 3b 0a 20  LOOP_XFER_SZ);. 
23a20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 54   memcpy(pTo->aLT
23a30 65 72 6d 2c 20 70 46 72 6f 6d 2d 3e 61 4c 54 65  erm, pFrom->aLTe
23a40 72 6d 2c 20 70 54 6f 2d 3e 6e 4c 54 65 72 6d 2a  rm, pTo->nLTerm*
23a50 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 61 4c 54 65  sizeof(pTo->aLTe
23a60 72 6d 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70  rm[0]));.  if( p
23a70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20  From->wsFlags & 
23a80 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
23a90 4c 45 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d  LE ){.    pFrom-
23aa0 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65  >u.vtab.needFree
23ab0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
23ac0 28 20 28 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67  ( (pFrom->wsFlag
23ad0 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49  s & WHERE_AUTO_I
23ae0 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20 20 20 20  NDEX)!=0 ){.    
23af0 70 46 72 6f 6d 2d 3e 75 2e 62 74 72 65 65 2e 70  pFrom->u.btree.p
23b00 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20  Index = 0;.  }. 
23b10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
23b20 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  K;.}../*.** Dele
23b30 74 65 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f  te a WhereLoop o
23b40 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20  bject.*/.static 
23b50 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 44 65  void whereLoopDe
23b60 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
23b70 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b  , WhereLoop *p){
23b80 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  .  whereLoopClea
23b90 72 28 64 62 2c 20 70 29 3b 0a 20 20 73 71 6c 69  r(db, p);.  sqli
23ba0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
23bb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
23bc0 61 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75  a WhereInfo stru
23bd0 63 74 75 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20  cture.*/.static 
23be0 76 6f 69 64 20 77 68 65 72 65 49 6e 66 6f 46 72  void whereInfoFr
23bf0 65 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ee(sqlite3 *db, 
23c00 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
23c10 6f 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  o){.  if( ALWAYS
23c20 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20  (pWInfo) ){.    
23c30 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72  whereClauseClear
23c40 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a  (&pWInfo->sWC);.
23c50 20 20 20 20 77 68 69 6c 65 28 20 70 57 49 6e 66      while( pWInf
23c60 6f 2d 3e 70 4c 6f 6f 70 73 20 29 7b 0a 20 20 20  o->pLoops ){.   
23c70 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 20     WhereLoop *p 
23c80 3d 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73  = pWInfo->pLoops
23c90 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  ;.      pWInfo->
23ca0 70 4c 6f 6f 70 73 20 3d 20 70 2d 3e 70 4e 65 78  pLoops = p->pNex
23cb0 74 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 77 68 65  tLoop;.      whe
23cc0 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 64 62 2c  reLoopDelete(db,
23cd0 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   p);.    }.    s
23ce0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
23cf0 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a   pWInfo);.  }.}.
23d00 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
23d10 55 45 20 69 66 20 62 6f 74 68 20 6f 66 20 74 68  UE if both of th
23d20 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
23d30 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31  true:.**.**   (1
23d40 29 20 20 58 20 68 61 73 20 74 68 65 20 73 61 6d  )  X has the sam
23d50 65 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74 20  e or lower cost 
23d60 74 68 61 74 20 59 0a 2a 2a 20 20 20 28 32 29 20  that Y.**   (2) 
23d70 20 58 20 69 73 20 61 20 70 72 6f 70 65 72 20 73   X is a proper s
23d80 75 62 73 65 74 20 6f 66 20 59 0a 2a 2a 0a 2a 2a  ubset of Y.**.**
23d90 20 42 79 20 22 70 72 6f 70 65 72 20 73 75 62 73   By "proper subs
23da0 65 74 22 20 77 65 20 6d 65 61 6e 20 74 68 61 74  et" we mean that
23db0 20 58 20 75 73 65 73 20 66 65 77 65 72 20 57 48   X uses fewer WH
23dc0 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
23dd0 0a 2a 2a 20 74 68 61 6e 20 59 20 61 6e 64 20 74  .** than Y and t
23de0 68 61 74 20 65 76 65 72 79 20 57 48 45 52 45 20  hat every WHERE 
23df0 63 6c 61 75 73 65 20 74 65 72 6d 20 75 73 65 64  clause term used
23e00 20 62 79 20 58 20 69 73 20 61 6c 73 6f 20 75 73   by X is also us
23e10 65 64 0a 2a 2a 20 62 79 20 59 2e 0a 2a 2a 0a 2a  ed.** by Y..**.*
23e20 2a 20 49 66 20 58 20 69 73 20 61 20 70 72 6f 70  * If X is a prop
23e30 65 72 20 73 75 62 73 65 74 20 6f 66 20 59 20 74  er subset of Y t
23e40 68 65 6e 20 59 20 69 73 20 61 20 62 65 74 74 65  hen Y is a bette
23e50 72 20 63 68 6f 69 63 65 20 61 6e 64 20 6f 75 67  r choice and oug
23e60 68 74 0a 2a 2a 20 74 6f 20 68 61 76 65 20 61 20  ht.** to have a 
23e70 6c 6f 77 65 72 20 63 6f 73 74 2e 20 20 54 68 69  lower cost.  Thi
23e80 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
23e90 73 20 54 52 55 45 20 77 68 65 6e 20 74 68 61 74  s TRUE when that
23ea0 20 63 6f 73 74 20 0a 2a 2a 20 72 65 6c 61 74 69   cost .** relati
23eb0 6f 6e 73 68 69 70 20 69 73 20 69 6e 76 65 72 74  onship is invert
23ec0 65 64 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20  ed and needs to 
23ed0 62 65 20 61 64 6a 75 73 74 65 64 2e 0a 2a 2f 0a  be adjusted..*/.
23ee0 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
23ef0 4c 6f 6f 70 43 68 65 61 70 65 72 50 72 6f 70 65  LoopCheaperPrope
23f00 72 53 75 62 73 65 74 28 0a 20 20 63 6f 6e 73 74  rSubset(.  const
23f10 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 58 2c 20   WhereLoop *pX, 
23f20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 57        /* First W
23f30 68 65 72 65 4c 6f 6f 70 20 74 6f 20 63 6f 6d 70  hereLoop to comp
23f40 61 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 57  are */.  const W
23f50 68 65 72 65 4c 6f 6f 70 20 2a 70 59 20 20 20 20  hereLoop *pY    
23f60 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 65 20 61      /* Compare a
23f70 67 61 69 6e 73 74 20 74 68 69 73 20 57 68 65 72  gainst this Wher
23f80 65 4c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 69 6e  eLoop */.){.  in
23f90 74 20 69 2c 20 6a 3b 0a 20 20 69 66 28 20 70 58  t i, j;.  if( pX
23fa0 2d 3e 6e 4c 54 65 72 6d 20 3e 3d 20 70 59 2d 3e  ->nLTerm >= pY->
23fb0 6e 4c 54 65 72 6d 20 29 20 72 65 74 75 72 6e 20  nLTerm ) return 
23fc0 30 3b 20 2f 2a 20 58 20 69 73 20 6e 6f 74 20 61  0; /* X is not a
23fd0 20 73 75 62 73 65 74 20 6f 66 20 59 20 2a 2f 0a   subset of Y */.
23fe0 20 20 69 66 28 20 70 58 2d 3e 72 52 75 6e 20 3e    if( pX->rRun >
23ff0 3d 20 70 59 2d 3e 72 52 75 6e 20 29 7b 0a 20 20  = pY->rRun ){.  
24000 20 20 69 66 28 20 70 58 2d 3e 72 52 75 6e 20 3e    if( pX->rRun >
24010 20 70 59 2d 3e 72 52 75 6e 20 29 20 72 65 74 75   pY->rRun ) retu
24020 72 6e 20 30 3b 20 20 20 20 2f 2a 20 58 20 63 6f  rn 0;    /* X co
24030 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 59 20  sts more than Y 
24040 2a 2f 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 6e  */.    if( pX->n
24050 4f 75 74 20 3e 20 70 59 2d 3e 6e 4f 75 74 20 29  Out > pY->nOut )
24060 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a   return 0;    /*
24070 20 58 20 63 6f 73 74 73 20 6d 6f 72 65 20 74 68   X costs more th
24080 61 6e 20 59 20 2a 2f 0a 20 20 7d 0a 20 20 66 6f  an Y */.  }.  fo
24090 72 28 69 3d 70 58 2d 3e 6e 4c 54 65 72 6d 2d 31  r(i=pX->nLTerm-1
240a0 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
240b0 20 20 66 6f 72 28 6a 3d 70 59 2d 3e 6e 4c 54 65    for(j=pY->nLTe
240c0 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29  rm-1; j>=0; j--)
240d0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 59 2d 3e  {.      if( pY->
240e0 61 4c 54 65 72 6d 5b 6a 5d 3d 3d 70 58 2d 3e 61  aLTerm[j]==pX->a
240f0 4c 54 65 72 6d 5b 69 5d 20 29 20 62 72 65 61 6b  LTerm[i] ) break
24100 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
24110 6a 3c 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  j<0 ) return 0; 
24120 20 2f 2a 20 58 20 6e 6f 74 20 61 20 73 75 62 73   /* X not a subs
24130 65 74 20 6f 66 20 59 20 73 69 6e 63 65 20 74 65  et of Y since te
24140 72 6d 20 58 5b 69 5d 20 6e 6f 74 20 75 73 65 64  rm X[i] not used
24150 20 62 79 20 59 20 2a 2f 0a 20 20 7d 0a 20 20 72   by Y */.  }.  r
24160 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 41 6c 6c  eturn 1;  /* All
24170 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 65 65 74   conditions meet
24180 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79   */.}../*.** Try
24190 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 63   to adjust the c
241a0 6f 73 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70  ost of WhereLoop
241b0 20 70 54 65 6d 70 6c 61 74 65 20 75 70 77 61 72   pTemplate upwar
241c0 64 73 20 6f 72 20 64 6f 77 6e 77 61 72 64 73 20  ds or downwards 
241d0 73 6f 0a 2a 2a 20 74 68 61 74 3a 0a 2a 2a 0a 2a  so.** that:.**.*
241e0 2a 20 20 20 28 31 29 20 70 54 65 6d 70 6c 61 74  *   (1) pTemplat
241f0 65 20 63 6f 73 74 73 20 6c 65 73 73 20 74 68 61  e costs less tha
24200 6e 20 61 6e 79 20 6f 74 68 65 72 20 57 68 65 72  n any other Wher
24210 65 4c 6f 6f 70 73 20 74 68 61 74 20 61 72 65 20  eLoops that are 
24220 61 20 70 72 6f 70 65 72 0a 2a 2a 20 20 20 20 20  a proper.**     
24230 20 20 73 75 62 73 65 74 20 6f 66 20 70 54 65 6d    subset of pTem
24240 70 6c 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 28 32  plate.**.**   (2
24250 29 20 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74  ) pTemplate cost
24260 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e 79 20  s more than any 
24270 6f 74 68 65 72 20 57 68 65 72 65 4c 6f 6f 70 73  other WhereLoops
24280 20 66 6f 72 20 77 68 69 63 68 20 70 54 65 6d 70   for which pTemp
24290 6c 61 74 65 0a 2a 2a 20 20 20 20 20 20 20 69 73  late.**       is
242a0 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74   a proper subset
242b0 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 73 61 79 20 22  ..**.** To say "
242c0 57 68 65 72 65 4c 6f 6f 70 20 58 20 69 73 20 61  WhereLoop X is a
242d0 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f   proper subset o
242e0 66 20 59 22 20 6d 65 61 6e 73 20 74 68 61 74 20  f Y" means that 
242f0 58 20 75 73 65 73 20 66 65 77 65 72 0a 2a 2a 20  X uses fewer.** 
24300 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
24310 6d 73 20 74 68 61 6e 20 59 20 61 6e 64 20 74 68  ms than Y and th
24320 61 74 20 65 76 65 72 79 20 57 48 45 52 45 20 63  at every WHERE c
24330 6c 61 75 73 65 20 74 65 72 6d 20 75 73 65 64 20  lause term used 
24340 62 79 20 58 20 69 73 0a 2a 2a 20 61 6c 73 6f 20  by X is.** also 
24350 75 73 65 64 20 62 79 20 59 2e 0a 2a 2a 0a 2a 2a  used by Y..**.**
24360 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74   This adjustment
24370 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f 72 20   is omitted for 
24380 53 4b 49 50 53 43 41 4e 20 6c 6f 6f 70 73 2e 20  SKIPSCAN loops. 
24390 20 49 6e 20 61 20 53 4b 49 50 53 43 41 4e 20 6c   In a SKIPSCAN l
243a0 6f 6f 70 2c 20 74 68 65 0a 2a 2a 20 57 68 65 72  oop, the.** Wher
243b0 65 4c 6f 6f 70 2e 6e 4c 54 65 72 6d 20 66 69 65  eLoop.nLTerm fie
243c0 6c 64 20 69 73 20 6e 6f 74 20 61 6e 20 61 63 63  ld is not an acc
243d0 75 72 61 74 65 20 6d 65 61 73 75 72 65 20 6f 66  urate measure of
243e0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 57   the number of W
243f0 48 45 52 45 0a 2a 2a 20 63 6c 61 75 73 65 20 74  HERE.** clause t
24400 65 72 6d 73 20 63 6f 76 65 72 65 64 2c 20 73 69  erms covered, si
24410 6e 63 65 20 73 6f 6d 65 20 6f 66 20 74 68 65 20  nce some of the 
24420 66 69 72 73 74 20 6e 4c 54 65 72 6d 20 65 6e 74  first nLTerm ent
24430 72 69 65 73 20 69 6e 20 61 4c 54 65 72 6d 5b 5d  ries in aLTerm[]
24440 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c  .** will be NULL
24450 20 28 62 65 63 61 75 73 65 20 74 68 65 79 20 61   (because they a
24460 72 65 20 73 6b 69 70 70 65 64 29 2e 20 20 54 68  re skipped).  Th
24470 61 74 20 6d 61 6b 65 73 20 69 74 20 6d 6f 72 65  at makes it more
24480 20 64 69 66 66 69 63 75 6c 74 0a 2a 2a 20 74 6f   difficult.** to
24490 20 63 6f 6d 70 61 72 65 20 74 68 65 20 6c 6f 6f   compare the loo
244a0 70 73 2e 20 20 57 65 20 63 6f 75 6c 64 20 61 64  ps.  We could ad
244b0 64 20 65 78 74 72 61 20 63 6f 64 65 20 74 6f 20  d extra code to 
244c0 64 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  do the compariso
244d0 6e 2c 20 61 6e 64 0a 2a 2a 20 70 65 72 68 61 70  n, and.** perhap
244e0 73 20 77 65 20 77 69 6c 6c 20 73 6f 6d 65 64 61  s we will someda
244f0 79 2e 20 20 42 75 74 20 53 4b 49 50 53 43 41 4e  y.  But SKIPSCAN
24500 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 6c 79   is sufficiently
24510 20 75 6e 63 6f 6d 6d 6f 6e 2c 20 61 6e 64 20 74   uncommon, and t
24520 68 69 73 0a 2a 2a 20 61 64 6a 75 73 74 6d 65 6e  his.** adjustmen
24530 74 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 20  t is sufficient 
24540 6d 69 6e 6f 72 2c 20 74 68 61 74 20 69 74 20 69  minor, that it i
24550 73 20 76 65 72 79 20 64 69 66 66 69 63 75 6c 74  s very difficult
24560 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 0a 2a 2a   to construct.**
24570 20 61 20 74 65 73 74 20 63 61 73 65 20 77 68 65   a test case whe
24580 72 65 20 74 68 65 20 65 78 74 72 61 20 63 6f 64  re the extra cod
24590 65 20 77 6f 75 6c 64 20 69 6d 70 72 6f 76 65 20  e would improve 
245a0 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 2e 20  the query plan. 
245b0 20 42 65 74 74 65 72 0a 2a 2a 20 74 6f 20 61 76   Better.** to av
245c0 6f 69 64 20 74 68 65 20 61 64 64 65 64 20 63 6f  oid the added co
245d0 6d 70 6c 65 78 69 74 79 20 61 6e 64 20 6a 75 73  mplexity and jus
245e0 74 20 6f 6d 69 74 20 63 6f 73 74 20 61 64 6a 75  t omit cost adju
245f0 73 74 6d 65 6e 74 73 20 74 6f 20 53 4b 49 50 53  stments to SKIPS
24600 43 41 4e 0a 2a 2a 20 6c 6f 6f 70 73 2e 0a 2a 2f  CAN.** loops..*/
24610 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
24620 72 65 4c 6f 6f 70 41 64 6a 75 73 74 43 6f 73 74  reLoopAdjustCost
24630 28 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70  (const WhereLoop
24640 20 2a 70 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a   *p, WhereLoop *
24650 70 54 65 6d 70 6c 61 74 65 29 7b 0a 20 20 69 66  pTemplate){.  if
24660 28 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73  ( (pTemplate->ws
24670 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
24680 44 45 58 45 44 29 3d 3d 30 20 29 20 72 65 74 75  DEXED)==0 ) retu
24690 72 6e 3b 0a 20 20 69 66 28 20 28 70 54 65 6d 70  rn;.  if( (pTemp
246a0 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26 20  late->wsFlags & 
246b0 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 29 21  WHERE_SKIPSCAN)!
246c0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
246d0 6f 72 28 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  or(; p; p=p->pNe
246e0 78 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 69 66 28  xtLoop){.    if(
246f0 20 70 2d 3e 69 54 61 62 21 3d 70 54 65 6d 70 6c   p->iTab!=pTempl
24700 61 74 65 2d 3e 69 54 61 62 20 29 20 63 6f 6e 74  ate->iTab ) cont
24710 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70  inue;.    if( (p
24720 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
24730 45 5f 49 4e 44 45 58 45 44 29 3d 3d 30 20 29 20  E_INDEXED)==0 ) 
24740 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
24750 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  ( (p->wsFlags & 
24760 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 29 21  WHERE_SKIPSCAN)!
24770 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
24780 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70     if( whereLoop
24790 43 68 65 61 70 65 72 50 72 6f 70 65 72 53 75 62  CheaperProperSub
247a0 73 65 74 28 70 2c 20 70 54 65 6d 70 6c 61 74 65  set(p, pTemplate
247b0 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64  ) ){.      /* Ad
247c0 6a 75 73 74 20 70 54 65 6d 70 6c 61 74 65 20 63  just pTemplate c
247d0 6f 73 74 20 64 6f 77 6e 77 61 72 64 20 73 6f 20  ost downward so 
247e0 74 68 61 74 20 69 74 20 69 73 20 63 68 65 61 70  that it is cheap
247f0 65 72 20 74 68 61 6e 20 69 74 73 20 0a 20 20 20  er than its .   
24800 20 20 20 2a 2a 20 73 75 62 73 65 74 20 70 20 2a     ** subset p *
24810 2f 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74  /.      pTemplat
24820 65 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e 72 52 75  e->rRun = p->rRu
24830 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61  n;.      pTempla
24840 74 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f  te->nOut = p->nO
24850 75 74 20 2d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  ut - 1;.    }els
24860 65 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 43  e if( whereLoopC
24870 68 65 61 70 65 72 50 72 6f 70 65 72 53 75 62 73  heaperProperSubs
24880 65 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 29  et(pTemplate, p)
24890 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a   ){.      /* Adj
248a0 75 73 74 20 70 54 65 6d 70 6c 61 74 65 20 63 6f  ust pTemplate co
248b0 73 74 20 75 70 77 61 72 64 20 73 6f 20 74 68 61  st upward so tha
248c0 74 20 69 74 20 69 73 20 63 6f 73 74 6c 69 65 72  t it is costlier
248d0 20 74 68 61 6e 20 70 20 73 69 6e 63 65 0a 20 20   than p since.  
248e0 20 20 20 20 2a 2a 20 70 54 65 6d 70 6c 61 74 65      ** pTemplate
248f0 20 69 73 20 61 20 70 72 6f 70 65 72 20 73 75 62   is a proper sub
24900 73 65 74 20 6f 66 20 70 20 2a 2f 0a 20 20 20 20  set of p */.    
24910 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75    pTemplate->rRu
24920 6e 20 3d 20 70 2d 3e 72 52 75 6e 3b 0a 20 20 20  n = p->rRun;.   
24930 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f     pTemplate->nO
24940 75 74 20 3d 20 70 2d 3e 6e 4f 75 74 20 2b 20 31  ut = p->nOut + 1
24950 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
24960 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20  *.** Search the 
24970 6c 69 73 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f  list of WhereLoo
24980 70 73 20 69 6e 20 2a 70 70 50 72 65 76 20 6c 6f  ps in *ppPrev lo
24990 6f 6b 69 6e 67 20 66 6f 72 20 6f 6e 65 20 74 68  oking for one th
249a0 61 74 20 63 61 6e 20 62 65 0a 2a 2a 20 73 75 70  at can be.** sup
249b0 70 6c 61 6e 74 65 64 20 62 79 20 70 54 65 6d 70  planted by pTemp
249c0 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  late..**.** Retu
249d0 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 57  rn NULL if the W
249e0 68 65 72 65 4c 6f 6f 70 20 6c 69 73 74 20 63 6f  hereLoop list co
249f0 6e 74 61 69 6e 73 20 61 6e 20 65 6e 74 72 79 20  ntains an entry 
24a00 74 68 61 74 20 63 61 6e 20 73 75 70 70 6c 61 6e  that can supplan
24a10 74 0a 2a 2a 20 70 54 65 6d 70 6c 61 74 65 2c 20  t.** pTemplate, 
24a20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20 69  in other words i
24a30 66 20 70 54 65 6d 70 6c 61 74 65 20 64 6f 65 73  f pTemplate does
24a40 20 6e 6f 74 20 62 65 6c 6f 6e 67 20 6f 6e 20 74   not belong on t
24a50 68 65 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49  he list..**.** I
24a60 66 20 70 58 20 69 73 20 61 20 57 68 65 72 65 4c  f pX is a WhereL
24a70 6f 6f 70 20 74 68 61 74 20 70 54 65 6d 70 6c 61  oop that pTempla
24a80 74 65 20 63 61 6e 20 73 75 70 70 6c 61 6e 74 2c  te can supplant,
24a90 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65   then return the
24aa0 0a 2a 2a 20 6c 69 6e 6b 20 74 68 61 74 20 70 6f  .** link that po
24ab0 69 6e 74 73 20 74 6f 20 70 58 2e 0a 2a 2a 0a 2a  ints to pX..**.*
24ac0 2a 20 49 66 20 70 54 65 6d 70 6c 61 74 65 20 63  * If pTemplate c
24ad0 61 6e 6e 6f 74 20 73 75 70 70 6c 61 6e 74 20 61  annot supplant a
24ae0 6e 79 20 65 78 69 73 74 69 6e 67 20 65 6c 65 6d  ny existing elem
24af0 65 6e 74 20 6f 66 20 74 68 65 20 6c 69 73 74 20  ent of the list 
24b00 62 75 74 20 6e 65 65 64 73 0a 2a 2a 20 74 6f 20  but needs.** to 
24b10 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  be added to the 
24b20 6c 69 73 74 2c 20 74 68 65 6e 20 72 65 74 75 72  list, then retur
24b30 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
24b40 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65 20 6c  he tail of the l
24b50 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57  ist..*/.static W
24b60 68 65 72 65 4c 6f 6f 70 20 2a 2a 77 68 65 72 65  hereLoop **where
24b70 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72 28 0a  LoopFindLesser(.
24b80 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70    WhereLoop **pp
24b90 50 72 65 76 2c 0a 20 20 63 6f 6e 73 74 20 57 68  Prev,.  const Wh
24ba0 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61  ereLoop *pTempla
24bb0 74 65 0a 29 7b 0a 20 20 57 68 65 72 65 4c 6f 6f  te.){.  WhereLoo
24bc0 70 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 28 2a  p *p;.  for(p=(*
24bd0 70 70 50 72 65 76 29 3b 20 70 3b 20 70 70 50 72  ppPrev); p; ppPr
24be0 65 76 3d 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70  ev=&p->pNextLoop
24bf0 2c 20 70 3d 2a 70 70 50 72 65 76 29 7b 0a 20 20  , p=*ppPrev){.  
24c00 20 20 69 66 28 20 70 2d 3e 69 54 61 62 21 3d 70    if( p->iTab!=p
24c10 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20 7c  Template->iTab |
24c20 7c 20 70 2d 3e 69 53 6f 72 74 49 64 78 21 3d 70  | p->iSortIdx!=p
24c30 54 65 6d 70 6c 61 74 65 2d 3e 69 53 6f 72 74 49  Template->iSortI
24c40 64 78 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  dx ){.      /* I
24c50 66 20 65 69 74 68 65 72 20 74 68 65 20 69 54 61  f either the iTa
24c60 62 20 6f 72 20 69 53 6f 72 74 49 64 78 20 76 61  b or iSortIdx va
24c70 6c 75 65 73 20 66 6f 72 20 74 77 6f 20 57 68 65  lues for two Whe
24c80 72 65 4c 6f 6f 70 20 61 72 65 20 64 69 66 66 65  reLoop are diffe
24c90 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 68  rent.      ** th
24ca0 65 6e 20 74 68 6f 73 65 20 57 68 65 72 65 4c 6f  en those WhereLo
24cb0 6f 70 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63  ops need to be c
24cc0 6f 6e 73 69 64 65 72 65 64 20 73 65 70 61 72 61  onsidered separa
24cd0 74 65 6c 79 2e 20 20 4e 65 69 74 68 65 72 20 69  tely.  Neither i
24ce0 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 61 6e  s.      ** a can
24cf0 64 69 64 61 74 65 20 74 6f 20 72 65 70 6c 61 63  didate to replac
24d00 65 20 74 68 65 20 6f 74 68 65 72 2e 20 2a 2f 0a  e the other. */.
24d10 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
24d20 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 6e 20      }.    /* In 
24d30 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c  the current impl
24d40 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68 65 20  ementation, the 
24d50 72 53 65 74 75 70 20 76 61 6c 75 65 20 69 73 20  rSetup value is 
24d60 65 69 74 68 65 72 20 7a 65 72 6f 0a 20 20 20 20  either zero.    
24d70 2a 2a 20 6f 72 20 74 68 65 20 63 6f 73 74 20 6f  ** or the cost o
24d80 66 20 62 75 69 6c 64 69 6e 67 20 61 6e 20 61 75  f building an au
24d90 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 28 4e  tomatic index (N
24da0 6c 6f 67 4e 29 20 61 6e 64 20 74 68 65 20 4e 6c  logN) and the Nl
24db0 6f 67 4e 0a 20 20 20 20 2a 2a 20 69 73 20 74 68  ogN.    ** is th
24dc0 65 20 73 61 6d 65 20 66 6f 72 20 63 6f 6d 70 61  e same for compa
24dd0 74 69 62 6c 65 20 57 68 65 72 65 4c 6f 6f 70 73  tible WhereLoops
24de0 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
24df0 20 70 2d 3e 72 53 65 74 75 70 3d 3d 30 20 7c 7c   p->rSetup==0 ||
24e00 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74   pTemplate->rSet
24e10 75 70 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20  up==0 .         
24e20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 72 53          || p->rS
24e30 65 74 75 70 3d 3d 70 54 65 6d 70 6c 61 74 65 2d  etup==pTemplate-
24e40 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20 20 20 20  >rSetup );..    
24e50 2f 2a 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42  /* whereLoopAddB
24e60 74 72 65 65 28 29 20 61 6c 77 61 79 73 20 67 65  tree() always ge
24e70 6e 65 72 61 74 65 73 20 61 6e 64 20 69 6e 73 65  nerates and inse
24e80 72 74 73 20 74 68 65 20 61 75 74 6f 6d 61 74 69  rts the automati
24e90 63 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20 63  c index.    ** c
24ea0 61 73 65 20 66 69 72 73 74 2e 20 20 48 65 6e 63  ase first.  Henc
24eb0 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 63 61 6e  e compatible can
24ec0 64 69 64 61 74 65 20 57 68 65 72 65 4c 6f 6f 70  didate WhereLoop
24ed0 73 20 6e 65 76 65 72 20 68 61 76 65 20 61 20 6c  s never have a l
24ee0 61 72 67 65 72 0a 20 20 20 20 2a 2a 20 72 53 65  arger.    ** rSe
24ef0 74 75 70 2e 20 43 61 6c 6c 20 74 68 69 73 20 53  tup. Call this S
24f00 45 54 55 50 2d 49 4e 56 41 52 49 41 4e 54 20 2a  ETUP-INVARIANT *
24f10 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
24f20 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d 70 6c 61  >rSetup>=pTempla
24f30 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20  te->rSetup );.. 
24f40 20 20 20 2f 2a 20 41 6e 79 20 6c 6f 6f 70 20 75     /* Any loop u
24f50 73 69 6e 67 20 61 6e 20 61 70 70 6c 69 61 74 69  sing an appliati
24f60 6f 6e 2d 64 65 66 69 6e 65 64 20 69 6e 64 65 78  on-defined index
24f70 20 28 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59   (or PRIMARY KEY
24f80 20 6f 72 0a 20 20 20 20 2a 2a 20 55 4e 49 51 55   or.    ** UNIQU
24f90 45 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 77 69  E constraint) wi
24fa0 74 68 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 3d  th one or more =
24fb0 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 73  = constraints is
24fc0 20 62 65 74 74 65 72 0a 20 20 20 20 2a 2a 20 74   better.    ** t
24fd0 68 61 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  han an automatic
24fe0 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 20 20 69   index. */.    i
24ff0 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26  f( (p->wsFlags &
25000 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
25010 58 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70  X)!=0.     && (p
25020 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67  Template->wsFlag
25030 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
25040 44 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70  D)!=0.     && (p
25050 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67  Template->wsFlag
25060 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
25070 5f 45 51 29 21 3d 30 0a 20 20 20 20 20 26 26 20  _EQ)!=0.     && 
25080 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54 65  (p->prereq & pTe
25090 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29 3d  mplate->prereq)=
250a0 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72  =pTemplate->prer
250b0 65 71 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  eq.    ){.      
250c0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
250d0 20 20 2f 2a 20 49 66 20 65 78 69 73 74 69 6e 67    /* If existing
250e0 20 57 68 65 72 65 4c 6f 6f 70 20 70 20 69 73 20   WhereLoop p is 
250f0 62 65 74 74 65 72 20 74 68 61 6e 20 70 54 65 6d  better than pTem
25100 70 6c 61 74 65 2c 20 70 54 65 6d 70 6c 61 74 65  plate, pTemplate
25110 20 63 61 6e 20 62 65 0a 20 20 20 20 2a 2a 20 64   can be.    ** d
25120 69 73 63 61 72 64 65 64 2e 20 20 57 68 65 72 65  iscarded.  Where
25130 4c 6f 6f 70 20 70 20 69 73 20 62 65 74 74 65 72  Loop p is better
25140 20 69 66 3a 0a 20 20 20 20 2a 2a 20 20 20 28 31   if:.    **   (1
25150 29 20 20 70 20 68 61 73 20 6e 6f 20 6d 6f 72 65  )  p has no more
25160 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74 68   dependencies th
25170 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20 61 6e  an pTemplate, an
25180 64 0a 20 20 20 20 2a 2a 20 20 20 28 32 29 20 20  d.    **   (2)  
25190 70 20 68 61 73 20 61 6e 20 65 71 75 61 6c 20 6f  p has an equal o
251a0 72 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61  r lower cost tha
251b0 6e 20 70 54 65 6d 70 6c 61 74 65 0a 20 20 20 20  n pTemplate.    
251c0 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70  */.    if( (p->p
251d0 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61 74  rereq & pTemplat
251e0 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 2d 3e 70  e->prereq)==p->p
251f0 72 65 72 65 71 20 20 20 20 2f 2a 20 28 31 29 20  rereq    /* (1) 
25200 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 72   */.     && p->r
25210 53 65 74 75 70 3c 3d 70 54 65 6d 70 6c 61 74 65  Setup<=pTemplate
25220 2d 3e 72 53 65 74 75 70 20 20 20 20 20 20 20 20  ->rSetup        
25230 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 61            /* (2a
25240 29 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e  ) */.     && p->
25250 72 52 75 6e 3c 3d 70 54 65 6d 70 6c 61 74 65 2d  rRun<=pTemplate-
25260 3e 72 52 75 6e 20 20 20 20 20 20 20 20 20 20 20  >rRun           
25270 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32             /* (2
25280 62 29 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d  b) */.     && p-
25290 3e 6e 4f 75 74 3c 3d 70 54 65 6d 70 6c 61 74 65  >nOut<=pTemplate
252a0 2d 3e 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20  ->nOut          
252b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
252c0 32 63 29 20 2a 2f 0a 20 20 20 20 29 7b 0a 20 20  2c) */.    ){.  
252d0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f      return 0;  /
252e0 2a 20 44 69 73 63 61 72 64 20 70 54 65 6d 70 6c  * Discard pTempl
252f0 61 74 65 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20  ate */.    }..  
25300 20 20 2f 2a 20 49 66 20 70 54 65 6d 70 6c 61 74    /* If pTemplat
25310 65 20 69 73 20 61 6c 77 61 79 73 20 62 65 74 74  e is always bett
25320 65 72 20 74 68 61 6e 20 70 2c 20 74 68 65 6e 20  er than p, then 
25330 63 61 75 73 65 20 70 20 74 6f 20 62 65 20 6f 76  cause p to be ov
25340 65 72 77 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a  erwritten.    **
25350 20 77 69 74 68 20 70 54 65 6d 70 6c 61 74 65 2e   with pTemplate.
25360 20 20 70 54 65 6d 70 6c 61 74 65 20 69 73 20 62    pTemplate is b
25370 65 74 74 65 72 20 74 68 61 6e 20 70 20 69 66 3a  etter than p if:
25380 0a 20 20 20 20 2a 2a 20 20 20 28 31 29 20 20 70  .    **   (1)  p
25390 54 65 6d 70 6c 61 74 65 20 68 61 73 20 6e 6f 20  Template has no 
253a0 6d 6f 72 65 20 64 65 70 65 6e 64 65 6e 63 65 73  more dependences
253b0 20 74 68 61 6e 20 70 2c 20 61 6e 64 0a 20 20 20   than p, and.   
253c0 20 2a 2a 20 20 20 28 32 29 20 20 70 54 65 6d 70   **   (2)  pTemp
253d0 6c 61 74 65 20 68 61 73 20 61 6e 20 65 71 75 61  late has an equa
253e0 6c 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74 20  l or lower cost 
253f0 74 68 61 6e 20 70 2e 0a 20 20 20 20 2a 2f 0a 20  than p..    */. 
25400 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65     if( (p->prere
25410 71 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70  q & pTemplate->p
25420 72 65 72 65 71 29 3d 3d 70 54 65 6d 70 6c 61 74  rereq)==pTemplat
25430 65 2d 3e 70 72 65 72 65 71 20 20 20 2f 2a 20 28  e->prereq   /* (
25440 31 29 20 20 2a 2f 0a 20 20 20 20 20 26 26 20 70  1)  */.     && p
25450 2d 3e 72 52 75 6e 3e 3d 70 54 65 6d 70 6c 61 74  ->rRun>=pTemplat
25460 65 2d 3e 72 52 75 6e 20 20 20 20 20 20 20 20 20  e->rRun         
25470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25480 20 20 20 20 2f 2a 20 28 32 61 29 20 2a 2f 0a 20      /* (2a) */. 
25490 20 20 20 20 26 26 20 70 2d 3e 6e 4f 75 74 3e 3d      && p->nOut>=
254a0 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20  pTemplate->nOut 
254b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
254d0 32 62 29 20 2a 2f 0a 20 20 20 20 29 7b 0a 20 20  2b) */.    ){.  
254e0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72      assert( p->r
254f0 53 65 74 75 70 3e 3d 70 54 65 6d 70 6c 61 74 65  Setup>=pTemplate
25500 2d 3e 72 53 65 74 75 70 20 29 3b 20 2f 2a 20 53  ->rSetup ); /* S
25510 45 54 55 50 2d 49 4e 56 41 52 49 41 4e 54 20 61  ETUP-INVARIANT a
25520 62 6f 76 65 20 2a 2f 0a 20 20 20 20 20 20 62 72  bove */.      br
25530 65 61 6b 3b 20 20 20 2f 2a 20 43 61 75 73 65 20  eak;   /* Cause 
25540 70 20 74 6f 20 62 65 20 6f 76 65 72 77 72 69 74  p to be overwrit
25550 74 65 6e 20 62 79 20 70 54 65 6d 70 6c 61 74 65  ten by pTemplate
25560 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   */.    }.  }.  
25570 72 65 74 75 72 6e 20 70 70 50 72 65 76 3b 0a 7d  return ppPrev;.}
25580 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 6f  ../*.** Insert o
25590 72 20 72 65 70 6c 61 63 65 20 61 20 57 68 65 72  r replace a Wher
255a0 65 4c 6f 6f 70 20 65 6e 74 72 79 20 75 73 69 6e  eLoop entry usin
255b0 67 20 74 68 65 20 74 65 6d 70 6c 61 74 65 20 73  g the template s
255c0 75 70 70 6c 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  upplied..**.** A
255d0 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65  n existing Where
255e0 4c 6f 6f 70 20 65 6e 74 72 79 20 6d 69 67 68 74  Loop entry might
255f0 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20   be overwritten 
25600 69 66 20 74 68 65 20 6e 65 77 20 74 65 6d 70 6c  if the new templ
25610 61 74 65 0a 2a 2a 20 69 73 20 62 65 74 74 65 72  ate.** is better
25620 20 61 6e 64 20 68 61 73 20 66 65 77 65 72 20 64   and has fewer d
25630 65 70 65 6e 64 65 6e 63 69 65 73 2e 20 20 4f 72  ependencies.  Or
25640 20 74 68 65 20 74 65 6d 70 6c 61 74 65 20 77 69   the template wi
25650 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64 0a 2a 2a  ll be ignored.**
25660 20 61 6e 64 20 6e 6f 20 69 6e 73 65 72 74 20 77   and no insert w
25670 69 6c 6c 20 6f 63 63 75 72 20 69 66 20 61 6e 20  ill occur if an 
25680 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f  existing WhereLo
25690 6f 70 20 69 73 20 66 61 73 74 65 72 20 61 6e 64  op is faster and
256a0 20 68 61 73 0a 2a 2a 20 66 65 77 65 72 20 64 65   has.** fewer de
256b0 70 65 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20  pendencies than 
256c0 74 68 65 20 74 65 6d 70 6c 61 74 65 2e 20 20 4f  the template.  O
256d0 74 68 65 72 77 69 73 65 20 61 20 6e 65 77 20 57  therwise a new W
256e0 68 65 72 65 4c 6f 6f 70 20 69 73 0a 2a 2a 20 61  hereLoop is.** a
256f0 64 64 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68  dded based on th
25700 65 20 74 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a  e template..**.*
25710 2a 20 49 66 20 70 42 75 69 6c 64 65 72 2d 3e 70  * If pBuilder->p
25720 4f 72 53 65 74 20 69 73 20 6e 6f 74 20 4e 55 4c  OrSet is not NUL
25730 4c 20 74 68 65 6e 20 77 65 20 63 61 72 65 20 61  L then we care a
25740 62 6f 75 74 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a  bout only the.**
25750 20 70 72 65 72 65 71 75 69 73 69 74 65 73 20 61   prerequisites a
25760 6e 64 20 72 52 75 6e 20 61 6e 64 20 6e 4f 75 74  nd rRun and nOut
25770 20 63 6f 73 74 73 20 6f 66 20 74 68 65 20 4e 20   costs of the N 
25780 62 65 73 74 20 6c 6f 6f 70 73 2e 20 20 54 68 61  best loops.  Tha
25790 74 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  t.** information
257a0 20 69 73 20 67 61 74 68 65 72 65 64 20 69 6e 20   is gathered in 
257b0 74 68 65 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f  the pBuilder->pO
257c0 72 53 65 74 20 6f 62 6a 65 63 74 2e 20 20 54 68  rSet object.  Th
257d0 69 73 20 73 70 65 63 69 61 6c 0a 2a 2a 20 70 72  is special.** pr
257e0 6f 63 65 73 73 69 6e 67 20 6d 6f 64 65 20 69 73  ocessing mode is
257f0 20 75 73 65 64 20 6f 6e 6c 79 20 66 6f 72 20 4f   used only for O
25800 52 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  R clause process
25810 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ing..**.** When 
25820 61 63 63 75 6d 75 6c 61 74 69 6e 67 20 6d 75 6c  accumulating mul
25830 74 69 70 6c 65 20 6c 6f 6f 70 73 20 28 77 68 65  tiple loops (whe
25840 6e 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53  n pBuilder->pOrS
25850 65 74 20 69 73 20 4e 55 4c 4c 29 20 77 65 0a 2a  et is NULL) we.*
25860 2a 20 73 74 69 6c 6c 20 6d 69 67 68 74 20 6f 76  * still might ov
25870 65 72 77 72 69 74 65 20 73 69 6d 69 6c 61 72 20  erwrite similar 
25880 6c 6f 6f 70 73 20 77 69 74 68 20 74 68 65 20 6e  loops with the n
25890 65 77 20 74 65 6d 70 6c 61 74 65 20 69 66 20 74  ew template if t
258a0 68 65 0a 2a 2a 20 6e 65 77 20 74 65 6d 70 6c 61  he.** new templa
258b0 74 65 20 69 73 20 62 65 74 74 65 72 2e 20 20 4c  te is better.  L
258c0 6f 6f 70 73 20 6d 61 79 20 62 65 20 6f 76 65 72  oops may be over
258d0 77 72 69 74 74 65 6e 20 69 66 20 74 68 65 20 66  written if the f
258e0 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 63 6f 6e  ollowing .** con
258f0 64 69 74 69 6f 6e 73 20 61 72 65 20 6d 65 74 3a  ditions are met:
25900 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54  .**.**    (1)  T
25910 68 65 79 20 68 61 76 65 20 74 68 65 20 73 61 6d  hey have the sam
25920 65 20 69 54 61 62 2e 0a 2a 2a 20 20 20 20 28 32  e iTab..**    (2
25930 29 20 20 54 68 65 79 20 68 61 76 65 20 74 68 65  )  They have the
25940 20 73 61 6d 65 20 69 53 6f 72 74 49 64 78 2e 0a   same iSortIdx..
25950 2a 2a 20 20 20 20 28 33 29 20 20 54 68 65 20 74  **    (3)  The t
25960 65 6d 70 6c 61 74 65 20 68 61 73 20 73 61 6d 65  emplate has same
25970 20 6f 72 20 66 65 77 65 72 20 64 65 70 65 6e 64   or fewer depend
25980 65 6e 63 69 65 73 20 74 68 61 6e 20 74 68 65 20  encies than the 
25990 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2a 20  current loop.** 
259a0 20 20 20 28 34 29 20 20 54 68 65 20 74 65 6d 70     (4)  The temp
259b0 6c 61 74 65 20 68 61 73 20 74 68 65 20 73 61 6d  late has the sam
259c0 65 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74 20  e or lower cost 
259d0 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
259e0 20 6c 6f 6f 70 0a 2a 2f 0a 73 74 61 74 69 63 20   loop.*/.static 
259f0 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  int whereLoopIns
25a00 65 72 74 28 57 68 65 72 65 4c 6f 6f 70 42 75 69  ert(WhereLoopBui
25a10 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20  lder *pBuilder, 
25a20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70  WhereLoop *pTemp
25a30 6c 61 74 65 29 7b 0a 20 20 57 68 65 72 65 4c 6f  late){.  WhereLo
25a40 6f 70 20 2a 2a 70 70 50 72 65 76 2c 20 2a 70 3b  op **ppPrev, *p;
25a50 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
25a60 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
25a70 3e 70 57 49 6e 66 6f 3b 0a 20 20 73 71 6c 69 74  >pWInfo;.  sqlit
25a80 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d  e3 *db = pWInfo-
25a90 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20  >pParse->db;..  
25aa0 2f 2a 20 49 66 20 70 42 75 69 6c 64 65 72 2d 3e  /* If pBuilder->
25ab0 70 4f 72 53 65 74 20 69 73 20 64 65 66 69 6e 65  pOrSet is define
25ac0 64 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 6b 65 65  d, then only kee
25ad0 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 63  p track of the c
25ae0 6f 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20 70 72  osts.  ** and pr
25af0 65 72 65 71 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  ereqs..  */.  if
25b00 28 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53  ( pBuilder->pOrS
25b10 65 74 21 3d 30 20 29 7b 0a 23 69 66 20 57 48 45  et!=0 ){.#if WHE
25b20 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  RETRACE_ENABLED.
25b30 20 20 20 20 75 31 36 20 6e 20 3d 20 70 42 75 69      u16 n = pBui
25b40 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2d 3e 6e 3b  lder->pOrSet->n;
25b50 0a 20 20 20 20 69 6e 74 20 78 20 3d 0a 23 65 6e  .    int x =.#en
25b60 64 69 66 0a 20 20 20 20 77 68 65 72 65 4f 72 49  dif.    whereOrI
25b70 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2d 3e  nsert(pBuilder->
25b80 70 4f 72 53 65 74 2c 20 70 54 65 6d 70 6c 61 74  pOrSet, pTemplat
25b90 65 2d 3e 70 72 65 72 65 71 2c 20 70 54 65 6d 70  e->prereq, pTemp
25ba0 6c 61 74 65 2d 3e 72 52 75 6e 2c 0a 20 20 20 20  late->rRun,.    
25bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25bd0 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 29  pTemplate->nOut)
25be0 3b 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45  ;.#if WHERETRACE
25bf0 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20  _ENABLED /* 0x8 
25c00 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
25c10 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
25c20 78 38 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  x8 ){.      sqli
25c30 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 78  te3DebugPrintf(x
25c40 3f 22 20 20 20 6f 72 2d 25 64 3a 20 20 22 3a 22  ?"   or-%d:  ":"
25c50 20 20 20 6f 72 2d 58 3a 20 20 22 2c 20 6e 29 3b     or-X:  ", n);
25c60 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70  .      whereLoop
25c70 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c  Print(pTemplate,
25c80 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b   pBuilder->pWC);
25c90 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
25ca0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
25cb0 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f  OK;.  }..  /* Lo
25cc0 6f 6b 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69  ok for an existi
25cd0 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20  ng WhereLoop to 
25ce0 72 65 70 6c 61 63 65 20 77 69 74 68 20 70 54 65  replace with pTe
25cf0 6d 70 6c 61 74 65 0a 20 20 2a 2f 0a 20 20 77 68  mplate.  */.  wh
25d00 65 72 65 4c 6f 6f 70 41 64 6a 75 73 74 43 6f 73  ereLoopAdjustCos
25d10 74 28 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73  t(pWInfo->pLoops
25d20 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20  , pTemplate);.  
25d30 70 70 50 72 65 76 20 3d 20 77 68 65 72 65 4c 6f  ppPrev = whereLo
25d40 6f 70 46 69 6e 64 4c 65 73 73 65 72 28 26 70 57  opFindLesser(&pW
25d50 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 54  Info->pLoops, pT
25d60 65 6d 70 6c 61 74 65 29 3b 0a 0a 20 20 69 66 28  emplate);..  if(
25d70 20 70 70 50 72 65 76 3d 3d 30 20 29 7b 0a 20 20   ppPrev==0 ){.  
25d80 20 20 2f 2a 20 54 68 65 72 65 20 61 6c 72 65 61    /* There alrea
25d90 64 79 20 65 78 69 73 74 73 20 61 20 57 68 65 72  dy exists a Wher
25da0 65 4c 6f 6f 70 20 6f 6e 20 74 68 65 20 6c 69 73  eLoop on the lis
25db0 74 20 74 68 61 74 20 69 73 20 62 65 74 74 65 72  t that is better
25dc0 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 70 54 65  .    ** than pTe
25dd0 6d 70 6c 61 74 65 2c 20 73 6f 20 6a 75 73 74 20  mplate, so just 
25de0 69 67 6e 6f 72 65 20 70 54 65 6d 70 6c 61 74 65  ignore pTemplate
25df0 20 2a 2f 0a 23 69 66 20 57 48 45 52 45 54 52 41   */.#if WHERETRA
25e00 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78  CE_ENABLED /* 0x
25e10 38 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c  8 */.    if( sql
25e20 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26  ite3WhereTrace &
25e30 20 30 78 38 20 29 7b 0a 20 20 20 20 20 20 73 71   0x8 ){.      sq
25e40 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
25e50 28 22 69 6e 73 2d 6e 6f 6f 70 3a 20 22 29 3b 0a  ("ins-noop: ");.
25e60 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50        whereLoopP
25e70 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20  rint(pTemplate, 
25e80 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a  pBuilder->pWC);.
25e90 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
25ea0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
25eb0 4b 3b 20 20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  K;  .  }else{.  
25ec0 20 20 70 20 3d 20 2a 70 70 50 72 65 76 3b 0a 20    p = *ppPrev;. 
25ed0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72   }..  /* If we r
25ee0 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 20  each this point 
25ef0 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 65 69  it means that ei
25f00 74 68 65 72 20 70 5b 5d 20 73 68 6f 75 6c 64 20  ther p[] should 
25f10 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 0a 20  be overwritten. 
25f20 20 2a 2a 20 77 69 74 68 20 70 54 65 6d 70 6c 61   ** with pTempla
25f30 74 65 5b 5d 20 69 66 20 70 5b 5d 20 65 78 69 73  te[] if p[] exis
25f40 74 73 2c 20 6f 72 20 69 66 20 70 3d 3d 4e 55 4c  ts, or if p==NUL
25f50 4c 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20  L then allocate 
25f60 61 20 6e 65 77 0a 20 20 2a 2a 20 57 68 65 72 65  a new.  ** Where
25f70 4c 6f 6f 70 20 61 6e 64 20 69 6e 73 65 72 74 20  Loop and insert 
25f80 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 20 57 48 45  it..  */.#if WHE
25f90 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
25fa0 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 69 66 28 20  /* 0x8 */.  if( 
25fb0 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
25fc0 65 20 26 20 30 78 38 20 29 7b 0a 20 20 20 20 69  e & 0x8 ){.    i
25fd0 66 28 20 70 21 3d 30 20 29 7b 0a 20 20 20 20 20  f( p!=0 ){.     
25fe0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
25ff0 6e 74 66 28 22 69 6e 73 2d 64 65 6c 3a 20 20 22  ntf("ins-del:  "
26000 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  );.      whereLo
26010 6f 70 50 72 69 6e 74 28 70 2c 20 70 42 75 69 6c  opPrint(p, pBuil
26020 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20 7d  der->pWC);.    }
26030 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
26040 67 50 72 69 6e 74 66 28 22 69 6e 73 2d 6e 65 77  gPrintf("ins-new
26050 3a 20 20 22 29 3b 0a 20 20 20 20 77 68 65 72 65  :  ");.    where
26060 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c  LoopPrint(pTempl
26070 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  ate, pBuilder->p
26080 57 43 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  WC);.  }.#endif.
26090 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
260a0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20    /* Allocate a 
260b0 6e 65 77 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f  new WhereLoop to
260c0 20 61 64 64 20 74 6f 20 74 68 65 20 65 6e 64 20   add to the end 
260d0 6f 66 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20  of the list */. 
260e0 20 20 20 2a 70 70 50 72 65 76 20 3d 20 70 20 3d     *ppPrev = p =
260f0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
26100 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 57  Raw(db, sizeof(W
26110 68 65 72 65 4c 6f 6f 70 29 29 3b 0a 20 20 20 20  hereLoop));.    
26120 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
26130 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
26140 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69      whereLoopIni
26150 74 28 70 29 3b 0a 20 20 20 20 70 2d 3e 70 4e 65  t(p);.    p->pNe
26160 78 74 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 7d 65  xtLoop = 0;.  }e
26170 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 57 65 20 77  lse{.    /* We w
26180 69 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74 69  ill be overwriti
26190 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 70 5b 5d  ng WhereLoop p[]
261a0 2e 20 20 42 75 74 20 62 65 66 6f 72 65 20 77 65  .  But before we
261b0 20 64 6f 2c 20 66 69 72 73 74 0a 20 20 20 20 2a   do, first.    *
261c0 2a 20 67 6f 20 74 68 72 6f 75 67 68 20 74 68 65  * go through the
261d0 20 72 65 73 74 20 6f 66 20 74 68 65 20 6c 69 73   rest of the lis
261e0 74 20 61 6e 64 20 64 65 6c 65 74 65 20 61 6e 79  t and delete any
261f0 20 6f 74 68 65 72 20 65 6e 74 72 69 65 73 20 62   other entries b
26200 65 73 69 64 65 73 0a 20 20 20 20 2a 2a 20 70 5b  esides.    ** p[
26210 5d 20 74 68 61 74 20 61 72 65 20 61 6c 73 6f 20  ] that are also 
26220 73 75 70 70 6c 61 74 65 64 20 62 79 20 70 54 65  supplated by pTe
26230 6d 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20 57 68  mplate */.    Wh
26240 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 54 61 69 6c  ereLoop **ppTail
26250 20 3d 20 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70   = &p->pNextLoop
26260 3b 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20  ;.    WhereLoop 
26270 2a 70 54 6f 44 65 6c 3b 0a 20 20 20 20 77 68 69  *pToDel;.    whi
26280 6c 65 28 20 2a 70 70 54 61 69 6c 20 29 7b 0a 20  le( *ppTail ){. 
26290 20 20 20 20 20 70 70 54 61 69 6c 20 3d 20 77 68       ppTail = wh
262a0 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65  ereLoopFindLesse
262b0 72 28 70 70 54 61 69 6c 2c 20 70 54 65 6d 70 6c  r(ppTail, pTempl
262c0 61 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ate);.      if( 
262d0 70 70 54 61 69 6c 3d 3d 30 20 29 20 62 72 65 61  ppTail==0 ) brea
262e0 6b 3b 0a 20 20 20 20 20 20 70 54 6f 44 65 6c 20  k;.      pToDel 
262f0 3d 20 2a 70 70 54 61 69 6c 3b 0a 20 20 20 20 20  = *ppTail;.     
26300 20 69 66 28 20 70 54 6f 44 65 6c 3d 3d 30 20 29   if( pToDel==0 )
26310 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 2a 70   break;.      *p
26320 70 54 61 69 6c 20 3d 20 70 54 6f 44 65 6c 2d 3e  pTail = pToDel->
26330 70 4e 65 78 74 4c 6f 6f 70 3b 0a 23 69 66 20 57  pNextLoop;.#if W
26340 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
26350 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20  D /* 0x8 */.    
26360 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
26370 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b  reTrace & 0x8 ){
26380 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
26390 44 65 62 75 67 50 72 69 6e 74 66 28 22 69 6e 73  DebugPrintf("ins
263a0 2d 64 65 6c 3a 20 20 22 29 3b 0a 20 20 20 20 20  -del:  ");.     
263b0 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e     whereLoopPrin
263c0 74 28 70 54 6f 44 65 6c 2c 20 70 42 75 69 6c 64  t(pToDel, pBuild
263d0 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20 20 20  er->pWC);.      
263e0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 77  }.#endif.      w
263f0 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 64  hereLoopDelete(d
26400 62 2c 20 70 54 6f 44 65 6c 29 3b 0a 20 20 20 20  b, pToDel);.    
26410 7d 0a 20 20 7d 0a 20 20 77 68 65 72 65 4c 6f 6f  }.  }.  whereLoo
26420 70 58 66 65 72 28 64 62 2c 20 70 2c 20 70 54 65  pXfer(db, p, pTe
26430 6d 70 6c 61 74 65 29 3b 0a 20 20 69 66 28 20 28  mplate);.  if( (
26440 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
26450 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
26460 3d 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  ==0 ){.    Index
26470 20 2a 70 49 6e 64 65 78 20 3d 20 70 2d 3e 75 2e   *pIndex = p->u.
26480 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
26490 20 20 69 66 28 20 70 49 6e 64 65 78 20 26 26 20    if( pIndex && 
264a0 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3d 3d 30 20  pIndex->tnum==0 
264b0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62 74  ){.      p->u.bt
264c0 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a  ree.pIndex = 0;.
264d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
264e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
264f0 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68  ./*.** Adjust th
26500 65 20 57 68 65 72 65 4c 6f 6f 70 2e 6e 4f 75 74  e WhereLoop.nOut
26510 20 76 61 6c 75 65 20 64 6f 77 6e 77 61 72 64 20   value downward 
26520 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74  to account for t
26530 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 57  erms of the.** W
26540 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
26550 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 6c   reference the l
26560 6f 6f 70 20 62 75 74 20 77 68 69 63 68 20 61 72  oop but which ar
26570 65 20 6e 6f 74 20 75 73 65 64 20 62 79 20 61 6e  e not used by an
26580 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a  .** index..**.**
26590 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   In the current 
265a0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20  implementation, 
265b0 74 68 65 20 66 69 72 73 74 20 65 78 74 72 61 20  the first extra 
265c0 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
265d0 6d 20 72 65 64 75 63 65 73 0a 2a 2a 20 74 68 65  m reduces.** the
265e0 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
265f0 74 20 72 6f 77 73 20 62 79 20 61 20 66 61 63 74  t rows by a fact
26600 6f 72 20 6f 66 20 31 30 20 61 6e 64 20 65 61 63  or of 10 and eac
26610 68 20 61 64 64 69 74 69 6f 6e 61 6c 20 74 65 72  h additional ter
26620 6d 0a 2a 2a 20 72 65 64 75 63 65 73 20 74 68 65  m.** reduces the
26630 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
26640 74 20 72 6f 77 73 20 62 79 20 73 71 72 74 28 32  t rows by sqrt(2
26650 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
26660 64 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75  d whereLoopOutpu
26670 74 41 64 6a 75 73 74 28 0a 20 20 57 68 65 72 65  tAdjust(.  Where
26680 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
26690 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
266a0 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
266b0 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20 20 20 20  Loop *pLoop,    
266c0 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 70 20 74 6f    /* The loop to
266d0 20 61 64 6a 75 73 74 20 64 6f 77 6e 77 61 72 64   adjust downward
266e0 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 52 6f   */.  LogEst nRo
266f0 77 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  w            /* 
26700 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  Number of rows i
26710 6e 20 74 68 65 20 65 6e 74 69 72 65 20 74 61 62  n the entire tab
26720 6c 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65  le */.){.  Where
26730 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 58  Term *pTerm, *pX
26740 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 41  ;.  Bitmask notA
26750 6c 6c 6f 77 65 64 20 3d 20 7e 28 70 4c 6f 6f 70  llowed = ~(pLoop
26760 2d 3e 70 72 65 72 65 71 7c 70 4c 6f 6f 70 2d 3e  ->prereq|pLoop->
26770 6d 61 73 6b 53 65 6c 66 29 3b 0a 20 20 69 6e 74  maskSelf);.  int
26780 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 45 71   i, j;.  int nEq
26790 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62   = 0;    /* Numb
267a0 65 72 20 6f 66 20 3d 20 63 6f 6e 73 74 72 61 69  er of = constrai
267b0 6e 74 73 20 6e 6f 74 20 77 69 74 68 69 6e 20 6c  nts not within l
267c0 69 6b 65 6c 79 28 29 2f 75 6e 6c 69 6b 65 6c 79  ikely()/unlikely
267d0 28 29 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 3d 70  () */..  for(i=p
267e0 57 43 2d 3e 6e 54 65 72 6d 2c 20 70 54 65 72 6d  WC->nTerm, pTerm
267f0 3d 70 57 43 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d  =pWC->a; i>0; i-
26800 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  -, pTerm++){.   
26810 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 77 74 46   if( (pTerm->wtF
26820 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
26830 55 41 4c 29 21 3d 30 20 29 20 62 72 65 61 6b 3b  UAL)!=0 ) break;
26840 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d  .    if( (pTerm-
26850 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f  >prereqAll & pLo
26860 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 3d 3d 30  op->maskSelf)==0
26870 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
26880 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
26890 72 65 71 41 6c 6c 20 26 20 6e 6f 74 41 6c 6c 6f  reqAll & notAllo
268a0 77 65 64 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  wed)!=0 ) contin
268b0 75 65 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 70 4c  ue;.    for(j=pL
268c0 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a  oop->nLTerm-1; j
268d0 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20  >=0; j--){.     
268e0 20 70 58 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54   pX = pLoop->aLT
268f0 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66  erm[j];.      if
26900 28 20 70 58 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  ( pX==0 ) contin
26910 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58  ue;.      if( pX
26920 3d 3d 70 54 65 72 6d 20 29 20 62 72 65 61 6b 3b  ==pTerm ) break;
26930 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e 69  .      if( pX->i
26940 50 61 72 65 6e 74 3e 3d 30 20 26 26 20 28 26 70  Parent>=0 && (&p
26950 57 43 2d 3e 61 5b 70 58 2d 3e 69 50 61 72 65 6e  WC->a[pX->iParen
26960 74 5d 29 3d 3d 70 54 65 72 6d 20 29 20 62 72 65  t])==pTerm ) bre
26970 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
26980 28 20 6a 3c 30 20 29 7b 0a 20 20 20 20 20 20 69  ( j<0 ){.      i
26990 66 28 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50  f( pTerm->truthP
269a0 72 6f 62 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20  rob<=0 ){.      
269b0 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2b 3d    pLoop->nOut +=
269c0 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f   pTerm->truthPro
269d0 62 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  b;.      }else{.
269e0 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e          pLoop->n
269f0 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 69  Out--;.        i
26a00 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
26a10 74 6f 72 26 57 4f 5f 45 51 20 29 20 6e 45 71 2b  tor&WO_EQ ) nEq+
26a20 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
26a30 0a 20 20 7d 0a 20 20 2f 2a 20 54 55 4e 49 4e 47  .  }.  /* TUNING
26a40 3a 20 20 49 66 20 74 68 65 72 65 20 69 73 20 61  :  If there is a
26a50 74 20 6c 65 61 73 74 20 6f 6e 65 20 65 71 75 61  t least one equa
26a60 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  lity constraint 
26a70 69 6e 20 74 68 65 20 57 48 45 52 45 0a 20 20 2a  in the WHERE.  *
26a80 2a 20 63 6c 61 75 73 65 20 74 68 61 74 20 64 6f  * clause that do
26a90 65 73 20 6e 6f 74 20 68 61 76 65 20 61 20 6c 69  es not have a li
26aa0 6b 65 6c 69 68 6f 6f 64 28 29 20 65 78 70 6c 69  kelihood() expli
26ab0 63 69 74 6c 79 20 61 73 73 69 67 6e 65 64 20 74  citly assigned t
26ac0 6f 20 69 74 0a 20 20 2a 2a 20 74 68 65 6e 20 64  o it.  ** then d
26ad0 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65 20 65 73  o not let the es
26ae0 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f  timated number o
26af0 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 65 78  f output rows ex
26b00 63 65 65 64 20 68 61 6c 66 20 0a 20 20 2a 2a 20  ceed half .  ** 
26b10 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
26b20 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ws in the table.
26b30 20 2a 2f 0a 20 20 69 66 28 20 6e 45 71 20 26 26   */.  if( nEq &&
26b40 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3e 6e 52 6f   pLoop->nOut>nRo
26b50 77 2d 31 30 20 29 7b 0a 20 20 20 20 70 4c 6f 6f  w-10 ){.    pLoo
26b60 70 2d 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77 20 2d  p->nOut = nRow -
26b70 20 31 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   10;.  }.}../*.*
26b80 2a 20 41 64 6a 75 73 74 20 74 68 65 20 63 6f 73  * Adjust the cos
26b90 74 20 43 20 62 79 20 74 68 65 20 63 6f 73 74 4d  t C by the costM
26ba0 75 6c 74 20 66 61 63 74 65 72 20 54 2e 20 20 54  ult facter T.  T
26bb0 68 69 73 20 6f 6e 6c 79 20 6f 63 63 75 72 73 20  his only occurs 
26bc0 69 66 0a 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 77  if.** compiled w
26bd0 69 74 68 20 2d 44 53 51 4c 49 54 45 5f 45 4e 41  ith -DSQLITE_ENA
26be0 42 4c 45 5f 43 4f 53 54 4d 55 4c 54 0a 2a 2f 0a  BLE_COSTMULT.*/.
26bf0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
26c00 41 42 4c 45 5f 43 4f 53 54 4d 55 4c 54 0a 23 20  ABLE_COSTMULT.# 
26c10 64 65 66 69 6e 65 20 41 70 70 6c 79 43 6f 73 74  define ApplyCost
26c20 4d 75 6c 74 69 70 6c 69 65 72 28 43 2c 54 29 20  Multiplier(C,T) 
26c30 20 43 20 2b 3d 20 54 0a 23 65 6c 73 65 0a 23 20   C += T.#else.# 
26c40 64 65 66 69 6e 65 20 41 70 70 6c 79 43 6f 73 74  define ApplyCost
26c50 4d 75 6c 74 69 70 6c 69 65 72 28 43 2c 54 29 0a  Multiplier(C,T).
26c60 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65  #endif../*.** We
26c70 20 68 61 76 65 20 73 6f 20 66 61 72 20 6d 61 74   have so far mat
26c80 63 68 65 64 20 70 42 75 69 6c 64 65 72 2d 3e 70  ched pBuilder->p
26c90 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
26ca0 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 0a 2a   terms of the .*
26cb0 2a 20 69 6e 64 65 78 20 70 49 6e 64 65 78 2e 20  * index pIndex. 
26cc0 54 72 79 20 74 6f 20 6d 61 74 63 68 20 6f 6e 65  Try to match one
26cd0 20 6d 6f 72 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65   more..**.** Whe
26ce0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
26cf0 69 73 20 63 61 6c 6c 65 64 2c 20 70 42 75 69 6c  is called, pBuil
26d00 64 65 72 2d 3e 70 4e 65 77 2d 3e 6e 4f 75 74 20  der->pNew->nOut 
26d10 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 0a 2a 2a  contains the .**
26d20 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
26d30 65 78 70 65 63 74 65 64 20 74 6f 20 62 65 20 76  expected to be v
26d40 69 73 69 74 65 64 20 62 79 20 66 69 6c 74 65 72  isited by filter
26d50 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20 6e 45  ing using the nE
26d60 71 20 0a 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c 79  q .** terms only
26d70 2e 20 49 66 20 69 74 20 69 73 20 6d 6f 64 69 66  . If it is modif
26d80 69 65 64 2c 20 74 68 69 73 20 76 61 6c 75 65 20  ied, this value 
26d90 69 73 20 72 65 73 74 6f 72 65 64 20 62 65 66 6f  is restored befo
26da0 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63  re this .** func
26db0 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a  tion returns..**
26dc0 0a 2a 2a 20 49 66 20 70 50 72 6f 62 65 2d 3e 74  .** If pProbe->t
26dd0 6e 75 6d 3d 3d 30 2c 20 74 68 61 74 20 6d 65 61  num==0, that mea
26de0 6e 73 20 70 49 6e 64 65 78 20 69 73 20 61 20 66  ns pIndex is a f
26df0 61 6b 65 20 69 6e 64 65 78 20 75 73 65 64 20 66  ake index used f
26e00 6f 72 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45  or the.** INTEGE
26e10 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a  R PRIMARY KEY..*
26e20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
26e30 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e  reLoopAddBtreeIn
26e40 64 65 78 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70  dex(.  WhereLoop
26e50 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
26e60 72 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68  r,     /* The Wh
26e70 65 72 65 4c 6f 6f 70 20 66 61 63 74 6f 72 79 20  ereLoop factory 
26e80 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
26e90 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20  ist_item *pSrc, 
26ea0 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
26eb0 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20 61  use term being a
26ec0 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 49 6e 64  nalyzed */.  Ind
26ed0 65 78 20 2a 70 50 72 6f 62 65 2c 20 20 20 20 20  ex *pProbe,     
26ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26ef0 41 6e 20 69 6e 64 65 78 20 6f 6e 20 70 53 72 63  An index on pSrc
26f00 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 49 6e   */.  LogEst nIn
26f10 4d 75 6c 20 20 20 20 20 20 20 20 20 20 20 20 20  Mul             
26f20 20 20 20 20 20 20 2f 2a 20 6c 6f 67 28 4e 75 6d        /* log(Num
26f30 62 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f 6e  ber of iteration
26f40 73 20 64 75 65 20 74 6f 20 49 4e 29 20 2a 2f 0a  s due to IN) */.
26f50 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
26f60 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
26f70 72 2d 3e 70 57 49 6e 66 6f 3b 20 20 2f 2a 20 57  r->pWInfo;  /* W
26f80 48 45 52 45 20 61 6e 61 6c 79 73 65 20 63 6f 6e  HERE analyse con
26f90 74 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20  text */.  Parse 
26fa0 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f  *pParse = pWInfo
26fb0 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20 20 20  ->pParse;       
26fc0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
26fd0 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ext */.  sqlite3
26fe0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
26ff0 62 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  b;       /* Data
27000 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
27010 6d 61 6c 6c 6f 63 20 63 6f 6e 74 65 78 74 20 2a  malloc context *
27020 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
27030 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
27040 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20      /* Template 
27050 57 68 65 72 65 4c 6f 6f 70 20 75 6e 64 65 72 20  WhereLoop under 
27060 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
27070 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
27080 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
27090 20 20 2f 2a 20 41 20 57 68 65 72 65 54 65 72 6d    /* A WhereTerm
270a0 20 75 6e 64 65 72 20 63 6f 6e 73 69 64 65 72 61   under considera
270b0 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  tion */.  int op
270c0 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
270d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
270e0 69 64 20 6f 70 65 72 61 74 6f 72 73 20 66 6f 72  id operators for
270f0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
27100 20 20 57 68 65 72 65 53 63 61 6e 20 73 63 61 6e    WhereScan scan
27110 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27120 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f    /* Iterator fo
27130 72 20 57 48 45 52 45 20 74 65 72 6d 73 20 2a 2f  r WHERE terms */
27140 0a 20 20 42 69 74 6d 61 73 6b 20 73 61 76 65 64  .  Bitmask saved
27150 5f 70 72 65 72 65 71 3b 20 20 20 20 20 20 20 20  _prereq;        
27160 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76     /* Original v
27170 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 70 72  alue of pNew->pr
27180 65 72 65 71 20 2a 2f 0a 20 20 75 31 36 20 73 61  ereq */.  u16 sa
27190 76 65 64 5f 6e 4c 54 65 72 6d 3b 20 20 20 20 20  ved_nLTerm;     
271a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
271b0 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  ginal value of p
271c0 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 2a 2f 0a 20  New->nLTerm */. 
271d0 20 75 31 36 20 73 61 76 65 64 5f 6e 45 71 3b 20   u16 saved_nEq; 
271e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
271f0 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c   /* Original val
27200 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75 2e 62 74  ue of pNew->u.bt
27210 72 65 65 2e 6e 45 71 20 2a 2f 0a 20 20 75 31 36  ree.nEq */.  u16
27220 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b 20 20 20   saved_nSkip;   
27230 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27240 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f  Original value o
27250 66 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  f pNew->u.btree.
27260 6e 53 6b 69 70 20 2a 2f 0a 20 20 75 33 32 20 73  nSkip */.  u32 s
27270 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 20 20 20  aved_wsFlags;   
27280 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72             /* Or
27290 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20  iginal value of 
272a0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 2a 2f  pNew->wsFlags */
272b0 0a 20 20 4c 6f 67 45 73 74 20 73 61 76 65 64 5f  .  LogEst saved_
272c0 6e 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20  nOut;           
272d0 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76     /* Original v
272e0 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f  alue of pNew->nO
272f0 75 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  ut */.  int iCol
27300 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27310 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
27320 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69   of the column i
27330 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  n the table */. 
27340 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
27350 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
27360 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
27370 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 69 7a  */.  LogEst rSiz
27380 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
27390 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
273a0 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  f rows in the ta
273b0 62 6c 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  ble */.  LogEst 
273c0 72 4c 6f 67 53 69 7a 65 3b 20 20 20 20 20 20 20  rLogSize;       
273d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67 61           /* Loga
273e0 72 69 74 68 6d 20 6f 66 20 74 61 62 6c 65 20 73  rithm of table s
273f0 69 7a 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ize */.  WhereTe
27400 72 6d 20 2a 70 54 6f 70 20 3d 20 30 2c 20 2a 70  rm *pTop = 0, *p
27410 42 74 6d 20 3d 20 30 3b 20 2f 2a 20 54 6f 70 20  Btm = 0; /* Top 
27420 61 6e 64 20 62 6f 74 74 6f 6d 20 72 61 6e 67 65  and bottom range
27430 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
27440 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64  .  pNew = pBuild
27450 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 69 66 28 20  er->pNew;.  if( 
27460 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
27470 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
27480 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 61 73 73 65 72  _NOMEM;..  asser
27490 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67  t( (pNew->wsFlag
274a0 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
274b0 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20  LTABLE)==0 );.  
274c0 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77  assert( (pNew->w
274d0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54  sFlags & WHERE_T
274e0 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 20 29 3b 0a  OP_LIMIT)==0 );.
274f0 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c    if( pNew->wsFl
27500 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
27510 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 6f 70 4d  LIMIT ){.    opM
27520 61 73 6b 20 3d 20 57 4f 5f 4c 54 7c 57 4f 5f 4c  ask = WO_LT|WO_L
27530 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  E;.  }else if( p
27540 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20 7c  Probe->tnum<=0 |
27550 7c 20 28 70 53 72 63 2d 3e 6a 6f 69 6e 74 79 70  | (pSrc->jointyp
27560 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20  e & JT_LEFT)!=0 
27570 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20  ){.    opMask = 
27580 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 47  WO_EQ|WO_IN|WO_G
27590 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f  T|WO_GE|WO_LT|WO
275a0 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _LE;.  }else{.  
275b0 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45 51    opMask = WO_EQ
275c0 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c  |WO_IN|WO_ISNULL
275d0 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f  |WO_GT|WO_GE|WO_
275e0 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 0a 20 20  LT|WO_LE;.  }.  
275f0 69 66 28 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f  if( pProbe->bUno
27600 72 64 65 72 65 64 20 29 20 6f 70 4d 61 73 6b 20  rdered ) opMask 
27610 26 3d 20 7e 28 57 4f 5f 47 54 7c 57 4f 5f 47 45  &= ~(WO_GT|WO_GE
27620 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 3b 0a 0a  |WO_LT|WO_LE);..
27630 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
27640 75 2e 62 74 72 65 65 2e 6e 45 71 3c 70 50 72 6f  u.btree.nEq<pPro
27650 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20  be->nColumn );. 
27660 20 69 43 6f 6c 20 3d 20 70 50 72 6f 62 65 2d 3e   iCol = pProbe->
27670 61 69 43 6f 6c 75 6d 6e 5b 70 4e 65 77 2d 3e 75  aiColumn[pNew->u
27680 2e 62 74 72 65 65 2e 6e 45 71 5d 3b 0a 0a 20 20  .btree.nEq];..  
27690 70 54 65 72 6d 20 3d 20 77 68 65 72 65 53 63 61  pTerm = whereSca
276a0 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20 70 42 75  nInit(&scan, pBu
276b0 69 6c 64 65 72 2d 3e 70 57 43 2c 20 70 53 72 63  ilder->pWC, pSrc
276c0 2d 3e 69 43 75 72 73 6f 72 2c 20 69 43 6f 6c 2c  ->iCursor, iCol,
276d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
276e0 20 20 20 20 20 20 20 20 20 6f 70 4d 61 73 6b 2c           opMask,
276f0 20 70 50 72 6f 62 65 29 3b 0a 20 20 73 61 76 65   pProbe);.  save
27700 64 5f 6e 45 71 20 3d 20 70 4e 65 77 2d 3e 75 2e  d_nEq = pNew->u.
27710 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 73 61 76  btree.nEq;.  sav
27720 65 64 5f 6e 53 6b 69 70 20 3d 20 70 4e 65 77 2d  ed_nSkip = pNew-
27730 3e 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70 3b 0a  >u.btree.nSkip;.
27740 20 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 20 3d    saved_nLTerm =
27750 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3b 0a 20   pNew->nLTerm;. 
27760 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 20 3d   saved_wsFlags =
27770 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 3b 0a   pNew->wsFlags;.
27780 20 20 73 61 76 65 64 5f 70 72 65 72 65 71 20 3d    saved_prereq =
27790 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 3b 0a 20   pNew->prereq;. 
277a0 20 73 61 76 65 64 5f 6e 4f 75 74 20 3d 20 70 4e   saved_nOut = pN
277b0 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20 70 4e 65 77  ew->nOut;.  pNew
277c0 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20  ->rSetup = 0;.  
277d0 72 53 69 7a 65 20 3d 20 70 50 72 6f 62 65 2d 3e  rSize = pProbe->
277e0 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a  aiRowLogEst[0];.
277f0 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74    rLogSize = est
27800 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 0a 20 20 2f  Log(rSize);..  /
27810 2a 20 43 6f 6e 73 69 64 65 72 20 75 73 69 6e 67  * Consider using
27820 20 61 20 73 6b 69 70 2d 73 63 61 6e 20 69 66 20   a skip-scan if 
27830 74 68 65 72 65 20 61 72 65 20 6e 6f 20 57 48 45  there are no WHE
27840 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72  RE clause constr
27850 61 69 6e 74 73 0a 20 20 2a 2a 20 61 76 61 69 6c  aints.  ** avail
27860 61 62 6c 65 20 66 6f 72 20 74 68 65 20 6c 65 66  able for the lef
27870 74 2d 6d 6f 73 74 20 74 65 72 6d 73 20 6f 66 20  t-most terms of 
27880 74 68 65 20 69 6e 64 65 78 2c 20 61 6e 64 20 69  the index, and i
27890 66 20 74 68 65 20 61 76 65 72 61 67 65 0a 20 20  f the average.  
278a0 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 70  ** number of rep
278b0 65 61 74 73 20 69 6e 20 74 68 65 20 6c 65 66 74  eats in the left
278c0 2d 6d 6f 73 74 20 74 65 72 6d 73 20 69 73 20 61  -most terms is a
278d0 74 20 6c 65 61 73 74 20 31 38 2e 20 0a 20 20 2a  t least 18. .  *
278e0 2a 0a 20 20 2a 2a 20 54 68 65 20 6d 61 67 69 63  *.  ** The magic
278f0 20 6e 75 6d 62 65 72 20 31 38 20 69 73 20 73 65   number 18 is se
27900 6c 65 63 74 65 64 20 6f 6e 20 74 68 65 20 62 61  lected on the ba
27910 73 69 73 20 74 68 61 74 20 73 63 61 6e 6e 69 6e  sis that scannin
27920 67 20 31 37 20 72 6f 77 73 0a 20 20 2a 2a 20 69  g 17 rows.  ** i
27930 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20  s almost always 
27940 71 75 69 63 6b 65 72 20 74 68 61 6e 20 61 6e 20  quicker than an 
27950 69 6e 64 65 78 20 73 65 65 6b 20 28 65 76 65 6e  index seek (even
27960 20 74 68 6f 75 67 68 20 69 66 20 74 68 65 20 69   though if the i
27970 6e 64 65 78 0a 20 20 2a 2a 20 63 6f 6e 74 61 69  ndex.  ** contai
27980 6e 73 20 66 65 77 65 72 20 74 68 61 6e 20 32 5e  ns fewer than 2^
27990 31 37 20 72 6f 77 73 20 77 65 20 61 73 73 75 6d  17 rows we assum
279a0 65 20 6f 74 68 65 72 77 69 73 65 20 69 6e 20 6f  e otherwise in o
279b0 74 68 65 72 20 70 61 72 74 73 20 6f 66 0a 20 20  ther parts of.  
279c0 2a 2a 20 74 68 65 20 63 6f 64 65 29 2e 20 41 6e  ** the code). An
279d0 64 2c 20 65 76 65 6e 20 69 66 20 69 74 20 69 73  d, even if it is
279e0 20 6e 6f 74 2c 20 69 74 20 73 68 6f 75 6c 64 20   not, it should 
279f0 6e 6f 74 20 62 65 20 74 6f 6f 20 6d 75 63 68 20  not be too much 
27a00 73 6c 6f 77 65 72 2e 20 0a 20 20 2a 2a 20 4f 6e  slower. .  ** On
27a10 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
27a20 20 74 68 65 20 65 78 74 72 61 20 73 65 65 6b 73   the extra seeks
27a30 20 63 6f 75 6c 64 20 65 6e 64 20 75 70 20 62 65   could end up be
27a40 69 6e 67 20 73 69 67 6e 69 66 69 63 61 6e 74 6c  ing significantl
27a50 79 0a 20 20 2a 2a 20 6d 6f 72 65 20 65 78 70 65  y.  ** more expe
27a60 6e 73 69 76 65 2e 20 20 2a 2f 0a 20 20 61 73 73  nsive.  */.  ass
27a70 65 72 74 28 20 34 32 3d 3d 73 71 6c 69 74 65 33  ert( 42==sqlite3
27a80 4c 6f 67 45 73 74 28 31 38 29 20 29 3b 0a 20 20  LogEst(18) );.  
27a90 69 66 28 20 73 61 76 65 64 5f 6e 45 71 3d 3d 73  if( saved_nEq==s
27aa0 61 76 65 64 5f 6e 53 6b 69 70 0a 20 20 20 26 26  aved_nSkip.   &&
27ab0 20 73 61 76 65 64 5f 6e 45 71 2b 31 3c 70 50 72   saved_nEq+1<pPr
27ac0 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 0a 20 20 20  obe->nKeyCol.   
27ad0 26 26 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77  && pProbe->aiRow
27ae0 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e 45 71  LogEst[saved_nEq
27af0 2b 31 5d 3e 3d 34 32 20 20 2f 2a 20 54 55 4e 49  +1]>=42  /* TUNI
27b00 4e 47 3a 20 4d 69 6e 69 6d 75 6d 20 66 6f 72 20  NG: Minimum for 
27b10 73 6b 69 70 2d 73 63 61 6e 20 2a 2f 0a 20 20 20  skip-scan */.   
27b20 26 26 20 28 72 63 20 3d 20 77 68 65 72 65 4c 6f  && (rc = whereLo
27b30 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65  opResize(db, pNe
27b40 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b  w, pNew->nLTerm+
27b50 31 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20  1))==SQLITE_OK. 
27b60 20 29 7b 0a 20 20 20 20 4c 6f 67 45 73 74 20 6e   ){.    LogEst n
27b70 49 74 65 72 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Iter;.    pNew->
27b80 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20  u.btree.nEq++;. 
27b90 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
27ba0 2e 6e 53 6b 69 70 2b 2b 3b 0a 20 20 20 20 70 4e  .nSkip++;.    pN
27bb0 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d  ew->aLTerm[pNew-
27bc0 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 30 3b 0a  >nLTerm++] = 0;.
27bd0 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
27be0 73 20 7c 3d 20 57 48 45 52 45 5f 53 4b 49 50 53  s |= WHERE_SKIPS
27bf0 43 41 4e 3b 0a 20 20 20 20 6e 49 74 65 72 20 3d  CAN;.    nIter =
27c00 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f   pProbe->aiRowLo
27c10 67 45 73 74 5b 73 61 76 65 64 5f 6e 45 71 5d 20  gEst[saved_nEq] 
27c20 2d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c  - pProbe->aiRowL
27c30 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e 45 71 2b  ogEst[saved_nEq+
27c40 31 5d 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  1];.    if( pTer
27c50 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 55  m ){.      /* TU
27c60 4e 49 4e 47 3a 20 20 57 68 65 6e 20 65 73 74 69  NING:  When esti
27c70 6d 61 74 69 6e 67 20 73 6b 69 70 2d 73 63 61 6e  mating skip-scan
27c80 20 66 6f 72 20 61 20 74 65 72 6d 20 74 68 61 74   for a term that
27c90 20 69 73 20 61 6c 73 6f 20 69 6e 64 65 78 61 62   is also indexab
27ca0 6c 65 2c 0a 20 20 20 20 20 20 2a 2a 20 6d 75 6c  le,.      ** mul
27cb0 74 69 70 6c 79 20 74 68 65 20 63 6f 73 74 20 6f  tiply the cost o
27cc0 66 20 74 68 65 20 73 6b 69 70 2d 73 63 61 6e 20  f the skip-scan 
27cd0 62 79 20 32 2e 30 2c 20 74 6f 20 6d 61 6b 65 20  by 2.0, to make 
27ce0 69 74 20 61 20 6c 69 74 74 6c 65 20 6c 65 73 73  it a little less
27cf0 0a 20 20 20 20 20 20 2a 2a 20 64 65 73 69 72 61  .      ** desira
27d00 62 6c 65 20 74 68 61 6e 20 74 68 65 20 72 65 67  ble than the reg
27d10 75 6c 61 72 20 69 6e 64 65 78 20 6c 6f 6f 6b 75  ular index looku
27d20 70 2e 20 2a 2f 0a 20 20 20 20 20 20 6e 49 74 65  p. */.      nIte
27d30 72 20 2b 3d 20 31 30 3b 20 20 61 73 73 65 72 74  r += 10;  assert
27d40 28 20 31 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  ( 10==sqlite3Log
27d50 45 73 74 28 32 29 20 29 3b 0a 20 20 20 20 7d 0a  Est(2) );.    }.
27d60 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d      pNew->nOut -
27d70 3d 20 6e 49 74 65 72 3b 0a 20 20 20 20 2f 2a 20  = nIter;.    /* 
27d80 54 55 4e 49 4e 47 3a 20 20 42 65 63 61 75 73 65  TUNING:  Because
27d90 20 75 6e 63 65 72 74 61 69 6e 74 69 65 73 20 69   uncertainties i
27da0 6e 20 74 68 65 20 65 73 74 69 6d 61 74 65 73 20  n the estimates 
27db0 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20 71 75  for skip-scan qu
27dc0 65 72 69 65 73 2c 0a 20 20 20 20 2a 2a 20 61 64  eries,.    ** ad
27dd0 64 20 61 20 31 2e 33 37 35 20 66 75 64 67 65 20  d a 1.375 fudge 
27de0 66 61 63 74 6f 72 20 74 6f 20 6d 61 6b 65 20 73  factor to make s
27df0 6b 69 70 2d 73 63 61 6e 20 73 6c 69 67 68 74 6c  kip-scan slightl
27e00 79 20 6c 65 73 73 20 6c 69 6b 65 6c 79 2e 20 2a  y less likely. *
27e10 2f 0a 20 20 20 20 6e 49 74 65 72 20 2b 3d 20 35  /.    nIter += 5
27e20 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 41  ;.    whereLoopA
27e30 64 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75  ddBtreeIndex(pBu
27e40 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72  ilder, pSrc, pPr
27e50 6f 62 65 2c 20 6e 49 74 65 72 20 2b 20 6e 49 6e  obe, nIter + nIn
27e60 4d 75 6c 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Mul);.    pNew->
27e70 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75  nOut = saved_nOu
27e80 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  t;.    pNew->u.b
27e90 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64  tree.nEq = saved
27ea0 5f 6e 45 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  _nEq;.    pNew->
27eb0 75 2e 62 74 72 65 65 2e 6e 53 6b 69 70 20 3d 20  u.btree.nSkip = 
27ec0 73 61 76 65 64 5f 6e 53 6b 69 70 3b 0a 20 20 7d  saved_nSkip;.  }
27ed0 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c  .  for(; rc==SQL
27ee0 49 54 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d 21  ITE_OK && pTerm!
27ef0 3d 30 3b 20 70 54 65 72 6d 20 3d 20 77 68 65 72  =0; pTerm = wher
27f00 65 53 63 61 6e 4e 65 78 74 28 26 73 63 61 6e 29  eScanNext(&scan)
27f10 29 7b 0a 20 20 20 20 75 31 36 20 65 4f 70 20 3d  ){.    u16 eOp =
27f20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
27f30 72 3b 20 20 20 2f 2a 20 53 68 6f 72 74 68 61 6e  r;   /* Shorthan
27f40 64 20 66 6f 72 20 70 54 65 72 6d 2d 3e 65 4f 70  d for pTerm->eOp
27f50 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 4c 6f  erator */.    Lo
27f60 67 45 73 74 20 72 43 6f 73 74 49 64 78 3b 0a 20  gEst rCostIdx;. 
27f70 20 20 20 4c 6f 67 45 73 74 20 6e 4f 75 74 55 6e     LogEst nOutUn
27f80 61 64 6a 75 73 74 65 64 3b 20 20 20 20 20 20 20  adjusted;       
27f90 20 2f 2a 20 6e 4f 75 74 20 62 65 66 6f 72 65 20   /* nOut before 
27fa0 49 4e 28 29 20 61 6e 64 20 57 48 45 52 45 20 61  IN() and WHERE a
27fb0 64 6a 75 73 74 6d 65 6e 74 73 20 2a 2f 0a 20 20  djustments */.  
27fc0 20 20 69 6e 74 20 6e 49 6e 20 3d 20 30 3b 0a 23    int nIn = 0;.#
27fd0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
27fe0 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
27ff0 54 34 0a 20 20 20 20 69 6e 74 20 6e 52 65 63 56  T4.    int nRecV
28000 61 6c 69 64 20 3d 20 70 42 75 69 6c 64 65 72 2d  alid = pBuilder-
28010 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 23 65 6e 64  >nRecValid;.#end
28020 69 66 0a 20 20 20 20 69 66 28 20 28 65 4f 70 3d  if.    if( (eOp=
28030 3d 57 4f 5f 49 53 4e 55 4c 4c 20 7c 7c 20 28 70  =WO_ISNULL || (p
28040 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 26 54 45  Term->wtFlags&TE
28050 52 4d 5f 56 4e 55 4c 4c 29 21 3d 30 29 0a 20 20  RM_VNULL)!=0).  
28060 20 20 20 26 26 20 28 69 43 6f 6c 3c 30 20 7c 7c     && (iCol<0 ||
28070 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 61 43 6f   pSrc->pTab->aCo
28080 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 29  l[iCol].notNull)
28090 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63 6f  .    ){.      co
280a0 6e 74 69 6e 75 65 3b 20 2f 2a 20 69 67 6e 6f 72  ntinue; /* ignor
280b0 65 20 49 53 20 5b 4e 4f 54 5d 20 4e 55 4c 4c 20  e IS [NOT] NULL 
280c0 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 4e  constraints on N
280d0 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20  OT NULL columns 
280e0 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  */.    }.    if(
280f0 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
28100 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b  ght & pNew->mask
28110 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Self ) continue;
28120 0a 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c  ..    pNew->wsFl
28130 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73 46 6c  ags = saved_wsFl
28140 61 67 73 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75  ags;.    pNew->u
28150 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76  .btree.nEq = sav
28160 65 64 5f 6e 45 71 3b 0a 20 20 20 20 70 4e 65 77  ed_nEq;.    pNew
28170 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65 64  ->nLTerm = saved
28180 5f 6e 4c 54 65 72 6d 3b 0a 20 20 20 20 69 66 28  _nLTerm;.    if(
28190 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65   whereLoopResize
281a0 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d  (db, pNew, pNew-
281b0 3e 6e 4c 54 65 72 6d 2b 31 29 20 29 20 62 72 65  >nLTerm+1) ) bre
281c0 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20  ak; /* OOM */.  
281d0 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70    pNew->aLTerm[p
281e0 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d  New->nLTerm++] =
281f0 20 70 54 65 72 6d 3b 0a 20 20 20 20 70 4e 65 77   pTerm;.    pNew
28200 2d 3e 70 72 65 72 65 71 20 3d 20 28 73 61 76 65  ->prereq = (save
28210 64 5f 70 72 65 72 65 71 20 7c 20 70 54 65 72 6d  d_prereq | pTerm
28220 2d 3e 70 72 65 72 65 71 52 69 67 68 74 29 20 26  ->prereqRight) &
28230 20 7e 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66   ~pNew->maskSelf
28240 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  ;..    assert( n
28250 49 6e 4d 75 6c 3d 3d 30 0a 20 20 20 20 20 20 20  InMul==0.       
28260 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61   || (pNew->wsFla
28270 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs & WHERE_COLUM
28280 4e 5f 4e 55 4c 4c 29 21 3d 30 20 0a 20 20 20 20  N_NULL)!=0 .    
28290 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73      || (pNew->ws
282a0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  Flags & WHERE_CO
282b0 4c 55 4d 4e 5f 49 4e 29 21 3d 30 20 0a 20 20 20  LUMN_IN)!=0 .   
282c0 20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77       || (pNew->w
282d0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53  sFlags & WHERE_S
282e0 4b 49 50 53 43 41 4e 29 21 3d 30 20 0a 20 20 20  KIPSCAN)!=0 .   
282f0 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 65 4f 70   );..    if( eOp
28300 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20   & WO_IN ){.    
28310 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
28320 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
28330 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
28340 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
28350 4e 5f 49 4e 3b 0a 20 20 20 20 20 20 69 66 28 20  N_IN;.      if( 
28360 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
28370 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
28380 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ect) ){.        
28390 2f 2a 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54  /* "x IN (SELECT
283a0 20 2e 2e 2e 29 22 3a 20 20 54 55 4e 49 4e 47 3a   ...)":  TUNING:
283b0 20 74 68 65 20 53 45 4c 45 43 54 20 72 65 74 75   the SELECT retu
283c0 72 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f 0a 20  rns 25 rows */. 
283d0 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 34 36 3b         nIn = 46;
283e0 20 20 61 73 73 65 72 74 28 20 34 36 3d 3d 73 71    assert( 46==sq
283f0 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 35 29 20  lite3LogEst(25) 
28400 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
28410 66 28 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d  f( ALWAYS(pExpr-
28420 3e 78 2e 70 4c 69 73 74 20 26 26 20 70 45 78 70  >x.pList && pExp
28430 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
28440 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  r) ){.        /*
28450 20 22 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76   "x IN (value, v
28460 61 6c 75 65 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20  alue, ...)" */. 
28470 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 73 71 6c         nIn = sql
28480 69 74 65 33 4c 6f 67 45 73 74 28 70 45 78 70 72  ite3LogEst(pExpr
28490 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
284a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
284b0 20 61 73 73 65 72 74 28 20 6e 49 6e 3e 30 20 29   assert( nIn>0 )
284c0 3b 20 20 2f 2a 20 52 48 53 20 61 6c 77 61 79 73  ;  /* RHS always
284d0 20 68 61 73 20 32 20 6f 72 20 6d 6f 72 65 20 74   has 2 or more t
284e0 65 72 6d 73 2e 2e 2e 20 20 54 68 65 20 70 61 72  erms...  The par
284f0 73 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20  ser.            
28500 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63              ** c
28510 68 61 6e 67 65 73 20 22 78 20 49 4e 20 28 3f 29  hanges "x IN (?)
28520 22 20 69 6e 74 6f 20 22 78 3d 3f 22 2e 20 2a 2f  " into "x=?". */
28530 0a 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ..    }else if( 
28540 65 4f 70 20 26 20 28 57 4f 5f 45 51 29 20 29 7b  eOp & (WO_EQ) ){
28550 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  .      pNew->wsF
28560 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f  lags |= WHERE_CO
28570 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20 20 20 20 69  LUMN_EQ;.      i
28580 66 28 20 69 43 6f 6c 3c 30 20 7c 7c 20 28 6e 49  f( iCol<0 || (nI
28590 6e 4d 75 6c 3d 3d 30 20 26 26 20 70 4e 65 77 2d  nMul==0 && pNew-
285a0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3d 3d 70 50  >u.btree.nEq==pP
285b0 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 2d 31 29  robe->nKeyCol-1)
285c0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
285d0 69 43 6f 6c 3e 3d 30 20 26 26 20 21 49 73 55 6e  iCol>=0 && !IsUn
285e0 69 71 75 65 49 6e 64 65 78 28 70 50 72 6f 62 65  iqueIndex(pProbe
285f0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  ) ){.          p
28600 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
28610 57 48 45 52 45 5f 55 4e 51 5f 57 41 4e 54 45 44  WHERE_UNQ_WANTED
28620 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
28630 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
28640 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
28650 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 20 20  E_ONEROW;.      
28660 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
28670 7d 65 6c 73 65 20 69 66 28 20 65 4f 70 20 26 20  }else if( eOp & 
28680 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20  WO_ISNULL ){.   
28690 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
286a0 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
286b0 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  _NULL;.    }else
286c0 20 69 66 28 20 65 4f 70 20 26 20 28 57 4f 5f 47   if( eOp & (WO_G
286d0 54 7c 57 4f 5f 47 45 29 20 29 7b 0a 20 20 20 20  T|WO_GE) ){.    
286e0 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20    testcase( eOp 
286f0 26 20 57 4f 5f 47 54 20 29 3b 0a 20 20 20 20 20  & WO_GT );.     
28700 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26   testcase( eOp &
28710 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20 20 20   WO_GE );.      
28720 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
28730 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41   WHERE_COLUMN_RA
28740 4e 47 45 7c 57 48 45 52 45 5f 42 54 4d 5f 4c 49  NGE|WHERE_BTM_LI
28750 4d 49 54 3b 0a 20 20 20 20 20 20 70 42 74 6d 20  MIT;.      pBtm 
28760 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  = pTerm;.      p
28770 54 6f 70 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Top = 0;.    }el
28780 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
28790 28 20 65 4f 70 20 26 20 28 57 4f 5f 4c 54 7c 57  ( eOp & (WO_LT|W
287a0 4f 5f 4c 45 29 20 29 3b 0a 20 20 20 20 20 20 74  O_LE) );.      t
287b0 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57  estcase( eOp & W
287c0 4f 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65  O_LT );.      te
287d0 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f  stcase( eOp & WO
287e0 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 70 4e 65  _LE );.      pNe
287f0 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
28800 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
28810 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54  |WHERE_TOP_LIMIT
28820 3b 0a 20 20 20 20 20 20 70 54 6f 70 20 3d 20 70  ;.      pTop = p
28830 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 42 74 6d  Term;.      pBtm
28840 20 3d 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67   = (pNew->wsFlag
28850 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49  s & WHERE_BTM_LI
28860 4d 49 54 29 21 3d 30 20 3f 0a 20 20 20 20 20 20  MIT)!=0 ?.      
28870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
28880 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77  New->aLTerm[pNew
28890 2d 3e 6e 4c 54 65 72 6d 2d 32 5d 20 3a 20 30 3b  ->nLTerm-2] : 0;
288a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
288b0 74 20 74 68 69 73 20 70 6f 69 6e 74 20 70 4e 65  t this point pNe
288c0 77 2d 3e 6e 4f 75 74 20 69 73 20 73 65 74 20 74  w->nOut is set t
288d0 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
288e0 72 6f 77 73 20 65 78 70 65 63 74 65 64 20 74 6f  rows expected to
288f0 0a 20 20 20 20 2a 2a 20 62 65 20 76 69 73 69 74  .    ** be visit
28900 65 64 20 62 79 20 74 68 65 20 69 6e 64 65 78 20  ed by the index 
28910 73 63 61 6e 20 62 65 66 6f 72 65 20 63 6f 6e 73  scan before cons
28920 69 64 65 72 69 6e 67 20 74 65 72 6d 20 70 54 65  idering term pTe
28930 72 6d 2c 20 6f 72 20 74 68 65 0a 20 20 20 20 2a  rm, or the.    *
28940 2a 20 76 61 6c 75 65 73 20 6f 66 20 6e 49 6e 20  * values of nIn 
28950 61 6e 64 20 6e 49 6e 4d 75 6c 2e 20 49 6e 20 6f  and nInMul. In o
28960 74 68 65 72 20 77 6f 72 64 73 2c 20 61 73 73 75  ther words, assu
28970 6d 69 6e 67 20 74 68 61 74 20 61 6c 6c 20 0a 20  ming that all . 
28980 20 20 20 2a 2a 20 22 78 20 49 4e 28 2e 2e 2e 29     ** "x IN(...)
28990 22 20 74 65 72 6d 73 20 61 72 65 20 72 65 70 6c  " terms are repl
289a0 61 63 65 64 20 77 69 74 68 20 22 78 20 3d 20 3f  aced with "x = ?
289b0 22 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 75 70  ". This block up
289c0 64 61 74 65 73 0a 20 20 20 20 2a 2a 20 74 68 65  dates.    ** the
289d0 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
289e0 6e 4f 75 74 20 74 6f 20 61 63 63 6f 75 6e 74 20  nOut to account 
289f0 66 6f 72 20 70 54 65 72 6d 20 28 62 75 74 20 6e  for pTerm (but n
28a00 6f 74 20 6e 49 6e 2f 6e 49 6e 4d 75 6c 29 2e 20  ot nIn/nInMul). 
28a10 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
28a20 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65  pNew->nOut==save
28a30 64 5f 6e 4f 75 74 20 29 3b 0a 20 20 20 20 69 66  d_nOut );.    if
28a40 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20  ( pNew->wsFlags 
28a50 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52  & WHERE_COLUMN_R
28a60 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ANGE ){.      /*
28a70 20 41 64 6a 75 73 74 20 6e 4f 75 74 20 75 73 69   Adjust nOut usi
28a80 6e 67 20 73 74 61 74 33 2f 73 74 61 74 34 20 64  ng stat3/stat4 d
28a90 61 74 61 2e 20 4f 72 2c 20 69 66 20 74 68 65 72  ata. Or, if ther
28aa0 65 20 69 73 20 6e 6f 20 73 74 61 74 33 2f 73 74  e is no stat3/st
28ab0 61 74 34 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  at4.      ** dat
28ac0 61 2c 20 75 73 69 6e 67 20 73 6f 6d 65 20 6f 74  a, using some ot
28ad0 68 65 72 20 65 73 74 69 6d 61 74 65 2e 20 20 2a  her estimate.  *
28ae0 2f 0a 20 20 20 20 20 20 77 68 65 72 65 52 61 6e  /.      whereRan
28af0 67 65 53 63 61 6e 45 73 74 28 70 50 61 72 73 65  geScanEst(pParse
28b00 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 42 74 6d  , pBuilder, pBtm
28b10 2c 20 70 54 6f 70 2c 20 70 4e 65 77 29 3b 0a 20  , pTop, pNew);. 
28b20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28b30 69 6e 74 20 6e 45 71 20 3d 20 2b 2b 70 4e 65 77  int nEq = ++pNew
28b40 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20  ->u.btree.nEq;. 
28b50 20 20 20 20 20 61 73 73 65 72 74 28 20 65 4f 70       assert( eOp
28b60 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f   & (WO_ISNULL|WO
28b70 5f 45 51 7c 57 4f 5f 49 4e 29 20 29 3b 0a 0a 20  _EQ|WO_IN) );.. 
28b80 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65       assert( pNe
28b90 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e  w->nOut==saved_n
28ba0 4f 75 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28  Out );.      if(
28bb0 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f   pTerm->truthPro
28bc0 62 3c 3d 30 20 26 26 20 69 43 6f 6c 3e 3d 30 20  b<=0 && iCol>=0 
28bd0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
28be0 74 28 20 28 65 4f 70 20 26 20 57 4f 5f 49 4e 29  t( (eOp & WO_IN)
28bf0 20 7c 7c 20 6e 49 6e 3d 3d 30 20 29 3b 0a 20 20   || nIn==0 );.  
28c00 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
28c10 65 4f 70 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20  eOp & WO_IN );. 
28c20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75         pNew->nOu
28c30 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74  t += pTerm->trut
28c40 68 50 72 6f 62 3b 0a 20 20 20 20 20 20 20 20 70  hProb;.        p
28c50 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 6e  New->nOut -= nIn
28c60 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 23  ;.      }else{.#
28c70 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
28c80 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
28c90 54 34 0a 20 20 20 20 20 20 20 20 74 52 6f 77 63  T4.        tRowc
28ca0 6e 74 20 6e 4f 75 74 20 3d 20 30 3b 0a 20 20 20  nt nOut = 0;.   
28cb0 20 20 20 20 20 69 66 28 20 6e 49 6e 4d 75 6c 3d       if( nInMul=
28cc0 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26 26 20  =0 .         && 
28cd0 70 50 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 20  pProbe->nSample 
28ce0 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 4e 65  .         && pNe
28cf0 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 3d  w->u.btree.nEq<=
28d00 70 50 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 43  pProbe->nSampleC
28d10 6f 6c 0a 20 20 20 20 20 20 20 20 20 26 26 20 4f  ol.         && O
28d20 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
28d30 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 53 74  ed(db, SQLITE_St
28d40 61 74 33 29 20 0a 20 20 20 20 20 20 20 20 20 26  at3) .         &
28d50 26 20 28 28 65 4f 70 20 26 20 57 4f 5f 49 4e 29  & ((eOp & WO_IN)
28d60 3d 3d 30 20 7c 7c 20 21 45 78 70 72 48 61 73 50  ==0 || !ExprHasP
28d70 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70  roperty(pTerm->p
28d80 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
28d90 63 74 29 29 0a 20 20 20 20 20 20 20 20 29 7b 0a  ct)).        ){.
28da0 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
28db0 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70  pExpr = pTerm->p
28dc0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
28dd0 69 66 28 20 28 65 4f 70 20 26 20 28 57 4f 5f 45  if( (eOp & (WO_E
28de0 51 7c 57 4f 5f 49 53 4e 55 4c 4c 29 29 21 3d 30  Q|WO_ISNULL))!=0
28df0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
28e00 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20  testcase( eOp & 
28e10 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20  WO_EQ );.       
28e20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
28e30 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  Op & WO_ISNULL )
28e40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
28e50 20 3d 20 77 68 65 72 65 45 71 75 61 6c 53 63 61   = whereEqualSca
28e60 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42 75  nEst(pParse, pBu
28e70 69 6c 64 65 72 2c 20 70 45 78 70 72 2d 3e 70 52  ilder, pExpr->pR
28e80 69 67 68 74 2c 20 26 6e 4f 75 74 29 3b 0a 20 20  ight, &nOut);.  
28e90 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
28ea0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
28eb0 77 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28 70  whereInScanEst(p
28ec0 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c  Parse, pBuilder,
28ed0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c   pExpr->x.pList,
28ee0 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20   &nOut);.       
28ef0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
28f00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
28f10 54 46 4f 55 4e 44 20 29 20 72 63 20 3d 20 53 51  TFOUND ) rc = SQ
28f20 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
28f30 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
28f40 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 20 20 20  E_OK ) break;   
28f50 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f         /* Jump o
28f60 75 74 20 6f 66 20 74 68 65 20 70 54 65 72 6d 20  ut of the pTerm 
28f70 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 20 20  loop */.        
28f80 20 20 69 66 28 20 6e 4f 75 74 20 29 7b 0a 20 20    if( nOut ){.  
28f90 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
28fa0 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f  nOut = sqlite3Lo
28fb0 67 45 73 74 28 6e 4f 75 74 29 3b 0a 20 20 20 20  gEst(nOut);.    
28fc0 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
28fd0 2d 3e 6e 4f 75 74 3e 73 61 76 65 64 5f 6e 4f 75  ->nOut>saved_nOu
28fe0 74 20 29 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d  t ) pNew->nOut =
28ff0 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 20   saved_nOut;.   
29000 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e           pNew->n
29010 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a 20 20 20 20  Out -= nIn;.    
29020 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
29030 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f  }.        if( nO
29040 75 74 3d 3d 30 20 29 0a 23 65 6e 64 69 66 0a 20  ut==0 ).#endif. 
29050 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
29060 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d     pNew->nOut +=
29070 20 28 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c   (pProbe->aiRowL
29080 6f 67 45 73 74 5b 6e 45 71 5d 20 2d 20 70 50 72  ogEst[nEq] - pPr
29090 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  obe->aiRowLogEst
290a0 5b 6e 45 71 2d 31 5d 29 3b 0a 20 20 20 20 20 20  [nEq-1]);.      
290b0 20 20 20 20 69 66 28 20 65 4f 70 20 26 20 57 4f      if( eOp & WO
290c0 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  _ISNULL ){.     
290d0 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47         /* TUNING
290e0 3a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  : If there is no
290f0 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20 76 61   likelihood() va
29100 6c 75 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74  lue, assume that
29110 20 61 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   a .            
29120 2a 2a 20 22 63 6f 6c 20 49 53 20 4e 55 4c 4c 22  ** "col IS NULL"
29130 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 74 63   expression matc
29140 68 65 73 20 74 77 69 63 65 20 61 73 20 6d 61 6e  hes twice as man
29150 79 20 72 6f 77 73 20 0a 20 20 20 20 20 20 20 20  y rows .        
29160 20 20 20 20 2a 2a 20 61 73 20 28 63 6f 6c 3d 3f      ** as (col=?
29170 29 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ). */.          
29180 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20    pNew->nOut += 
29190 31 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  10;.          }.
291a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
291b0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
291c0 53 65 74 20 72 43 6f 73 74 49 64 78 20 74 6f 20  Set rCostIdx to 
291d0 74 68 65 20 63 6f 73 74 20 6f 66 20 76 69 73 69  the cost of visi
291e0 74 69 6e 67 20 73 65 6c 65 63 74 65 64 20 72 6f  ting selected ro
291f0 77 73 20 69 6e 20 69 6e 64 65 78 2e 20 41 64 64  ws in index. Add
29200 0a 20 20 20 20 2a 2a 20 69 74 20 74 6f 20 70 4e  .    ** it to pN
29210 65 77 2d 3e 72 52 75 6e 2c 20 77 68 69 63 68 20  ew->rRun, which 
29220 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73 65 74  is currently set
29230 20 74 6f 20 74 68 65 20 63 6f 73 74 20 6f 66 20   to the cost of 
29240 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a  the index.    **
29250 20 73 65 65 6b 20 6f 6e 6c 79 2e 20 54 68 65 6e   seek only. Then
29260 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20 6e  , if this is a n
29270 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  on-covering inde
29280 78 2c 20 61 64 64 20 74 68 65 20 63 6f 73 74 20  x, add the cost 
29290 6f 66 0a 20 20 20 20 2a 2a 20 76 69 73 69 74 69  of.    ** visiti
292a0 6e 67 20 74 68 65 20 72 6f 77 73 20 69 6e 20 74  ng the rows in t
292b0 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 20 20  he main table.  
292c0 2a 2f 0a 20 20 20 20 72 43 6f 73 74 49 64 78 20  */.    rCostIdx 
292d0 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 20 31  = pNew->nOut + 1
292e0 20 2b 20 28 31 35 2a 70 50 72 6f 62 65 2d 3e 73   + (15*pProbe->s
292f0 7a 49 64 78 52 6f 77 29 2f 70 53 72 63 2d 3e 70  zIdxRow)/pSrc->p
29300 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20  Tab->szTabRow;. 
29310 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
29320 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
29330 28 72 4c 6f 67 53 69 7a 65 2c 20 72 43 6f 73 74  (rLogSize, rCost
29340 49 64 78 29 3b 0a 20 20 20 20 69 66 28 20 28 70  Idx);.    if( (p
29350 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 28  New->wsFlags & (
29360 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57  WHERE_IDX_ONLY|W
29370 48 45 52 45 5f 49 50 4b 29 29 3d 3d 30 20 29 7b  HERE_IPK))==0 ){
29380 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75  .      pNew->rRu
29390 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  n = sqlite3LogEs
293a0 74 41 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c  tAdd(pNew->rRun,
293b0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 20 31 36   pNew->nOut + 16
293c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 41 70 70  );.    }.    App
293d0 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72  lyCostMultiplier
293e0 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 50 72  (pNew->rRun, pPr
293f0 6f 62 65 2d 3e 70 54 61 62 6c 65 2d 3e 63 6f 73  obe->pTable->cos
29400 74 4d 75 6c 74 29 3b 0a 0a 20 20 20 20 6e 4f 75  tMult);..    nOu
29410 74 55 6e 61 64 6a 75 73 74 65 64 20 3d 20 70 4e  tUnadjusted = pN
29420 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20 70 4e  ew->nOut;.    pN
29430 65 77 2d 3e 72 52 75 6e 20 2b 3d 20 6e 49 6e 4d  ew->rRun += nInM
29440 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20 20 70 4e  ul + nIn;.    pN
29450 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 6e 49 6e 4d  ew->nOut += nInM
29460 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20 20 77 68  ul + nIn;.    wh
29470 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a  ereLoopOutputAdj
29480 75 73 74 28 70 42 75 69 6c 64 65 72 2d 3e 70 57  ust(pBuilder->pW
29490 43 2c 20 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b  C, pNew, rSize);
294a0 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c  .    rc = whereL
294b0 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64  oopInsert(pBuild
294c0 65 72 2c 20 70 4e 65 77 29 3b 0a 0a 20 20 20 20  er, pNew);..    
294d0 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67  if( pNew->wsFlag
294e0 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
294f0 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20  _RANGE ){.      
29500 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76  pNew->nOut = sav
29510 65 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 7d 65 6c  ed_nOut;.    }el
29520 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  se{.      pNew->
29530 6e 4f 75 74 20 3d 20 6e 4f 75 74 55 6e 61 64 6a  nOut = nOutUnadj
29540 75 73 74 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  usted;.    }..  
29550 20 20 69 66 28 20 28 70 4e 65 77 2d 3e 77 73 46    if( (pNew->wsF
29560 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50  lags & WHERE_TOP
29570 5f 4c 49 4d 49 54 29 3d 3d 30 0a 20 20 20 20 20  _LIMIT)==0.     
29580 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  && pNew->u.btree
29590 2e 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f  .nEq<pProbe->nCo
295a0 6c 75 6d 6e 0a 20 20 20 20 29 7b 0a 20 20 20 20  lumn.    ){.    
295b0 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74    whereLoopAddBt
295c0 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65  reeIndex(pBuilde
295d0 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c  r, pSrc, pProbe,
295e0 20 6e 49 6e 4d 75 6c 2b 6e 49 6e 29 3b 0a 20 20   nInMul+nIn);.  
295f0 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f    }.    pNew->nO
29600 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b  ut = saved_nOut;
29610 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
29620 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
29630 54 41 54 34 0a 20 20 20 20 70 42 75 69 6c 64 65  TAT4.    pBuilde
29640 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e  r->nRecValid = n
29650 52 65 63 56 61 6c 69 64 3b 0a 23 65 6e 64 69 66  RecValid;.#endif
29660 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 72 65  .  }.  pNew->pre
29670 72 65 71 20 3d 20 73 61 76 65 64 5f 70 72 65 72  req = saved_prer
29680 65 71 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 62 74  eq;.  pNew->u.bt
29690 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f  ree.nEq = saved_
296a0 6e 45 71 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 62  nEq;.  pNew->u.b
296b0 74 72 65 65 2e 6e 53 6b 69 70 20 3d 20 73 61 76  tree.nSkip = sav
296c0 65 64 5f 6e 53 6b 69 70 3b 0a 20 20 70 4e 65 77  ed_nSkip;.  pNew
296d0 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65  ->wsFlags = save
296e0 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 70 4e 65  d_wsFlags;.  pNe
296f0 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f  w->nOut = saved_
29700 6e 4f 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c  nOut;.  pNew->nL
29710 54 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54  Term = saved_nLT
29720 65 72 6d 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  erm;.  return rc
29730 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
29740 6e 20 54 72 75 65 20 69 66 20 69 74 20 69 73 20  n True if it is 
29750 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 70 49  possible that pI
29760 6e 64 65 78 20 6d 69 67 68 74 20 62 65 20 75 73  ndex might be us
29770 65 66 75 6c 20 69 6e 0a 2a 2a 20 69 6d 70 6c 65  eful in.** imple
29780 6d 65 6e 74 69 6e 67 20 74 68 65 20 4f 52 44 45  menting the ORDE
29790 52 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20 70  R BY clause in p
297a0 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 52  Builder..**.** R
297b0 65 74 75 72 6e 20 46 61 6c 73 65 20 69 66 20 70  eturn False if p
297c0 42 75 69 6c 64 65 72 20 64 6f 65 73 20 6e 6f 74  Builder does not
297d0 20 63 6f 6e 74 61 69 6e 20 61 6e 20 4f 52 44 45   contain an ORDE
297e0 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72 0a 2a  R BY clause or.*
297f0 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  * if there is no
29800 20 77 61 79 20 66 6f 72 20 70 49 6e 64 65 78 20   way for pIndex 
29810 74 6f 20 62 65 20 75 73 65 66 75 6c 20 69 6e 20  to be useful in 
29820 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 61  implementing tha
29830 74 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6c  t.** ORDER BY cl
29840 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ause..*/.static 
29850 69 6e 74 20 69 6e 64 65 78 4d 69 67 68 74 48 65  int indexMightHe
29860 6c 70 57 69 74 68 4f 72 64 65 72 42 79 28 0a 20  lpWithOrderBy(. 
29870 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
29880 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 49  r *pBuilder,.  I
29890 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 0a 20 20  ndex *pIndex,.  
298a0 69 6e 74 20 69 43 75 72 73 6f 72 0a 29 7b 0a 20  int iCursor.){. 
298b0 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 42 3b 0a   ExprList *pOB;.
298c0 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 0a 20    int ii, jj;.. 
298d0 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 62 55 6e   if( pIndex->bUn
298e0 6f 72 64 65 72 65 64 20 29 20 72 65 74 75 72 6e  ordered ) return
298f0 20 30 3b 0a 20 20 69 66 28 20 28 70 4f 42 20 3d   0;.  if( (pOB =
29900 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
29910 6f 2d 3e 70 4f 72 64 65 72 42 79 29 3d 3d 30 20  o->pOrderBy)==0 
29920 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f  ) return 0;.  fo
29930 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 42 2d 3e  r(ii=0; ii<pOB->
29940 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20  nExpr; ii++){.  
29950 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
29960 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
29970 6f 6c 6c 61 74 65 28 70 4f 42 2d 3e 61 5b 69 69  ollate(pOB->a[ii
29980 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66  ].pExpr);.    if
29990 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
299a0 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20  COLUMN ) return 
299b0 30 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  0;.    if( pExpr
299c0 2d 3e 69 54 61 62 6c 65 3d 3d 69 43 75 72 73 6f  ->iTable==iCurso
299d0 72 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  r ){.      if( p
299e0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  Expr->iColumn<0 
299f0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
29a00 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70    for(jj=0; jj<p
29a10 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  Index->nKeyCol; 
29a20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  jj++){.        i
29a30 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
29a40 6e 3d 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  n==pIndex->aiCol
29a50 75 6d 6e 5b 6a 6a 5d 20 29 20 72 65 74 75 72 6e  umn[jj] ) return
29a60 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
29a70 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
29a80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
29a90 6e 20 61 20 62 69 74 6d 61 73 6b 20 77 68 65 72  n a bitmask wher
29aa0 65 20 31 73 20 69 6e 64 69 63 61 74 65 20 74 68  e 1s indicate th
29ab0 61 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  at the correspon
29ac0 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a  ding column of.*
29ad0 2a 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 75  * the table is u
29ae0 73 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 2e  sed by an index.
29af0 20 20 4f 6e 6c 79 20 74 68 65 20 66 69 72 73 74    Only the first
29b00 20 36 33 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20   63 columns are 
29b10 63 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 73  considered..*/.s
29b20 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 63 6f  tatic Bitmask co
29b30 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 49 6e 64  lumnsInIndex(Ind
29b40 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 42 69 74  ex *pIdx){.  Bit
29b50 6d 61 73 6b 20 6d 20 3d 20 30 3b 0a 20 20 69 6e  mask m = 0;.  in
29b60 74 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d 70 49 64  t j;.  for(j=pId
29b70 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e  x->nColumn-1; j>
29b80 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e  =0; j--){.    in
29b90 74 20 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f  t x = pIdx->aiCo
29ba0 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 69 66 28  lumn[j];.    if(
29bb0 20 78 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 74   x>=0 ){.      t
29bc0 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d  estcase( x==BMS-
29bd0 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  1 );.      testc
29be0 61 73 65 28 20 78 3d 3d 42 4d 53 2d 32 20 29 3b  ase( x==BMS-2 );
29bf0 0a 20 20 20 20 20 20 69 66 28 20 78 3c 42 4d 53  .      if( x<BMS
29c00 2d 31 20 29 20 6d 20 7c 3d 20 4d 41 53 4b 42 49  -1 ) m |= MASKBI
29c10 54 28 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  T(x);.    }.  }.
29c20 20 20 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f    return m;.}../
29c30 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
29c40 66 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65  f a partial inde
29c50 78 20 77 69 74 68 20 70 50 61 72 74 49 6e 64 65  x with pPartInde
29c60 78 57 68 65 72 65 20 63 61 6e 20 62 65 20 75 73  xWhere can be us
29c70 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72  ed.** in the cur
29c80 72 65 6e 74 20 71 75 65 72 79 2e 20 20 52 65 74  rent query.  Ret
29c90 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 63  urn true if it c
29ca0 61 6e 20 62 65 20 61 6e 64 20 66 61 6c 73 65 20  an be and false 
29cb0 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69  if not..*/.stati
29cc0 63 20 69 6e 74 20 77 68 65 72 65 55 73 61 62 6c  c int whereUsabl
29cd0 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28 69 6e  ePartialIndex(in
29ce0 74 20 69 54 61 62 2c 20 57 68 65 72 65 43 6c 61  t iTab, WhereCla
29cf0 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a  use *pWC, Expr *
29d00 70 57 68 65 72 65 29 7b 0a 20 20 69 6e 74 20 69  pWhere){.  int i
29d10 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  ;.  WhereTerm *p
29d20 54 65 72 6d 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  Term;.  for(i=0,
29d30 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69   pTerm=pWC->a; i
29d40 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b  <pWC->nTerm; i++
29d50 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
29d60 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
29d70 6d 70 6c 69 65 73 45 78 70 72 28 70 54 65 72 6d  mpliesExpr(pTerm
29d80 2d 3e 70 45 78 70 72 2c 20 70 57 68 65 72 65 2c  ->pExpr, pWhere,
29d90 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20   iTab) ) return 
29da0 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
29db0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  0;.}../*.** Add 
29dc0 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  all WhereLoop ob
29dd0 6a 65 63 74 73 20 66 6f 72 20 61 20 73 69 6e 67  jects for a sing
29de0 6c 65 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  le table of the 
29df0 6a 6f 69 6e 20 77 68 65 72 65 20 74 68 65 20 74  join where the t
29e00 61 62 6c 65 0a 2a 2a 20 69 73 20 69 64 65 6e 66  able.** is idenf
29e10 69 65 64 20 62 79 20 70 42 75 69 6c 64 65 72 2d  ied by pBuilder-
29e20 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68  >pNew->iTab.  Th
29e30 61 74 20 74 61 62 6c 65 20 69 73 20 67 75 61 72  at table is guar
29e40 61 6e 74 65 65 64 20 74 6f 20 62 65 0a 2a 2a 20  anteed to be.** 
29e50 61 20 62 2d 74 72 65 65 20 74 61 62 6c 65 2c 20  a b-tree table, 
29e60 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74 61  not a virtual ta
29e70 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ble..**.** The c
29e80 6f 73 74 73 20 28 57 68 65 72 65 4c 6f 6f 70 2e  osts (WhereLoop.
29e90 72 52 75 6e 29 20 6f 66 20 74 68 65 20 62 2d 74  rRun) of the b-t
29ea0 72 65 65 20 6c 6f 6f 70 73 20 61 64 64 65 64 20  ree loops added 
29eb0 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
29ec0 0a 2a 2a 20 61 72 65 20 63 61 6c 63 75 6c 61 74  .** are calculat
29ed0 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ed as follows:.*
29ee0 2a 0a 2a 2a 20 46 6f 72 20 61 20 66 75 6c 6c 20  *.** For a full 
29ef0 73 63 61 6e 2c 20 61 73 73 75 6d 69 6e 67 20 74  scan, assuming t
29f00 68 65 20 74 61 62 6c 65 20 28 6f 72 20 69 6e 64  he table (or ind
29f10 65 78 29 20 63 6f 6e 74 61 69 6e 73 20 6e 52 6f  ex) contains nRo
29f20 77 20 72 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  w rows:.**.**   
29f30 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20    cost = nRow * 
29f40 33 2e 30 20 20 20 20 20 20 20 20 20 20 20 20 20  3.0             
29f50 20 20 20 20 20 20 20 2f 2f 20 66 75 6c 6c 2d 74         // full-t
29f60 61 62 6c 65 20 73 63 61 6e 0a 2a 2a 20 20 20 20  able scan.**    
29f70 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20 4b   cost = nRow * K
29f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f90 20 20 20 20 20 20 2f 2f 20 73 63 61 6e 20 6f 66        // scan of
29fa0 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a   covering index.
29fb0 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 52  **     cost = nR
29fc0 6f 77 20 2a 20 28 4b 2b 33 2e 30 29 20 20 20 20  ow * (K+3.0)    
29fd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 73              // s
29fe0 63 61 6e 20 6f 66 20 6e 6f 6e 2d 63 6f 76 65 72  can of non-cover
29ff0 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a 2a 20  ing index.**.** 
2a000 77 68 65 72 65 20 4b 20 69 73 20 61 20 76 61 6c  where K is a val
2a010 75 65 20 62 65 74 77 65 65 6e 20 31 2e 31 20 61  ue between 1.1 a
2a020 6e 64 20 33 2e 30 20 73 65 74 20 62 61 73 65 64  nd 3.0 set based
2a030 20 6f 6e 20 74 68 65 20 72 65 6c 61 74 69 76 65   on the relative
2a040 20 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64 20 61   .** estimated a
2a050 76 65 72 61 67 65 20 73 69 7a 65 20 6f 66 20 74  verage size of t
2a060 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62  he index and tab
2a070 6c 65 20 72 65 63 6f 72 64 73 2e 0a 2a 2a 0a 2a  le records..**.*
2a080 2a 20 46 6f 72 20 61 6e 20 69 6e 64 65 78 20 73  * For an index s
2a090 63 61 6e 2c 20 77 68 65 72 65 20 6e 56 69 73 69  can, where nVisi
2a0a0 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  t is the number 
2a0b0 6f 66 20 69 6e 64 65 78 20 72 6f 77 73 20 76 69  of index rows vi
2a0c0 73 69 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  sited.** by the 
2a0d0 73 63 61 6e 2c 20 61 6e 64 20 6e 53 65 65 6b 20  scan, and nSeek 
2a0e0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
2a0f0 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e 73   seek operations
2a100 20 72 65 71 75 69 72 65 64 20 6f 6e 20 0a 2a 2a   required on .**
2a110 20 74 68 65 20 69 6e 64 65 78 20 62 2d 74 72 65   the index b-tre
2a120 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f 73  e:.**.**     cos
2a130 74 20 3d 20 6e 53 65 65 6b 20 2a 20 28 6c 6f 67  t = nSeek * (log
2a140 28 6e 52 6f 77 29 20 2b 20 4b 20 2a 20 6e 56 69  (nRow) + K * nVi
2a150 73 69 74 29 20 20 20 20 20 20 20 20 20 20 2f 2f  sit)          //
2a160 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a   covering index.
2a170 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 53  **     cost = nS
2a180 65 65 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f 77 29  eek * (log(nRow)
2a190 20 2b 20 28 4b 2b 33 2e 30 29 20 2a 20 6e 56 69   + (K+3.0) * nVi
2a1a0 73 69 74 29 20 20 20 20 2f 2f 20 6e 6f 6e 2d 63  sit)    // non-c
2a1b0 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a  overing index.**
2a1c0 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 53  .** Normally, nS
2a1d0 65 65 6b 20 69 73 20 31 2e 20 6e 53 65 65 6b 20  eek is 1. nSeek 
2a1e0 76 61 6c 75 65 73 20 67 72 65 61 74 65 72 20 74  values greater t
2a1f0 68 61 6e 20 31 20 63 6f 6d 65 20 61 62 6f 75 74  han 1 come about
2a200 20 69 66 20 74 68 65 20 0a 2a 2a 20 57 48 45 52   if the .** WHER
2a210 45 20 63 6c 61 75 73 65 20 69 6e 63 6c 75 64 65  E clause include
2a220 73 20 22 78 20 49 4e 20 28 2e 2e 2e 2e 29 22 20  s "x IN (....)" 
2a230 74 65 72 6d 73 20 75 73 65 64 20 69 6e 20 70 6c  terms used in pl
2a240 61 63 65 20 6f 66 20 22 78 3d 3f 22 2e 20 4f 72  ace of "x=?". Or
2a250 20 77 68 65 6e 20 0a 2a 2a 20 69 6d 70 6c 69 63   when .** implic
2a260 69 74 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54  it "x IN (SELECT
2a270 20 78 20 46 52 4f 4d 20 74 62 6c 29 22 20 74 65   x FROM tbl)" te
2a280 72 6d 73 20 61 72 65 20 61 64 64 65 64 20 66 6f  rms are added fo
2a290 72 20 73 6b 69 70 2d 73 63 61 6e 73 2e 0a 2a 2a  r skip-scans..**
2a2a0 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d 61 74 65  .** The estimate
2a2b0 64 20 76 61 6c 75 65 73 20 28 6e 52 6f 77 2c 20  d values (nRow, 
2a2c0 6e 56 69 73 69 74 2c 20 6e 53 65 65 6b 29 20 6f  nVisit, nSeek) o
2a2d0 66 74 65 6e 20 63 6f 6e 74 61 69 6e 20 61 20 6c  ften contain a l
2a2e0 61 72 67 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f  arge amount.** o
2a2f0 66 20 75 6e 63 65 72 74 61 69 6e 74 79 2e 20 20  f uncertainty.  
2a300 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c  For this reason,
2a310 20 73 63 6f 72 69 6e 67 20 69 73 20 64 65 73 69   scoring is desi
2a320 67 6e 65 64 20 74 6f 20 70 69 63 6b 20 70 6c 61  gned to pick pla
2a330 6e 73 20 74 68 61 74 0a 2a 2a 20 22 64 6f 20 74  ns that.** "do t
2a340 68 65 20 6c 65 61 73 74 20 68 61 72 6d 22 20 69  he least harm" i
2a350 66 20 74 68 65 20 65 73 74 69 6d 61 74 65 73 20  f the estimates 
2a360 61 72 65 20 69 6e 61 63 63 75 72 61 74 65 2e 20  are inaccurate. 
2a370 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 0a   For example, a.
2a380 2a 2a 20 6c 6f 67 28 6e 52 6f 77 29 20 66 61 63  ** log(nRow) fac
2a390 74 6f 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66  tor is omitted f
2a3a0 72 6f 6d 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69  rom a non-coveri
2a3b0 6e 67 20 69 6e 64 65 78 20 73 63 61 6e 20 69 6e  ng index scan in
2a3c0 20 6f 72 64 65 72 20 74 6f 0a 2a 2a 20 62 69 61   order to.** bia
2a3d0 73 20 74 68 65 20 73 63 6f 72 69 6e 67 20 69 6e  s the scoring in
2a3e0 20 66 61 76 6f 72 20 6f 66 20 75 73 69 6e 67 20   favor of using 
2a3f0 61 6e 20 69 6e 64 65 78 2c 20 73 69 6e 63 65 20  an index, since 
2a400 74 68 65 20 77 6f 72 73 74 2d 63 61 73 65 0a 2a  the worst-case.*
2a410 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 66  * performance of
2a420 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 20   using an index 
2a430 69 73 20 66 61 72 20 62 65 74 74 65 72 20 74 68  is far better th
2a440 61 6e 20 74 68 65 20 77 6f 72 73 74 2d 63 61 73  an the worst-cas
2a450 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a  e performance.**
2a460 20 6f 66 20 61 20 66 75 6c 6c 20 74 61 62 6c 65   of a full table
2a470 20 73 63 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63   scan..*/.static
2a480 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64   int whereLoopAd
2a490 64 42 74 72 65 65 28 0a 20 20 57 68 65 72 65 4c  dBtree(.  WhereL
2a4a0 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
2a4b0 6c 64 65 72 2c 20 2f 2a 20 57 48 45 52 45 20 63  lder, /* WHERE c
2a4c0 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f  lause informatio
2a4d0 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d  n */.  Bitmask m
2a4e0 45 78 74 72 61 20 20 20 20 20 20 20 20 20 20 20  Extra           
2a4f0 20 20 20 2f 2a 20 45 78 74 72 61 20 70 72 65 72     /* Extra prer
2a500 65 71 75 65 73 69 74 65 73 20 66 6f 72 20 75 73  equesites for us
2a510 69 6e 67 20 74 68 69 73 20 74 61 62 6c 65 20 2a  ing this table *
2a520 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  /.){.  WhereInfo
2a530 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20   *pWInfo;       
2a540 20 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c     /* WHERE anal
2a550 79 73 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ysis context */.
2a560 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b    Index *pProbe;
2a570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a580 20 41 6e 20 69 6e 64 65 78 20 77 65 20 61 72 65   An index we are
2a590 20 65 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20   evaluating */. 
2a5a0 20 49 6e 64 65 78 20 73 50 6b 3b 20 20 20 20 20   Index sPk;     
2a5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a5c0 41 20 66 61 6b 65 20 69 6e 64 65 78 20 6f 62 6a  A fake index obj
2a5d0 65 63 74 20 66 6f 72 20 74 68 65 20 70 72 69 6d  ect for the prim
2a5e0 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20 4c 6f 67  ary key */.  Log
2a5f0 45 73 74 20 61 69 52 6f 77 45 73 74 50 6b 5b 32  Est aiRowEstPk[2
2a600 5d 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ];       /* The 
2a610 61 69 52 6f 77 4c 6f 67 45 73 74 5b 5d 20 76 61  aiRowLogEst[] va
2a620 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20  lue for the sPk 
2a630 69 6e 64 65 78 20 2a 2f 0a 20 20 69 31 36 20 61  index */.  i16 a
2a640 69 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31 3b 20  iColumnPk = -1; 
2a650 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 43         /* The aC
2a660 6f 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65 20 66 6f  olumn[] value fo
2a670 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20  r the sPk index 
2a680 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
2a690 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  abList;         
2a6a0 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
2a6b0 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
2a6c0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
2a6d0 72 63 3b 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  rc;  /* The FROM
2a6e0 20 63 6c 61 75 73 65 20 62 74 72 65 65 20 74 65   clause btree te
2a6f0 72 6d 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 57  rm to add */.  W
2a700 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20  hereLoop *pNew; 
2a710 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
2a720 6d 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70  mplate WhereLoop
2a730 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
2a740 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2a750 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2a760 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
2a770 20 69 53 6f 72 74 49 64 78 20 3d 20 31 3b 20 20   iSortIdx = 1;  
2a780 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
2a790 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e  x number */.  in
2a7a0 74 20 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  t b;            
2a7b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62            /* A b
2a7c0 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20 2a 2f 0a  oolean value */.
2a7d0 20 20 4c 6f 67 45 73 74 20 72 53 69 7a 65 3b 20    LogEst rSize; 
2a7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a7f0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
2a800 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  in the table */.
2a810 20 20 4c 6f 67 45 73 74 20 72 4c 6f 67 53 69 7a    LogEst rLogSiz
2a820 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
2a830 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68   Logarithm of th
2a840 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
2a850 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   in the table */
2a860 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
2a870 70 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 2f  pWC;           /
2a880 2a 20 54 68 65 20 70 61 72 73 65 64 20 57 48 45  * The parsed WHE
2a890 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54  RE clause */.  T
2a8a0 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
2a8b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
2a8c0 62 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69 65  ble being querie
2a8d0 64 20 2a 2f 0a 20 20 0a 20 20 70 4e 65 77 20 3d  d */.  .  pNew =
2a8e0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b   pBuilder->pNew;
2a8f0 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69  .  pWInfo = pBui
2a900 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20  lder->pWInfo;.  
2a910 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66  pTabList = pWInf
2a920 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 70  o->pTabList;.  p
2a930 53 72 63 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Src = pTabList->
2a940 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a  a + pNew->iTab;.
2a950 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 70    pTab = pSrc->p
2a960 54 61 62 3b 0a 20 20 70 57 43 20 3d 20 70 42 75  Tab;.  pWC = pBu
2a970 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 61 73  ilder->pWC;.  as
2a980 73 65 72 74 28 20 21 49 73 56 69 72 74 75 61 6c  sert( !IsVirtual
2a990 28 70 53 72 63 2d 3e 70 54 61 62 29 20 29 3b 0a  (pSrc->pTab) );.
2a9a0 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49 6e  .  if( pSrc->pIn
2a9b0 64 65 78 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e  dex ){.    /* An
2a9c0 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
2a9d0 73 65 20 73 70 65 63 69 66 69 65 73 20 61 20 70  se specifies a p
2a9e0 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20  articular index 
2a9f0 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 70 50  to use */.    pP
2aa00 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 49 6e  robe = pSrc->pIn
2aa10 64 65 78 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  dex;.  }else if(
2aa20 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   !HasRowid(pTab)
2aa30 20 29 7b 0a 20 20 20 20 70 50 72 6f 62 65 20 3d   ){.    pProbe =
2aa40 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20   pTab->pIndex;. 
2aa50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
2aa60 68 65 72 65 20 69 73 20 6e 6f 20 49 4e 44 45 58  here is no INDEX
2aa70 45 44 20 42 59 20 63 6c 61 75 73 65 2e 20 20 43  ED BY clause.  C
2aa80 72 65 61 74 65 20 61 20 66 61 6b 65 20 49 6e 64  reate a fake Ind
2aa90 65 78 20 6f 62 6a 65 63 74 20 69 6e 20 6c 6f 63  ex object in loc
2aaa0 61 6c 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62  al.    ** variab
2aab0 6c 65 20 73 50 6b 20 74 6f 20 72 65 70 72 65 73  le sPk to repres
2aac0 65 6e 74 20 74 68 65 20 72 6f 77 69 64 20 70 72  ent the rowid pr
2aad0 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 2e  imary key index.
2aae0 20 20 4d 61 6b 65 20 74 68 69 73 0a 20 20 20 20    Make this.    
2aaf0 2a 2a 20 66 61 6b 65 20 69 6e 64 65 78 20 74 68  ** fake index th
2ab00 65 20 66 69 72 73 74 20 69 6e 20 61 20 63 68 61  e first in a cha
2ab10 69 6e 20 6f 66 20 49 6e 64 65 78 20 6f 62 6a 65  in of Index obje
2ab20 63 74 73 20 77 69 74 68 20 61 6c 6c 20 6f 66 20  cts with all of 
2ab30 74 68 65 20 72 65 61 6c 0a 20 20 20 20 2a 2a 20  the real.    ** 
2ab40 69 6e 64 69 63 65 73 20 74 6f 20 66 6f 6c 6c 6f  indices to follo
2ab50 77 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a  w */.    Index *
2ab60 70 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  pFirst;         
2ab70 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
2ab80 74 20 6f 66 20 72 65 61 6c 20 69 6e 64 69 63 65  t of real indice
2ab90 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 2a  s on the table *
2aba0 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 50  /.    memset(&sP
2abb0 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28 49 6e 64  k, 0, sizeof(Ind
2abc0 65 78 29 29 3b 0a 20 20 20 20 73 50 6b 2e 6e 4b  ex));.    sPk.nK
2abd0 65 79 43 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 73  eyCol = 1;.    s
2abe0 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a  Pk.nColumn = 1;.
2abf0 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c 75 6d 6e      sPk.aiColumn
2ac00 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50 6b 3b 0a   = &aiColumnPk;.
2ac10 20 20 20 20 73 50 6b 2e 61 69 52 6f 77 4c 6f 67      sPk.aiRowLog
2ac20 45 73 74 20 3d 20 61 69 52 6f 77 45 73 74 50 6b  Est = aiRowEstPk
2ac30 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e 45 72 72 6f  ;.    sPk.onErro
2ac40 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b 0a  r = OE_Replace;.
2ac50 20 20 20 20 73 50 6b 2e 70 54 61 62 6c 65 20 3d      sPk.pTable =
2ac60 20 70 54 61 62 3b 0a 20 20 20 20 73 50 6b 2e 73   pTab;.    sPk.s
2ac70 7a 49 64 78 52 6f 77 20 3d 20 70 54 61 62 2d 3e  zIdxRow = pTab->
2ac80 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20 61 69  szTabRow;.    ai
2ac90 52 6f 77 45 73 74 50 6b 5b 30 5d 20 3d 20 70 54  RowEstPk[0] = pT
2aca0 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a  ab->nRowLogEst;.
2acb0 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 31      aiRowEstPk[1
2acc0 5d 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 72 73  ] = 0;.    pFirs
2acd0 74 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e  t = pSrc->pTab->
2ace0 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20  pIndex;.    if( 
2acf0 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64  pSrc->notIndexed
2ad00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
2ad10 54 68 65 20 72 65 61 6c 20 69 6e 64 69 63 65 73  The real indices
2ad20 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61 72   of the table ar
2ad30 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 65  e only considere
2ad40 64 20 69 66 20 74 68 65 0a 20 20 20 20 20 20 2a  d if the.      *
2ad50 2a 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 71 75  * NOT INDEXED qu
2ad60 61 6c 69 66 69 65 72 20 69 73 20 6f 6d 69 74 74  alifier is omitt
2ad70 65 64 20 66 72 6f 6d 20 74 68 65 20 46 52 4f 4d  ed from the FROM
2ad80 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
2ad90 20 73 50 6b 2e 70 4e 65 78 74 20 3d 20 70 46 69   sPk.pNext = pFi
2ada0 72 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  rst;.    }.    p
2adb0 50 72 6f 62 65 20 3d 20 26 73 50 6b 3b 0a 20 20  Probe = &sPk;.  
2adc0 7d 0a 20 20 72 53 69 7a 65 20 3d 20 70 54 61 62  }.  rSize = pTab
2add0 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20  ->nRowLogEst;.  
2ade0 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f  rLogSize = estLo
2adf0 67 28 72 53 69 7a 65 29 3b 0a 0a 23 69 66 6e 64  g(rSize);..#ifnd
2ae00 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2ae10 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20  UTOMATIC_INDEX. 
2ae20 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20 69 6e   /* Automatic in
2ae30 64 65 78 65 73 20 2a 2f 0a 20 20 69 66 28 20 21  dexes */.  if( !
2ae40 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74  pBuilder->pOrSet
2ae50 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e  .   && (pWInfo->
2ae60 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
2ae70 73 20 26 20 53 51 4c 49 54 45 5f 41 75 74 6f 49  s & SQLITE_AutoI
2ae80 6e 64 65 78 29 21 3d 30 0a 20 20 20 26 26 20 70  ndex)!=0.   && p
2ae90 53 72 63 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20  Src->pIndex==0. 
2aea0 20 20 26 26 20 21 70 53 72 63 2d 3e 76 69 61 43    && !pSrc->viaC
2aeb0 6f 72 6f 75 74 69 6e 65 0a 20 20 20 26 26 20 21  oroutine.   && !
2aec0 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64  pSrc->notIndexed
2aed0 0a 20 20 20 26 26 20 48 61 73 52 6f 77 69 64 28  .   && HasRowid(
2aee0 70 54 61 62 29 0a 20 20 20 26 26 20 21 70 53 72  pTab).   && !pSr
2aef0 63 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65 64 0a  c->isCorrelated.
2af00 20 20 20 26 26 20 21 70 53 72 63 2d 3e 69 73 52     && !pSrc->isR
2af10 65 63 75 72 73 69 76 65 0a 20 20 29 7b 0a 20 20  ecursive.  ){.  
2af20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 75    /* Generate au
2af30 74 6f 2d 69 6e 64 65 78 20 57 68 65 72 65 4c 6f  to-index WhereLo
2af40 6f 70 73 20 2a 2f 0a 20 20 20 20 57 68 65 72 65  ops */.    Where
2af50 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20  Term *pTerm;.   
2af60 20 57 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45   WhereTerm *pWCE
2af70 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57  nd = pWC->a + pW
2af80 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 66 6f  C->nTerm;.    fo
2af90 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  r(pTerm=pWC->a; 
2afa0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2afb0 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70   pTerm<pWCEnd; p
2afc0 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69  Term++){.      i
2afd0 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  f( pTerm->prereq
2afe0 52 69 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d 61  Right & pNew->ma
2aff0 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e 75  skSelf ) continu
2b000 65 3b 0a 20 20 20 20 20 20 69 66 28 20 74 65 72  e;.      if( ter
2b010 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70  mCanDriveIndex(p
2b020 54 65 72 6d 2c 20 70 53 72 63 2c 20 30 29 20 29  Term, pSrc, 0) )
2b030 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
2b040 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b  u.btree.nEq = 1;
2b050 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
2b060 2e 62 74 72 65 65 2e 6e 53 6b 69 70 20 3d 20 30  .btree.nSkip = 0
2b070 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
2b080 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d  u.btree.pIndex =
2b090 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   0;.        pNew
2b0a0 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20  ->nLTerm = 1;.  
2b0b0 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65        pNew->aLTe
2b0c0 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20  rm[0] = pTerm;. 
2b0d0 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47         /* TUNING
2b0e0 3a 20 4f 6e 65 2d 74 69 6d 65 20 63 6f 73 74 20  : One-time cost 
2b0f0 66 6f 72 20 63 6f 6d 70 75 74 69 6e 67 20 74 68  for computing th
2b100 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  e automatic inde
2b110 78 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  x is.        ** 
2b120 65 73 74 69 6d 61 74 65 64 20 74 6f 20 62 65 20  estimated to be 
2b130 58 2a 4e 2a 6c 6f 67 32 28 4e 29 20 77 68 65 72  X*N*log2(N) wher
2b140 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  e N is the numbe
2b150 72 20 6f 66 20 72 6f 77 73 20 69 6e 0a 20 20 20  r of rows in.   
2b160 20 20 20 20 20 2a 2a 20 74 68 65 20 74 61 62 6c       ** the tabl
2b170 65 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20  e being indexed 
2b180 61 6e 64 20 77 68 65 72 65 20 58 20 69 73 20 37  and where X is 7
2b190 20 28 4c 6f 67 45 73 74 3d 32 38 29 20 66 6f 72   (LogEst=28) for
2b1a0 20 6e 6f 72 6d 61 6c 0a 20 20 20 20 20 20 20 20   normal.        
2b1b0 2a 2a 20 74 61 62 6c 65 73 20 6f 72 20 31 2e 33  ** tables or 1.3
2b1c0 37 35 20 28 4c 6f 67 45 73 74 3d 34 29 20 66 6f  75 (LogEst=4) fo
2b1d0 72 20 76 69 65 77 73 20 61 6e 64 20 73 75 62 71  r views and subq
2b1e0 75 65 72 69 65 73 2e 20 20 54 68 65 20 76 61 6c  ueries.  The val
2b1f0 75 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  ue.        ** of
2b200 20 58 20 69 73 20 73 6d 61 6c 6c 65 72 20 66 6f   X is smaller fo
2b210 72 20 76 69 65 77 73 20 61 6e 64 20 73 75 62 71  r views and subq
2b220 75 65 72 69 65 73 20 73 6f 20 74 68 61 74 20 74  ueries so that t
2b230 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72  he query planner
2b240 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c  .        ** will
2b250 20 62 65 20 6d 6f 72 65 20 61 67 67 72 65 73 73   be more aggress
2b260 69 76 65 20 61 62 6f 75 74 20 67 65 6e 65 72 61  ive about genera
2b270 74 69 6e 67 20 61 75 74 6f 6d 61 74 69 63 20 69  ting automatic i
2b280 6e 64 65 78 65 73 20 66 6f 72 0a 20 20 20 20 20  ndexes for.     
2b290 20 20 20 2a 2a 20 74 68 6f 73 65 20 6f 62 6a 65     ** those obje
2b2a0 63 74 73 2c 20 73 69 6e 63 65 20 74 68 65 72 65  cts, since there
2b2b0 20 69 73 20 6e 6f 20 6f 70 70 6f 72 74 75 6e 69   is no opportuni
2b2c0 74 79 20 74 6f 20 61 64 64 20 73 63 68 65 6d 61  ty to add schema
2b2d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65  .        ** inde
2b2e0 78 65 73 20 6f 6e 20 73 75 62 71 75 65 72 69 65  xes on subquerie
2b2f0 73 20 61 6e 64 20 76 69 65 77 73 2e 20 2a 2f 0a  s and views. */.
2b300 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53          pNew->rS
2b310 65 74 75 70 20 3d 20 72 4c 6f 67 53 69 7a 65 20  etup = rLogSize 
2b320 2b 20 72 53 69 7a 65 20 2b 20 34 3b 0a 20 20 20  + rSize + 4;.   
2b330 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70       if( pTab->p
2b340 53 65 6c 65 63 74 3d 3d 30 20 26 26 20 28 70 54  Select==0 && (pT
2b350 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
2b360 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30 20  F_Ephemeral)==0 
2b370 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  ){.          pNe
2b380 77 2d 3e 72 53 65 74 75 70 20 2b 3d 20 32 34 3b  w->rSetup += 24;
2b390 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2b3a0 20 20 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74     ApplyCostMult
2b3b0 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72 53 65  iplier(pNew->rSe
2b3c0 74 75 70 2c 20 70 54 61 62 2d 3e 63 6f 73 74 4d  tup, pTab->costM
2b3d0 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  ult);.        /*
2b3e0 20 54 55 4e 49 4e 47 3a 20 45 61 63 68 20 69 6e   TUNING: Each in
2b3f0 64 65 78 20 6c 6f 6f 6b 75 70 20 79 69 65 6c 64  dex lookup yield
2b400 73 20 32 30 20 72 6f 77 73 20 69 6e 20 74 68 65  s 20 rows in the
2b410 20 74 61 62 6c 65 2e 20 20 54 68 69 73 0a 20 20   table.  This.  
2b420 20 20 20 20 20 20 2a 2a 20 69 73 20 6d 6f 72 65        ** is more
2b430 20 74 68 61 6e 20 74 68 65 20 75 73 75 61 6c 20   than the usual 
2b440 67 75 65 73 73 20 6f 66 20 31 30 20 72 6f 77 73  guess of 10 rows
2b450 2c 20 73 69 6e 63 65 20 77 65 20 68 61 76 65 20  , since we have 
2b460 6e 6f 20 77 61 79 0a 20 20 20 20 20 20 20 20 2a  no way.        *
2b470 2a 20 6f 66 20 6b 6e 6f 77 69 6e 67 20 68 6f 77  * of knowing how
2b480 20 73 65 6c 65 63 74 69 76 65 20 74 68 65 20 69   selective the i
2b490 6e 64 65 78 20 77 69 6c 6c 20 75 6c 74 69 6d 61  ndex will ultima
2b4a0 74 65 6c 79 20 62 65 2e 20 20 49 74 20 77 6f 75  tely be.  It wou
2b4b0 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f  ld.        ** no
2b4c0 74 20 62 65 20 75 6e 72 65 61 73 6f 6e 61 62 6c  t be unreasonabl
2b4d0 65 20 74 6f 20 6d 61 6b 65 20 74 68 69 73 20 76  e to make this v
2b4e0 61 6c 75 65 20 6d 75 63 68 20 6c 61 72 67 65 72  alue much larger
2b4f0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65  . */.        pNe
2b500 77 2d 3e 6e 4f 75 74 20 3d 20 34 33 3b 20 20 61  w->nOut = 43;  a
2b510 73 73 65 72 74 28 20 34 33 3d 3d 73 71 6c 69 74  ssert( 43==sqlit
2b520 65 33 4c 6f 67 45 73 74 28 32 30 29 20 29 3b 0a  e3LogEst(20) );.
2b530 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52          pNew->rR
2b540 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  un = sqlite3LogE
2b550 73 74 41 64 64 28 72 4c 6f 67 53 69 7a 65 2c 70  stAdd(rLogSize,p
2b560 4e 65 77 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20 20  New->nOut);.    
2b570 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
2b580 73 20 3d 20 57 48 45 52 45 5f 41 55 54 4f 5f 49  s = WHERE_AUTO_I
2b590 4e 44 45 58 3b 0a 20 20 20 20 20 20 20 20 70 4e  NDEX;.        pN
2b5a0 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45 78  ew->prereq = mEx
2b5b0 74 72 61 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65  tra | pTerm->pre
2b5c0 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20  reqRight;.      
2b5d0 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
2b5e0 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
2b5f0 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a   pNew);.      }.
2b600 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
2b610 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
2b620 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20  AUTOMATIC_INDEX 
2b630 2a 2f 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76  */..  /* Loop ov
2b640 65 72 20 61 6c 6c 20 69 6e 64 69 63 65 73 0a 20  er all indices. 
2b650 20 2a 2f 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d   */.  for(; rc==
2b660 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 72  SQLITE_OK && pPr
2b670 6f 62 65 3b 20 70 50 72 6f 62 65 3d 70 50 72 6f  obe; pProbe=pPro
2b680 62 65 2d 3e 70 4e 65 78 74 2c 20 69 53 6f 72 74  be->pNext, iSort
2b690 49 64 78 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  Idx++){.    if( 
2b6a0 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49 64 78  pProbe->pPartIdx
2b6b0 57 68 65 72 65 21 3d 30 0a 20 20 20 20 20 26 26  Where!=0.     &&
2b6c0 20 21 77 68 65 72 65 55 73 61 62 6c 65 50 61 72   !whereUsablePar
2b6d0 74 69 61 6c 49 6e 64 65 78 28 70 53 72 63 2d 3e  tialIndex(pSrc->
2b6e0 69 43 75 72 73 6f 72 2c 20 70 57 43 2c 20 70 50  iCursor, pWC, pP
2b6f0 72 6f 62 65 2d 3e 70 50 61 72 74 49 64 78 57 68  robe->pPartIdxWh
2b700 65 72 65 29 20 29 7b 0a 20 20 20 20 20 20 74 65  ere) ){.      te
2b710 73 74 63 61 73 65 28 20 70 4e 65 77 2d 3e 69 54  stcase( pNew->iT
2b720 61 62 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f  ab!=pSrc->iCurso
2b730 72 20 29 3b 20 20 2f 2a 20 53 65 65 20 74 69 63  r );  /* See tic
2b740 6b 65 74 20 5b 39 38 64 39 37 33 62 38 66 35 5d  ket [98d973b8f5]
2b750 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   */.      contin
2b760 75 65 3b 20 20 2f 2a 20 50 61 72 74 69 61 6c 20  ue;  /* Partial 
2b770 69 6e 64 65 78 20 69 6e 61 70 70 72 6f 70 72 69  index inappropri
2b780 61 74 65 20 66 6f 72 20 74 68 69 73 20 71 75 65  ate for this que
2b790 72 79 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  ry */.    }.    
2b7a0 72 53 69 7a 65 20 3d 20 70 50 72 6f 62 65 2d 3e  rSize = pProbe->
2b7b0 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a  aiRowLogEst[0];.
2b7c0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
2b7d0 65 2e 6e 45 71 20 3d 20 30 3b 0a 20 20 20 20 70  e.nEq = 0;.    p
2b7e0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 53 6b  New->u.btree.nSk
2b7f0 69 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  ip = 0;.    pNew
2b800 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20  ->nLTerm = 0;.  
2b810 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78    pNew->iSortIdx
2b820 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
2b830 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20  rSetup = 0;.    
2b840 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d  pNew->prereq = m
2b850 45 78 74 72 61 3b 0a 20 20 20 20 70 4e 65 77 2d  Extra;.    pNew-
2b860 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20  >nOut = rSize;. 
2b870 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
2b880 2e 70 49 6e 64 65 78 20 3d 20 70 50 72 6f 62 65  .pIndex = pProbe
2b890 3b 0a 20 20 20 20 62 20 3d 20 69 6e 64 65 78 4d  ;.    b = indexM
2b8a0 69 67 68 74 48 65 6c 70 57 69 74 68 4f 72 64 65  ightHelpWithOrde
2b8b0 72 42 79 28 70 42 75 69 6c 64 65 72 2c 20 70 50  rBy(pBuilder, pP
2b8c0 72 6f 62 65 2c 20 70 53 72 63 2d 3e 69 43 75 72  robe, pSrc->iCur
2b8d0 73 6f 72 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65  sor);.    /* The
2b8e0 20 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44   ONEPASS_DESIRED
2b8f0 20 66 6c 61 67 73 20 6e 65 76 65 72 20 6f 63 63   flags never occ
2b900 75 72 73 20 74 6f 67 65 74 68 65 72 20 77 69 74  urs together wit
2b910 68 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20  h ORDER BY */.  
2b920 20 20 61 73 73 65 72 74 28 20 28 70 57 49 6e 66    assert( (pWInf
2b930 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
2b940 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
2b950 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 62 3d 3d  SIRED)==0 || b==
2b960 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 72  0 );.    if( pPr
2b970 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20 29 7b 0a  obe->tnum<=0 ){.
2b980 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72        /* Integer
2b990 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64   primary key ind
2b9a0 65 78 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77  ex */.      pNew
2b9b0 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
2b9c0 45 5f 49 50 4b 3b 0a 0a 20 20 20 20 20 20 2f 2a  E_IPK;..      /*
2b9d0 20 46 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e   Full table scan
2b9e0 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   */.      pNew->
2b9f0 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f 20 69  iSortIdx = b ? i
2ba00 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 20 20 20  SortIdx : 0;.   
2ba10 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f     /* TUNING: Co
2ba20 73 74 20 6f 66 20 66 75 6c 6c 20 74 61 62 6c 65  st of full table
2ba30 20 73 63 61 6e 20 69 73 20 28 4e 2a 33 2e 30 29   scan is (N*3.0)
2ba40 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d  . */.      pNew-
2ba50 3e 72 52 75 6e 20 3d 20 72 53 69 7a 65 20 2b 20  >rRun = rSize + 
2ba60 31 36 3b 0a 20 20 20 20 20 20 41 70 70 6c 79 43  16;.      ApplyC
2ba70 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e  ostMultiplier(pN
2ba80 65 77 2d 3e 72 52 75 6e 2c 20 70 54 61 62 2d 3e  ew->rRun, pTab->
2ba90 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20 20 20  costMult);.     
2baa0 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74   whereLoopOutput
2bab0 41 64 6a 75 73 74 28 70 57 43 2c 20 70 4e 65 77  Adjust(pWC, pNew
2bac0 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  , rSize);.      
2bad0 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e  rc = whereLoopIn
2bae0 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70  sert(pBuilder, p
2baf0 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  New);.      pNew
2bb00 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a  ->nOut = rSize;.
2bb10 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 62        if( rc ) b
2bb20 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  reak;.    }else{
2bb30 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  .      Bitmask m
2bb40 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 6f  ;.      if( pPro
2bb50 62 65 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 29  be->isCovering )
2bb60 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
2bb70 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  wsFlags = WHERE_
2bb80 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45 52 45  IDX_ONLY | WHERE
2bb90 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20 20 20  _INDEXED;.      
2bba0 20 20 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d    m = 0;.      }
2bbb0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 20  else{.        m 
2bbc0 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20  = pSrc->colUsed 
2bbd0 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65  & ~columnsInInde
2bbe0 78 28 70 50 72 6f 62 65 29 3b 0a 20 20 20 20 20  x(pProbe);.     
2bbf0 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
2bc00 20 3d 20 28 6d 3d 3d 30 29 20 3f 20 28 57 48 45   = (m==0) ? (WHE
2bc10 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52  RE_IDX_ONLY|WHER
2bc20 45 5f 49 4e 44 45 58 45 44 29 20 3a 20 57 48 45  E_INDEXED) : WHE
2bc30 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20  RE_INDEXED;.    
2bc40 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 75    }..      /* Fu
2bc50 6c 6c 20 73 63 61 6e 20 76 69 61 20 69 6e 64 65  ll scan via inde
2bc60 78 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62  x */.      if( b
2bc70 0a 20 20 20 20 20 20 20 7c 7c 20 21 48 61 73 52  .       || !HasR
2bc80 6f 77 69 64 28 70 54 61 62 29 0a 20 20 20 20 20  owid(pTab).     
2bc90 20 20 7c 7c 20 28 20 6d 3d 3d 30 0a 20 20 20 20    || ( m==0.    
2bca0 20 20 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e       && pProbe->
2bcb0 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30 0a 20 20  bUnordered==0.  
2bcc0 20 20 20 20 20 20 20 26 26 20 28 70 50 72 6f 62         && (pProb
2bcd0 65 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 54 61 62  e->szIdxRow<pTab
2bce0 2d 3e 73 7a 54 61 62 52 6f 77 29 0a 20 20 20 20  ->szTabRow).    
2bcf0 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d       && (pWInfo-
2bd00 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
2bd10 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49  ERE_ONEPASS_DESI
2bd20 52 45 44 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  RED)==0.        
2bd30 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   && sqlite3Globa
2bd40 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43 69 73 0a  lConfig.bUseCis.
2bd50 20 20 20 20 20 20 20 20 20 26 26 20 4f 70 74 69           && Opti
2bd60 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
2bd70 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e  pWInfo->pParse->
2bd80 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f 76 65 72  db, SQLITE_Cover
2bd90 49 64 78 53 63 61 6e 29 0a 20 20 20 20 20 20 20  IdxScan).       
2bda0 20 20 20 29 0a 20 20 20 20 20 20 29 7b 0a 20 20     ).      ){.  
2bdb0 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72        pNew->iSor
2bdc0 74 49 64 78 20 3d 20 62 20 3f 20 69 53 6f 72 74  tIdx = b ? iSort
2bdd0 49 64 78 20 3a 20 30 3b 0a 0a 20 20 20 20 20 20  Idx : 0;..      
2bde0 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 6f 66    /* The cost of
2bdf0 20 76 69 73 69 74 69 6e 67 20 74 68 65 20 69 6e   visiting the in
2be00 64 65 78 20 72 6f 77 73 20 69 73 20 4e 2a 4b 2c  dex rows is N*K,
2be10 20 77 68 65 72 65 20 4b 20 69 73 0a 20 20 20 20   where K is.    
2be20 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 31      ** between 1
2be30 2e 31 20 61 6e 64 20 33 2e 30 2c 20 64 65 70 65  .1 and 3.0, depe
2be40 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 72 65 6c  nding on the rel
2be50 61 74 69 76 65 20 73 69 7a 65 73 20 6f 66 20 74  ative sizes of t
2be60 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  he.        ** in
2be70 64 65 78 20 61 6e 64 20 74 61 62 6c 65 20 72 6f  dex and table ro
2be80 77 73 2e 20 49 66 20 74 68 69 73 20 69 73 20 61  ws. If this is a
2be90 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e   non-covering in
2bea0 64 65 78 20 73 63 61 6e 2c 0a 20 20 20 20 20 20  dex scan,.      
2beb0 20 20 2a 2a 20 61 6c 73 6f 20 61 64 64 20 74 68    ** also add th
2bec0 65 20 63 6f 73 74 20 6f 66 20 76 69 73 69 74 69  e cost of visiti
2bed0 6e 67 20 74 61 62 6c 65 20 72 6f 77 73 20 28 4e  ng table rows (N
2bee0 2a 33 2e 30 29 2e 20 20 2a 2f 0a 20 20 20 20 20  *3.0).  */.     
2bef0 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
2bf00 72 53 69 7a 65 20 2b 20 31 20 2b 20 28 31 35 2a  rSize + 1 + (15*
2bf10 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77  pProbe->szIdxRow
2bf20 29 2f 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77  )/pTab->szTabRow
2bf30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 21  ;.        if( m!
2bf40 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2bf50 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c  pNew->rRun = sql
2bf60 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70 4e  ite3LogEstAdd(pN
2bf70 65 77 2d 3e 72 52 75 6e 2c 20 72 53 69 7a 65 2b  ew->rRun, rSize+
2bf80 31 36 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  16);.        }. 
2bf90 20 20 20 20 20 20 20 41 70 70 6c 79 43 6f 73 74         ApplyCost
2bfa0 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e 65 77 2d  Multiplier(pNew-
2bfb0 3e 72 52 75 6e 2c 20 70 54 61 62 2d 3e 63 6f 73  >rRun, pTab->cos
2bfc0 74 4d 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20  tMult);.        
2bfd0 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41  whereLoopOutputA
2bfe0 64 6a 75 73 74 28 70 57 43 2c 20 70 4e 65 77 2c  djust(pWC, pNew,
2bff0 20 72 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20   rSize);.       
2c000 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49   rc = whereLoopI
2c010 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
2c020 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70  pNew);.        p
2c030 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a  New->nOut = rSiz
2c040 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  e;.        if( r
2c050 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  c ) break;.     
2c060 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63   }.    }..    rc
2c070 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42   = whereLoopAddB
2c080 74 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64  treeIndex(pBuild
2c090 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65  er, pSrc, pProbe
2c0a0 2c 20 30 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  , 0);.#ifdef SQL
2c0b0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
2c0c0 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 73 71  _OR_STAT4.    sq
2c0d0 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 46  lite3Stat4ProbeF
2c0e0 72 65 65 28 70 42 75 69 6c 64 65 72 2d 3e 70 52  ree(pBuilder->pR
2c0f0 65 63 29 3b 0a 20 20 20 20 70 42 75 69 6c 64 65  ec);.    pBuilde
2c100 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 30  r->nRecValid = 0
2c110 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e  ;.    pBuilder->
2c120 70 52 65 63 20 3d 20 30 3b 0a 23 65 6e 64 69 66  pRec = 0;.#endif
2c130 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
2c140 65 20 77 61 73 20 61 6e 20 49 4e 44 45 58 45 44  e was an INDEXED
2c150 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
2c160 20 6f 6e 6c 79 20 74 68 61 74 20 6f 6e 65 20 69   only that one i
2c170 6e 64 65 78 20 69 73 0a 20 20 20 20 2a 2a 20 63  ndex is.    ** c
2c180 6f 6e 73 69 64 65 72 65 64 2e 20 2a 2f 0a 20 20  onsidered. */.  
2c190 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49 6e 64    if( pSrc->pInd
2c1a0 65 78 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  ex ) break;.  }.
2c1b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2c1c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2c1d0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
2c1e0 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57  ./*.** Add all W
2c1f0 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
2c200 20 66 6f 72 20 61 20 74 61 62 6c 65 20 6f 66 20   for a table of 
2c210 74 68 65 20 6a 6f 69 6e 20 69 64 65 6e 74 69 66  the join identif
2c220 69 65 64 20 62 79 0a 2a 2a 20 70 42 75 69 6c 64  ied by.** pBuild
2c230 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20  er->pNew->iTab. 
2c240 20 54 68 61 74 20 74 61 62 6c 65 20 69 73 20 67   That table is g
2c250 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
2c260 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
2c270 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
2c280 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75  hereLoopAddVirtu
2c290 61 6c 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42  al(.  WhereLoopB
2c2a0 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
2c2b0 2c 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75  ,  /* WHERE clau
2c2c0 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  se information *
2c2d0 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45 78 74  /.  Bitmask mExt
2c2e0 72 61 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66  ra.){.  WhereInf
2c2f0 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20  o *pWInfo;      
2c300 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 61 6e       /* WHERE an
2c310 61 6c 79 73 69 73 20 63 6f 6e 74 65 78 74 20 2a  alysis context *
2c320 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  /.  Parse *pPars
2c330 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2c340 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
2c350 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
2c360 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20  reClause *pWC;  
2c370 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2c380 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
2c390 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
2c3a0 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20 20 20  t_item *pSrc;   
2c3b0 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
2c3c0 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63  se term to searc
2c3d0 68 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  h */.  Table *pT
2c3e0 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ab;.  sqlite3 *d
2c3f0 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64  b;.  sqlite3_ind
2c400 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66  ex_info *pIdxInf
2c410 6f 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  o;.  struct sqli
2c420 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
2c430 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a  aint *pIdxCons;.
2c440 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33    struct sqlite3
2c450 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
2c460 74 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b  t_usage *pUsage;
2c470 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
2c480 65 72 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  erm;.  int i, j;
2c490 0a 20 20 69 6e 74 20 69 54 65 72 6d 2c 20 6d 78  .  int iTerm, mx
2c4a0 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 43 6f 6e  Term;.  int nCon
2c4b0 73 74 72 61 69 6e 74 3b 0a 20 20 69 6e 74 20 73  straint;.  int s
2c4c0 65 65 6e 49 6e 20 3d 20 30 3b 20 20 20 20 20 20  eenIn = 0;      
2c4d0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2c4e0 69 66 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f  if an IN operato
2c4f0 72 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69  r is seen */.  i
2c500 6e 74 20 73 65 65 6e 56 61 72 20 3d 20 30 3b 20  nt seenVar = 0; 
2c510 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2c520 72 75 65 20 69 66 20 61 20 6e 6f 6e 2d 63 6f 6e  rue if a non-con
2c530 73 74 61 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74  stant constraint
2c540 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e   is seen */.  in
2c550 74 20 69 50 68 61 73 65 3b 20 20 20 20 20 20 20  t iPhase;       
2c560 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 3a             /* 0:
2c570 20 63 6f 6e 73 74 20 77 2f 6f 20 49 4e 2c 20 31   const w/o IN, 1
2c580 3a 20 63 6f 6e 73 74 2c 20 32 3a 20 6e 6f 20 49  : const, 2: no I
2c590 4e 2c 20 20 32 3a 20 49 4e 20 2a 2f 0a 20 20 57  N,  2: IN */.  W
2c5a0 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a  hereLoop *pNew;.
2c5b0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2c5c0 45 5f 4f 4b 3b 0a 0a 20 20 70 57 49 6e 66 6f 20  E_OK;..  pWInfo 
2c5d0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
2c5e0 66 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70  fo;.  pParse = p
2c5f0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20  WInfo->pParse;. 
2c600 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
2c610 3b 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64  ;.  pWC = pBuild
2c620 65 72 2d 3e 70 57 43 3b 0a 20 20 70 4e 65 77 20  er->pWC;.  pNew 
2c630 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
2c640 3b 0a 20 20 70 53 72 63 20 3d 20 26 70 57 49 6e  ;.  pSrc = &pWIn
2c650 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b  fo->pTabList->a[
2c660 70 4e 65 77 2d 3e 69 54 61 62 5d 3b 0a 20 20 70  pNew->iTab];.  p
2c670 54 61 62 20 3d 20 70 53 72 63 2d 3e 70 54 61 62  Tab = pSrc->pTab
2c680 3b 0a 20 20 61 73 73 65 72 74 28 20 49 73 56 69  ;.  assert( IsVi
2c690 72 74 75 61 6c 28 70 54 61 62 29 20 29 3b 0a 20  rtual(pTab) );. 
2c6a0 20 70 49 64 78 49 6e 66 6f 20 3d 20 61 6c 6c 6f   pIdxInfo = allo
2c6b0 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 70 50  cateIndexInfo(pP
2c6c0 61 72 73 65 2c 20 70 57 43 2c 20 70 53 72 63 2c  arse, pWC, pSrc,
2c6d0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 64 65   pBuilder->pOrde
2c6e0 72 42 79 29 3b 0a 20 20 69 66 28 20 70 49 64 78  rBy);.  if( pIdx
2c6f0 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e  Info==0 ) return
2c700 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2c710 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20   pNew->prereq = 
2c720 30 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74 75  0;.  pNew->rSetu
2c730 70 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 77  p = 0;.  pNew->w
2c740 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 56  sFlags = WHERE_V
2c750 49 52 54 55 41 4c 54 41 42 4c 45 3b 0a 20 20 70  IRTUALTABLE;.  p
2c760 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b  New->nLTerm = 0;
2c770 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e  .  pNew->u.vtab.
2c780 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20  needFree = 0;.  
2c790 70 55 73 61 67 65 20 3d 20 70 49 64 78 49 6e 66  pUsage = pIdxInf
2c7a0 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
2c7b0 61 67 65 3b 0a 20 20 6e 43 6f 6e 73 74 72 61 69  age;.  nConstrai
2c7c0 6e 74 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e  nt = pIdxInfo->n
2c7d0 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69 66  Constraint;.  if
2c7e0 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a  ( whereLoopResiz
2c7f0 65 28 64 62 2c 20 70 4e 65 77 2c 20 6e 43 6f 6e  e(db, pNew, nCon
2c800 73 74 72 61 69 6e 74 29 20 29 7b 0a 20 20 20 20  straint) ){.    
2c810 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
2c820 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 20  , pIdxInfo);.   
2c830 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2c840 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72  OMEM;.  }..  for
2c850 28 69 50 68 61 73 65 3d 30 3b 20 69 50 68 61 73  (iPhase=0; iPhas
2c860 65 3c 3d 33 3b 20 69 50 68 61 73 65 2b 2b 29 7b  e<=3; iPhase++){
2c870 0a 20 20 20 20 69 66 28 20 21 73 65 65 6e 49 6e  .    if( !seenIn
2c880 20 26 26 20 28 69 50 68 61 73 65 26 31 29 21 3d   && (iPhase&1)!=
2c890 30 20 29 7b 0a 20 20 20 20 20 20 69 50 68 61 73  0 ){.      iPhas
2c8a0 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69  e++;.      if( i
2c8b0 50 68 61 73 65 3e 33 20 29 20 62 72 65 61 6b 3b  Phase>3 ) break;
2c8c0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
2c8d0 73 65 65 6e 56 61 72 20 26 26 20 69 50 68 61 73  seenVar && iPhas
2c8e0 65 3e 31 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  e>1 ) break;.   
2c8f0 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74   pIdxCons = *(st
2c900 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
2c910 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29  ex_constraint**)
2c920 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73  &pIdxInfo->aCons
2c930 74 72 61 69 6e 74 3b 0a 20 20 20 20 66 6f 72 28  traint;.    for(
2c940 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d  i=0; i<pIdxInfo-
2c950 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  >nConstraint; i+
2c960 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a  +, pIdxCons++){.
2c970 20 20 20 20 20 20 6a 20 3d 20 70 49 64 78 43 6f        j = pIdxCo
2c980 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b  ns->iTermOffset;
2c990 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26  .      pTerm = &
2c9a0 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20  pWC->a[j];.     
2c9b0 20 73 77 69 74 63 68 28 20 69 50 68 61 73 65 20   switch( iPhase 
2c9c0 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  ){.        case 
2c9d0 30 3a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 61 6e  0:    /* Constan
2c9e0 74 73 20 77 69 74 68 6f 75 74 20 49 4e 20 6f 70  ts without IN op
2c9f0 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  erator */.      
2ca00 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73      pIdxCons->us
2ca10 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  able = 0;.      
2ca20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
2ca30 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
2ca40 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  N)!=0 ){.       
2ca50 20 20 20 20 20 73 65 65 6e 49 6e 20 3d 20 31 3b       seenIn = 1;
2ca60 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2ca70 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d         if( pTerm
2ca80 2d 3e 70 72 65 72 65 71 52 69 67 68 74 21 3d 30  ->prereqRight!=0
2ca90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2caa0 73 65 65 6e 56 61 72 20 3d 20 31 3b 0a 20 20 20  seenVar = 1;.   
2cab0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
2cac0 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
2cad0 6f 72 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 29  or & WO_IN)==0 )
2cae0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  {.            pI
2caf0 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d  dxCons->usable =
2cb00 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
2cb10 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2cb20 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 31 3a  .        case 1:
2cb30 20 20 20 20 2f 2a 20 43 6f 6e 73 74 61 6e 74 73      /* Constants
2cb40 20 77 69 74 68 20 49 4e 20 6f 70 65 72 61 74 6f   with IN operato
2cb50 72 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  rs */.          
2cb60 61 73 73 65 72 74 28 20 73 65 65 6e 49 6e 20 29  assert( seenIn )
2cb70 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78  ;.          pIdx
2cb80 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28  Cons->usable = (
2cb90 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
2cba0 68 74 3d 3d 30 29 3b 0a 20 20 20 20 20 20 20 20  ht==0);.        
2cbb0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2cbc0 20 63 61 73 65 20 32 3a 20 20 20 20 2f 2a 20 56   case 2:    /* V
2cbd0 61 72 69 61 62 6c 65 73 20 77 69 74 68 6f 75 74  ariables without
2cbe0 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20   IN */.         
2cbf0 20 61 73 73 65 72 74 28 20 73 65 65 6e 56 61 72   assert( seenVar
2cc00 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49   );.          pI
2cc10 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d  dxCons->usable =
2cc20 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
2cc30 6f 72 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 3b 0a  or & WO_IN)==0;.
2cc40 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2cc50 0a 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74  .        default
2cc60 3a 20 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 73  :   /* Variables
2cc70 20 77 69 74 68 20 49 4e 20 2a 2f 0a 20 20 20 20   with IN */.    
2cc80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 65        assert( se
2cc90 65 6e 56 61 72 20 26 26 20 73 65 65 6e 49 6e 20  enVar && seenIn 
2cca0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 64  );.          pId
2ccb0 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20  xCons->usable = 
2ccc0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  1;.          bre
2ccd0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
2cce0 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 55 73  }.    memset(pUs
2ccf0 61 67 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  age, 0, sizeof(p
2cd00 55 73 61 67 65 5b 30 5d 29 2a 70 49 64 78 49 6e  Usage[0])*pIdxIn
2cd10 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 29  fo->nConstraint)
2cd20 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 49 6e  ;.    if( pIdxIn
2cd30 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
2cd40 78 53 74 72 20 29 20 73 71 6c 69 74 65 33 5f 66  xStr ) sqlite3_f
2cd50 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64  ree(pIdxInfo->id
2cd60 78 53 74 72 29 3b 0a 20 20 20 20 70 49 64 78 49  xStr);.    pIdxI
2cd70 6e 66 6f 2d 3e 69 64 78 53 74 72 20 3d 20 30 3b  nfo->idxStr = 0;
2cd80 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69  .    pIdxInfo->i
2cd90 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 70  dxNum = 0;.    p
2cda0 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46  IdxInfo->needToF
2cdb0 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20  reeIdxStr = 0;. 
2cdc0 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64     pIdxInfo->ord
2cdd0 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30  erByConsumed = 0
2cde0 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  ;.    pIdxInfo->
2cdf0 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20  estimatedCost = 
2ce00 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 2f  SQLITE_BIG_DBL /
2ce10 20 28 64 6f 75 62 6c 65 29 32 3b 0a 20 20 20 20   (double)2;.    
2ce20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61  pIdxInfo->estima
2ce30 74 65 64 52 6f 77 73 20 3d 20 32 35 3b 0a 20 20  tedRows = 25;.  
2ce40 20 20 72 63 20 3d 20 76 74 61 62 42 65 73 74 49    rc = vtabBestI
2ce50 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 54 61  ndex(pParse, pTa
2ce60 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20  b, pIdxInfo);.  
2ce70 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2ce80 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61 62  whereLoopAddVtab
2ce90 5f 65 78 69 74 3b 0a 20 20 20 20 70 49 64 78 43  _exit;.    pIdxC
2cea0 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73  ons = *(struct s
2ceb0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
2cec0 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49  straint**)&pIdxI
2ced0 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
2cee0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72  ;.    pNew->prer
2cef0 65 71 20 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20  eq = mExtra;.   
2cf00 20 6d 78 54 65 72 6d 20 3d 20 2d 31 3b 0a 20 20   mxTerm = -1;.  
2cf10 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
2cf20 6e 4c 53 6c 6f 74 3e 3d 6e 43 6f 6e 73 74 72 61  nLSlot>=nConstra
2cf30 69 6e 74 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  int );.    for(i
2cf40 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e  =0; i<nConstrain
2cf50 74 3b 20 69 2b 2b 29 20 70 4e 65 77 2d 3e 61 4c  t; i++) pNew->aL
2cf60 54 65 72 6d 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  Term[i] = 0;.   
2cf70 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d   pNew->u.vtab.om
2cf80 69 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20  itMask = 0;.    
2cf90 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73  for(i=0; i<nCons
2cfa0 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64  traint; i++, pId
2cfb0 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 20 20  xCons++){.      
2cfc0 69 66 28 20 28 69 54 65 72 6d 20 3d 20 70 55 73  if( (iTerm = pUs
2cfd0 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78  age[i].argvIndex
2cfe0 20 2d 20 31 29 3e 3d 30 20 29 7b 0a 20 20 20 20   - 1)>=0 ){.    
2cff0 20 20 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73      j = pIdxCons
2d000 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20  ->iTermOffset;. 
2d010 20 20 20 20 20 20 20 69 66 28 20 69 54 65 72 6d         if( iTerm
2d020 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 0a 20 20  >=nConstraint.  
2d030 20 20 20 20 20 20 20 7c 7c 20 6a 3c 30 0a 20 20         || j<0.  
2d040 20 20 20 20 20 20 20 7c 7c 20 6a 3e 3d 70 57 43         || j>=pWC
2d050 2d 3e 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 20  ->nTerm.        
2d060 20 7c 7c 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d   || pNew->aLTerm
2d070 5b 69 54 65 72 6d 5d 21 3d 30 0a 20 20 20 20 20  [iTerm]!=0.     
2d080 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
2d090 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
2d0a0 52 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  R;.          sql
2d0b0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
2d0c0 72 73 65 2c 20 22 25 73 2e 78 42 65 73 74 49 6e  rse, "%s.xBestIn
2d0d0 64 65 78 28 29 20 6d 61 6c 66 75 6e 63 74 69 6f  dex() malfunctio
2d0e0 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  n", pTab->zName)
2d0f0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
2d100 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 74 61   whereLoopAddVta
2d110 62 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20  b_exit;.        
2d120 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  }.        testca
2d130 73 65 28 20 69 54 65 72 6d 3d 3d 6e 43 6f 6e 73  se( iTerm==nCons
2d140 74 72 61 69 6e 74 2d 31 20 29 3b 0a 20 20 20 20  traint-1 );.    
2d150 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d      testcase( j=
2d160 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  =0 );.        te
2d170 73 74 63 61 73 65 28 20 6a 3d 3d 70 57 43 2d 3e  stcase( j==pWC->
2d180 6e 54 65 72 6d 2d 31 20 29 3b 0a 20 20 20 20 20  nTerm-1 );.     
2d190 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
2d1a0 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70  >a[j];.        p
2d1b0 4e 65 77 2d 3e 70 72 65 72 65 71 20 7c 3d 20 70  New->prereq |= p
2d1c0 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
2d1d0 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t;.        asser
2d1e0 74 28 20 69 54 65 72 6d 3c 70 4e 65 77 2d 3e 6e  t( iTerm<pNew->n
2d1f0 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20 20 20  LSlot );.       
2d200 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 54   pNew->aLTerm[iT
2d210 65 72 6d 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  erm] = pTerm;.  
2d220 20 20 20 20 20 20 69 66 28 20 69 54 65 72 6d 3e        if( iTerm>
2d230 6d 78 54 65 72 6d 20 29 20 6d 78 54 65 72 6d 20  mxTerm ) mxTerm 
2d240 3d 20 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  = iTerm;.       
2d250 20 74 65 73 74 63 61 73 65 28 20 69 54 65 72 6d   testcase( iTerm
2d260 3d 3d 31 35 20 29 3b 0a 20 20 20 20 20 20 20 20  ==15 );.        
2d270 74 65 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d  testcase( iTerm=
2d280 3d 31 36 20 29 3b 0a 20 20 20 20 20 20 20 20 69  =16 );.        i
2d290 66 28 20 69 54 65 72 6d 3c 31 36 20 26 26 20 70  f( iTerm<16 && p
2d2a0 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 20 29 20  Usage[i].omit ) 
2d2b0 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69  pNew->u.vtab.omi
2d2c0 74 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 54 65 72  tMask |= 1<<iTer
2d2d0 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  m;.        if( (
2d2e0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
2d2f0 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a   & WO_IN)!=0 ){.
2d300 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 55            if( pU
2d310 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 3d 3d 30 20  sage[i].omit==0 
2d320 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
2d330 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74  * Do not attempt
2d340 20 74 6f 20 75 73 65 20 61 6e 20 49 4e 20 63 6f   to use an IN co
2d350 6e 73 74 72 61 69 6e 74 20 69 66 20 74 68 65 20  nstraint if the 
2d360 76 69 72 74 75 61 6c 20 74 61 62 6c 65 0a 20 20  virtual table.  
2d370 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61 79            ** say
2d380 73 20 74 68 61 74 20 74 68 65 20 65 71 75 69 76  s that the equiv
2d390 61 6c 65 6e 74 20 45 51 20 63 6f 6e 73 74 72 61  alent EQ constra
2d3a0 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 73 61  int cannot be sa
2d3b0 66 65 6c 79 20 6f 6d 69 74 74 65 64 2e 0a 20 20  fely omitted..  
2d3c0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20            ** If 
2d3d0 77 65 20 64 6f 20 61 74 74 65 6d 70 74 20 74 6f  we do attempt to
2d3e0 20 75 73 65 20 73 75 63 68 20 61 20 63 6f 6e 73   use such a cons
2d3f0 74 72 61 69 6e 74 2c 20 73 6f 6d 65 20 72 6f 77  traint, some row
2d400 73 20 6d 69 67 68 74 20 62 65 0a 20 20 20 20 20  s might be.     
2d410 20 20 20 20 20 20 20 2a 2a 20 72 65 70 65 61 74         ** repeat
2d420 65 64 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74  ed in the output
2d430 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
2d440 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2d450 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2f 2a    }.          /*
2d460 20 41 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   A virtual table
2d470 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74 72 61   that is constra
2d480 69 6e 65 64 20 62 79 20 61 6e 20 49 4e 20 63 6c  ined by an IN cl
2d490 61 75 73 65 20 6d 61 79 20 6e 6f 74 0a 20 20 20  ause may not.   
2d4a0 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 75 6d         ** consum
2d4b0 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  e the ORDER BY c
2d4c0 6c 61 75 73 65 20 62 65 63 61 75 73 65 20 28 31  lause because (1
2d4d0 29 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 49  ) the order of I
2d4e0 4e 20 74 65 72 6d 73 0a 20 20 20 20 20 20 20 20  N terms.        
2d4f0 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6e 65 63 65    ** is not nece
2d500 73 73 61 72 69 6c 79 20 72 65 6c 61 74 65 64 20  ssarily related 
2d510 74 6f 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20  to the order of 
2d520 6f 75 74 70 75 74 20 74 65 72 6d 73 20 61 6e 64  output terms and
2d530 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 28 32  .          ** (2
2d540 29 20 4d 75 6c 74 69 70 6c 65 20 6f 75 74 70 75  ) Multiple outpu
2d550 74 73 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65  ts from a single
2d560 20 49 4e 20 76 61 6c 75 65 20 77 69 6c 6c 20 6e   IN value will n
2d570 6f 74 20 6d 65 72 67 65 0a 20 20 20 20 20 20 20  ot merge.       
2d580 20 20 20 2a 2a 20 74 6f 67 65 74 68 65 72 2e 20     ** together. 
2d590 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 49   */.          pI
2d5a0 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43  dxInfo->orderByC
2d5b0 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20  onsumed = 0;.   
2d5c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2d5d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d     }.    if( i>=
2d5e0 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 7b 0a 20  nConstraint ){. 
2d5f0 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72       pNew->nLTer
2d600 6d 20 3d 20 6d 78 54 65 72 6d 2b 31 3b 0a 20 20  m = mxTerm+1;.  
2d610 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
2d620 2d 3e 6e 4c 54 65 72 6d 3c 3d 70 4e 65 77 2d 3e  ->nLTerm<=pNew->
2d630 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20 20  nLSlot );.      
2d640 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78  pNew->u.vtab.idx
2d650 4e 75 6d 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e  Num = pIdxInfo->
2d660 69 64 78 4e 75 6d 3b 0a 20 20 20 20 20 20 70 4e  idxNum;.      pN
2d670 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46  ew->u.vtab.needF
2d680 72 65 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e  ree = pIdxInfo->
2d690 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
2d6a0 3b 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f  ;.      pIdxInfo
2d6b0 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
2d6c0 74 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e  tr = 0;.      pN
2d6d0 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74  ew->u.vtab.idxSt
2d6e0 72 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64  r = pIdxInfo->id
2d6f0 78 53 74 72 3b 0a 20 20 20 20 20 20 70 4e 65 77  xStr;.      pNew
2d700 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64 65 72  ->u.vtab.isOrder
2d710 65 64 20 3d 20 28 69 38 29 28 70 49 64 78 49 6e  ed = (i8)(pIdxIn
2d720 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75  fo->orderByConsu
2d730 6d 65 64 20 3f 0a 20 20 20 20 20 20 20 20 20 20  med ?.          
2d740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d750 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78              pIdx
2d760 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3a  Info->nOrderBy :
2d770 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d   0);.      pNew-
2d780 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20  >rSetup = 0;.   
2d790 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
2d7a0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 46 72 6f  sqlite3LogEstFro
2d7b0 6d 44 6f 75 62 6c 65 28 70 49 64 78 49 6e 66 6f  mDouble(pIdxInfo
2d7c0 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29  ->estimatedCost)
2d7d0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f  ;.      pNew->nO
2d7e0 75 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ut = sqlite3LogE
2d7f0 73 74 28 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74  st(pIdxInfo->est
2d800 69 6d 61 74 65 64 52 6f 77 73 29 3b 0a 20 20 20  imatedRows);.   
2d810 20 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65     whereLoopInse
2d820 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65  rt(pBuilder, pNe
2d830 77 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e  w);.      if( pN
2d840 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46  ew->u.vtab.needF
2d850 72 65 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ree ){.        s
2d860 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77  qlite3_free(pNew
2d870 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29  ->u.vtab.idxStr)
2d880 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
2d890 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
2d8a0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
2d8b0 20 7d 0a 20 20 7d 20 20 0a 0a 77 68 65 72 65 4c   }.  }  ..whereL
2d8c0 6f 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74 3a  oopAddVtab_exit:
2d8d0 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d  .  if( pIdxInfo-
2d8e0 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
2d8f0 72 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65  r ) sqlite3_free
2d900 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74  (pIdxInfo->idxSt
2d910 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  r);.  sqlite3DbF
2d920 72 65 65 28 64 62 2c 20 70 49 64 78 49 6e 66 6f  ree(db, pIdxInfo
2d930 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
2d940 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
2d950 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
2d960 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  ABLE */../*.** A
2d970 64 64 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74  dd WhereLoop ent
2d980 72 69 65 73 20 74 6f 20 68 61 6e 64 6c 65 20 4f  ries to handle O
2d990 52 20 74 65 72 6d 73 2e 20 20 54 68 69 73 20 77  R terms.  This w
2d9a0 6f 72 6b 73 20 66 6f 72 20 65 69 74 68 65 72 0a  orks for either.
2d9b0 2a 2a 20 62 74 72 65 65 73 20 6f 72 20 76 69 72  ** btrees or vir
2d9c0 74 75 61 6c 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a  tual tables..*/.
2d9d0 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
2d9e0 4c 6f 6f 70 41 64 64 4f 72 28 57 68 65 72 65 4c  LoopAddOr(WhereL
2d9f0 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
2da00 6c 64 65 72 2c 20 42 69 74 6d 61 73 6b 20 6d 45  lder, Bitmask mE
2da10 78 74 72 61 29 7b 0a 20 20 57 68 65 72 65 49 6e  xtra){.  WhereIn
2da20 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75  fo *pWInfo = pBu
2da30 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20  ilder->pWInfo;. 
2da40 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
2da50 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  C;.  WhereLoop *
2da60 70 4e 65 77 3b 0a 20 20 57 68 65 72 65 54 65 72  pNew;.  WhereTer
2da70 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 57 43 45 6e  m *pTerm, *pWCEn
2da80 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
2da90 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69  LITE_OK;.  int i
2daa0 43 75 72 3b 0a 20 20 57 68 65 72 65 43 6c 61 75  Cur;.  WhereClau
2dab0 73 65 20 74 65 6d 70 57 43 3b 0a 20 20 57 68 65  se tempWC;.  Whe
2dac0 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73 53  reLoopBuilder sS
2dad0 75 62 42 75 69 6c 64 3b 0a 20 20 57 68 65 72 65  ubBuild;.  Where
2dae0 4f 72 53 65 74 20 73 53 75 6d 2c 20 73 43 75 72  OrSet sSum, sCur
2daf0 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
2db00 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
2db10 20 20 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c    .  pWC = pBuil
2db20 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70 57 43 45  der->pWC;.  pWCE
2db30 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57  nd = pWC->a + pW
2db40 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 70 4e 65 77  C->nTerm;.  pNew
2db50 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
2db60 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 53 75  w;.  memset(&sSu
2db70 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 75  m, 0, sizeof(sSu
2db80 6d 29 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70  m));.  pItem = p
2db90 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
2dba0 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b  >a + pNew->iTab;
2dbb0 0a 20 20 69 43 75 72 20 3d 20 70 49 74 65 6d 2d  .  iCur = pItem-
2dbc0 3e 69 43 75 72 73 6f 72 3b 0a 0a 20 20 66 6f 72  >iCursor;..  for
2dbd0 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70  (pTerm=pWC->a; p
2dbe0 54 65 72 6d 3c 70 57 43 45 6e 64 20 26 26 20 72  Term<pWCEnd && r
2dbf0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 70 54  c==SQLITE_OK; pT
2dc00 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  erm++){.    if( 
2dc10 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
2dc20 72 20 26 20 57 4f 5f 4f 52 29 21 3d 30 0a 20 20  r & WO_OR)!=0.  
2dc30 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 75 2e     && (pTerm->u.
2dc40 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62  pOrInfo->indexab
2dc50 6c 65 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53  le & pNew->maskS
2dc60 65 6c 66 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a  elf)!=0 .    ){.
2dc70 20 20 20 20 20 20 57 68 65 72 65 43 6c 61 75 73        WhereClaus
2dc80 65 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 20  e * const pOrWC 
2dc90 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49  = &pTerm->u.pOrI
2dca0 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 57  nfo->wc;.      W
2dcb0 68 65 72 65 54 65 72 6d 20 2a 20 63 6f 6e 73 74  hereTerm * const
2dcc0 20 70 4f 72 57 43 45 6e 64 20 3d 20 26 70 4f 72   pOrWCEnd = &pOr
2dcd0 57 43 2d 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54 65  WC->a[pOrWC->nTe
2dce0 72 6d 5d 3b 0a 20 20 20 20 20 20 57 68 65 72 65  rm];.      Where
2dcf0 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 20  Term *pOrTerm;. 
2dd00 20 20 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20       int once = 
2dd10 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20  1;.      int i, 
2dd20 6a 3b 0a 20 20 20 20 0a 20 20 20 20 20 20 73 53  j;.    .      sS
2dd30 75 62 42 75 69 6c 64 20 3d 20 2a 70 42 75 69 6c  ubBuild = *pBuil
2dd40 64 65 72 3b 0a 20 20 20 20 20 20 73 53 75 62 42  der;.      sSubB
2dd50 75 69 6c 64 2e 70 4f 72 64 65 72 42 79 20 3d 20  uild.pOrderBy = 
2dd60 30 3b 0a 20 20 20 20 20 20 73 53 75 62 42 75 69  0;.      sSubBui
2dd70 6c 64 2e 70 4f 72 53 65 74 20 3d 20 26 73 43 75  ld.pOrSet = &sCu
2dd80 72 3b 0a 0a 20 20 20 20 20 20 57 48 45 52 45 54  r;..      WHERET
2dd90 52 41 43 45 28 30 78 32 30 30 2c 20 28 22 42 65  RACE(0x200, ("Be
2dda0 67 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 4f  gin processing O
2ddb0 52 2d 63 6c 61 75 73 65 20 25 70 5c 6e 22 2c 20  R-clause %p\n", 
2ddc0 70 54 65 72 6d 29 29 3b 0a 20 20 20 20 20 20 66  pTerm));.      f
2ddd0 6f 72 28 70 4f 72 54 65 72 6d 3d 70 4f 72 57 43  or(pOrTerm=pOrWC
2dde0 2d 3e 61 3b 20 70 4f 72 54 65 72 6d 3c 70 4f 72  ->a; pOrTerm<pOr
2ddf0 57 43 45 6e 64 3b 20 70 4f 72 54 65 72 6d 2b 2b  WCEnd; pOrTerm++
2de00 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ){.        if( (
2de10 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
2de20 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20  or & WO_AND)!=0 
2de30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75  ){.          sSu
2de40 62 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 70 4f  bBuild.pWC = &pO
2de50 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66  rTerm->u.pAndInf
2de60 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 7d  o->wc;.        }
2de70 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d  else if( pOrTerm
2de80 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
2de90 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ur ){.          
2dea0 74 65 6d 70 57 43 2e 70 57 49 6e 66 6f 20 3d 20  tempWC.pWInfo = 
2deb0 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 20  pWC->pWInfo;.   
2dec0 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70 4f         tempWC.pO
2ded0 75 74 65 72 20 3d 20 70 57 43 3b 0a 20 20 20 20  uter = pWC;.    
2dee0 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6f 70 20        tempWC.op 
2def0 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20  = TK_AND;.      
2df00 20 20 20 20 74 65 6d 70 57 43 2e 6e 54 65 72 6d      tempWC.nTerm
2df10 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
2df20 74 65 6d 70 57 43 2e 61 20 3d 20 70 4f 72 54 65  tempWC.a = pOrTe
2df30 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 73 53  rm;.          sS
2df40 75 62 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 74  ubBuild.pWC = &t
2df50 65 6d 70 57 43 3b 0a 20 20 20 20 20 20 20 20 7d  empWC;.        }
2df60 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2df70 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2df80 20 20 7d 0a 20 20 20 20 20 20 20 20 73 43 75 72    }.        sCur
2df90 2e 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 57  .n = 0;.#ifdef W
2dfa0 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
2dfb0 44 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 54  D.        WHERET
2dfc0 52 41 43 45 28 30 78 32 30 30 2c 20 28 22 4f 52  RACE(0x200, ("OR
2dfd0 2d 74 65 72 6d 20 25 64 20 6f 66 20 25 70 20 68  -term %d of %p h
2dfe0 61 73 20 25 64 20 73 75 62 74 65 72 6d 73 3a 5c  as %d subterms:\
2dff0 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  n", .           
2e000 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 70 4f          (int)(pO
2e010 72 54 65 72 6d 2d 70 4f 72 57 43 2d 3e 61 29 2c  rTerm-pOrWC->a),
2e020 20 70 54 65 72 6d 2c 20 73 53 75 62 42 75 69 6c   pTerm, sSubBuil
2e030 64 2e 70 57 43 2d 3e 6e 54 65 72 6d 29 29 3b 0a  d.pWC->nTerm));.
2e040 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
2e050 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20  te3WhereTrace & 
2e060 30 78 34 30 30 20 29 7b 0a 20 20 20 20 20 20 20  0x400 ){.       
2e070 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 53     for(i=0; i<sS
2e080 75 62 42 75 69 6c 64 2e 70 57 43 2d 3e 6e 54 65  ubBuild.pWC->nTe
2e090 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rm; i++){.      
2e0a0 20 20 20 20 20 20 77 68 65 72 65 54 65 72 6d 50        whereTermP
2e0b0 72 69 6e 74 28 26 73 53 75 62 42 75 69 6c 64 2e  rint(&sSubBuild.
2e0c0 70 57 43 2d 3e 61 5b 69 5d 2c 20 69 29 3b 0a 20  pWC->a[i], i);. 
2e0d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2e0e0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e     }.#endif.#ifn
2e0f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2e100 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
2e110 20 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75       if( IsVirtu
2e120 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62 29 20  al(pItem->pTab) 
2e130 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
2e140 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69  = whereLoopAddVi
2e150 72 74 75 61 6c 28 26 73 53 75 62 42 75 69 6c 64  rtual(&sSubBuild
2e160 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 20  , mExtra);.     
2e170 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
2e180 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
2e190 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
2e1a0 6f 70 41 64 64 42 74 72 65 65 28 26 73 53 75 62  opAddBtree(&sSub
2e1b0 42 75 69 6c 64 2c 20 6d 45 78 74 72 61 29 3b 0a  Build, mExtra);.
2e1c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e1d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2e1e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2e1f0 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
2e200 64 64 4f 72 28 26 73 53 75 62 42 75 69 6c 64 2c  ddOr(&sSubBuild,
2e210 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20   mExtra);.      
2e220 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
2e230 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
2e240 4b 20 7c 7c 20 73 43 75 72 2e 6e 3d 3d 30 20 29  K || sCur.n==0 )
2e250 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 43  ;.        if( sC
2e260 75 72 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ur.n==0 ){.     
2e270 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d 20 30 3b       sSum.n = 0;
2e280 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
2e290 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
2e2a0 69 66 28 20 6f 6e 63 65 20 29 7b 0a 20 20 20 20  if( once ){.    
2e2b0 20 20 20 20 20 20 77 68 65 72 65 4f 72 4d 6f 76        whereOrMov
2e2c0 65 28 26 73 53 75 6d 2c 20 26 73 43 75 72 29 3b  e(&sSum, &sCur);
2e2d0 0a 20 20 20 20 20 20 20 20 20 20 6f 6e 63 65 20  .          once 
2e2e0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
2e2f0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 57 68  se{.          Wh
2e300 65 72 65 4f 72 53 65 74 20 73 50 72 65 76 3b 0a  ereOrSet sPrev;.
2e310 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 4f            whereO
2e320 72 4d 6f 76 65 28 26 73 50 72 65 76 2c 20 26 73  rMove(&sPrev, &s
2e330 53 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Sum);.          
2e340 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20  sSum.n = 0;.    
2e350 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
2e360 3c 73 50 72 65 76 2e 6e 3b 20 69 2b 2b 29 7b 0a  <sPrev.n; i++){.
2e370 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
2e380 6a 3d 30 3b 20 6a 3c 73 43 75 72 2e 6e 3b 20 6a  j=0; j<sCur.n; j
2e390 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
2e3a0 20 20 20 77 68 65 72 65 4f 72 49 6e 73 65 72 74     whereOrInsert
2e3b0 28 26 73 53 75 6d 2c 20 73 50 72 65 76 2e 61 5b  (&sSum, sPrev.a[
2e3c0 69 5d 2e 70 72 65 72 65 71 20 7c 20 73 43 75 72  i].prereq | sCur
2e3d0 2e 61 5b 6a 5d 2e 70 72 65 72 65 71 2c 0a 20 20  .a[j].prereq,.  
2e3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e3f0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2e400 33 4c 6f 67 45 73 74 41 64 64 28 73 50 72 65 76  3LogEstAdd(sPrev
2e410 2e 61 5b 69 5d 2e 72 52 75 6e 2c 20 73 43 75 72  .a[i].rRun, sCur
2e420 2e 61 5b 6a 5d 2e 72 52 75 6e 29 2c 0a 20 20 20  .a[j].rRun),.   
2e430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e440 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2e450 4c 6f 67 45 73 74 41 64 64 28 73 50 72 65 76 2e  LogEstAdd(sPrev.
2e460 61 5b 69 5d 2e 6e 4f 75 74 2c 20 73 43 75 72 2e  a[i].nOut, sCur.
2e470 61 5b 6a 5d 2e 6e 4f 75 74 29 29 3b 0a 20 20 20  a[j].nOut));.   
2e480 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2e490 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2e4a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
2e4b0 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b  New->nLTerm = 1;
2e4c0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54  .      pNew->aLT
2e4d0 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a  erm[0] = pTerm;.
2e4e0 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
2e4f0 61 67 73 20 3d 20 57 48 45 52 45 5f 4d 55 4c 54  ags = WHERE_MULT
2e500 49 5f 4f 52 3b 0a 20 20 20 20 20 20 70 4e 65 77  I_OR;.      pNew
2e510 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20  ->rSetup = 0;.  
2e520 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49      pNew->iSortI
2e530 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 6d 65  dx = 0;.      me
2e540 6d 73 65 74 28 26 70 4e 65 77 2d 3e 75 2c 20 30  mset(&pNew->u, 0
2e550 2c 20 73 69 7a 65 6f 66 28 70 4e 65 77 2d 3e 75  , sizeof(pNew->u
2e560 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ));.      for(i=
2e570 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
2e580 20 26 26 20 69 3c 73 53 75 6d 2e 6e 3b 20 69 2b   && i<sSum.n; i+
2e590 2b 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  +){.        /* T
2e5a0 55 4e 49 4e 47 3a 20 43 75 72 72 65 6e 74 6c 79  UNING: Currently
2e5b0 20 73 53 75 6d 2e 61 5b 69 5d 2e 72 52 75 6e 20   sSum.a[i].rRun 
2e5c0 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 75  is set to the su
2e5d0 6d 20 6f 66 20 74 68 65 20 63 6f 73 74 73 0a 20  m of the costs. 
2e5e0 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 6c 6c         ** of all
2e5f0 20 73 75 62 2d 73 63 61 6e 73 20 72 65 71 75 69   sub-scans requi
2e600 72 65 64 20 62 79 20 74 68 65 20 4f 52 2d 73 63  red by the OR-sc
2e610 61 6e 2e 20 48 6f 77 65 76 65 72 2c 20 64 75 65  an. However, due
2e620 20 74 6f 20 72 6f 75 6e 64 69 6e 67 0a 20 20 20   to rounding.   
2e630 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 73 2c 20       ** errors, 
2e640 69 74 20 6d 61 79 20 62 65 20 74 68 61 74 20 74  it may be that t
2e650 68 65 20 63 6f 73 74 20 6f 66 20 74 68 65 20 4f  he cost of the O
2e660 52 2d 73 63 61 6e 20 69 73 20 65 71 75 61 6c 20  R-scan is equal 
2e670 74 6f 20 69 74 73 0a 20 20 20 20 20 20 20 20 2a  to its.        *
2e680 2a 20 6d 6f 73 74 20 65 78 70 65 6e 73 69 76 65  * most expensive
2e690 20 73 75 62 2d 73 63 61 6e 2e 20 41 64 64 20 74   sub-scan. Add t
2e6a0 68 65 20 73 6d 61 6c 6c 65 73 74 20 70 6f 73 73  he smallest poss
2e6b0 69 62 6c 65 20 70 65 6e 61 6c 74 79 20 0a 20 20  ible penalty .  
2e6c0 20 20 20 20 20 20 2a 2a 20 28 65 71 75 69 76 61        ** (equiva
2e6d0 6c 65 6e 74 20 74 6f 20 6d 75 6c 74 69 70 6c 79  lent to multiply
2e6e0 69 6e 67 20 74 68 65 20 63 6f 73 74 20 62 79 20  ing the cost by 
2e6f0 31 2e 30 37 29 20 74 6f 20 65 6e 73 75 72 65 20  1.07) to ensure 
2e700 74 68 61 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  that .        **
2e710 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 68   this does not h
2e720 61 70 70 65 6e 2e 20 4f 74 68 65 72 77 69 73 65  appen. Otherwise
2e730 2c 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61 75  , for WHERE clau
2e740 73 65 73 20 73 75 63 68 20 61 73 20 74 68 65 0a  ses such as the.
2e750 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f          ** follo
2e760 77 69 6e 67 20 77 68 65 72 65 20 74 68 65 72 65  wing where there
2e770 20 69 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20   is an index on 
2e780 22 79 22 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a  "y":.        **.
2e790 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 57          **     W
2e7a0 48 45 52 45 20 6c 69 6b 65 6c 69 68 6f 6f 64 28  HERE likelihood(
2e7b0 78 3d 3f 2c 20 30 2e 39 39 29 20 4f 52 20 79 3d  x=?, 0.99) OR y=
2e7c0 3f 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ?.        **.   
2e7d0 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6c 61 6e       ** the plan
2e7e0 6e 65 72 20 6d 61 79 20 65 6c 65 63 74 20 74 6f  ner may elect to
2e7f0 20 22 4f 52 22 20 74 6f 67 65 74 68 65 72 20 61   "OR" together a
2e800 20 66 75 6c 6c 2d 74 61 62 6c 65 20 73 63 61 6e   full-table scan
2e810 20 61 6e 64 20 61 6e 0a 20 20 20 20 20 20 20 20   and an.        
2e820 2a 2a 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 2e  ** index lookup.
2e830 20 41 6e 64 20 6f 74 68 65 72 20 73 69 6d 69 6c   And other simil
2e840 61 72 6c 79 20 6f 64 64 20 72 65 73 75 6c 74 73  arly odd results
2e850 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e  .  */.        pN
2e860 65 77 2d 3e 72 52 75 6e 20 3d 20 73 53 75 6d 2e  ew->rRun = sSum.
2e870 61 5b 69 5d 2e 72 52 75 6e 20 2b 20 31 3b 0a 20  a[i].rRun + 1;. 
2e880 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75         pNew->nOu
2e890 74 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 6e 4f  t = sSum.a[i].nO
2e8a0 75 74 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  ut;.        pNew
2e8b0 2d 3e 70 72 65 72 65 71 20 3d 20 73 53 75 6d 2e  ->prereq = sSum.
2e8c0 61 5b 69 5d 2e 70 72 65 72 65 71 3b 0a 20 20 20  a[i].prereq;.   
2e8d0 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
2e8e0 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64  oopInsert(pBuild
2e8f0 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  er, pNew);.     
2e900 20 7d 0a 20 20 20 20 20 20 57 48 45 52 45 54 52   }.      WHERETR
2e910 41 43 45 28 30 78 32 30 30 2c 20 28 22 45 6e 64  ACE(0x200, ("End
2e920 20 70 72 6f 63 65 73 73 69 6e 67 20 4f 52 2d 63   processing OR-c
2e930 6c 61 75 73 65 20 25 70 5c 6e 22 2c 20 70 54 65  lause %p\n", pTe
2e940 72 6d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rm));.    }.  }.
2e950 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2e960 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68  /*.** Add all Wh
2e970 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
2e980 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 0a  for all tables .
2e990 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
2e9a0 65 72 65 4c 6f 6f 70 41 64 64 41 6c 6c 28 57 68  ereLoopAddAll(Wh
2e9b0 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
2e9c0 70 42 75 69 6c 64 65 72 29 7b 0a 20 20 57 68 65  pBuilder){.  Whe
2e9d0 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d  reInfo *pWInfo =
2e9e0 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
2e9f0 6f 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 45 78  o;.  Bitmask mEx
2ea00 74 72 61 20 3d 20 30 3b 0a 20 20 42 69 74 6d 61  tra = 0;.  Bitma
2ea10 73 6b 20 6d 50 72 69 6f 72 20 3d 20 30 3b 0a 20  sk mPrior = 0;. 
2ea20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 53 72 63   int iTab;.  Src
2ea30 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d  List *pTabList =
2ea40 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
2ea50 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  t;.  struct SrcL
2ea60 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
2ea70 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
2ea80 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d   pWInfo->pParse-
2ea90 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 54 61 62 4c  >db;.  int nTabL
2eaa0 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c  ist = pWInfo->nL
2eab0 65 76 65 6c 3b 0a 20 20 69 6e 74 20 72 63 20 3d  evel;.  int rc =
2eac0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38   SQLITE_OK;.  u8
2ead0 20 70 72 69 6f 72 4a 6f 69 6e 54 79 70 65 20 3d   priorJoinType =
2eae0 20 30 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   0;.  WhereLoop 
2eaf0 2a 70 4e 65 77 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f  *pNew;..  /* Loo
2eb00 70 20 6f 76 65 72 20 74 68 65 20 74 61 62 6c 65  p over the table
2eb10 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 2c 20 66  s in the join, f
2eb20 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
2eb30 74 20 2a 2f 0a 20 20 70 4e 65 77 20 3d 20 70 42  t */.  pNew = pB
2eb40 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20  uilder->pNew;.  
2eb50 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 4e  whereLoopInit(pN
2eb60 65 77 29 3b 0a 20 20 66 6f 72 28 69 54 61 62 3d  ew);.  for(iTab=
2eb70 30 2c 20 70 49 74 65 6d 3d 70 54 61 62 4c 69 73  0, pItem=pTabLis
2eb80 74 2d 3e 61 3b 20 69 54 61 62 3c 6e 54 61 62 4c  t->a; iTab<nTabL
2eb90 69 73 74 3b 20 69 54 61 62 2b 2b 2c 20 70 49 74  ist; iTab++, pIt
2eba0 65 6d 2b 2b 29 7b 0a 20 20 20 20 70 4e 65 77 2d  em++){.    pNew-
2ebb0 3e 69 54 61 62 20 3d 20 69 54 61 62 3b 0a 20 20  >iTab = iTab;.  
2ebc0 20 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66    pNew->maskSelf
2ebd0 20 3d 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e   = getMask(&pWIn
2ebe0 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 49  fo->sMaskSet, pI
2ebf0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
2ec00 20 20 20 69 66 28 20 28 28 70 49 74 65 6d 2d 3e     if( ((pItem->
2ec10 6a 6f 69 6e 74 79 70 65 7c 70 72 69 6f 72 4a 6f  jointype|priorJo
2ec20 69 6e 54 79 70 65 29 20 26 20 28 4a 54 5f 4c 45  inType) & (JT_LE
2ec30 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30  FT|JT_CROSS))!=0
2ec40 20 29 7b 0a 20 20 20 20 20 20 6d 45 78 74 72 61   ){.      mExtra
2ec50 20 3d 20 6d 50 72 69 6f 72 3b 0a 20 20 20 20 7d   = mPrior;.    }
2ec60 0a 20 20 20 20 70 72 69 6f 72 4a 6f 69 6e 54 79  .    priorJoinTy
2ec70 70 65 20 3d 20 70 49 74 65 6d 2d 3e 6a 6f 69 6e  pe = pItem->join
2ec80 74 79 70 65 3b 0a 20 20 20 20 69 66 28 20 49 73  type;.    if( Is
2ec90 56 69 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70  Virtual(pItem->p
2eca0 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 72 63  Tab) ){.      rc
2ecb0 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56   = whereLoopAddV
2ecc0 69 72 74 75 61 6c 28 70 42 75 69 6c 64 65 72 2c  irtual(pBuilder,
2ecd0 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 65   mExtra);.    }e
2ece0 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
2ecf0 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65  whereLoopAddBtre
2ed00 65 28 70 42 75 69 6c 64 65 72 2c 20 6d 45 78 74  e(pBuilder, mExt
2ed10 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ra);.    }.    i
2ed20 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2ed30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   ){.      rc = w
2ed40 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 70 42  hereLoopAddOr(pB
2ed50 75 69 6c 64 65 72 2c 20 6d 45 78 74 72 61 29 3b  uilder, mExtra);
2ed60 0a 20 20 20 20 7d 0a 20 20 20 20 6d 50 72 69 6f  .    }.    mPrio
2ed70 72 20 7c 3d 20 70 4e 65 77 2d 3e 6d 61 73 6b 53  r |= pNew->maskS
2ed80 65 6c 66 3b 0a 20 20 20 20 69 66 28 20 72 63 20  elf;.    if( rc 
2ed90 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
2eda0 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  led ) break;.  }
2edb0 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  .  whereLoopClea
2edc0 72 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 72  r(db, pNew);.  r
2edd0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2ede0 2a 2a 20 45 78 61 6d 69 6e 65 20 61 20 57 68 65  ** Examine a Whe
2edf0 72 65 50 61 74 68 20 28 77 69 74 68 20 74 68 65  rePath (with the
2ee00 20 61 64 64 69 74 69 6f 6e 20 6f 66 20 74 68 65   addition of the
2ee10 20 65 78 74 72 61 20 57 68 65 72 65 4c 6f 6f 70   extra WhereLoop
2ee20 20 6f 66 20 74 68 65 20 35 74 68 0a 2a 2a 20 70   of the 5th.** p
2ee30 61 72 61 6d 65 74 65 72 73 29 20 74 6f 20 73 65  arameters) to se
2ee40 65 20 69 66 20 69 74 20 6f 75 74 70 75 74 73 20  e if it outputs 
2ee50 72 6f 77 73 20 69 6e 20 74 68 65 20 72 65 71 75  rows in the requ
2ee60 65 73 74 65 64 20 4f 52 44 45 52 20 42 59 0a 2a  ested ORDER BY.*
2ee70 2a 20 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20  * (or GROUP BY) 
2ee80 77 69 74 68 6f 75 74 20 72 65 71 75 69 72 69 6e  without requirin
2ee90 67 20 61 20 73 65 70 61 72 61 74 65 20 73 6f 72  g a separate sor
2eea0 74 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 52 65  t operation.  Re
2eeb0 74 75 72 6e 20 4e 3a 0a 2a 2a 20 0a 2a 2a 20 20  turn N:.** .**  
2eec0 20 4e 3e 30 3a 20 20 20 4e 20 74 65 72 6d 73 20   N>0:   N terms 
2eed0 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
2eee0 63 6c 61 75 73 65 20 61 72 65 20 73 61 74 69 73  clause are satis
2eef0 66 69 65 64 0a 2a 2a 20 20 20 4e 3d 3d 30 3a 20  fied.**   N==0: 
2ef00 20 4e 6f 20 74 65 72 6d 73 20 6f 66 20 74 68 65   No terms of the
2ef10 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2ef20 20 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a   are satisfied.*
2ef30 2a 20 20 20 4e 3c 30 3a 20 20 20 55 6e 6b 6e 6f  *   N<0:   Unkno
2ef40 77 6e 20 79 65 74 20 68 6f 77 20 6d 61 6e 79 20  wn yet how many 
2ef50 74 65 72 6d 73 20 6f 66 20 4f 52 44 45 52 20 42  terms of ORDER B
2ef60 59 20 6d 69 67 68 74 20 62 65 20 73 61 74 69 73  Y might be satis
2ef70 66 69 65 64 2e 20 20 20 0a 2a 2a 0a 2a 2a 20 4e  fied.   .**.** N
2ef80 6f 74 65 20 74 68 61 74 20 70 72 6f 63 65 73 73  ote that process
2ef90 69 6e 67 20 66 6f 72 20 57 48 45 52 45 5f 47 52  ing for WHERE_GR
2efa0 4f 55 50 42 59 20 61 6e 64 20 57 48 45 52 45 5f  OUPBY and WHERE_
2efb0 44 49 53 54 49 4e 43 54 42 59 20 69 73 20 6e 6f  DISTINCTBY is no
2efc0 74 20 61 73 0a 2a 2a 20 73 74 72 69 63 74 2e 20  t as.** strict. 
2efd0 20 57 69 74 68 20 47 52 4f 55 50 20 42 59 20 61   With GROUP BY a
2efe0 6e 64 20 44 49 53 54 49 4e 43 54 20 74 68 65 20  nd DISTINCT the 
2eff0 6f 6e 6c 79 20 72 65 71 75 69 72 65 6d 65 6e 74  only requirement
2f000 20 69 73 20 74 68 61 74 0a 2a 2a 20 65 71 75 69   is that.** equi
2f010 76 61 6c 65 6e 74 20 72 6f 77 73 20 61 70 70 65  valent rows appe
2f020 61 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61  ar immediately a
2f030 64 6a 61 63 65 6e 74 20 74 6f 20 6f 6e 65 20 61  djacent to one a
2f040 6e 6f 74 68 65 72 2e 20 20 47 52 4f 55 50 20 42  nother.  GROUP B
2f050 59 0a 2a 2a 20 61 6e 64 20 44 49 53 54 49 4e 43  Y.** and DISTINC
2f060 54 20 64 6f 20 6e 6f 74 20 72 65 71 75 69 72 65  T do not require
2f070 20 72 6f 77 73 20 74 6f 20 61 70 70 65 61 72 20   rows to appear 
2f080 69 6e 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61  in any particula
2f090 72 20 6f 72 64 65 72 20 61 73 20 6c 6f 6e 67 0a  r order as long.
2f0a0 2a 2a 20 61 73 20 65 71 75 69 76 61 6c 65 6e 74  ** as equivalent
2f0b0 20 72 6f 77 73 20 61 72 65 20 67 72 6f 75 70 65   rows are groupe
2f0c0 64 20 74 6f 67 65 74 68 65 72 2e 20 20 54 68 75  d together.  Thu
2f0d0 73 20 66 6f 72 20 47 52 4f 55 50 20 42 59 20 61  s for GROUP BY a
2f0e0 6e 64 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 74  nd DISTINCT.** t
2f0f0 68 65 20 70 4f 72 64 65 72 42 79 20 74 65 72 6d  he pOrderBy term
2f100 73 20 63 61 6e 20 62 65 20 6d 61 74 63 68 65 64  s can be matched
2f110 20 69 6e 20 61 6e 79 20 6f 72 64 65 72 2e 20 20   in any order.  
2f120 57 69 74 68 20 4f 52 44 45 52 20 42 59 2c 20 74  With ORDER BY, t
2f130 68 65 20 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20  he .** pOrderBy 
2f140 74 65 72 6d 73 20 6d 75 73 74 20 62 65 20 6d 61  terms must be ma
2f150 74 63 68 65 64 20 69 6e 20 73 74 72 69 63 74 20  tched in strict 
2f160 6c 65 66 74 2d 74 6f 2d 72 69 67 68 74 20 6f 72  left-to-right or
2f170 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
2f180 38 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73  8 wherePathSatis
2f190 66 69 65 73 4f 72 64 65 72 42 79 28 0a 20 20 57  fiesOrderBy(.  W
2f1a0 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
2f1b0 2c 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52  ,    /* The WHER
2f1c0 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
2f1d0 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
2f1e0 2c 20 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20  ,   /* ORDER BY 
2f1f0 6f 72 20 47 52 4f 55 50 20 42 59 20 6f 72 20 44  or GROUP BY or D
2f200 49 53 54 49 4e 43 54 20 63 6c 61 75 73 65 20 74  ISTINCT clause t
2f210 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 57 68 65  o check */.  Whe
2f220 72 65 50 61 74 68 20 2a 70 50 61 74 68 2c 20 20  rePath *pPath,  
2f230 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 50     /* The WhereP
2f240 61 74 68 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  ath to check */.
2f250 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73    u16 wctrlFlags
2f260 2c 20 20 20 20 20 20 20 2f 2a 20 4d 69 67 68 74  ,       /* Might
2f270 20 63 6f 6e 74 61 69 6e 20 57 48 45 52 45 5f 47   contain WHERE_G
2f280 52 4f 55 50 42 59 20 6f 72 20 57 48 45 52 45 5f  ROUPBY or WHERE_
2f290 44 49 53 54 49 4e 43 54 42 59 20 2a 2f 0a 20 20  DISTINCTBY */.  
2f2a0 75 31 36 20 6e 4c 6f 6f 70 2c 20 20 20 20 20 20  u16 nLoop,      
2f2b0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2f2c0 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 70 50  of entries in pP
2f2d0 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a  ath->aLoop[] */.
2f2e0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61    WhereLoop *pLa
2f2f0 73 74 2c 20 20 20 20 20 2f 2a 20 41 64 64 20 74  st,     /* Add t
2f300 68 69 73 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f  his WhereLoop to
2f310 20 74 68 65 20 65 6e 64 20 6f 66 20 70 50 61 74   the end of pPat
2f320 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20  h->aLoop[] */.  
2f330 42 69 74 6d 61 73 6b 20 2a 70 52 65 76 4d 61 73  Bitmask *pRevMas
2f340 6b 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61  k     /* OUT: Ma
2f350 73 6b 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 73  sk of WhereLoops
2f360 20 74 6f 20 72 75 6e 20 69 6e 20 72 65 76 65 72   to run in rever
2f370 73 65 20 6f 72 64 65 72 20 2a 2f 0a 29 7b 0a 20  se order */.){. 
2f380 20 75 38 20 72 65 76 53 65 74 3b 20 20 20 20 20   u8 revSet;     
2f390 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2f3a0 66 20 72 65 76 20 69 73 20 6b 6e 6f 77 6e 20 2a  f rev is known *
2f3b0 2f 0a 20 20 75 38 20 72 65 76 3b 20 20 20 20 20  /.  u8 rev;     
2f3c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
2f3d0 70 6f 73 69 74 65 20 73 6f 72 74 20 6f 72 64 65  posite sort orde
2f3e0 72 20 2a 2f 0a 20 20 75 38 20 72 65 76 49 64 78  r */.  u8 revIdx
2f3f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2f400 49 6e 64 65 78 20 73 6f 72 74 20 6f 72 64 65 72  Index sort order
2f410 20 2a 2f 0a 20 20 75 38 20 69 73 4f 72 64 65 72   */.  u8 isOrder
2f420 44 69 73 74 69 6e 63 74 3b 20 20 20 2f 2a 20 41  Distinct;   /* A
2f430 6c 6c 20 70 72 69 6f 72 20 57 68 65 72 65 4c 6f  ll prior WhereLo
2f440 6f 70 73 20 61 72 65 20 6f 72 64 65 72 2d 64 69  ops are order-di
2f450 73 74 69 6e 63 74 20 2a 2f 0a 20 20 75 38 20 64  stinct */.  u8 d
2f460 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3b 20  istinctColumns; 
2f470 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
2f480 20 6c 6f 6f 70 20 68 61 73 20 55 4e 49 51 55 45   loop has UNIQUE
2f490 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e   NOT NULL column
2f4a0 73 20 2a 2f 0a 20 20 75 38 20 69 73 4d 61 74 63  s */.  u8 isMatc
2f4b0 68 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  h;           /* 
2f4c0 69 43 6f 6c 75 6d 6e 20 6d 61 74 63 68 65 73 20  iColumn matches 
2f4d0 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52  a term of the OR
2f4e0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
2f4f0 0a 20 20 75 31 36 20 6e 4b 65 79 43 6f 6c 3b 20  .  u16 nKeyCol; 
2f500 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2f510 65 72 20 6f 66 20 6b 65 79 20 63 6f 6c 75 6d 6e  er of key column
2f520 73 20 69 6e 20 70 49 6e 64 65 78 20 2a 2f 0a 20  s in pIndex */. 
2f530 20 75 31 36 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20   u16 nColumn;   
2f540 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
2f550 6e 75 6d 62 65 72 20 6f 66 20 6f 72 64 65 72 65  number of ordere
2f560 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  d columns in the
2f570 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36 20   index */.  u16 
2f580 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20  nOrderBy;       
2f590 20 20 2f 2a 20 4e 75 6d 62 65 72 20 74 65 72 6d    /* Number term
2f5a0 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42  s in the ORDER B
2f5b0 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  Y clause */.  in
2f5c0 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20  t iLoop;        
2f5d0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
2f5e0 57 68 65 72 65 4c 6f 6f 70 20 69 6e 20 70 50 61  WhereLoop in pPa
2f5f0 74 68 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73  th being process
2f600 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  ed */.  int i, j
2f610 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2f620 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
2f630 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20  /.  int iCur;   
2f640 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
2f650 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 63  sor number for c
2f660 75 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70  urrent WhereLoop
2f670 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d   */.  int iColum
2f680 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  n;          /* A
2f690 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77   column number w
2f6a0 69 74 68 69 6e 20 74 61 62 6c 65 20 69 43 75 72  ithin table iCur
2f6b0 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
2f6c0 2a 70 4c 6f 6f 70 20 3d 20 30 3b 20 2f 2a 20 43  *pLoop = 0; /* C
2f6d0 75 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70  urrent WhereLoop
2f6e0 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64   being processed
2f6f0 2e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  . */.  WhereTerm
2f700 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 2f 2a 20   *pTerm;     /* 
2f710 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66  A single term of
2f720 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2f730 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 42  e */.  Expr *pOB
2f740 45 78 70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  Expr;        /* 
2f750 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72  An expression fr
2f760 6f 6d 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  om the ORDER BY 
2f770 63 6c 61 75 73 65 20 2a 2f 0a 20 20 43 6f 6c 6c  clause */.  Coll
2f780 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20  Seq *pColl;     
2f790 20 20 2f 2a 20 43 4f 4c 4c 41 54 45 20 66 75 6e    /* COLLATE fun
2f7a0 63 74 69 6f 6e 20 66 72 6f 6d 20 61 6e 20 4f 52  ction from an OR
2f7b0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65  DER BY clause te
2f7c0 72 6d 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  rm */.  Index *p
2f7d0 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 2f 2a  Index;        /*
2f7e0 20 54 68 65 20 69 6e 64 65 78 20 61 73 73 6f 63   The index assoc
2f7f0 69 61 74 65 64 20 77 69 74 68 20 70 4c 6f 6f 70  iated with pLoop
2f800 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
2f810 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  b = pWInfo->pPar
2f820 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61  se->db;  /* Data
2f830 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
2f840 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62 53  */.  Bitmask obS
2f850 61 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4d 61  at = 0;    /* Ma
2f860 73 6b 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74  sk of ORDER BY t
2f870 65 72 6d 73 20 73 61 74 69 73 66 69 65 64 20 73  erms satisfied s
2f880 6f 20 66 61 72 20 2a 2f 0a 20 20 42 69 74 6d 61  o far */.  Bitma
2f890 73 6b 20 6f 62 44 6f 6e 65 3b 20 20 20 20 20 20  sk obDone;      
2f8a0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20   /* Mask of all 
2f8b0 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a  ORDER BY terms *
2f8c0 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 72 64 65  /.  Bitmask orde
2f8d0 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 3b 20 20  rDistinctMask;  
2f8e0 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 77  /* Mask of all w
2f8f0 65 6c 6c 2d 6f 72 64 65 72 65 64 20 6c 6f 6f 70  ell-ordered loop
2f900 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 72  s */.  Bitmask r
2f910 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 20  eady;           
2f920 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 69 6e     /* Mask of in
2f930 6e 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a 0a 20 20  ner loops */..  
2f940 2f 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79 20 74  /*.  ** We say t
2f950 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20  he WhereLoop is 
2f960 22 6f 6e 65 2d 72 6f 77 22 20 69 66 20 69 74 20  "one-row" if it 
2f970 67 65 6e 65 72 61 74 65 73 20 6e 6f 20 6d 6f 72  generates no mor
2f980 65 20 74 68 61 6e 20 6f 6e 65 0a 20 20 2a 2a 20  e than one.  ** 
2f990 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 2e 20 20  row of output.  
2f9a0 41 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 6f  A WhereLoop is o
2f9b0 6e 65 2d 72 6f 77 20 69 66 20 61 6c 6c 20 6f 66  ne-row if all of
2f9c0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
2f9d0 72 65 20 74 72 75 65 3a 0a 20 20 2a 2a 20 20 28  re true:.  **  (
2f9e0 61 29 20 41 6c 6c 20 69 6e 64 65 78 20 63 6f 6c  a) All index col
2f9f0 75 6d 6e 73 20 6d 61 74 63 68 20 77 69 74 68 20  umns match with 
2fa00 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 2e  WHERE_COLUMN_EQ.
2fa10 0a 20 20 2a 2a 20 20 28 62 29 20 54 68 65 20 69  .  **  (b) The i
2fa20 6e 64 65 78 20 69 73 20 75 6e 69 71 75 65 0a 20  ndex is unique. 
2fa30 20 2a 2a 20 41 6e 79 20 57 68 65 72 65 4c 6f 6f   ** Any WhereLoo
2fa40 70 20 77 69 74 68 20 61 6e 20 57 48 45 52 45 5f  p with an WHERE_
2fa50 43 4f 4c 55 4d 4e 5f 45 51 20 63 6f 6e 73 74 72  COLUMN_EQ constr
2fa60 61 69 6e 74 20 6f 6e 20 74 68 65 20 72 6f 77 69  aint on the rowi
2fa70 64 20 69 73 20 6f 6e 65 2d 72 6f 77 2e 0a 20 20  d is one-row..  
2fa80 2a 2a 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77  ** Every one-row
2fa90 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 6c 6c 20   WhereLoop will 
2faa0 68 61 76 65 20 74 68 65 20 57 48 45 52 45 5f 4f  have the WHERE_O
2fab0 4e 45 52 4f 57 20 62 69 74 20 73 65 74 20 69 6e  NEROW bit set in
2fac0 20 77 73 46 6c 61 67 73 2e 0a 20 20 2a 2a 0a 20   wsFlags..  **. 
2fad0 20 2a 2a 20 57 65 20 73 61 79 20 74 68 65 20 57   ** We say the W
2fae0 68 65 72 65 4c 6f 6f 70 20 69 73 20 22 6f 72 64  hereLoop is "ord
2faf0 65 72 2d 64 69 73 74 69 6e 63 74 22 20 69 66 20  er-distinct" if 
2fb00 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6c 75 6d  the set of colum
2fb10 6e 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 61  ns from.  ** tha
2fb20 74 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74  t WhereLoop that
2fb30 20 61 72 65 20 69 6e 20 74 68 65 20 4f 52 44 45   are in the ORDE
2fb40 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20  R BY clause are 
2fb50 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76  different for ev
2fb60 65 72 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20  ery.  ** row of 
2fb70 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 20 20  the WhereLoop.  
2fb80 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68  Every one-row Wh
2fb90 65 72 65 4c 6f 6f 70 20 69 73 20 61 75 74 6f 6d  ereLoop is autom
2fba0 61 74 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 6f 72  atically.  ** or
2fbb0 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 20 20 20  der-distinct.   
2fbc0 41 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74  A WhereLoop that
2fbd0 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 73 20   has no columns 
2fbe0 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  in the ORDER BY 
2fbf0 63 6c 61 75 73 65 0a 20 20 2a 2a 20 69 73 20 6e  clause.  ** is n
2fc00 6f 74 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  ot order-distinc
2fc10 74 2e 20 54 6f 20 62 65 20 6f 72 64 65 72 2d 64  t. To be order-d
2fc20 69 73 74 69 6e 63 74 20 69 73 20 6e 6f 74 20 71  istinct is not q
2fc30 75 69 74 65 20 74 68 65 20 73 61 6d 65 20 61 73  uite the same as
2fc40 20 62 65 69 6e 67 0a 20 20 2a 2a 20 55 4e 49 51   being.  ** UNIQ
2fc50 55 45 20 73 69 6e 63 65 20 61 20 55 4e 49 51 55  UE since a UNIQU
2fc60 45 20 63 6f 6c 75 6d 6e 20 6f 72 20 69 6e 64 65  E column or inde
2fc70 78 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 69  x can have multi
2fc80 70 6c 65 20 72 6f 77 73 20 74 68 61 74 20 0a 20  ple rows that . 
2fc90 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 20 61 6e 64   ** are NULL and
2fca0 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65   NULL values are
2fcb0 20 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 20   equivalent for 
2fcc0 74 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 6f  the purpose of o
2fcd0 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20  rder-distinct.. 
2fce0 20 2a 2a 20 54 6f 20 62 65 20 6f 72 64 65 72 2d   ** To be order-
2fcf0 64 69 73 74 69 6e 63 74 2c 20 74 68 65 20 63 6f  distinct, the co
2fd00 6c 75 6d 6e 73 20 6d 75 73 74 20 62 65 20 55 4e  lumns must be UN
2fd10 49 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c  IQUE and NOT NUL
2fd20 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  L..  **.  ** The
2fd30 20 72 6f 77 69 64 20 66 6f 72 20 61 20 74 61 62   rowid for a tab
2fd40 6c 65 20 69 73 20 61 6c 77 61 79 73 20 55 4e 49  le is always UNI
2fd50 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c  QUE and NOT NULL
2fd60 20 73 6f 20 77 68 65 6e 65 76 65 72 20 74 68 65   so whenever the
2fd70 0a 20 20 2a 2a 20 72 6f 77 69 64 20 61 70 70 65  .  ** rowid appe
2fd80 61 72 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52  ars in the ORDER
2fd90 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 20   BY clause, the 
2fda0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68  corresponding Wh
2fdb0 65 72 65 4c 6f 6f 70 20 69 73 0a 20 20 2a 2a 20  ereLoop is.  ** 
2fdc0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 6f 72  automatically or
2fdd0 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20 20  der-distinct..  
2fde0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  */..  assert( pO
2fdf0 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 69  rderBy!=0 );.  i
2fe00 66 28 20 6e 4c 6f 6f 70 20 26 26 20 4f 70 74 69  f( nLoop && Opti
2fe10 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64  mizationDisabled
2fe20 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 72 64 65  (db, SQLITE_Orde
2fe30 72 42 79 49 64 78 4a 6f 69 6e 29 20 29 20 72 65  rByIdxJoin) ) re
2fe40 74 75 72 6e 20 30 3b 0a 0a 20 20 6e 4f 72 64 65  turn 0;..  nOrde
2fe50 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  rBy = pOrderBy->
2fe60 6e 45 78 70 72 3b 0a 20 20 74 65 73 74 63 61 73  nExpr;.  testcas
2fe70 65 28 20 6e 4f 72 64 65 72 42 79 3d 3d 42 4d 53  e( nOrderBy==BMS
2fe80 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 4f 72 64  -1 );.  if( nOrd
2fe90 65 72 42 79 3e 42 4d 53 2d 31 20 29 20 72 65 74  erBy>BMS-1 ) ret
2fea0 75 72 6e 20 30 3b 20 20 2f 2a 20 43 61 6e 6e 6f  urn 0;  /* Canno
2feb0 74 20 6f 70 74 69 6d 69 7a 65 20 6f 76 65 72 6c  t optimize overl
2fec0 79 20 6c 61 72 67 65 20 4f 52 44 45 52 20 42 59  y large ORDER BY
2fed0 73 20 2a 2f 0a 20 20 69 73 4f 72 64 65 72 44 69  s */.  isOrderDi
2fee0 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20 6f 62  stinct = 1;.  ob
2fef0 44 6f 6e 65 20 3d 20 4d 41 53 4b 42 49 54 28 6e  Done = MASKBIT(n
2ff00 4f 72 64 65 72 42 79 29 2d 31 3b 0a 20 20 6f 72  OrderBy)-1;.  or
2ff10 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 20  derDistinctMask 
2ff20 3d 20 30 3b 0a 20 20 72 65 61 64 79 20 3d 20 30  = 0;.  ready = 0
2ff30 3b 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b  ;.  for(iLoop=0;
2ff40 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
2ff50 20 26 26 20 6f 62 53 61 74 3c 6f 62 44 6f 6e 65   && obSat<obDone
2ff60 20 26 26 20 69 4c 6f 6f 70 3c 3d 6e 4c 6f 6f 70   && iLoop<=nLoop
2ff70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20  ; iLoop++){.    
2ff80 69 66 28 20 69 4c 6f 6f 70 3e 30 20 29 20 72 65  if( iLoop>0 ) re
2ff90 61 64 79 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61  ady |= pLoop->ma
2ffa0 73 6b 53 65 6c 66 3b 0a 20 20 20 20 70 4c 6f 6f  skSelf;.    pLoo
2ffb0 70 20 3d 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 20  p = iLoop<nLoop 
2ffc0 3f 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69  ? pPath->aLoop[i
2ffd0 4c 6f 6f 70 5d 20 3a 20 70 4c 61 73 74 3b 0a 20  Loop] : pLast;. 
2ffe0 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73     if( pLoop->ws
2fff0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
30000 52 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20  RTUALTABLE ){.  
30010 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 75      if( pLoop->u
30020 2e 76 74 61 62 2e 69 73 4f 72 64 65 72 65 64 20  .vtab.isOrdered 
30030 29 20 6f 62 53 61 74 20 3d 20 6f 62 44 6f 6e 65  ) obSat = obDone
30040 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
30050 20 20 20 7d 0a 20 20 20 20 69 43 75 72 20 3d 20     }.    iCur = 
30060 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
30070 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d  ->a[pLoop->iTab]
30080 2e 69 43 75 72 73 6f 72 3b 0a 0a 20 20 20 20 2f  .iCursor;..    /
30090 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79 20 4f  * Mark off any O
300a0 52 44 45 52 20 42 59 20 74 65 72 6d 20 58 20 74  RDER BY term X t
300b0 68 61 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20  hat is a column 
300c0 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 66 0a  in the table of.
300d0 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65      ** the curre
300e0 6e 74 20 6c 6f 6f 70 20 66 6f 72 20 77 68 69 63  nt loop for whic
300f0 68 20 74 68 65 72 65 20 69 73 20 74 65 72 6d 20  h there is term 
30100 69 6e 20 74 68 65 20 57 48 45 52 45 0a 20 20 20  in the WHERE.   
30110 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 74 68   ** clause of th
30120 65 20 66 6f 72 6d 20 58 20 49 53 20 4e 55 4c 4c  e form X IS NULL
30130 20 6f 72 20 58 3d 3f 20 74 68 61 74 20 72 65 66   or X=? that ref
30140 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 75 74 65  erence only oute
30150 72 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70 73 2e 0a  r.    ** loops..
30160 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
30170 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20  =0; i<nOrderBy; 
30180 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
30190 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53  MASKBIT(i) & obS
301a0 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  at ) continue;. 
301b0 20 20 20 20 20 70 4f 42 45 78 70 72 20 3d 20 73       pOBExpr = s
301c0 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
301d0 6c 6c 61 74 65 28 70 4f 72 64 65 72 42 79 2d 3e  llate(pOrderBy->
301e0 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
301f0 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e     if( pOBExpr->
30200 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20  op!=TK_COLUMN ) 
30210 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
30220 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 54 61  if( pOBExpr->iTa
30230 62 6c 65 21 3d 69 43 75 72 20 29 20 63 6f 6e 74  ble!=iCur ) cont
30240 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 54 65 72  inue;.      pTer
30250 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 26 70 57  m = findTerm(&pW
30260 49 6e 66 6f 2d 3e 73 57 43 2c 20 69 43 75 72 2c  Info->sWC, iCur,
30270 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   pOBExpr->iColum
30280 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
30290 20 20 20 20 20 20 20 20 20 20 7e 72 65 61 64 79            ~ready
302a0 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c  , WO_EQ|WO_ISNUL
302b0 4c 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  L, 0);.      if(
302c0 20 70 54 65 72 6d 3d 3d 30 20 29 20 63 6f 6e 74   pTerm==0 ) cont
302d0 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
302e0 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
302f0 72 26 57 4f 5f 45 51 29 21 3d 30 20 26 26 20 70  r&WO_EQ)!=0 && p
30300 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e  OBExpr->iColumn>
30310 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  =0 ){.        co
30320 6e 73 74 20 63 68 61 72 20 2a 7a 31 2c 20 2a 7a  nst char *z1, *z
30330 32 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  2;.        pColl
30340 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
30350 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50  llSeq(pWInfo->pP
30360 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e  arse, pOrderBy->
30370 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
30380 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
30390 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44  ) pColl = db->pD
303a0 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  fltColl;.       
303b0 20 7a 31 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e 61   z1 = pColl->zNa
303c0 6d 65 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  me;.        pCol
303d0 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
303e0 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70  ollSeq(pWInfo->p
303f0 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45  Parse, pTerm->pE
30400 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  xpr);.        if
30410 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c  ( !pColl ) pColl
30420 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
30430 3b 0a 20 20 20 20 20 20 20 20 7a 32 20 3d 20 70  ;.        z2 = p
30440 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  Coll->zName;.   
30450 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
30460 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29 21  StrICmp(z1, z2)!
30470 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
30480 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6f 62 53       }.      obS
30490 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29  at |= MASKBIT(i)
304a0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
304b0 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
304c0 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29   & WHERE_ONEROW)
304d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
304e0 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
304f0 26 20 57 48 45 52 45 5f 49 50 4b 20 29 7b 0a 20  & WHERE_IPK ){. 
30500 20 20 20 20 20 20 20 70 49 6e 64 65 78 20 3d 20         pIndex = 
30510 30 3b 0a 20 20 20 20 20 20 20 20 6e 4b 65 79 43  0;.        nKeyC
30520 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ol = 0;.        
30530 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20 20  nColumn = 1;.   
30540 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 49     }else if( (pI
30550 6e 64 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e  ndex = pLoop->u.
30560 62 74 72 65 65 2e 70 49 6e 64 65 78 29 3d 3d 30  btree.pIndex)==0
30570 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f   || pIndex->bUno
30580 72 64 65 72 65 64 20 29 7b 0a 20 20 20 20 20 20  rdered ){.      
30590 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
305a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
305b0 20 6e 4b 65 79 43 6f 6c 20 3d 20 70 49 6e 64 65   nKeyCol = pInde
305c0 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20  x->nKeyCol;.    
305d0 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49      nColumn = pI
305e0 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20  ndex->nColumn;. 
305f0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
30600 43 6f 6c 75 6d 6e 3d 3d 6e 4b 65 79 43 6f 6c 2b  Column==nKeyCol+
30610 31 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70  1 || !HasRowid(p
30620 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 29 20 29  Index->pTable) )
30630 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
30640 28 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  ( pIndex->aiColu
30650 6d 6e 5b 6e 43 6f 6c 75 6d 6e 2d 31 5d 3d 3d 28  mn[nColumn-1]==(
30660 2d 31 29 20 7c 7c 20 21 48 61 73 52 6f 77 69 64  -1) || !HasRowid
30670 28 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 29  (pIndex->pTable)
30680 29 3b 0a 20 20 20 20 20 20 20 20 69 73 4f 72 64  );.        isOrd
30690 65 72 44 69 73 74 69 6e 63 74 20 3d 20 49 73 55  erDistinct = IsU
306a0 6e 69 71 75 65 49 6e 64 65 78 28 70 49 6e 64 65  niqueIndex(pInde
306b0 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  x);.      }..   
306c0 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75     /* Loop throu
306d0 67 68 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f  gh all columns o
306e0 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  f the index and 
306f0 64 65 61 6c 20 77 69 74 68 20 74 68 65 20 6f 6e  deal with the on
30700 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  es.      ** that
30710 20 61 72 65 20 6e 6f 74 20 63 6f 6e 73 74 72 61   are not constra
30720 69 6e 65 64 20 62 79 20 3d 3d 20 6f 72 20 49 4e  ined by == or IN
30730 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
30740 20 72 65 76 20 3d 20 72 65 76 53 65 74 20 3d 20   rev = revSet = 
30750 30 3b 0a 20 20 20 20 20 20 64 69 73 74 69 6e 63  0;.      distinc
30760 74 43 6f 6c 75 6d 6e 73 20 3d 20 30 3b 0a 20 20  tColumns = 0;.  
30770 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
30780 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  Column; j++){.  
30790 20 20 20 20 20 20 75 38 20 62 4f 6e 63 65 3b 20        u8 bOnce; 
307a0 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 75 6e    /* True to run
307b0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 73 65   the ORDER BY se
307c0 61 72 63 68 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20  arch loop */..  
307d0 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 6f 76        /* Skip ov
307e0 65 72 20 3d 3d 20 61 6e 64 20 49 53 20 4e 55 4c  er == and IS NUL
307f0 4c 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20  L terms */.     
30800 20 20 20 69 66 28 20 6a 3c 70 4c 6f 6f 70 2d 3e     if( j<pLoop->
30810 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20 20 20  u.btree.nEq.    
30820 20 20 20 20 20 26 26 20 70 4c 6f 6f 70 2d 3e 75       && pLoop->u
30830 2e 62 74 72 65 65 2e 6e 53 6b 69 70 3d 3d 30 0a  .btree.nSkip==0.
30840 20 20 20 20 20 20 20 20 20 26 26 20 28 28 69 20           && ((i 
30850 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  = pLoop->aLTerm[
30860 6a 5d 2d 3e 65 4f 70 65 72 61 74 6f 72 29 20 26  j]->eOperator) &
30870 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c   (WO_EQ|WO_ISNUL
30880 4c 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20 29  L))!=0.        )
30890 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
308a0 69 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b  i & WO_ISNULL ){
308b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
308c0 74 63 61 73 65 28 20 69 73 4f 72 64 65 72 44 69  tcase( isOrderDi
308d0 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20  stinct );.      
308e0 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73        isOrderDis
308f0 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20  tinct = 0;.     
30900 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
30910 20 63 6f 6e 74 69 6e 75 65 3b 20 20 0a 20 20 20   continue;  .   
30920 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
30930 2f 2a 20 47 65 74 20 74 68 65 20 63 6f 6c 75 6d  /* Get the colum
30940 6e 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20  n number in the 
30950 74 61 62 6c 65 20 28 69 43 6f 6c 75 6d 6e 29 20  table (iColumn) 
30960 61 6e 64 20 73 6f 72 74 20 6f 72 64 65 72 0a 20  and sort order. 
30970 20 20 20 20 20 20 20 2a 2a 20 28 72 65 76 49 64         ** (revId
30980 78 29 20 66 6f 72 20 74 68 65 20 6a 2d 74 68 20  x) for the j-th 
30990 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e  column of the in
309a0 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  dex..        */.
309b0 20 20 20 20 20 20 20 20 69 66 28 20 70 49 6e 64          if( pInd
309c0 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ex ){.          
309d0 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78  iColumn = pIndex
309e0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20  ->aiColumn[j];. 
309f0 20 20 20 20 20 20 20 20 20 72 65 76 49 64 78 20           revIdx 
30a00 3d 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f  = pIndex->aSortO
30a10 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  rder[j];.       
30a20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d     if( iColumn==
30a30 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
30a40 69 50 4b 65 79 20 29 20 69 43 6f 6c 75 6d 6e 20  iPKey ) iColumn 
30a50 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65  = -1;.        }e
30a60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
30a70 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20  Column = -1;.   
30a80 20 20 20 20 20 20 20 72 65 76 49 64 78 20 3d 20         revIdx = 
30a90 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  0;.        }..  
30aa0 20 20 20 20 20 20 2f 2a 20 41 6e 20 75 6e 63 6f        /* An unco
30ab0 6e 73 74 72 61 69 6e 65 64 20 63 6f 6c 75 6d 6e  nstrained column
30ac0 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 4e   that might be N
30ad0 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74  ULL means that t
30ae0 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 57  his.        ** W
30af0 68 65 72 65 4c 6f 6f 70 20 69 73 20 6e 6f 74 20  hereLoop is not 
30b00 77 65 6c 6c 2d 6f 72 64 65 72 65 64 0a 20 20 20  well-ordered.   
30b10 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
30b20 69 66 28 20 69 73 4f 72 64 65 72 44 69 73 74 69  if( isOrderDisti
30b30 6e 63 74 0a 20 20 20 20 20 20 20 20 20 26 26 20  nct.         && 
30b40 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20 20 20  iColumn>=0.     
30b50 20 20 20 20 26 26 20 6a 3e 3d 70 4c 6f 6f 70 2d      && j>=pLoop-
30b60 3e 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20 20  >u.btree.nEq.   
30b70 20 20 20 20 20 20 26 26 20 70 49 6e 64 65 78 2d        && pIndex-
30b80 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43  >pTable->aCol[iC
30b90 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d  olumn].notNull==
30ba0 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  0.        ){.   
30bb0 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69         isOrderDi
30bc0 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20  stinct = 0;.    
30bd0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
30be0 2a 20 46 69 6e 64 20 74 68 65 20 4f 52 44 45 52  * Find the ORDER
30bf0 20 42 59 20 74 65 72 6d 20 74 68 61 74 20 63 6f   BY term that co
30c00 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65  rresponds to the
30c10 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 0a 20 20 20   j-th column.   
30c20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 69       ** of the i
30c30 6e 64 65 78 20 61 6e 64 20 6d 61 72 6b 20 74 68  ndex and mark th
30c40 61 74 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  at ORDER BY term
30c50 20 6f 66 66 20 0a 20 20 20 20 20 20 20 20 2a 2f   off .        */
30c60 0a 20 20 20 20 20 20 20 20 62 4f 6e 63 65 20 3d  .        bOnce =
30c70 20 31 3b 0a 20 20 20 20 20 20 20 20 69 73 4d 61   1;.        isMa
30c80 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  tch = 0;.       
30c90 20 66 6f 72 28 69 3d 30 3b 20 62 4f 6e 63 65 20   for(i=0; bOnce 
30ca0 26 26 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69  && i<nOrderBy; i
30cb0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
30cc0 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20  f( MASKBIT(i) & 
30cd0 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65  obSat ) continue
30ce0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 42 45  ;.          pOBE
30cf0 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
30d00 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72  rSkipCollate(pOr
30d10 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
30d20 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  r);.          te
30d30 73 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61  stcase( wctrlFla
30d40 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50  gs & WHERE_GROUP
30d50 42 59 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  BY );.          
30d60 74 65 73 74 63 61 73 65 28 20 77 63 74 72 6c 46  testcase( wctrlF
30d70 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 49 53  lags & WHERE_DIS
30d80 54 49 4e 43 54 42 59 20 29 3b 0a 20 20 20 20 20  TINCTBY );.     
30d90 20 20 20 20 20 69 66 28 20 28 77 63 74 72 6c 46       if( (wctrlF
30da0 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 47 52  lags & (WHERE_GR
30db0 4f 55 50 42 59 7c 57 48 45 52 45 5f 44 49 53 54  OUPBY|WHERE_DIST
30dc0 49 4e 43 54 42 59 29 29 3d 3d 30 20 29 20 62 4f  INCTBY))==0 ) bO
30dd0 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nce = 0;.       
30de0 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e     if( pOBExpr->
30df0 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20  op!=TK_COLUMN ) 
30e00 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
30e10 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d      if( pOBExpr-
30e20 3e 69 54 61 62 6c 65 21 3d 69 43 75 72 20 29 20  >iTable!=iCur ) 
30e30 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
30e40 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d      if( pOBExpr-
30e50 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d  >iColumn!=iColum
30e60 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  n ) continue;.  
30e70 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
30e80 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  umn>=0 ){.      
30e90 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
30ea0 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
30eb0 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c  (pWInfo->pParse,
30ec0 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
30ed0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
30ee0 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
30ef0 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
30f00 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  ltColl;.        
30f10 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
30f20 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e  trICmp(pColl->zN
30f30 61 6d 65 2c 20 70 49 6e 64 65 78 2d 3e 61 7a 43  ame, pIndex->azC
30f40 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 20 63 6f 6e  oll[j])!=0 ) con
30f50 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
30f60 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 73 4d   }.          isM
30f70 61 74 63 68 20 3d 20 31 3b 0a 20 20 20 20 20 20  atch = 1;.      
30f80 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
30f90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
30fa0 20 69 73 4d 61 74 63 68 20 26 26 20 28 70 57 49   isMatch && (pWI
30fb0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
30fc0 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 29  & WHERE_GROUPBY)
30fd0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
30fe0 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
30ff0 65 20 73 6f 72 74 20 6f 72 64 65 72 20 69 73 20  e sort order is 
31000 63 6f 6d 70 61 74 69 62 6c 65 20 69 6e 20 61 6e  compatible in an
31010 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
31020 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53  ..          ** S
31030 6f 72 74 20 6f 72 64 65 72 20 69 73 20 69 72 72  ort order is irr
31040 65 6c 65 76 61 6e 74 20 66 6f 72 20 61 20 47 52  elevant for a GR
31050 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 2a  OUP BY clause. *
31060 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
31070 72 65 76 53 65 74 20 29 7b 0a 20 20 20 20 20 20  revSet ){.      
31080 20 20 20 20 20 20 69 66 28 20 28 72 65 76 20 5e        if( (rev ^
31090 20 72 65 76 49 64 78 29 21 3d 70 4f 72 64 65 72   revIdx)!=pOrder
310a0 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64  By->a[i].sortOrd
310b0 65 72 20 29 20 69 73 4d 61 74 63 68 20 3d 20 30  er ) isMatch = 0
310c0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
310d0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  e{.            r
310e0 65 76 20 3d 20 72 65 76 49 64 78 20 5e 20 70 4f  ev = revIdx ^ pO
310f0 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72  rderBy->a[i].sor
31100 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 20 20  tOrder;.        
31110 20 20 20 20 69 66 28 20 72 65 76 20 29 20 2a 70      if( rev ) *p
31120 52 65 76 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b 42  RevMask |= MASKB
31130 49 54 28 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  IT(iLoop);.     
31140 20 20 20 20 20 20 20 72 65 76 53 65 74 20 3d 20         revSet = 
31150 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  1;.          }. 
31160 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31170 20 69 66 28 20 69 73 4d 61 74 63 68 20 29 7b 0a   if( isMatch ){.
31180 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43            if( iC
31190 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20  olumn<0 ){.     
311a0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
311b0 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73   distinctColumns
311c0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
311d0 20 20 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d     distinctColum
311e0 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ns = 1;.        
311f0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6f 62    }.          ob
31200 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69  Sat |= MASKBIT(i
31210 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
31220 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  {.          /* N
31230 6f 20 6d 61 74 63 68 20 66 6f 75 6e 64 20 2a 2f  o match found */
31240 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a  .          if( j
31250 3d 3d 30 20 7c 7c 20 6a 3c 6e 4b 65 79 43 6f 6c  ==0 || j<nKeyCol
31260 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
31270 74 65 73 74 63 61 73 65 28 20 69 73 4f 72 64 65  testcase( isOrde
31280 72 44 69 73 74 69 6e 63 74 21 3d 30 20 29 3b 0a  rDistinct!=0 );.
31290 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
312a0 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b  derDistinct = 0;
312b0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
312c0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
312d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20        }.      } 
312e0 2f 2a 20 65 6e 64 20 4c 6f 6f 70 20 6f 76 65 72  /* end Loop over
312f0 20 61 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d   all index colum
31300 6e 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ns */.      if( 
31310 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20  distinctColumns 
31320 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  ){.        testc
31330 61 73 65 28 20 69 73 4f 72 64 65 72 44 69 73 74  ase( isOrderDist
31340 69 6e 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  inct==0 );.     
31350 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e     isOrderDistin
31360 63 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ct = 1;.      }.
31370 20 20 20 20 7d 20 2f 2a 20 65 6e 64 2d 69 66 20      } /* end-if 
31380 6e 6f 74 20 6f 6e 65 2d 72 6f 77 20 2a 2f 0a 0a  not one-row */..
31390 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20      /* Mark off 
313a0 61 6e 79 20 6f 74 68 65 72 20 4f 52 44 45 52 20  any other ORDER 
313b0 42 59 20 74 65 72 6d 73 20 74 68 61 74 20 72 65  BY terms that re
313c0 66 65 72 65 6e 63 65 20 70 4c 6f 6f 70 20 2a 2f  ference pLoop */
313d0 0a 20 20 20 20 69 66 28 20 69 73 4f 72 64 65 72  .    if( isOrder
313e0 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
313f0 20 20 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d    orderDistinctM
31400 61 73 6b 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61  ask |= pLoop->ma
31410 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 66 6f  skSelf;.      fo
31420 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42  r(i=0; i<nOrderB
31430 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  y; i++){.       
31440 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 20 20   Expr *p;.      
31450 20 20 42 69 74 6d 61 73 6b 20 6d 54 65 72 6d 3b    Bitmask mTerm;
31460 0a 20 20 20 20 20 20 20 20 69 66 28 20 4d 41 53  .        if( MAS
31470 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61 74 20  KBIT(i) & obSat 
31480 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
31490 20 20 20 20 70 20 3d 20 70 4f 72 64 65 72 42 79      p = pOrderBy
314a0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
314b0 20 20 20 20 20 20 6d 54 65 72 6d 20 3d 20 65 78        mTerm = ex
314c0 70 72 54 61 62 6c 65 55 73 61 67 65 28 26 70 57  prTableUsage(&pW
314d0 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 70  Info->sMaskSet,p
314e0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d  );.        if( m
314f0 54 65 72 6d 3d 3d 30 20 26 26 20 21 73 71 6c 69  Term==0 && !sqli
31500 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
31510 74 28 70 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  t(p) ) continue;
31520 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d 54  .        if( (mT
31530 65 72 6d 26 7e 6f 72 64 65 72 44 69 73 74 69 6e  erm&~orderDistin
31540 63 74 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20  ctMask)==0 ){.  
31550 20 20 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d          obSat |=
31560 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20   MASKBIT(i);.   
31570 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
31580 20 20 20 7d 0a 20 20 7d 20 2f 2a 20 45 6e 64 20     }.  } /* End 
31590 74 68 65 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c  the loop over al
315a0 6c 20 57 68 65 72 65 4c 6f 6f 70 73 20 66 72 6f  l WhereLoops fro
315b0 6d 20 6f 75 74 65 72 2d 6d 6f 73 74 20 64 6f 77  m outer-most dow
315c0 6e 20 74 6f 20 69 6e 6e 65 72 2d 6d 6f 73 74 20  n to inner-most 
315d0 2a 2f 0a 20 20 69 66 28 20 6f 62 53 61 74 3d 3d  */.  if( obSat==
315e0 6f 62 44 6f 6e 65 20 29 20 72 65 74 75 72 6e 20  obDone ) return 
315f0 28 69 38 29 6e 4f 72 64 65 72 42 79 3b 0a 20 20  (i8)nOrderBy;.  
31600 69 66 28 20 21 69 73 4f 72 64 65 72 44 69 73 74  if( !isOrderDist
31610 69 6e 63 74 20 29 7b 0a 20 20 20 20 66 6f 72 28  inct ){.    for(
31620 69 3d 6e 4f 72 64 65 72 42 79 2d 31 3b 20 69 3e  i=nOrderBy-1; i>
31630 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 42  0; i--){.      B
31640 69 74 6d 61 73 6b 20 6d 20 3d 20 4d 41 53 4b 42  itmask m = MASKB
31650 49 54 28 69 29 20 2d 20 31 3b 0a 20 20 20 20 20  IT(i) - 1;.     
31660 20 69 66 28 20 28 6f 62 53 61 74 26 6d 29 3d 3d   if( (obSat&m)==
31670 6d 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20  m ) return i;.  
31680 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30    }.    return 0
31690 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  ;.  }.  return -
316a0 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  1;.}.../*.** If 
316b0 74 68 65 20 57 48 45 52 45 5f 47 52 4f 55 50 42  the WHERE_GROUPB
316c0 59 20 66 6c 61 67 20 69 73 20 73 65 74 20 69 6e  Y flag is set in
316d0 20 74 68 65 20 6d 61 73 6b 20 70 61 73 73 65 64   the mask passed
316e0 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
316f0 42 65 67 69 6e 28 29 2c 0a 2a 2a 20 74 68 65 20  Begin(),.** the 
31700 70 6c 61 6e 6e 65 72 20 61 73 73 75 6d 65 73 20  planner assumes 
31710 74 68 61 74 20 74 68 65 20 73 70 65 63 69 66 69  that the specifi
31720 65 64 20 70 4f 72 64 65 72 42 79 20 6c 69 73 74  ed pOrderBy list
31730 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 47   is actually a G
31740 52 4f 55 50 0a 2a 2a 20 42 59 20 63 6c 61 75 73  ROUP.** BY claus
31750 65 20 2d 20 61 6e 64 20 73 6f 20 61 6e 79 20 6f  e - and so any o
31760 72 64 65 72 20 74 68 61 74 20 67 72 6f 75 70 73  rder that groups
31770 20 72 6f 77 73 20 61 73 20 72 65 71 75 69 72 65   rows as require
31780 64 20 73 61 74 69 73 66 69 65 73 20 74 68 65 0a  d satisfies the.
31790 2a 2a 20 72 65 71 75 65 73 74 2e 0a 2a 2a 0a 2a  ** request..**.*
317a0 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 6e 20 74  * Normally, in t
317b0 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20 6e  his case it is n
317c0 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
317d0 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 64 65  the caller to de
317e0 74 65 72 6d 69 6e 65 0a 2a 2a 20 77 68 65 74 68  termine.** wheth
317f0 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 72 6f  er or not the ro
31800 77 73 20 61 72 65 20 72 65 61 6c 6c 79 20 62 65  ws are really be
31810 69 6e 67 20 64 65 6c 69 76 65 72 65 64 20 69 6e  ing delivered in
31820 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2c 20 6f   sorted order, o
31830 72 0a 2a 2a 20 6a 75 73 74 20 69 6e 20 73 6f 6d  r.** just in som
31840 65 20 6f 74 68 65 72 20 6f 72 64 65 72 20 74 68  e other order th
31850 61 74 20 70 72 6f 76 69 64 65 73 20 74 68 65 20  at provides the 
31860 72 65 71 75 69 72 65 64 20 67 72 6f 75 70 69 6e  required groupin
31870 67 2e 20 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 69  g. However,.** i
31880 66 20 74 68 65 20 57 48 45 52 45 5f 53 4f 52 54  f the WHERE_SORT
31890 42 59 47 52 4f 55 50 20 66 6c 61 67 20 69 73 20  BYGROUP flag is 
318a0 61 6c 73 6f 20 70 61 73 73 65 64 20 74 6f 20 73  also passed to s
318b0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
318c0 28 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73  (), then.** this
318d0 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65   function may be
318e0 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 72   called on the r
318f0 65 74 75 72 6e 65 64 20 57 68 65 72 65 49 6e 66  eturned WhereInf
31900 6f 20 6f 62 6a 65 63 74 2e 20 49 74 20 72 65 74  o object. It ret
31910 75 72 6e 73 0a 2a 2a 20 74 72 75 65 20 69 66 20  urns.** true if 
31920 74 68 65 20 72 6f 77 73 20 72 65 61 6c 6c 79 20  the rows really 
31930 77 69 6c 6c 20 62 65 20 73 6f 72 74 65 64 20 69  will be sorted i
31940 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  n the specified 
31950 6f 72 64 65 72 2c 20 6f 72 20 66 61 6c 73 65 0a  order, or false.
31960 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a  ** otherwise..**
31970 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  .** For example,
31980 20 61 73 73 75 6d 69 6e 67 3a 0a 2a 2a 0a 2a 2a   assuming:.**.**
31990 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
319a0 69 31 20 4f 4e 20 74 31 28 78 2c 20 59 29 3b 0a  i1 ON t1(x, Y);.
319b0 2a 2a 0a 2a 2a 20 74 68 65 6e 0a 2a 2a 0a 2a 2a  **.** then.**.**
319c0 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
319d0 20 74 31 20 47 52 4f 55 50 20 42 59 20 78 2c 79   t1 GROUP BY x,y
319e0 20 4f 52 44 45 52 20 42 59 20 78 2c 79 3b 20 20   ORDER BY x,y;  
319f0 20 2d 2d 20 49 73 53 6f 72 74 65 64 28 29 3d 3d   -- IsSorted()==
31a00 31 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20  1.**   SELECT * 
31a10 46 52 4f 4d 20 74 31 20 47 52 4f 55 50 20 42 59  FROM t1 GROUP BY
31a20 20 79 2c 78 20 4f 52 44 45 52 20 42 59 20 79 2c   y,x ORDER BY y,
31a30 78 3b 20 20 20 2d 2d 20 49 73 53 6f 72 74 65 64  x;   -- IsSorted
31a40 28 29 3d 3d 30 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ()==0.*/.int sql
31a50 69 74 65 33 57 68 65 72 65 49 73 53 6f 72 74 65  ite3WhereIsSorte
31a60 64 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49  d(WhereInfo *pWI
31a70 6e 66 6f 29 7b 0a 20 20 61 73 73 65 72 74 28 20  nfo){.  assert( 
31a80 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
31a90 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50  gs & WHERE_GROUP
31aa0 42 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  BY );.  assert( 
31ab0 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
31ac0 67 73 20 26 20 57 48 45 52 45 5f 53 4f 52 54 42  gs & WHERE_SORTB
31ad0 59 47 52 4f 55 50 20 29 3b 0a 20 20 72 65 74 75  YGROUP );.  retu
31ae0 72 6e 20 70 57 49 6e 66 6f 2d 3e 73 6f 72 74 65  rn pWInfo->sorte
31af0 64 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 57 48 45  d;.}..#ifdef WHE
31b00 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  RETRACE_ENABLED.
31b10 2f 2a 20 46 6f 72 20 64 65 62 75 67 67 69 6e 67  /* For debugging
31b20 20 75 73 65 20 6f 6e 6c 79 3a 20 2a 2f 0a 73 74   use only: */.st
31b30 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
31b40 2a 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 57  *wherePathName(W
31b50 68 65 72 65 50 61 74 68 20 2a 70 50 61 74 68 2c  herePath *pPath,
31b60 20 69 6e 74 20 6e 4c 6f 6f 70 2c 20 57 68 65 72   int nLoop, Wher
31b70 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 29 7b 0a 20  eLoop *pLast){. 
31b80 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 4e 61   static char zNa
31b90 6d 65 5b 36 35 5d 3b 0a 20 20 69 6e 74 20 69 3b  me[65];.  int i;
31ba0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4c  .  for(i=0; i<nL
31bb0 6f 6f 70 3b 20 69 2b 2b 29 7b 20 7a 4e 61 6d 65  oop; i++){ zName
31bc0 5b 69 5d 20 3d 20 70 50 61 74 68 2d 3e 61 4c 6f  [i] = pPath->aLo
31bd0 6f 70 5b 69 5d 2d 3e 63 49 64 3b 20 7d 0a 20 20  op[i]->cId; }.  
31be0 69 66 28 20 70 4c 61 73 74 20 29 20 7a 4e 61 6d  if( pLast ) zNam
31bf0 65 5b 69 2b 2b 5d 20 3d 20 70 4c 61 73 74 2d 3e  e[i++] = pLast->
31c00 63 49 64 3b 0a 20 20 7a 4e 61 6d 65 5b 69 5d 20  cId;.  zName[i] 
31c10 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e  = 0;.  return zN
31c20 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  ame;.}.#endif../
31c30 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
31c40 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20  cost of sorting 
31c50 6e 52 6f 77 20 72 6f 77 73 2c 20 61 73 73 75 6d  nRow rows, assum
31c60 69 6e 67 20 74 68 61 74 20 74 68 65 20 6b 65 79  ing that the key
31c70 73 20 68 61 76 65 20 0a 2a 2a 20 6e 4f 72 64 65  s have .** nOrde
31c80 72 62 79 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20  rby columns and 
31c90 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20 6e  that the first n
31ca0 53 6f 72 74 65 64 20 63 6f 6c 75 6d 6e 73 20 61  Sorted columns a
31cb0 72 65 20 61 6c 72 65 61 64 79 20 69 6e 0a 2a 2a  re already in.**
31cc0 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
31cd0 63 20 4c 6f 67 45 73 74 20 77 68 65 72 65 53 6f  c LogEst whereSo
31ce0 72 74 69 6e 67 43 6f 73 74 28 0a 20 20 57 68 65  rtingCost(.  Whe
31cf0 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 0a  reInfo *pWInfo,.
31d00 20 20 4c 6f 67 45 73 74 20 6e 52 6f 77 2c 0a 20    LogEst nRow,. 
31d10 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 2c 0a 20   int nOrderBy,. 
31d20 20 69 6e 74 20 6e 53 6f 72 74 65 64 0a 29 7b 0a   int nSorted.){.
31d30 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 73 74    /* TUNING: Est
31d40 69 6d 61 74 65 64 20 63 6f 73 74 20 6f 66 20 61  imated cost of a
31d50 20 66 75 6c 6c 20 65 78 74 65 72 6e 61 6c 20 73   full external s
31d60 6f 72 74 2c 20 77 68 65 72 65 20 4e 20 69 73 20  ort, where N is 
31d70 0a 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  .  ** the number
31d80 20 6f 66 20 72 6f 77 73 20 74 6f 20 73 6f 72 74   of rows to sort
31d90 20 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   is:.  **.  **  
31da0 20 63 6f 73 74 20 3d 20 28 33 2e 30 20 2a 20 4e   cost = (3.0 * N
31db0 20 2a 20 6c 6f 67 28 4e 29 29 2e 0a 20 20 2a 2a   * log(N))..  **
31dc0 20 0a 20 20 2a 2a 20 4f 72 2c 20 69 66 20 74 68   .  ** Or, if th
31dd0 65 20 6f 72 64 65 72 2d 62 79 20 63 6c 61 75 73  e order-by claus
31de0 65 20 68 61 73 20 58 20 74 65 72 6d 73 20 62 75  e has X terms bu
31df0 74 20 6f 6e 6c 79 20 74 68 65 20 6c 61 73 74 20  t only the last 
31e00 59 20 0a 20 20 2a 2a 20 74 65 72 6d 73 20 61 72  Y .  ** terms ar
31e10 65 20 6f 75 74 20 6f 66 20 6f 72 64 65 72 2c 20  e out of order, 
31e20 74 68 65 6e 20 62 6c 6f 63 6b 2d 73 6f 72 74 69  then block-sorti
31e30 6e 67 20 77 69 6c 6c 20 72 65 64 75 63 65 20 74  ng will reduce t
31e40 68 65 20 0a 20 20 2a 2a 20 73 6f 72 74 69 6e 67  he .  ** sorting
31e50 20 63 6f 73 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20   cost to:.  **. 
31e60 20 2a 2a 20 20 20 63 6f 73 74 20 3d 20 28 33 2e   **   cost = (3.
31e70 30 20 2a 20 4e 20 2a 20 6c 6f 67 28 4e 29 29 20  0 * N * log(N)) 
31e80 2a 20 28 59 2f 58 29 0a 20 20 2a 2a 0a 20 20 2a  * (Y/X).  **.  *
31e90 2a 20 54 68 65 20 28 59 2f 58 29 20 74 65 72 6d  * The (Y/X) term
31ea0 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
31eb0 75 73 69 6e 67 20 73 74 61 63 6b 20 76 61 72 69  using stack vari
31ec0 61 62 6c 65 20 72 53 63 61 6c 65 0a 20 20 2a 2a  able rScale.  **
31ed0 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 4c 6f   below.  */.  Lo
31ee0 67 45 73 74 20 72 53 63 61 6c 65 2c 20 72 53 6f  gEst rScale, rSo
31ef0 72 74 43 6f 73 74 3b 0a 20 20 61 73 73 65 72 74  rtCost;.  assert
31f00 28 20 6e 4f 72 64 65 72 42 79 3e 30 20 26 26 20  ( nOrderBy>0 && 
31f10 36 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  66==sqlite3LogEs
31f20 74 28 31 30 30 29 20 29 3b 0a 20 20 72 53 63 61  t(100) );.  rSca
31f30 6c 65 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  le = sqlite3LogE
31f40 73 74 28 28 6e 4f 72 64 65 72 42 79 2d 6e 53 6f  st((nOrderBy-nSo
31f50 72 74 65 64 29 2a 31 30 30 2f 6e 4f 72 64 65 72  rted)*100/nOrder
31f60 42 79 29 20 2d 20 36 36 3b 0a 20 20 72 53 6f 72  By) - 66;.  rSor
31f70 74 43 6f 73 74 20 3d 20 6e 52 6f 77 20 2b 20 65  tCost = nRow + e
31f80 73 74 4c 6f 67 28 6e 52 6f 77 29 20 2b 20 72 53  stLog(nRow) + rS
31f90 63 61 6c 65 20 2b 20 31 36 3b 0a 0a 20 20 2f 2a  cale + 16;..  /*
31fa0 20 54 55 4e 49 4e 47 3a 20 54 68 65 20 63 6f 73   TUNING: The cos
31fb0 74 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e  t of implementin
31fc0 67 20 44 49 53 54 49 4e 43 54 20 75 73 69 6e 67  g DISTINCT using
31fd0 20 61 20 42 2d 54 52 45 45 20 69 73 0a 20 20 2a   a B-TREE is.  *
31fe0 2a 20 73 69 6d 69 6c 61 72 20 62 75 74 20 77 69  * similar but wi
31ff0 74 68 20 61 20 6c 61 72 67 65 72 20 63 6f 6e 73  th a larger cons
32000 74 61 6e 74 20 6f 66 20 70 72 6f 70 6f 72 74 69  tant of proporti
32010 6f 6e 61 6c 69 74 79 2e 20 0a 20 20 2a 2a 20 4d  onality. .  ** M
32020 75 6c 74 69 70 6c 79 20 62 79 20 61 6e 20 61 64  ultiply by an ad
32030 64 69 74 69 6f 6e 61 6c 20 66 61 63 74 6f 72 20  ditional factor 
32040 6f 66 20 33 2e 30 2e 20 20 2a 2f 0a 20 20 69 66  of 3.0.  */.  if
32050 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46  ( pWInfo->wctrlF
32060 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e  lags & WHERE_WAN
32070 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20  T_DISTINCT ){.  
32080 20 20 72 53 6f 72 74 43 6f 73 74 20 2b 3d 20 31    rSortCost += 1
32090 36 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  6;.  }..  return
320a0 20 72 53 6f 72 74 43 6f 73 74 3b 0a 7d 0a 0a 2f   rSortCost;.}../
320b0 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6c  *.** Given the l
320c0 69 73 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70  ist of WhereLoop
320d0 20 6f 62 6a 65 63 74 73 20 61 74 20 70 57 49 6e   objects at pWIn
320e0 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 74 68 69 73  fo->pLoops, this
320f0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 74 74 65   routine.** atte
32100 6d 70 74 73 20 74 6f 20 66 69 6e 64 20 74 68 65  mpts to find the
32110 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74   lowest cost pat
32120 68 20 74 68 61 74 20 76 69 73 69 74 73 20 65 61  h that visits ea
32130 63 68 20 57 68 65 72 65 4c 6f 6f 70 0a 2a 2a 20  ch WhereLoop.** 
32140 6f 6e 63 65 2e 20 20 54 68 69 73 20 70 61 74 68  once.  This path
32150 20 69 73 20 74 68 65 6e 20 6c 6f 61 64 65 64 20   is then loaded 
32160 69 6e 74 6f 20 74 68 65 20 70 57 49 6e 66 6f 2d  into the pWInfo-
32170 3e 61 5b 5d 2e 70 57 4c 6f 6f 70 20 66 69 65 6c  >a[].pWLoop fiel
32180 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 73 73 75 6d 65  ds..**.** Assume
32190 20 74 68 61 74 20 74 68 65 20 74 6f 74 61 6c 20   that the total 
321a0 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74  number of output
321b0 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20   rows that will 
321c0 6e 65 65 64 20 74 6f 20 62 65 20 73 6f 72 74 65  need to be sorte
321d0 64 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6e 52 6f  d.** will be nRo
321e0 77 45 73 74 20 28 69 6e 20 74 68 65 20 31 30 2a  wEst (in the 10*
321f0 6c 6f 67 32 20 72 65 70 72 65 73 65 6e 74 61 74  log2 representat
32200 69 6f 6e 29 2e 20 20 4f 72 2c 20 69 67 6e 6f 72  ion).  Or, ignor
32210 65 20 73 6f 72 74 69 6e 67 0a 2a 2a 20 63 6f 73  e sorting.** cos
32220 74 73 20 69 66 20 6e 52 6f 77 45 73 74 3d 3d 30  ts if nRowEst==0
32230 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
32240 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
32250 65 73 73 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f  ess or SQLITE_NO
32260 4d 45 4d 20 6f 66 20 61 20 6d 65 6d 6f 72 79 20  MEM of a memory 
32270 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 65 72  allocation.** er
32280 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73  ror occurs..*/.s
32290 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 50  tatic int whereP
322a0 61 74 68 53 6f 6c 76 65 72 28 57 68 65 72 65 49  athSolver(WhereI
322b0 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 4c 6f 67  nfo *pWInfo, Log
322c0 45 73 74 20 6e 52 6f 77 45 73 74 29 7b 0a 20 20  Est nRowEst){.  
322d0 69 6e 74 20 6d 78 43 68 6f 69 63 65 3b 20 20 20  int mxChoice;   
322e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
322f0 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73  imum number of s
32300 69 6d 75 6c 74 61 6e 65 6f 75 73 20 70 61 74 68  imultaneous path
32310 73 20 74 72 61 63 6b 65 64 20 2a 2f 0a 20 20 69  s tracked */.  i
32320 6e 74 20 6e 4c 6f 6f 70 3b 20 20 20 20 20 20 20  nt nLoop;       
32330 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
32340 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74  er of terms in t
32350 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 50 61 72  he join */.  Par
32360 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20  se *pParse;     
32370 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
32380 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73  g context */.  s
32390 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
323a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
323b0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
323c0 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f  ion */.  int iLo
323d0 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
323e0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
323f0 65 72 20 6f 76 65 72 20 74 68 65 20 74 65 72 6d  er over the term
32400 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f  s of the join */
32410 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 20 20  .  int ii, jj;  
32420 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32430 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
32440 0a 20 20 69 6e 74 20 6d 78 49 20 3d 20 30 3b 20  .  int mxI = 0; 
32450 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32460 49 6e 64 65 78 20 6f 66 20 6e 65 78 74 20 65 6e  Index of next en
32470 74 72 79 20 74 6f 20 72 65 70 6c 61 63 65 20 2a  try to replace *
32480 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79  /.  int nOrderBy
32490 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
324a0 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44 45 52   Number of ORDER
324b0 20 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d 73   BY clause terms
324c0 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6d 78 43   */.  LogEst mxC
324d0 6f 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ost = 0;        
324e0 2f 2a 20 4d 61 78 69 6d 75 6d 20 63 6f 73 74 20  /* Maximum cost 
324f0 6f 66 20 61 20 73 65 74 20 6f 66 20 70 61 74 68  of a set of path
32500 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6d 78  s */.  LogEst mx
32510 55 6e 73 6f 72 74 65 64 20 3d 20 30 3b 20 20 20  Unsorted = 0;   
32520 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 75 6e 73 6f   /* Maximum unso
32530 72 74 65 64 20 63 6f 73 74 20 6f 66 20 61 20 73  rted cost of a s
32540 65 74 20 6f 66 20 70 61 74 68 20 2a 2f 0a 20 20  et of path */.  
32550 69 6e 74 20 6e 54 6f 2c 20 6e 46 72 6f 6d 3b 20  int nTo, nFrom; 
32560 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
32570 62 65 72 20 6f 66 20 76 61 6c 69 64 20 65 6e 74  ber of valid ent
32580 72 69 65 73 20 69 6e 20 61 54 6f 5b 5d 20 61 6e  ries in aTo[] an
32590 64 20 61 46 72 6f 6d 5b 5d 20 2a 2f 0a 20 20 57  d aFrom[] */.  W
325a0 68 65 72 65 50 61 74 68 20 2a 61 46 72 6f 6d 3b  herePath *aFrom;
325b0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20           /* All 
325c0 6e 46 72 6f 6d 20 70 61 74 68 73 20 61 74 20 74  nFrom paths at t
325d0 68 65 20 70 72 65 76 69 6f 75 73 20 6c 65 76 65  he previous leve
325e0 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68  l */.  WherePath
325f0 20 2a 61 54 6f 3b 20 20 20 20 20 20 20 20 20 20   *aTo;          
32600 20 2f 2a 20 54 68 65 20 6e 54 6f 20 62 65 73 74   /* The nTo best
32610 20 70 61 74 68 73 20 61 74 20 74 68 65 20 63 75   paths at the cu
32620 72 72 65 6e 74 20 6c 65 76 65 6c 20 2a 2f 0a 20  rrent level */. 
32630 20 57 68 65 72 65 50 61 74 68 20 2a 70 46 72 6f   WherePath *pFro
32640 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e  m;         /* An
32650 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 46 72 6f   element of aFro
32660 6d 5b 5d 20 74 68 61 74 20 77 65 20 61 72 65 20  m[] that we are 
32670 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20  working on */.  
32680 57 68 65 72 65 50 61 74 68 20 2a 70 54 6f 3b 20  WherePath *pTo; 
32690 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
326a0 65 6c 65 6d 65 6e 74 20 6f 66 20 61 54 6f 5b 5d  element of aTo[]
326b0 20 74 68 61 74 20 77 65 20 61 72 65 20 77 6f 72   that we are wor
326c0 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65  king on */.  Whe
326d0 72 65 4c 6f 6f 70 20 2a 70 57 4c 6f 6f 70 3b 20  reLoop *pWLoop; 
326e0 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
326f0 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f   the WhereLoop o
32700 62 6a 65 63 74 73 20 2a 2f 0a 20 20 57 68 65 72  bjects */.  Wher
32710 65 4c 6f 6f 70 20 2a 2a 70 58 3b 20 20 20 20 20  eLoop **pX;     
32720 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
32730 20 64 69 76 79 20 75 70 20 74 68 65 20 70 53 70   divy up the pSp
32740 61 63 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  ace memory */.  
32750 4c 6f 67 45 73 74 20 2a 61 53 6f 72 74 43 6f 73  LogEst *aSortCos
32760 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 53 6f 72  t = 0;    /* Sor
32770 74 69 6e 67 20 61 6e 64 20 70 61 72 74 69 61 6c  ting and partial
32780 20 73 6f 72 74 69 6e 67 20 63 6f 73 74 73 20 2a   sorting costs *
32790 2f 0a 20 20 63 68 61 72 20 2a 70 53 70 61 63 65  /.  char *pSpace
327a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
327b0 20 54 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72   Temporary memor
327c0 79 20 75 73 65 64 20 62 79 20 74 68 69 73 20 72  y used by this r
327d0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
327e0 6e 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20  nSpace;         
327f0 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
32800 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  f space allocate
32810 64 20 61 74 20 70 53 70 61 63 65 20 2a 2f 0a 0a  d at pSpace */..
32820 20 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66    pParse = pWInf
32830 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20  o->pParse;.  db 
32840 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
32850 6e 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e  nLoop = pWInfo->
32860 6e 4c 65 76 65 6c 3b 0a 20 20 2f 2a 20 54 55 4e  nLevel;.  /* TUN
32870 49 4e 47 3a 20 46 6f 72 20 73 69 6d 70 6c 65 20  ING: For simple 
32880 71 75 65 72 69 65 73 2c 20 6f 6e 6c 79 20 74 68  queries, only th
32890 65 20 62 65 73 74 20 70 61 74 68 20 69 73 20 74  e best path is t
328a0 72 61 63 6b 65 64 2e 0a 20 20 2a 2a 20 46 6f 72  racked..  ** For
328b0 20 32 2d 77 61 79 20 6a 6f 69 6e 73 2c 20 74 68   2-way joins, th
328c0 65 20 35 20 62 65 73 74 20 70 61 74 68 73 20 61  e 5 best paths a
328d0 72 65 20 66 6f 6c 6c 6f 77 65 64 2e 0a 20 20 2a  re followed..  *
328e0 2a 20 46 6f 72 20 6a 6f 69 6e 73 20 6f 66 20 33  * For joins of 3
328f0 20 6f 72 20 6d 6f 72 65 20 74 61 62 6c 65 73 2c   or more tables,
32900 20 74 72 61 63 6b 20 74 68 65 20 31 30 20 62 65   track the 10 be
32910 73 74 20 70 61 74 68 73 20 2a 2f 0a 20 20 6d 78  st paths */.  mx
32920 43 68 6f 69 63 65 20 3d 20 28 6e 4c 6f 6f 70 3c  Choice = (nLoop<
32930 3d 31 29 20 3f 20 31 20 3a 20 28 6e 4c 6f 6f 70  =1) ? 1 : (nLoop
32940 3d 3d 32 20 3f 20 35 20 3a 20 31 30 29 3b 0a 20  ==2 ? 5 : 10);. 
32950 20 61 73 73 65 72 74 28 20 6e 4c 6f 6f 70 3c 3d   assert( nLoop<=
32960 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
32970 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 57 48 45 52  ->nSrc );.  WHER
32980 45 54 52 41 43 45 28 30 78 30 30 32 2c 20 28 22  ETRACE(0x002, ("
32990 2d 2d 2d 2d 20 62 65 67 69 6e 20 73 6f 6c 76 65  ---- begin solve
329a0 72 2e 20 20 28 6e 52 6f 77 45 73 74 3d 25 64 29  r.  (nRowEst=%d)
329b0 5c 6e 22 2c 20 6e 52 6f 77 45 73 74 29 29 3b 0a  \n", nRowEst));.
329c0 0a 20 20 2f 2a 20 49 66 20 6e 52 6f 77 45 73 74  .  /* If nRowEst
329d0 20 69 73 20 7a 65 72 6f 20 61 6e 64 20 74 68 65   is zero and the
329e0 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
329f0 59 20 63 6c 61 75 73 65 2c 20 69 67 6e 6f 72 65  Y clause, ignore
32a00 20 69 74 2e 20 49 6e 20 74 68 69 73 0a 20 20 2a   it. In this.  *
32a10 2a 20 63 61 73 65 20 74 68 65 20 70 75 72 70 6f  * case the purpo
32a20 73 65 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 20  se of this call 
32a30 69 73 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74  is to estimate t
32a40 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
32a50 73 20 72 65 74 75 72 6e 65 64 0a 20 20 2a 2a 20  s returned.  ** 
32a60 62 79 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 71  by the overall q
32a70 75 65 72 79 2e 20 4f 6e 63 65 20 74 68 69 73 20  uery. Once this 
32a80 65 73 74 69 6d 61 74 65 20 68 61 73 20 62 65 65  estimate has bee
32a90 6e 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 20  n obtained, the 
32aa0 63 61 6c 6c 65 72 0a 20 20 2a 2a 20 77 69 6c 6c  caller.  ** will
32ab0 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 66 75 6e   invoke this fun
32ac0 63 74 69 6f 6e 20 61 20 73 65 63 6f 6e 64 20 74  ction a second t
32ad0 69 6d 65 2c 20 70 61 73 73 69 6e 67 20 74 68 65  ime, passing the
32ae0 20 65 73 74 69 6d 61 74 65 20 61 73 20 74 68 65   estimate as the
32af0 0a 20 20 2a 2a 20 6e 52 6f 77 45 73 74 20 70 61  .  ** nRowEst pa
32b00 72 61 6d 65 74 65 72 2e 20 20 2a 2f 0a 20 20 69  rameter.  */.  i
32b10 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  f( pWInfo->pOrde
32b20 72 42 79 3d 3d 30 20 7c 7c 20 6e 52 6f 77 45 73  rBy==0 || nRowEs
32b30 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 4f 72 64  t==0 ){.    nOrd
32b40 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  erBy = 0;.  }els
32b50 65 7b 0a 20 20 20 20 6e 4f 72 64 65 72 42 79 20  e{.    nOrderBy 
32b60 3d 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  = pWInfo->pOrder
32b70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 0a  By->nExpr;.  }..
32b80 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
32b90 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 73 70 61  d initialize spa
32ba0 63 65 20 66 6f 72 20 61 54 6f 2c 20 61 46 72 6f  ce for aTo, aFro
32bb0 6d 20 61 6e 64 20 61 53 6f 72 74 43 6f 73 74 5b  m and aSortCost[
32bc0 5d 20 2a 2f 0a 20 20 6e 53 70 61 63 65 20 3d 20  ] */.  nSpace = 
32bd0 28 73 69 7a 65 6f 66 28 57 68 65 72 65 50 61 74  (sizeof(WherePat
32be0 68 29 2b 73 69 7a 65 6f 66 28 57 68 65 72 65 4c  h)+sizeof(WhereL
32bf0 6f 6f 70 2a 29 2a 6e 4c 6f 6f 70 29 2a 6d 78 43  oop*)*nLoop)*mxC
32c00 68 6f 69 63 65 2a 32 3b 0a 20 20 6e 53 70 61 63  hoice*2;.  nSpac
32c10 65 20 2b 3d 20 73 69 7a 65 6f 66 28 4c 6f 67 45  e += sizeof(LogE
32c20 73 74 29 20 2a 20 6e 4f 72 64 65 72 42 79 3b 0a  st) * nOrderBy;.
32c30 20 20 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74    pSpace = sqlit
32c40 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
32c50 2c 20 6e 53 70 61 63 65 29 3b 0a 20 20 69 66 28  , nSpace);.  if(
32c60 20 70 53 70 61 63 65 3d 3d 30 20 29 20 72 65 74   pSpace==0 ) ret
32c70 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
32c80 3b 0a 20 20 61 54 6f 20 3d 20 28 57 68 65 72 65  ;.  aTo = (Where
32c90 50 61 74 68 2a 29 70 53 70 61 63 65 3b 0a 20 20  Path*)pSpace;.  
32ca0 61 46 72 6f 6d 20 3d 20 61 54 6f 2b 6d 78 43 68  aFrom = aTo+mxCh
32cb0 6f 69 63 65 3b 0a 20 20 6d 65 6d 73 65 74 28 61  oice;.  memset(a
32cc0 46 72 6f 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  From, 0, sizeof(
32cd0 61 46 72 6f 6d 5b 30 5d 29 29 3b 0a 20 20 70 58  aFrom[0]));.  pX
32ce0 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a 2a 29   = (WhereLoop**)
32cf0 28 61 46 72 6f 6d 2b 6d 78 43 68 6f 69 63 65 29  (aFrom+mxChoice)
32d00 3b 0a 20 20 66 6f 72 28 69 69 3d 6d 78 43 68 6f  ;.  for(ii=mxCho
32d10 69 63 65 2a 32 2c 20 70 46 72 6f 6d 3d 61 54 6f  ice*2, pFrom=aTo
32d20 3b 20 69 69 3e 30 3b 20 69 69 2d 2d 2c 20 70 46  ; ii>0; ii--, pF
32d30 72 6f 6d 2b 2b 2c 20 70 58 20 2b 3d 20 6e 4c 6f  rom++, pX += nLo
32d40 6f 70 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e  op){.    pFrom->
32d50 61 4c 6f 6f 70 20 3d 20 70 58 3b 0a 20 20 7d 0a  aLoop = pX;.  }.
32d60 20 20 69 66 28 20 6e 4f 72 64 65 72 42 79 20 29    if( nOrderBy )
32d70 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
32d80 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
32d90 20 63 6c 61 75 73 65 20 61 6e 64 20 69 74 20 69   clause and it i
32da0 73 20 6e 6f 74 20 62 65 69 6e 67 20 69 67 6e 6f  s not being igno
32db0 72 65 64 2c 20 73 65 74 20 75 70 0a 20 20 20 20  red, set up.    
32dc0 2a 2a 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  ** space for the
32dd0 20 61 53 6f 72 74 43 6f 73 74 5b 5d 20 61 72 72   aSortCost[] arr
32de0 61 79 2e 20 45 61 63 68 20 65 6c 65 6d 65 6e 74  ay. Each element
32df0 20 6f 66 20 74 68 65 20 61 53 6f 72 74 43 6f 73   of the aSortCos
32e00 74 20 61 72 72 61 79 0a 20 20 20 20 2a 2a 20 69  t array.    ** i
32e10 73 20 65 69 74 68 65 72 20 7a 65 72 6f 20 2d 20  s either zero - 
32e20 6d 65 61 6e 69 6e 67 20 69 74 20 68 61 73 20 6e  meaning it has n
32e30 6f 74 20 79 65 74 20 62 65 65 6e 20 69 6e 69 74  ot yet been init
32e40 69 61 6c 69 7a 65 64 20 2d 20 6f 72 20 74 68 65  ialized - or the
32e50 0a 20 20 20 20 2a 2a 20 63 6f 73 74 20 6f 66 20  .    ** cost of 
32e60 73 6f 72 74 69 6e 67 20 6e 52 6f 77 45 73 74 20  sorting nRowEst 
32e70 72 6f 77 73 20 6f 66 20 64 61 74 61 20 77 68 65  rows of data whe
32e80 72 65 20 74 68 65 20 66 69 72 73 74 20 58 20 74  re the first X t
32e90 65 72 6d 73 20 6f 66 0a 20 20 20 20 2a 2a 20 74  erms of.    ** t
32ea0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
32eb0 73 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 69  se are already i
32ec0 6e 20 6f 72 64 65 72 2c 20 77 68 65 72 65 20 58  n order, where X
32ed0 20 69 73 20 74 68 65 20 61 72 72 61 79 20 0a 20   is the array . 
32ee0 20 20 20 2a 2a 20 69 6e 64 65 78 2e 20 20 2a 2f     ** index.  */
32ef0 0a 20 20 20 20 61 53 6f 72 74 43 6f 73 74 20 3d  .    aSortCost =
32f00 20 28 4c 6f 67 45 73 74 2a 29 70 58 3b 0a 20 20   (LogEst*)pX;.  
32f10 20 20 6d 65 6d 73 65 74 28 61 53 6f 72 74 43 6f    memset(aSortCo
32f20 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4c 6f  st, 0, sizeof(Lo
32f30 67 45 73 74 29 20 2a 20 6e 4f 72 64 65 72 42 79  gEst) * nOrderBy
32f40 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
32f50 20 61 53 6f 72 74 43 6f 73 74 3d 3d 30 20 7c 7c   aSortCost==0 ||
32f60 20 26 70 53 70 61 63 65 5b 6e 53 70 61 63 65 5d   &pSpace[nSpace]
32f70 3d 3d 28 63 68 61 72 2a 29 26 61 53 6f 72 74 43  ==(char*)&aSortC
32f80 6f 73 74 5b 6e 4f 72 64 65 72 42 79 5d 20 29 3b  ost[nOrderBy] );
32f90 0a 20 20 61 73 73 65 72 74 28 20 61 53 6f 72 74  .  assert( aSort
32fa0 43 6f 73 74 21 3d 30 20 7c 7c 20 26 70 53 70 61  Cost!=0 || &pSpa
32fb0 63 65 5b 6e 53 70 61 63 65 5d 3d 3d 28 63 68 61  ce[nSpace]==(cha
32fc0 72 2a 29 70 58 20 29 3b 0a 0a 20 20 2f 2a 20 53  r*)pX );..  /* S
32fd0 65 65 64 20 74 68 65 20 73 65 61 72 63 68 20 77  eed the search w
32fe0 69 74 68 20 61 20 73 69 6e 67 6c 65 20 57 68 65  ith a single Whe
32ff0 72 65 50 61 74 68 20 63 6f 6e 74 61 69 6e 69 6e  rePath containin
33000 67 20 7a 65 72 6f 20 57 68 65 72 65 4c 6f 6f 70  g zero WhereLoop
33010 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 55 4e  s..  **.  ** TUN
33020 49 4e 47 3a 20 44 6f 20 6e 6f 74 20 6c 65 74 20  ING: Do not let 
33030 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 74  the number of it
33040 65 72 61 74 69 6f 6e 73 20 67 6f 20 61 62 6f 76  erations go abov
33050 65 20 32 35 2e 20 20 49 66 20 74 68 65 20 63 6f  e 25.  If the co
33060 73 74 0a 20 20 2a 2a 20 6f 66 20 63 6f 6d 70 75  st.  ** of compu
33070 74 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74 69  ting an automati
33080 63 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 70  c index is not p
33090 61 69 64 20 62 61 63 6b 20 77 69 74 68 69 6e 20  aid back within 
330a0 74 68 65 20 66 69 72 73 74 20 32 35 0a 20 20 2a  the first 25.  *
330b0 2a 20 72 6f 77 73 2c 20 74 68 65 6e 20 64 6f 20  * rows, then do 
330c0 6e 6f 74 20 75 73 65 20 74 68 65 20 61 75 74 6f  not use the auto
330d0 6d 61 74 69 63 20 69 6e 64 65 78 2e 20 2a 2f 0a  matic index. */.
330e0 20 20 61 46 72 6f 6d 5b 30 5d 2e 6e 52 6f 77 20    aFrom[0].nRow 
330f0 3d 20 4d 49 4e 28 70 50 61 72 73 65 2d 3e 6e 51  = MIN(pParse->nQ
33100 75 65 72 79 4c 6f 6f 70 2c 20 34 36 29 3b 20 20  ueryLoop, 46);  
33110 61 73 73 65 72 74 28 20 34 36 3d 3d 73 71 6c 69  assert( 46==sqli
33120 74 65 33 4c 6f 67 45 73 74 28 32 35 29 20 29 3b  te3LogEst(25) );
33130 0a 20 20 6e 46 72 6f 6d 20 3d 20 31 3b 0a 20 20  .  nFrom = 1;.  
33140 61 73 73 65 72 74 28 20 61 46 72 6f 6d 5b 30 5d  assert( aFrom[0]
33150 2e 69 73 4f 72 64 65 72 65 64 3d 3d 30 20 29 3b  .isOrdered==0 );
33160 0a 20 20 69 66 28 20 6e 4f 72 64 65 72 42 79 20  .  if( nOrderBy 
33170 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 4c 6f  ){.    /* If nLo
33180 6f 70 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e  op is zero, then
33190 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 46 52   there are no FR
331a0 4f 4d 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  OM terms in the 
331b0 71 75 65 72 79 2e 20 53 69 6e 63 65 0a 20 20 20  query. Since.   
331c0 20 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65   ** in this case
331d0 20 74 68 65 20 71 75 65 72 79 20 6d 61 79 20 72   the query may r
331e0 65 74 75 72 6e 20 61 20 6d 61 78 69 6d 75 6d 20  eturn a maximum 
331f0 6f 66 20 6f 6e 65 20 72 6f 77 2c 20 74 68 65 20  of one row, the 
33200 72 65 73 75 6c 74 73 0a 20 20 20 20 2a 2a 20 61  results.    ** a
33210 72 65 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  re already in th
33220 65 20 72 65 71 75 65 73 74 65 64 20 6f 72 64 65  e requested orde
33230 72 2e 20 53 65 74 20 69 73 4f 72 64 65 72 65 64  r. Set isOrdered
33240 20 74 6f 20 6e 4f 72 64 65 72 42 79 20 74 6f 0a   to nOrderBy to.
33250 20 20 20 20 2a 2a 20 69 6e 64 69 63 61 74 65 20      ** indicate 
33260 74 68 69 73 2e 20 4f 72 2c 20 69 66 20 6e 4c 6f  this. Or, if nLo
33270 6f 70 20 69 73 20 67 72 65 61 74 65 72 20 74 68  op is greater th
33280 61 6e 20 7a 65 72 6f 2c 20 73 65 74 20 69 73 4f  an zero, set isO
33290 72 64 65 72 65 64 20 74 6f 0a 20 20 20 20 2a 2a  rdered to.    **
332a0 20 2d 31 2c 20 69 6e 64 69 63 61 74 69 6e 67 20   -1, indicating 
332b0 74 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 20  that the result 
332c0 73 65 74 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  set may or may n
332d0 6f 74 20 62 65 20 6f 72 64 65 72 65 64 2c 20 0a  ot be ordered, .
332e0 20 20 20 20 2a 2a 20 64 65 70 65 6e 64 69 6e 67      ** depending
332f0 20 6f 6e 20 74 68 65 20 6c 6f 6f 70 73 20 61 64   on the loops ad
33300 64 65 64 20 74 6f 20 74 68 65 20 63 75 72 72 65  ded to the curre
33310 6e 74 20 70 6c 61 6e 2e 20 20 2a 2f 0a 20 20 20  nt plan.  */.   
33320 20 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65   aFrom[0].isOrde
33330 72 65 64 20 3d 20 6e 4c 6f 6f 70 3e 30 20 3f 20  red = nLoop>0 ? 
33340 2d 31 20 3a 20 6e 4f 72 64 65 72 42 79 3b 0a 20  -1 : nOrderBy;. 
33350 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65   }..  /* Compute
33360 20 73 75 63 63 65 73 73 69 76 65 6c 79 20 6c 6f   successively lo
33370 6e 67 65 72 20 57 68 65 72 65 50 61 74 68 73 20  nger WherePaths 
33380 75 73 69 6e 67 20 74 68 65 20 70 72 65 76 69 6f  using the previo
33390 75 73 20 67 65 6e 65 72 61 74 69 6f 6e 0a 20 20  us generation.  
333a0 2a 2a 20 6f 66 20 57 68 65 72 65 50 61 74 68 73  ** of WherePaths
333b0 20 61 73 20 74 68 65 20 62 61 73 69 73 20 66 6f   as the basis fo
333c0 72 20 74 68 65 20 6e 65 78 74 2e 20 20 4b 65 65  r the next.  Kee
333d0 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6d  p track of the m
333e0 78 43 68 6f 69 63 65 0a 20 20 2a 2a 20 62 65 73  xChoice.  ** bes
333f0 74 20 70 61 74 68 73 20 61 74 20 65 61 63 68 20  t paths at each 
33400 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20  generation */.  
33410 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f  for(iLoop=0; iLo
33420 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b  op<nLoop; iLoop+
33430 2b 29 7b 0a 20 20 20 20 6e 54 6f 20 3d 20 30 3b  +){.    nTo = 0;
33440 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70  .    for(ii=0, p
33450 46 72 6f 6d 3d 61 46 72 6f 6d 3b 20 69 69 3c 6e  From=aFrom; ii<n
33460 46 72 6f 6d 3b 20 69 69 2b 2b 2c 20 70 46 72 6f  From; ii++, pFro
33470 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  m++){.      for(
33480 70 57 4c 6f 6f 70 3d 70 57 49 6e 66 6f 2d 3e 70  pWLoop=pWInfo->p
33490 4c 6f 6f 70 73 3b 20 70 57 4c 6f 6f 70 3b 20 70  Loops; pWLoop; p
334a0 57 4c 6f 6f 70 3d 70 57 4c 6f 6f 70 2d 3e 70 4e  WLoop=pWLoop->pN
334b0 65 78 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 20 20  extLoop){.      
334c0 20 20 4c 6f 67 45 73 74 20 6e 4f 75 74 3b 20 20    LogEst nOut;  
334d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
334e0 20 20 20 20 2f 2a 20 52 6f 77 73 20 76 69 73 69      /* Rows visi
334f0 74 65 64 20 62 79 20 28 70 46 72 6f 6d 2b 70 57  ted by (pFrom+pW
33500 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20 20  Loop) */.       
33510 20 4c 6f 67 45 73 74 20 72 43 6f 73 74 3b 20 20   LogEst rCost;  
33520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33530 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 70 61     /* Cost of pa
33540 74 68 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70  th (pFrom+pWLoop
33550 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 4c 6f 67  ) */.        Log
33560 45 73 74 20 72 55 6e 73 6f 72 74 65 64 3b 20 20  Est rUnsorted;  
33570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
33580 2a 20 55 6e 73 6f 72 74 65 64 20 63 6f 73 74 20  * Unsorted cost 
33590 6f 66 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70  of (pFrom+pWLoop
335a0 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 38 20  ) */.        i8 
335b0 69 73 4f 72 64 65 72 65 64 20 3d 20 70 46 72 6f  isOrdered = pFro
335c0 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3b 20 20 2f  m->isOrdered;  /
335d0 2a 20 69 73 4f 72 64 65 72 65 64 20 66 6f 72 20  * isOrdered for 
335e0 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a  (pFrom+pWLoop) *
335f0 2f 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73  /.        Bitmas
33600 6b 20 6d 61 73 6b 4e 65 77 3b 20 20 20 20 20 20  k maskNew;      
33610 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
33620 61 73 6b 20 6f 66 20 73 72 63 20 76 69 73 69 74  ask of src visit
33630 65 64 20 62 79 20 28 2e 2e 29 20 2a 2f 0a 20 20  ed by (..) */.  
33640 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 72 65        Bitmask re
33650 76 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 20 20  vMask = 0;      
33660 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
33670 6f 66 20 72 65 76 2d 6f 72 64 65 72 20 6c 6f 6f  of rev-order loo
33680 70 73 20 66 6f 72 20 28 2e 2e 29 20 2a 2f 0a 0a  ps for (..) */..
33690 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57 4c          if( (pWL
336a0 6f 6f 70 2d 3e 70 72 65 72 65 71 20 26 20 7e 70  oop->prereq & ~p
336b0 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21  From->maskLoop)!
336c0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
336d0 20 20 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f         if( (pWLo
336e0 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 26 20 70  op->maskSelf & p
336f0 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21  From->maskLoop)!
33700 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
33710 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69         /* At thi
33720 73 20 70 6f 69 6e 74 2c 20 70 57 4c 6f 6f 70 20  s point, pWLoop 
33730 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 74  is a candidate t
33740 6f 20 62 65 20 74 68 65 20 6e 65 78 74 20 6c 6f  o be the next lo
33750 6f 70 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  op. .        ** 
33760 43 6f 6d 70 75 74 65 20 69 74 73 20 63 6f 73 74  Compute its cost
33770 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 55 6e 73   */.        rUns
33780 6f 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33 4c  orted = sqlite3L
33790 6f 67 45 73 74 41 64 64 28 70 57 4c 6f 6f 70 2d  ogEstAdd(pWLoop-
337a0 3e 72 53 65 74 75 70 2c 70 57 4c 6f 6f 70 2d 3e  >rSetup,pWLoop->
337b0 72 52 75 6e 20 2b 20 70 46 72 6f 6d 2d 3e 6e 52  rRun + pFrom->nR
337c0 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 72 55 6e  ow);.        rUn
337d0 73 6f 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33  sorted = sqlite3
337e0 4c 6f 67 45 73 74 41 64 64 28 72 55 6e 73 6f 72  LogEstAdd(rUnsor
337f0 74 65 64 2c 20 70 46 72 6f 6d 2d 3e 72 55 6e 73  ted, pFrom->rUns
33800 6f 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20  orted);.        
33810 6e 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52  nOut = pFrom->nR
33820 6f 77 20 2b 20 70 57 4c 6f 6f 70 2d 3e 6e 4f 75  ow + pWLoop->nOu
33830 74 3b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 4e  t;.        maskN
33840 65 77 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b  ew = pFrom->mask
33850 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d  Loop | pWLoop->m
33860 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 20  askSelf;.       
33870 20 69 66 28 20 69 73 4f 72 64 65 72 65 64 3c 30   if( isOrdered<0
33880 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73   ){.          is
33890 4f 72 64 65 72 65 64 20 3d 20 77 68 65 72 65 50  Ordered = whereP
338a0 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65  athSatisfiesOrde
338b0 72 42 79 28 70 57 49 6e 66 6f 2c 0a 20 20 20 20  rBy(pWInfo,.    
338c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
338d0 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65     pWInfo->pOrde
338e0 72 42 79 2c 20 70 46 72 6f 6d 2c 20 70 57 49 6e  rBy, pFrom, pWIn
338f0 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 2c 0a  fo->wctrlFlags,.
33900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33910 20 20 20 20 20 20 20 69 4c 6f 6f 70 2c 20 70 57         iLoop, pW
33920 4c 6f 6f 70 2c 20 26 72 65 76 4d 61 73 6b 29 3b  Loop, &revMask);
33930 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
33940 20 20 20 20 20 20 20 20 20 20 72 65 76 4d 61 73            revMas
33950 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f  k = pFrom->revLo
33960 6f 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  op;.        }.  
33970 20 20 20 20 20 20 69 66 28 20 69 73 4f 72 64 65        if( isOrde
33980 72 65 64 3e 3d 30 20 26 26 20 69 73 4f 72 64 65  red>=0 && isOrde
33990 72 65 64 3c 6e 4f 72 64 65 72 42 79 20 29 7b 0a  red<nOrderBy ){.
339a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 53            if( aS
339b0 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65  ortCost[isOrdere
339c0 64 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  d]==0 ){.       
339d0 20 20 20 20 20 61 53 6f 72 74 43 6f 73 74 5b 69       aSortCost[i
339e0 73 4f 72 64 65 72 65 64 5d 20 3d 20 77 68 65 72  sOrdered] = wher
339f0 65 53 6f 72 74 69 6e 67 43 6f 73 74 28 0a 20 20  eSortingCost(.  
33a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57                pW
33a10 49 6e 66 6f 2c 20 6e 52 6f 77 45 73 74 2c 20 6e  Info, nRowEst, n
33a20 4f 72 64 65 72 42 79 2c 20 69 73 4f 72 64 65 72  OrderBy, isOrder
33a30 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  ed.            )
33a40 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
33a50 20 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20          rCost = 
33a60 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
33a70 28 72 55 6e 73 6f 72 74 65 64 2c 20 61 53 6f 72  (rUnsorted, aSor
33a80 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64 5d  tCost[isOrdered]
33a90 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 57 48  );..          WH
33aa0 45 52 45 54 52 41 43 45 28 30 78 30 30 32 2c 0a  ERETRACE(0x002,.
33ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 22                ("
33ac0 2d 2d 2d 2d 20 73 6f 72 74 20 63 6f 73 74 3d 25  ---- sort cost=%
33ad0 2d 33 64 20 28 25 64 2f 25 64 29 20 69 6e 63 72  -3d (%d/%d) incr
33ae0 65 61 73 65 73 20 63 6f 73 74 20 25 33 64 20 74  eases cost %3d t
33af0 6f 20 25 2d 33 64 5c 6e 22 2c 0a 20 20 20 20 20  o %-3d\n",.     
33b00 20 20 20 20 20 20 20 20 20 20 61 53 6f 72 74 43            aSortC
33b10 6f 73 74 5b 69 73 4f 72 64 65 72 65 64 5d 2c 20  ost[isOrdered], 
33b20 28 6e 4f 72 64 65 72 42 79 2d 69 73 4f 72 64 65  (nOrderBy-isOrde
33b30 72 65 64 29 2c 20 6e 4f 72 64 65 72 42 79 2c 20  red), nOrderBy, 
33b40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
33b50 72 55 6e 73 6f 72 74 65 64 2c 20 72 43 6f 73 74  rUnsorted, rCost
33b60 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ));.        }els
33b70 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 43 6f  e{.          rCo
33b80 73 74 20 3d 20 72 55 6e 73 6f 72 74 65 64 3b 0a  st = rUnsorted;.
33b90 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
33ba0 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
33bb0 65 65 20 69 66 20 70 57 4c 6f 6f 70 20 73 68 6f  ee if pWLoop sho
33bc0 75 6c 64 20 62 65 20 61 64 64 65 64 20 74 6f 20  uld be added to 
33bd0 74 68 65 20 73 65 74 20 6f 66 0a 20 20 20 20 20  the set of.     
33be0 20 20 20 2a 2a 20 6d 78 43 68 6f 69 63 65 20 62     ** mxChoice b
33bf0 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 73  est-so-far paths
33c00 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
33c10 20 20 20 20 20 2a 2a 20 46 69 72 73 74 20 6c 6f       ** First lo
33c20 6f 6b 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69  ok for an existi
33c30 6e 67 20 70 61 74 68 20 61 6d 6f 6e 67 20 62 65  ng path among be
33c40 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 73 0a  st-so-far paths.
33c50 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
33c60 63 6f 76 65 72 73 20 74 68 65 20 73 61 6d 65 20  covers the same 
33c70 73 65 74 20 6f 66 20 6c 6f 6f 70 73 20 61 6e 64  set of loops and
33c80 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 69 73   has the same is
33c90 4f 72 64 65 72 65 64 0a 20 20 20 20 20 20 20 20  Ordered.        
33ca0 2a 2a 20 73 65 74 74 69 6e 67 20 61 73 20 74 68  ** setting as th
33cb0 65 20 63 75 72 72 65 6e 74 20 70 61 74 68 20 63  e current path c
33cc0 61 6e 64 69 64 61 74 65 2e 0a 20 20 20 20 20 20  andidate..      
33cd0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
33ce0 54 68 65 20 74 65 72 6d 20 22 28 28 70 54 6f 2d  The term "((pTo-
33cf0 3e 69 73 4f 72 64 65 72 65 64 5e 69 73 4f 72 64  >isOrdered^isOrd
33d00 65 72 65 64 29 26 30 78 38 30 29 3d 3d 30 22 20  ered)&0x80)==0" 
33d10 69 73 20 65 71 75 69 76 61 6c 65 6e 74 0a 20 20  is equivalent.  
33d20 20 20 20 20 20 20 2a 2a 20 74 6f 20 28 70 54 6f        ** to (pTo
33d30 2d 3e 69 73 4f 72 64 65 72 65 64 3d 3d 28 2d 31  ->isOrdered==(-1
33d40 29 29 3d 3d 28 69 73 4f 72 64 65 72 65 64 3d 3d  ))==(isOrdered==
33d50 28 2d 31 29 29 22 20 66 6f 72 20 74 68 65 20 72  (-1))" for the r
33d60 61 6e 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  ange.        ** 
33d70 6f 66 20 6c 65 67 61 6c 20 76 61 6c 75 65 73 20  of legal values 
33d80 66 6f 72 20 69 73 4f 72 64 65 72 65 64 2c 20 2d  for isOrdered, -
33d90 31 2e 2e 36 34 2e 0a 20 20 20 20 20 20 20 20 2a  1..64..        *
33da0 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 6a  /.        for(jj
33db0 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 6a 6a 3c  =0, pTo=aTo; jj<
33dc0 6e 54 6f 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b  nTo; jj++, pTo++
33dd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
33de0 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 3d 3d   pTo->maskLoop==
33df0 6d 61 73 6b 4e 65 77 0a 20 20 20 20 20 20 20 20  maskNew.        
33e00 20 20 20 26 26 20 28 28 70 54 6f 2d 3e 69 73 4f     && ((pTo->isO
33e10 72 64 65 72 65 64 5e 69 73 4f 72 64 65 72 65 64  rdered^isOrdered
33e20 29 26 30 78 38 30 29 3d 3d 30 0a 20 20 20 20 20  )&0x80)==0.     
33e30 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
33e40 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 6a      testcase( jj
33e50 3d 3d 6e 54 6f 2d 31 20 29 3b 0a 20 20 20 20 20  ==nTo-1 );.     
33e60 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
33e70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33e80 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
33e90 6a 6a 3e 3d 6e 54 6f 20 29 7b 0a 20 20 20 20 20  jj>=nTo ){.     
33ea0 20 20 20 20 20 2f 2a 20 4e 6f 6e 65 20 6f 66 20       /* None of 
33eb0 74 68 65 20 65 78 69 73 74 69 6e 67 20 62 65 73  the existing bes
33ec0 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 73 20 6d  t-so-far paths m
33ed0 61 74 63 68 20 74 68 65 20 63 61 6e 64 69 64 61  atch the candida
33ee0 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  te. */.         
33ef0 20 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69   if( nTo>=mxChoi
33f00 63 65 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  ce.           &&
33f10 20 28 72 43 6f 73 74 3e 6d 78 43 6f 73 74 20 7c   (rCost>mxCost |
33f20 7c 20 28 72 43 6f 73 74 3d 3d 6d 78 43 6f 73 74  | (rCost==mxCost
33f30 20 26 26 20 72 55 6e 73 6f 72 74 65 64 3e 3d 6d   && rUnsorted>=m
33f40 78 55 6e 73 6f 72 74 65 64 29 29 0a 20 20 20 20  xUnsorted)).    
33f50 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
33f60 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 72       /* The curr
33f70 65 6e 74 20 63 61 6e 64 69 64 61 74 65 20 69 73  ent candidate is
33f80 20 6e 6f 20 62 65 74 74 65 72 20 74 68 61 6e 20   no better than 
33f90 61 6e 79 20 6f 66 20 74 68 65 20 6d 78 43 68 6f  any of the mxCho
33fa0 69 63 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ice.            
33fb0 2a 2a 20 70 61 74 68 73 20 63 75 72 72 65 6e 74  ** paths current
33fc0 6c 79 20 69 6e 20 74 68 65 20 62 65 73 74 2d 73  ly in the best-s
33fd0 6f 2d 66 61 72 20 62 75 66 66 65 72 2e 20 20 53  o-far buffer.  S
33fe0 6f 20 64 69 73 63 61 72 64 0a 20 20 20 20 20 20  o discard.      
33ff0 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61        ** this ca
34000 6e 64 69 64 61 74 65 20 61 73 20 6e 6f 74 20 76  ndidate as not v
34010 69 61 62 6c 65 2e 20 2a 2f 0a 23 69 66 64 65 66  iable. */.#ifdef
34020 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
34030 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20  LED /* 0x4 */.  
34040 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
34050 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26  lite3WhereTrace&
34060 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  0x4 ){.         
34070 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
34080 67 50 72 69 6e 74 66 28 22 53 6b 69 70 20 20 20  gPrintf("Skip   
34090 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64  %s cost=%-3d,%3d
340a0 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20   order=%c\n",.  
340b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
340c0 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46  wherePathName(pF
340d0 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f  rom, iLoop, pWLo
340e0 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74  op), rCost, nOut
340f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
34100 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30      isOrdered>=0
34110 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27   ? isOrdered+'0'
34120 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
34130 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
34140 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
34150 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ue;.          }.
34160 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
34170 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
34180 69 6e 74 73 20 69 74 20 6d 65 61 6e 73 20 74 68  ints it means th
34190 61 74 20 74 68 65 20 6e 65 77 20 63 61 6e 64 69  at the new candi
341a0 64 61 74 65 20 70 61 74 68 0a 20 20 20 20 20 20  date path.      
341b0 20 20 20 20 2a 2a 20 6e 65 65 64 73 20 74 6f 20      ** needs to 
341c0 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  be added to the 
341d0 73 65 74 20 6f 66 20 62 65 73 74 2d 73 6f 2d 66  set of best-so-f
341e0 61 72 20 70 61 74 68 73 2e 20 2a 2f 0a 20 20 20  ar paths. */.   
341f0 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3c 6d         if( nTo<m
34200 78 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20 20  xChoice ){.     
34210 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 61         /* Increa
34220 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  se the size of t
34230 68 65 20 61 54 6f 20 73 65 74 20 62 79 20 6f 6e  he aTo set by on
34240 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
34250 20 6a 6a 20 3d 20 6e 54 6f 2b 2b 3b 0a 20 20 20   jj = nTo++;.   
34260 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
34270 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
34280 20 70 61 74 68 20 72 65 70 6c 61 63 65 73 20 74   path replaces t
34290 68 65 20 70 72 69 6f 72 20 77 6f 72 73 74 20 74  he prior worst t
342a0 6f 20 6b 65 65 70 20 63 6f 75 6e 74 20 62 65 6c  o keep count bel
342b0 6f 77 20 6d 78 43 68 6f 69 63 65 20 2a 2f 0a 20  ow mxChoice */. 
342c0 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20 3d 20             jj = 
342d0 6d 78 49 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  mxI;.          }
342e0 0a 20 20 20 20 20 20 20 20 20 20 70 54 6f 20 3d  .          pTo =
342f0 20 26 61 54 6f 5b 6a 6a 5d 3b 0a 23 69 66 64 65   &aTo[jj];.#ifde
34300 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
34310 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20  BLED /* 0x4 */. 
34320 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
34330 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30  ite3WhereTrace&0
34340 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  x4 ){.          
34350 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
34360 69 6e 74 66 28 22 4e 65 77 20 20 20 20 25 73 20  intf("New    %s 
34370 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72  cost=%-3d,%3d or
34380 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20  der=%c\n",.     
34390 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
343a0 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20  PathName(pFrom, 
343b0 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20  iLoop, pWLoop), 
343c0 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20  rCost, nOut,.   
343d0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
343e0 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72  rdered>=0 ? isOr
343f0 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29  dered+'0' : '?')
34400 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65  ;.          }.#e
34410 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d 65 6c  ndif.        }el
34420 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
34430 20 43 6f 6e 74 72 6f 6c 20 72 65 61 63 68 65 73   Control reaches
34440 20 68 65 72 65 20 69 66 20 62 65 73 74 2d 73 6f   here if best-so
34450 2d 66 61 72 20 70 61 74 68 20 70 54 6f 3d 61 54  -far path pTo=aT
34460 6f 5b 6a 6a 5d 20 63 6f 76 65 72 73 20 74 68 65  o[jj] covers the
34470 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61  .          ** sa
34480 6d 65 20 73 65 74 20 6f 66 20 6c 6f 6f 70 73 20  me set of loops 
34490 61 6e 64 20 68 61 73 20 74 68 65 20 73 61 6d 20  and has the sam 
344a0 69 73 4f 72 64 65 72 65 64 20 73 65 74 74 69 6e  isOrdered settin
344b0 67 20 61 73 20 74 68 65 0a 20 20 20 20 20 20 20  g as the.       
344c0 20 20 20 2a 2a 20 63 61 6e 64 69 64 61 74 65 20     ** candidate 
344d0 70 61 74 68 2e 20 20 43 68 65 63 6b 20 74 6f 20  path.  Check to 
344e0 73 65 65 20 69 66 20 74 68 65 20 63 61 6e 64 69  see if the candi
344f0 64 61 74 65 20 73 68 6f 75 6c 64 20 72 65 70 6c  date should repl
34500 61 63 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ace.          **
34510 20 70 54 6f 20 6f 72 20 69 66 20 74 68 65 20 63   pTo or if the c
34520 61 6e 64 69 64 61 74 65 20 73 68 6f 75 6c 64 20  andidate should 
34530 62 65 20 73 6b 69 70 70 65 64 20 2a 2f 0a 20 20  be skipped */.  
34540 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d          if( pTo-
34550 3e 72 43 6f 73 74 3c 72 43 6f 73 74 20 7c 7c 20  >rCost<rCost || 
34560 28 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f  (pTo->rCost==rCo
34570 73 74 20 26 26 20 70 54 6f 2d 3e 6e 52 6f 77 3c  st && pTo->nRow<
34580 3d 6e 4f 75 74 29 20 29 7b 0a 23 69 66 64 65 66  =nOut) ){.#ifdef
34590 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
345a0 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20  LED /* 0x4 */.  
345b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
345c0 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26  lite3WhereTrace&
345d0 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  0x4 ){.         
345e0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
345f0 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  gPrintf(.       
34600 20 20 20 20 20 20 20 20 20 20 20 22 53 6b 69 70             "Skip
34610 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c     %s cost=%-3d,
34620 25 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20  %3d order=%c",. 
34630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34640 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70   wherePathName(p
34650 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c  From, iLoop, pWL
34660 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75  oop), rCost, nOu
34670 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
34680 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d       isOrdered>=
34690 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30  0 ? isOrdered+'0
346a0 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ' : '?');.      
346b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
346c0 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 20 76  ebugPrintf("   v
346d0 73 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25  s %s cost=%-3d,%
346e0 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20  d order=%c\n",. 
346f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34700 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70   wherePathName(p
34710 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c  To, iLoop+1, 0),
34720 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f   pTo->rCost, pTo
34730 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20  ->nRow,.        
34740 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69            pTo->i
34750 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 70 54  sOrdered>=0 ? pT
34760 6f 2d 3e 69 73 4f 72 64 65 72 65 64 2b 27 30 27  o->isOrdered+'0'
34770 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20   : '?');.       
34780 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
34790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73            /* Dis
347a0 63 61 72 64 20 74 68 65 20 63 61 6e 64 69 64 61  card the candida
347b0 74 65 20 70 61 74 68 20 66 72 6f 6d 20 66 75 72  te path from fur
347c0 74 68 65 72 20 63 6f 6e 73 69 64 65 72 61 74 69  ther considerati
347d0 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  on */.          
347e0 20 20 74 65 73 74 63 61 73 65 28 20 70 54 6f 2d    testcase( pTo-
347f0 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 20 29 3b  >rCost==rCost );
34800 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
34810 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
34820 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 65 73   }.          tes
34830 74 63 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73  tcase( pTo->rCos
34840 74 3d 3d 72 43 6f 73 74 2b 31 20 29 3b 0a 20 20  t==rCost+1 );.  
34850 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 72          /* Contr
34860 6f 6c 20 72 65 61 63 68 65 73 20 68 65 72 65 20  ol reaches here 
34870 69 66 20 74 68 65 20 63 61 6e 64 69 64 61 74 65  if the candidate
34880 20 70 61 74 68 20 69 73 20 62 65 74 74 65 72 20   path is better 
34890 74 68 61 6e 20 74 68 65 0a 20 20 20 20 20 20 20  than the.       
348a0 20 20 20 2a 2a 20 70 54 6f 20 70 61 74 68 2e 20     ** pTo path. 
348b0 20 52 65 70 6c 61 63 65 20 70 54 6f 20 77 69 74   Replace pTo wit
348c0 68 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 2e  h the candidate.
348d0 20 2a 2f 0a 23 69 66 64 65 66 20 57 48 45 52 45   */.#ifdef WHERE
348e0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a  TRACE_ENABLED /*
348f0 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20   0x4 */.        
34900 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
34910 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a 20  reTrace&0x4 ){. 
34920 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
34930 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20  e3DebugPrintf(. 
34940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
34950 55 70 64 61 74 65 20 25 73 20 63 6f 73 74 3d 25  Update %s cost=%
34960 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63  -3d,%3d order=%c
34970 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
34980 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65     wherePathName
34990 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70  (pFrom, iLoop, p
349a0 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e  WLoop), rCost, n
349b0 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Out,.           
349c0 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d       isOrdered>=
349d0 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30  0 ? isOrdered+'0
349e0 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ' : '?');.      
349f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
34a00 75 67 50 72 69 6e 74 66 28 22 20 20 77 61 73 20  ugPrintf("  was 
34a10 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64  %s cost=%-3d,%3d
34a20 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20   order=%c\n",.  
34a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
34a40 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c  erePathName(pTo,
34a50 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54   iLoop+1, 0), pT
34a60 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e  o->rCost, pTo->n
34a70 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Row,.           
34a80 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65       pTo->isOrde
34a90 72 65 64 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69 73  red>=0 ? pTo->is
34aa0 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f  Ordered+'0' : '?
34ab0 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ');.          }.
34ac0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d  #endif.        }
34ad0 0a 20 20 20 20 20 20 20 20 2f 2a 20 70 57 4c 6f  .        /* pWLo
34ae0 6f 70 20 69 73 20 61 20 77 69 6e 6e 65 72 2e 20  op is a winner. 
34af0 20 41 64 64 20 69 74 20 74 6f 20 74 68 65 20 73   Add it to the s
34b00 65 74 20 6f 66 20 62 65 73 74 20 73 6f 20 66 61  et of best so fa
34b10 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 54 6f  r */.        pTo
34b20 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 3d 20 70 46 72  ->maskLoop = pFr
34b30 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c 20 70  om->maskLoop | p
34b40 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b  WLoop->maskSelf;
34b50 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 65  .        pTo->re
34b60 76 4c 6f 6f 70 20 3d 20 72 65 76 4d 61 73 6b 3b  vLoop = revMask;
34b70 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 6e 52  .        pTo->nR
34b80 6f 77 20 3d 20 6e 4f 75 74 3b 0a 20 20 20 20 20  ow = nOut;.     
34b90 20 20 20 70 54 6f 2d 3e 72 43 6f 73 74 20 3d 20     pTo->rCost = 
34ba0 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 70  rCost;.        p
34bb0 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 20 3d 20  To->rUnsorted = 
34bc0 72 55 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20 20  rUnsorted;.     
34bd0 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65     pTo->isOrdere
34be0 64 20 3d 20 69 73 4f 72 64 65 72 65 64 3b 0a 20  d = isOrdered;. 
34bf0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54         memcpy(pT
34c00 6f 2d 3e 61 4c 6f 6f 70 2c 20 70 46 72 6f 6d 2d  o->aLoop, pFrom-
34c10 3e 61 4c 6f 6f 70 2c 20 73 69 7a 65 6f 66 28 57  >aLoop, sizeof(W
34c20 68 65 72 65 4c 6f 6f 70 2a 29 2a 69 4c 6f 6f 70  hereLoop*)*iLoop
34c30 29 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  );.        pTo->
34c40 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3d 20 70  aLoop[iLoop] = p
34c50 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 69  WLoop;.        i
34c60 66 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65  f( nTo>=mxChoice
34c70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 78   ){.          mx
34c80 49 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  I = 0;.         
34c90 20 6d 78 43 6f 73 74 20 3d 20 61 54 6f 5b 30 5d   mxCost = aTo[0]
34ca0 2e 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20  .rCost;.        
34cb0 20 20 6d 78 55 6e 73 6f 72 74 65 64 20 3d 20 61    mxUnsorted = a
34cc0 54 6f 5b 30 5d 2e 6e 52 6f 77 3b 0a 20 20 20 20  To[0].nRow;.    
34cd0 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 31 2c 20        for(jj=1, 
34ce0 70 54 6f 3d 26 61 54 6f 5b 31 5d 3b 20 6a 6a 3c  pTo=&aTo[1]; jj<
34cf0 6d 78 43 68 6f 69 63 65 3b 20 6a 6a 2b 2b 2c 20  mxChoice; jj++, 
34d00 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  pTo++){.        
34d10 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f      if( pTo->rCo
34d20 73 74 3e 6d 78 43 6f 73 74 20 0a 20 20 20 20 20  st>mxCost .     
34d30 20 20 20 20 20 20 20 20 7c 7c 20 28 70 54 6f 2d          || (pTo-
34d40 3e 72 43 6f 73 74 3d 3d 6d 78 43 6f 73 74 20 26  >rCost==mxCost &
34d50 26 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64  & pTo->rUnsorted
34d60 3e 6d 78 55 6e 73 6f 72 74 65 64 29 20 0a 20 20  >mxUnsorted) .  
34d70 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
34d80 20 20 20 20 20 20 20 20 20 20 20 6d 78 43 6f 73             mxCos
34d90 74 20 3d 20 70 54 6f 2d 3e 72 43 6f 73 74 3b 0a  t = pTo->rCost;.
34da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 78                mx
34db0 55 6e 73 6f 72 74 65 64 20 3d 20 70 54 6f 2d 3e  Unsorted = pTo->
34dc0 72 55 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20 20  rUnsorted;.     
34dd0 20 20 20 20 20 20 20 20 20 6d 78 49 20 3d 20 6a           mxI = j
34de0 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  j;.            }
34df0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
34e00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
34e10 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 57 48 45     }..#ifdef WHE
34e20 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
34e30 20 2f 2a 20 3e 3d 32 20 2a 2f 0a 20 20 20 20 69   /* >=2 */.    i
34e40 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
34e50 72 61 63 65 3e 3d 32 20 29 7b 0a 20 20 20 20 20  race>=2 ){.     
34e60 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
34e70 6e 74 66 28 22 2d 2d 2d 2d 20 61 66 74 65 72 20  ntf("---- after 
34e80 72 6f 75 6e 64 20 25 64 20 2d 2d 2d 2d 5c 6e 22  round %d ----\n"
34e90 2c 20 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  , iLoop);.      
34ea0 66 6f 72 28 69 69 3d 30 2c 20 70 54 6f 3d 61 54  for(ii=0, pTo=aT
34eb0 6f 3b 20 69 69 3c 6e 54 6f 3b 20 69 69 2b 2b 2c  o; ii<nTo; ii++,
34ec0 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20   pTo++){.       
34ed0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
34ee0 6e 74 66 28 22 20 25 73 20 63 6f 73 74 3d 25 2d  ntf(" %s cost=%-
34ef0 33 64 20 6e 72 6f 77 3d 25 2d 33 64 20 6f 72 64  3d nrow=%-3d ord
34f00 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20  er=%c",.        
34f10 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65     wherePathName
34f20 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30  (pTo, iLoop+1, 0
34f30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70  ), pTo->rCost, p
34f40 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20  To->nRow,.      
34f50 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65       pTo->isOrde
34f60 72 65 64 3e 3d 30 20 3f 20 28 70 54 6f 2d 3e 69  red>=0 ? (pTo->i
34f70 73 4f 72 64 65 72 65 64 2b 27 30 27 29 20 3a 20  sOrdered+'0') : 
34f80 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 69 66  '?');.        if
34f90 28 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64  ( pTo->isOrdered
34fa0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
34fb0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
34fc0 74 66 28 22 20 72 65 76 3d 30 78 25 6c 6c 78 5c  tf(" rev=0x%llx\
34fd0 6e 22 2c 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70  n", pTo->revLoop
34fe0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
34ff0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
35000 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
35010 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  \n");.        }.
35020 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
35030 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53 77 61  ndif..    /* Swa
35040 70 20 74 68 65 20 72 6f 6c 65 73 20 6f 66 20 61  p the roles of a
35050 46 72 6f 6d 20 61 6e 64 20 61 54 6f 20 66 6f 72  From and aTo for
35060 20 74 68 65 20 6e 65 78 74 20 67 65 6e 65 72 61   the next genera
35070 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 70 46 72 6f  tion */.    pFro
35080 6d 20 3d 20 61 54 6f 3b 0a 20 20 20 20 61 54 6f  m = aTo;.    aTo
35090 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 20 20 61 46   = aFrom;.    aF
350a0 72 6f 6d 20 3d 20 70 46 72 6f 6d 3b 0a 20 20 20  rom = pFrom;.   
350b0 20 6e 46 72 6f 6d 20 3d 20 6e 54 6f 3b 0a 20 20   nFrom = nTo;.  
350c0 7d 0a 0a 20 20 69 66 28 20 6e 46 72 6f 6d 3d 3d  }..  if( nFrom==
350d0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
350e0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
350f0 20 22 6e 6f 20 71 75 65 72 79 20 73 6f 6c 75 74   "no query solut
35100 69 6f 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  ion");.    sqlit
35110 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 70  e3DbFree(db, pSp
35120 61 63 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ace);.    return
35130 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
35140 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69 6e 64 20   }.  .  /* Find 
35150 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20  the lowest cost 
35160 70 61 74 68 2e 20 20 70 46 72 6f 6d 20 77 69 6c  path.  pFrom wil
35170 6c 20 62 65 20 6c 65 66 74 20 70 6f 69 6e 74 69  l be left pointi
35180 6e 67 20 74 6f 20 74 68 61 74 20 70 61 74 68 20  ng to that path 
35190 2a 2f 0a 20 20 70 46 72 6f 6d 20 3d 20 61 46 72  */.  pFrom = aFr
351a0 6f 6d 3b 0a 20 20 66 6f 72 28 69 69 3d 31 3b 20  om;.  for(ii=1; 
351b0 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 29 7b  ii<nFrom; ii++){
351c0 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  .    if( pFrom->
351d0 72 43 6f 73 74 3e 61 46 72 6f 6d 5b 69 69 5d 2e  rCost>aFrom[ii].
351e0 72 43 6f 73 74 20 29 20 70 46 72 6f 6d 20 3d 20  rCost ) pFrom = 
351f0 26 61 46 72 6f 6d 5b 69 69 5d 3b 0a 20 20 7d 0a  &aFrom[ii];.  }.
35200 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f    assert( pWInfo
35210 2d 3e 6e 4c 65 76 65 6c 3d 3d 6e 4c 6f 6f 70 20  ->nLevel==nLoop 
35220 29 3b 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65  );.  /* Load the
35230 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74   lowest cost pat
35240 68 20 69 6e 74 6f 20 70 57 49 6e 66 6f 20 2a 2f  h into pWInfo */
35250 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20  .  for(iLoop=0; 
35260 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f  iLoop<nLoop; iLo
35270 6f 70 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72 65  op++){.    Where
35280 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 3d 20  Level *pLevel = 
35290 70 57 49 6e 66 6f 2d 3e 61 20 2b 20 69 4c 6f 6f  pWInfo->a + iLoo
352a0 70 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  p;.    pLevel->p
352b0 57 4c 6f 6f 70 20 3d 20 70 57 4c 6f 6f 70 20 3d  WLoop = pWLoop =
352c0 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 69 4c   pFrom->aLoop[iL
352d0 6f 6f 70 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c  oop];.    pLevel
352e0 2d 3e 69 46 72 6f 6d 20 3d 20 70 57 4c 6f 6f 70  ->iFrom = pWLoop
352f0 2d 3e 69 54 61 62 3b 0a 20 20 20 20 70 4c 65 76  ->iTab;.    pLev
35300 65 6c 2d 3e 69 54 61 62 43 75 72 20 3d 20 70 57  el->iTabCur = pW
35310 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
35320 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
35330 2e 69 43 75 72 73 6f 72 3b 0a 20 20 7d 0a 20 20  .iCursor;.  }.  
35340 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74  if( (pWInfo->wct
35350 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
35360 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 29 21 3d  WANT_DISTINCT)!=
35370 30 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d  0.   && (pWInfo-
35380 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
35390 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 29 3d  ERE_DISTINCTBY)=
353a0 3d 30 0a 20 20 20 26 26 20 70 57 49 6e 66 6f 2d  =0.   && pWInfo-
353b0 3e 65 44 69 73 74 69 6e 63 74 3d 3d 57 48 45 52  >eDistinct==WHER
353c0 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 0a  E_DISTINCT_NOOP.
353d0 20 20 20 26 26 20 6e 52 6f 77 45 73 74 0a 20 20     && nRowEst.  
353e0 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6e  ){.    Bitmask n
353f0 6f 74 55 73 65 64 3b 0a 20 20 20 20 69 6e 74 20  otUsed;.    int 
35400 72 63 20 3d 20 77 68 65 72 65 50 61 74 68 53 61  rc = wherePathSa
35410 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28 70  tisfiesOrderBy(p
35420 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70  WInfo, pWInfo->p
35430 52 65 73 75 6c 74 53 65 74 2c 20 70 46 72 6f 6d  ResultSet, pFrom
35440 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
35450 20 20 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43     WHERE_DISTINC
35460 54 42 59 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46  TBY, nLoop-1, pF
35470 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70  rom->aLoop[nLoop
35480 2d 31 5d 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a  -1], &notUsed);.
35490 20 20 20 20 69 66 28 20 72 63 3d 3d 70 57 49 6e      if( rc==pWIn
354a0 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74 2d 3e  fo->pResultSet->
354b0 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70  nExpr ){.      p
354c0 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
354d0 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   = WHERE_DISTINC
354e0 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20 20 7d  T_ORDERED;.    }
354f0 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 49 6e 66  .  }.  if( pWInf
35500 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  o->pOrderBy ){. 
35510 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77     if( pWInfo->w
35520 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
35530 45 5f 44 49 53 54 49 4e 43 54 42 59 20 29 7b 0a  E_DISTINCTBY ){.
35540 20 20 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d        if( pFrom-
35550 3e 69 73 4f 72 64 65 72 65 64 3d 3d 70 57 49 6e  >isOrdered==pWIn
35560 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  fo->pOrderBy->nE
35570 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70  xpr ){.        p
35580 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
35590 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   = WHERE_DISTINC
355a0 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20 20 20  T_ORDERED;.     
355b0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
355c0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53      pWInfo->nOBS
355d0 61 74 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f 72  at = pFrom->isOr
355e0 64 65 72 65 64 3b 0a 20 20 20 20 20 20 69 66 28  dered;.      if(
355f0 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3c   pWInfo->nOBSat<
35600 30 20 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53  0 ) pWInfo->nOBS
35610 61 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 57  at = 0;.      pW
35620 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20  Info->revMask = 
35630 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a  pFrom->revLoop;.
35640 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70      }.    if( (p
35650 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
35660 73 20 26 20 57 48 45 52 45 5f 53 4f 52 54 42 59  s & WHERE_SORTBY
35670 47 52 4f 55 50 29 0a 20 20 20 20 20 20 20 20 26  GROUP).        &
35680 26 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74  & pWInfo->nOBSat
35690 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ==pWInfo->pOrder
356a0 42 79 2d 3e 6e 45 78 70 72 0a 20 20 20 20 29 7b  By->nExpr.    ){
356b0 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6e  .      Bitmask n
356c0 6f 74 55 73 65 64 20 3d 20 30 3b 0a 20 20 20 20  otUsed = 0;.    
356d0 20 20 69 6e 74 20 6e 4f 72 64 65 72 20 3d 20 77    int nOrder = w
356e0 68 65 72 65 50 61 74 68 53 61 74 69 73 66 69 65  herePathSatisfie
356f0 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c  sOrderBy(pWInfo,
35700 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
35710 79 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 46  y, .          pF
35720 72 6f 6d 2c 20 30 2c 20 6e 4c 6f 6f 70 2d 31 2c  rom, 0, nLoop-1,
35730 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c   pFrom->aLoop[nL
35740 6f 6f 70 2d 31 5d 2c 20 26 6e 6f 74 55 73 65 64  oop-1], &notUsed
35750 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
35760 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
35770 73 6f 72 74 65 64 3d 3d 30 20 29 3b 0a 20 20 20  sorted==0 );.   
35780 20 20 20 70 57 49 6e 66 6f 2d 3e 73 6f 72 74 65     pWInfo->sorte
35790 64 20 3d 20 28 6e 4f 72 64 65 72 3d 3d 70 57 49  d = (nOrder==pWI
357a0 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  nfo->pOrderBy->n
357b0 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Expr);.    }.  }
357c0 0a 0a 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f  ...  pWInfo->nRo
357d0 77 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52  wOut = pFrom->nR
357e0 6f 77 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74  ow;..  /* Free t
357f0 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20  emporary memory 
35800 61 6e 64 20 72 65 74 75 72 6e 20 73 75 63 63 65  and return succe
35810 73 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44  ss */.  sqlite3D
35820 62 46 72 65 65 28 64 62 2c 20 70 53 70 61 63 65  bFree(db, pSpace
35830 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
35840 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
35850 4d 6f 73 74 20 71 75 65 72 69 65 73 20 75 73 65  Most queries use
35860 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74   only a single t
35870 61 62 6c 65 20 28 74 68 65 79 20 61 72 65 20 6e  able (they are n
35880 6f 74 20 6a 6f 69 6e 73 29 20 61 6e 64 20 68 61  ot joins) and ha
35890 76 65 0a 2a 2a 20 73 69 6d 70 6c 65 20 3d 3d 20  ve.** simple == 
358a0 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 67 61 69  constraints agai
358b0 6e 73 74 20 69 6e 64 65 78 65 64 20 66 69 65 6c  nst indexed fiel
358c0 64 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ds.  This routin
358d0 65 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f  e attempts.** to
358e0 20 70 6c 61 6e 20 74 68 6f 73 65 20 73 69 6d 70   plan those simp
358f0 6c 65 20 63 61 73 65 73 20 75 73 69 6e 67 20 6d  le cases using m
35900 75 63 68 20 6c 65 73 73 20 63 65 72 65 6d 6f 6e  uch less ceremon
35910 79 20 74 68 61 6e 20 74 68 65 0a 2a 2a 20 67 65  y than the.** ge
35920 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65 20 71 75  neral-purpose qu
35930 65 72 79 20 70 6c 61 6e 6e 65 72 2c 20 61 6e 64  ery planner, and
35940 20 74 68 65 72 65 62 79 20 79 69 65 6c 64 20 66   thereby yield f
35950 61 73 74 65 72 20 73 71 6c 69 74 65 33 5f 70 72  aster sqlite3_pr
35960 65 70 61 72 65 28 29 0a 2a 2a 20 74 69 6d 65 73  epare().** times
35970 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20   for the common 
35980 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  case..**.** Retu
35990 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 20 73  rn non-zero on s
359a0 75 63 63 65 73 73 2c 20 69 66 20 74 68 69 73 20  uccess, if this 
359b0 71 75 65 72 79 20 63 61 6e 20 62 65 20 68 61 6e  query can be han
359c0 64 6c 65 64 20 62 79 20 74 68 69 73 0a 2a 2a 20  dled by this.** 
359d0 6e 6f 2d 66 72 69 6c 6c 73 20 71 75 65 72 79 20  no-frills query 
359e0 70 6c 61 6e 6e 65 72 2e 20 20 52 65 74 75 72 6e  planner.  Return
359f0 20 7a 65 72 6f 20 69 66 20 74 68 69 73 20 71 75   zero if this qu
35a00 65 72 79 20 6e 65 65 64 73 20 74 68 65 20 0a 2a  ery needs the .*
35a10 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73  * general-purpos
35a20 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e  e query planner.
35a30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
35a40 68 65 72 65 53 68 6f 72 74 43 75 74 28 57 68 65  hereShortCut(Whe
35a50 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
35a60 42 75 69 6c 64 65 72 29 7b 0a 20 20 57 68 65 72  Builder){.  Wher
35a70 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a 20  eInfo *pWInfo;. 
35a80 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
35a90 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 57  item *pItem;.  W
35aa0 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
35ab0 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
35ac0 65 72 6d 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70  erm;.  WhereLoop
35ad0 20 2a 70 4c 6f 6f 70 3b 0a 20 20 69 6e 74 20 69   *pLoop;.  int i
35ae0 43 75 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  Cur;.  int j;.  
35af0 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49  Table *pTab;.  I
35b00 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 0a 20  ndex *pIdx;.  . 
35b10 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64   pWInfo = pBuild
35b20 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69 66  er->pWInfo;.  if
35b30 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46  ( pWInfo->wctrlF
35b40 6c 61 67 73 20 26 20 57 48 45 52 45 5f 46 4f 52  lags & WHERE_FOR
35b50 43 45 5f 54 41 42 4c 45 20 29 20 72 65 74 75 72  CE_TABLE ) retur
35b60 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  n 0;.  assert( p
35b70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
35b80 3e 6e 53 72 63 3e 3d 31 20 29 3b 0a 20 20 70 49  >nSrc>=1 );.  pI
35b90 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  tem = pWInfo->pT
35ba0 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 54 61  abList->a;.  pTa
35bb0 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b  b = pItem->pTab;
35bc0 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
35bd0 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20  (pTab) ) return 
35be0 30 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  0;.  if( pItem->
35bf0 7a 49 6e 64 65 78 20 29 20 72 65 74 75 72 6e 20  zIndex ) return 
35c00 30 3b 0a 20 20 69 43 75 72 20 3d 20 70 49 74 65  0;.  iCur = pIte
35c10 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 57  m->iCursor;.  pW
35c20 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43  C = &pWInfo->sWC
35c30 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 42 75 69  ;.  pLoop = pBui
35c40 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 4c  lder->pNew;.  pL
35c50 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 30  oop->wsFlags = 0
35c60 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  ;.  pLoop->u.btr
35c70 65 65 2e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20  ee.nSkip = 0;.  
35c80 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d  pTerm = findTerm
35c90 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20  (pWC, iCur, -1, 
35ca0 30 2c 20 57 4f 5f 45 51 2c 20 30 29 3b 0a 20 20  0, WO_EQ, 0);.  
35cb0 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20  if( pTerm ){.   
35cc0 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
35cd0 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  = WHERE_COLUMN_E
35ce0 51 7c 57 48 45 52 45 5f 49 50 4b 7c 57 48 45 52  Q|WHERE_IPK|WHER
35cf0 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 70 4c  E_ONEROW;.    pL
35d00 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d  oop->aLTerm[0] =
35d10 20 70 54 65 72 6d 3b 0a 20 20 20 20 70 4c 6f 6f   pTerm;.    pLoo
35d20 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20  p->nLTerm = 1;. 
35d30 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65     pLoop->u.btre
35d40 65 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20 2f  e.nEq = 1;.    /
35d50 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f  * TUNING: Cost o
35d60 66 20 61 20 72 6f 77 69 64 20 6c 6f 6f 6b 75 70  f a rowid lookup
35d70 20 69 73 20 31 30 20 2a 2f 0a 20 20 20 20 70 4c   is 10 */.    pL
35d80 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 33 3b 20  oop->rRun = 33; 
35d90 20 2f 2a 20 33 33 3d 3d 73 71 6c 69 74 65 33 4c   /* 33==sqlite3L
35da0 6f 67 45 73 74 28 31 30 29 20 2a 2f 0a 20 20 7d  ogEst(10) */.  }
35db0 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 49  else{.    for(pI
35dc0 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
35dd0 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
35de0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
35df0 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61  assert( pLoop->a
35e00 4c 54 65 72 6d 53 70 61 63 65 3d 3d 70 4c 6f 6f  LTermSpace==pLoo
35e10 70 2d 3e 61 4c 54 65 72 6d 20 29 3b 0a 20 20 20  p->aLTerm );.   
35e20 20 20 20 61 73 73 65 72 74 28 20 41 72 72 61 79     assert( Array
35e30 53 69 7a 65 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65  Size(pLoop->aLTe
35e40 72 6d 53 70 61 63 65 29 3d 3d 34 20 29 3b 0a 20  rmSpace)==4 );. 
35e50 20 20 20 20 20 69 66 28 20 21 49 73 55 6e 69 71       if( !IsUniq
35e60 75 65 49 6e 64 65 78 28 70 49 64 78 29 0a 20 20  ueIndex(pIdx).  
35e70 20 20 20 20 20 7c 7c 20 70 49 64 78 2d 3e 70 50       || pIdx->pP
35e80 61 72 74 49 64 78 57 68 65 72 65 21 3d 30 20 0a  artIdxWhere!=0 .
35e90 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 2d 3e         || pIdx->
35ea0 6e 4b 65 79 43 6f 6c 3e 41 72 72 61 79 53 69 7a  nKeyCol>ArraySiz
35eb0 65 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53  e(pLoop->aLTermS
35ec0 70 61 63 65 29 20 0a 20 20 20 20 20 20 29 20 63  pace) .      ) c
35ed0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66  ontinue;.      f
35ee0 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e  or(j=0; j<pIdx->
35ef0 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  nKeyCol; j++){. 
35f00 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66         pTerm = f
35f10 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
35f20 72 2c 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  r, pIdx->aiColum
35f30 6e 5b 6a 5d 2c 20 30 2c 20 57 4f 5f 45 51 2c 20  n[j], 0, WO_EQ, 
35f40 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 69  pIdx);.        i
35f50 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 62 72  f( pTerm==0 ) br
35f60 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f  eak;.        pLo
35f70 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 20 3d 20  op->aLTerm[j] = 
35f80 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  pTerm;.      }. 
35f90 20 20 20 20 20 69 66 28 20 6a 21 3d 70 49 64 78       if( j!=pIdx
35fa0 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 63 6f 6e 74  ->nKeyCol ) cont
35fb0 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4c 6f 6f  inue;.      pLoo
35fc0 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  p->wsFlags = WHE
35fd0 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45  RE_COLUMN_EQ|WHE
35fe0 52 45 5f 4f 4e 45 52 4f 57 7c 57 48 45 52 45 5f  RE_ONEROW|WHERE_
35ff0 49 4e 44 45 58 45 44 3b 0a 20 20 20 20 20 20 69  INDEXED;.      i
36000 66 28 20 70 49 64 78 2d 3e 69 73 43 6f 76 65 72  f( pIdx->isCover
36010 69 6e 67 20 7c 7c 20 28 70 49 74 65 6d 2d 3e 63  ing || (pItem->c
36020 6f 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e  olUsed & ~column
36030 73 49 6e 49 6e 64 65 78 28 70 49 64 78 29 29 3d  sInIndex(pIdx))=
36040 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  =0 ){.        pL
36050 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  oop->wsFlags |= 
36060 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a  WHERE_IDX_ONLY;.
36070 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c        }.      pL
36080 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6a 3b  oop->nLTerm = j;
36090 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e  .      pLoop->u.
360a0 62 74 72 65 65 2e 6e 45 71 20 3d 20 6a 3b 0a 20  btree.nEq = j;. 
360b0 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74       pLoop->u.bt
360c0 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64  ree.pIndex = pId
360d0 78 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49  x;.      /* TUNI
360e0 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 75 6e  NG: Cost of a un
360f0 69 71 75 65 20 69 6e 64 65 78 20 6c 6f 6f 6b 75  ique index looku
36100 70 20 69 73 20 31 35 20 2a 2f 0a 20 20 20 20 20  p is 15 */.     
36110 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33   pLoop->rRun = 3
36120 39 3b 20 20 2f 2a 20 33 39 3d 3d 73 71 6c 69 74  9;  /* 39==sqlit
36130 65 33 4c 6f 67 45 73 74 28 31 35 29 20 2a 2f 0a  e3LogEst(15) */.
36140 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
36150 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f   }.  }.  if( pLo
36160 6f 70 2d 3e 77 73 46 6c 61 67 73 20 29 7b 0a 20  op->wsFlags ){. 
36170 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d     pLoop->nOut =
36180 20 28 4c 6f 67 45 73 74 29 31 3b 0a 20 20 20 20   (LogEst)1;.    
36190 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c  pWInfo->a[0].pWL
361a0 6f 6f 70 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20  oop = pLoop;.   
361b0 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66   pLoop->maskSelf
361c0 20 3d 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e   = getMask(&pWIn
361d0 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43  fo->sMaskSet, iC
361e0 75 72 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d  ur);.    pWInfo-
361f0 3e 61 5b 30 5d 2e 69 54 61 62 43 75 72 20 3d 20  >a[0].iTabCur = 
36200 69 43 75 72 3b 0a 20 20 20 20 70 57 49 6e 66 6f  iCur;.    pWInfo
36210 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 31 3b 0a 20  ->nRowOut = 1;. 
36220 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70     if( pWInfo->p
36230 4f 72 64 65 72 42 79 20 29 20 70 57 49 6e 66 6f  OrderBy ) pWInfo
36240 2d 3e 6e 4f 42 53 61 74 20 3d 20 20 70 57 49 6e  ->nOBSat =  pWIn
36250 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  fo->pOrderBy->nE
36260 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 57 49  xpr;.    if( pWI
36270 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
36280 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53  & WHERE_WANT_DIS
36290 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 20 20 70  TINCT ){.      p
362a0 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
362b0 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   = WHERE_DISTINC
362c0 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a  T_UNIQUE;.    }.
362d0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
362e0 42 55 47 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 63  BUG.    pLoop->c
362f0 49 64 20 3d 20 27 30 27 3b 0a 23 65 6e 64 69 66  Id = '0';.#endif
36300 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
36310 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
36320 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
36330 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
36340 66 20 74 68 65 20 6c 6f 6f 70 20 75 73 65 64 20  f the loop used 
36350 66 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73 65  for WHERE clause
36360 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 20   processing..** 
36370 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
36380 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
36390 20 61 6e 20 6f 70 61 71 75 65 20 73 74 72 75 63   an opaque struc
363a0 74 75 72 65 20 74 68 61 74 20 63 6f 6e 74 61 69  ture that contai
363b0 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f  ns.** informatio
363c0 6e 20 6e 65 65 64 65 64 20 74 6f 20 74 65 72 6d  n needed to term
363d0 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20  inate the loop. 
363e0 20 4c 61 74 65 72 2c 20 74 68 65 20 63 61 6c 6c   Later, the call
363f0 69 6e 67 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73  ing routine.** s
36400 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c  hould invoke sql
36410 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 77  ite3WhereEnd() w
36420 69 74 68 20 74 68 65 20 72 65 74 75 72 6e 20 76  ith the return v
36430 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e  alue of this fun
36440 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65  ction.** in orde
36450 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68  r to complete th
36460 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70  e WHERE clause p
36470 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a  rocessing..**.**
36480 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
36490 75 72 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  urs, this routin
364a0 65 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a  e returns NULL..
364b0 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73 69 63 20  **.** The basic 
364c0 69 64 65 61 20 69 73 20 74 6f 20 64 6f 20 61 20  idea is to do a 
364d0 6e 65 73 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65  nested loop, one
364e0 20 6c 6f 6f 70 20 66 6f 72 20 65 61 63 68 20 74   loop for each t
364f0 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46  able in.** the F
36500 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ROM clause of a 
36510 73 65 6c 65 63 74 2e 20 20 28 49 4e 53 45 52 54  select.  (INSERT
36520 20 61 6e 64 20 55 50 44 41 54 45 20 73 74 61 74   and UPDATE stat
36530 65 6d 65 6e 74 73 20 61 72 65 20 74 68 65 0a 2a  ements are the.*
36540 2a 20 73 61 6d 65 20 61 73 20 61 20 53 45 4c 45  * same as a SELE
36550 43 54 20 77 69 74 68 20 6f 6e 6c 79 20 61 20 73  CT with only a s
36560 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74  ingle table in t
36570 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 29  he FROM clause.)
36580 20 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65    For.** example
36590 2c 20 69 66 20 74 68 65 20 53 51 4c 20 69 73 20  , if the SQL is 
365a0 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
365b0 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
365c0 74 31 2c 20 74 32 2c 20 74 33 20 57 48 45 52 45  t1, t2, t3 WHERE
365d0 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e   ...;.**.** Then
365e0 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
365f0 74 65 64 20 69 73 20 63 6f 6e 63 65 70 74 75 61  ted is conceptua
36600 6c 6c 79 20 6c 69 6b 65 20 74 68 65 20 66 6f 6c  lly like the fol
36610 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
36620 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20     foreach row1 
36630 69 6e 20 74 31 20 64 6f 20 20 20 20 20 20 20 5c  in t1 do       \
36640 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74      Code generat
36650 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 66 6f 72  ed.**        for
36660 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20  each row2 in t2 
36670 64 6f 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73  do      |-- by s
36680 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
36690 28 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66  ().**          f
366a0 6f 72 65 61 63 68 20 72 6f 77 33 20 69 6e 20 74  oreach row3 in t
366b0 33 20 64 6f 20 20 20 2f 0a 2a 2a 20 20 20 20 20  3 do   /.**     
366c0 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20         ....**   
366d0 20 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20         end      
366e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
366f0 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74      Code generat
36700 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 65 6e 64  ed.**        end
36710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36720 20 20 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73          |-- by s
36730 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29  qlite3WhereEnd()
36740 0a 2a 2a 20 20 20 20 20 20 65 6e 64 20 20 20 20  .**      end    
36750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36760 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74       /.**.** Not
36770 65 20 74 68 61 74 20 74 68 65 20 6c 6f 6f 70 73  e that the loops
36780 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 6e 65   might not be ne
36790 73 74 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65  sted in the orde
367a0 72 20 69 6e 20 77 68 69 63 68 20 74 68 65 79 0a  r in which they.
367b0 2a 2a 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  ** appear in the
367c0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 66 20   FROM clause if 
367d0 61 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65  a different orde
367e0 72 20 69 73 20 62 65 74 74 65 72 20 61 62 6c 65  r is better able
367f0 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73 65 20   to make.** use 
36800 6f 66 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74  of indices.  Not
36810 65 20 61 6c 73 6f 20 74 68 61 74 20 77 68 65 6e  e also that when
36820 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
36830 20 61 70 70 65 61 72 73 20 69 6e 0a 2a 2a 20 74   appears in.** t
36840 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c  he WHERE clause,
36850 20 69 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74   it might result
36860 20 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e   in additional n
36870 65 73 74 65 64 20 6c 6f 6f 70 73 20 66 6f 72 0a  ested loops for.
36880 2a 2a 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f  ** scanning thro
36890 75 67 68 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f  ugh all values o
368a0 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  n the right-hand
368b0 20 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e 2e   side of the IN.
368c0 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65  .**.** There are
368d0 20 42 74 72 65 65 20 63 75 72 73 6f 72 73 20 61   Btree cursors a
368e0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65  ssociated with e
368f0 61 63 68 20 74 61 62 6c 65 2e 20 20 74 31 20 75  ach table.  t1 u
36900 73 65 73 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75  ses cursor.** nu
36910 6d 62 65 72 20 70 54 61 62 4c 69 73 74 2d 3e 61  mber pTabList->a
36920 5b 30 5d 2e 69 43 75 72 73 6f 72 2e 20 20 74 32  [0].iCursor.  t2
36930 20 75 73 65 73 20 74 68 65 20 63 75 72 73 6f 72   uses the cursor
36940 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e   pTabList->a[1].
36950 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20  iCursor..** And 
36960 73 6f 20 66 6f 72 74 68 2e 20 20 54 68 69 73 20  so forth.  This 
36970 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
36980 73 20 63 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74  s code to open t
36990 68 6f 73 65 20 56 44 42 45 20 63 75 72 73 6f 72  hose VDBE cursor
369a0 73 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33  s.** and sqlite3
369b0 57 68 65 72 65 45 6e 64 28 29 20 67 65 6e 65 72  WhereEnd() gener
369c0 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f  ates the code to
369d0 20 63 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a   close them..**.
369e0 2a 2a 20 54 68 65 20 63 6f 64 65 20 74 68 61 74  ** The code that
369f0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
36a00 69 6e 28 29 20 67 65 6e 65 72 61 74 65 73 20 6c  in() generates l
36a10 65 61 76 65 73 20 74 68 65 20 63 75 72 73 6f 72  eaves the cursor
36a20 73 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20 70 54  s named.** in pT
36a30 61 62 4c 69 73 74 20 70 6f 69 6e 74 69 6e 67 20  abList pointing 
36a40 61 74 20 74 68 65 69 72 20 61 70 70 72 6f 70 72  at their appropr
36a50 69 61 74 65 20 65 6e 74 72 69 65 73 2e 20 20 54  iate entries.  T
36a60 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a  he [...] code.**
36a70 20 63 61 6e 20 75 73 65 20 4f 50 5f 43 6f 6c 75   can use OP_Colu
36a80 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f 77 69 64 20  mn and OP_Rowid 
36a90 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68 65 73 65  opcodes on these
36aa0 20 63 75 72 73 6f 72 73 20 74 6f 20 65 78 74 72   cursors to extr
36ab0 61 63 74 0a 2a 2a 20 64 61 74 61 20 66 72 6f 6d  act.** data from
36ac0 20 74 68 65 20 76 61 72 69 6f 75 73 20 74 61 62   the various tab
36ad0 6c 65 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  les of the loop.
36ae0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48  .**.** If the WH
36af0 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 65 6d  ERE clause is em
36b00 70 74 79 2c 20 74 68 65 20 66 6f 72 65 61 63 68  pty, the foreach
36b10 20 6c 6f 6f 70 73 20 6d 75 73 74 20 65 61 63 68   loops must each
36b20 20 73 63 61 6e 20 74 68 65 69 72 0a 2a 2a 20 65   scan their.** e
36b30 6e 74 69 72 65 20 74 61 62 6c 65 73 2e 20 20 54  ntire tables.  T
36b40 68 75 73 20 61 20 74 68 72 65 65 2d 77 61 79 20  hus a three-way 
36b50 6a 6f 69 6e 20 69 73 20 61 6e 20 4f 28 4e 5e 33  join is an O(N^3
36b60 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 75  ) operation.  Bu
36b70 74 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c  t if.** the tabl
36b80 65 73 20 68 61 76 65 20 69 6e 64 69 63 65 73 20  es have indices 
36b90 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 74 65  and there are te
36ba0 72 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52 45  rms in the WHERE
36bb0 20 63 6c 61 75 73 65 20 74 68 61 74 0a 2a 2a 20   clause that.** 
36bc0 72 65 66 65 72 20 74 6f 20 74 68 6f 73 65 20 69  refer to those i
36bd0 6e 64 69 63 65 73 2c 20 61 20 63 6f 6d 70 6c 65  ndices, a comple
36be0 74 65 20 74 61 62 6c 65 20 73 63 61 6e 20 63 61  te table scan ca
36bf0 6e 20 62 65 20 61 76 6f 69 64 65 64 20 61 6e 64  n be avoided and
36c00 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 6c   the.** code wil
36c10 6c 20 72 75 6e 20 6d 75 63 68 20 66 61 73 74 65  l run much faste
36c20 72 2e 20 20 4d 6f 73 74 20 6f 66 20 74 68 65 20  r.  Most of the 
36c30 77 6f 72 6b 20 6f 66 20 74 68 69 73 20 72 6f 75  work of this rou
36c40 74 69 6e 65 20 69 73 20 63 68 65 63 6b 69 6e 67  tine is checking
36c50 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 74 68  .** to see if th
36c60 65 72 65 20 61 72 65 20 69 6e 64 69 63 65 73 20  ere are indices 
36c70 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64  that can be used
36c80 20 74 6f 20 73 70 65 65 64 20 75 70 20 74 68 65   to speed up the
36c90 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72   loop..**.** Ter
36ca0 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ms of the WHERE 
36cb0 63 6c 61 75 73 65 20 61 72 65 20 61 6c 73 6f 20  clause are also 
36cc0 75 73 65 64 20 74 6f 20 6c 69 6d 69 74 20 77 68  used to limit wh
36cd0 69 63 68 20 72 6f 77 73 20 61 63 74 75 61 6c 6c  ich rows actuall
36ce0 79 0a 2a 2a 20 6d 61 6b 65 20 69 74 20 74 6f 20  y.** make it to 
36cf0 74 68 65 20 22 2e 2e 2e 22 20 69 6e 20 74 68 65  the "..." in the
36d00 20 6d 69 64 64 6c 65 20 6f 66 20 74 68 65 20 6c   middle of the l
36d10 6f 6f 70 2e 20 20 41 66 74 65 72 20 65 61 63 68  oop.  After each
36d20 20 22 66 6f 72 65 61 63 68 22 2c 0a 2a 2a 20 74   "foreach",.** t
36d30 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52  erms of the WHER
36d40 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 75 73  E clause that us
36d50 65 20 6f 6e 6c 79 20 74 65 72 6d 73 20 69 6e 20  e only terms in 
36d60 74 68 61 74 20 6c 6f 6f 70 20 61 6e 64 20 6f 75  that loop and ou
36d70 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72 65  ter.** loops are
36d80 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69   evaluated and i
36d90 66 20 66 61 6c 73 65 20 61 20 6a 75 6d 70 20 69  f false a jump i
36da0 73 20 6d 61 64 65 20 61 72 6f 75 6e 64 20 61 6c  s made around al
36db0 6c 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20  l subsequent.** 
36dc0 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 28 6f 72 20  inner loops (or 
36dd0 61 72 6f 75 6e 64 20 74 68 65 20 22 2e 2e 2e 22  around the "..."
36de0 20 69 66 20 74 68 65 20 74 65 73 74 20 6f 63 63   if the test occ
36df0 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 69  urs within the i
36e00 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f  nner-.** most lo
36e10 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20  op).**.** OUTER 
36e20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f  JOINS.**.** An o
36e30 75 74 65 72 20 6a 6f 69 6e 20 6f 66 20 74 61 62  uter join of tab
36e40 6c 65 73 20 74 31 20 61 6e 64 20 74 32 20 69 73  les t1 and t2 is
36e50 20 63 6f 6e 63 65 70 74 61 6c 6c 79 20 63 6f 64   conceptally cod
36e60 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ed as follows:.*
36e70 2a 0a 2a 2a 20 20 20 20 66 6f 72 65 61 63 68 20  *.**    foreach 
36e80 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 0a 2a 2a  row1 in t1 do.**
36e90 20 20 20 20 20 20 66 6c 61 67 20 3d 20 30 0a 2a        flag = 0.*
36ea0 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72  *      foreach r
36eb0 6f 77 32 20 69 6e 20 74 32 20 64 6f 0a 2a 2a 20  ow2 in t2 do.** 
36ec0 20 20 20 20 20 20 20 73 74 61 72 74 3a 0a 2a 2a         start:.**
36ed0 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a            ....**
36ee0 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 20 3d            flag =
36ef0 20 31 0a 2a 2a 20 20 20 20 20 20 65 6e 64 0a 2a   1.**      end.*
36f00 2a 20 20 20 20 20 20 69 66 20 66 6c 61 67 3d 3d  *      if flag==
36f10 30 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20  0 then.**       
36f20 20 6d 6f 76 65 20 74 68 65 20 72 6f 77 32 20 63   move the row2 c
36f30 75 72 73 6f 72 20 74 6f 20 61 20 6e 75 6c 6c 20  ursor to a null 
36f40 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 67 6f  row.**        go
36f50 74 6f 20 73 74 61 72 74 0a 2a 2a 20 20 20 20 20  to start.**     
36f60 20 66 69 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a   fi.**    end.**
36f70 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 43 4c 41  .** ORDER BY CLA
36f80 55 53 45 20 50 52 4f 43 45 53 53 49 4e 47 0a 2a  USE PROCESSING.*
36f90 2a 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20 69 73  *.** pOrderBy is
36fa0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
36fb0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
36fc0 65 20 28 6f 72 20 74 68 65 20 47 52 4f 55 50 20  e (or the GROUP 
36fd0 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20 69 66 20  BY clause.** if 
36fe0 74 68 65 20 57 48 45 52 45 5f 47 52 4f 55 50 42  the WHERE_GROUPB
36ff0 59 20 66 6c 61 67 20 69 73 20 73 65 74 20 69 6e  Y flag is set in
37000 20 77 63 74 72 6c 46 6c 61 67 73 29 20 6f 66 20   wctrlFlags) of 
37010 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
37020 6e 74 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69  nt.** if there i
37030 73 20 6f 6e 65 2e 20 20 49 66 20 74 68 65 72 65  s one.  If there
37040 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20   is no ORDER BY 
37050 63 6c 61 75 73 65 20 6f 72 20 69 66 20 74 68 69  clause or if thi
37060 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  s routine.** is 
37070 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 6e 20 55  called from an U
37080 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
37090 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20  statement, then 
370a0 70 4f 72 64 65 72 42 79 20 69 73 20 4e 55 4c 4c  pOrderBy is NULL
370b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 49 64 78  ..**.** The iIdx
370c0 43 75 72 20 70 61 72 61 6d 65 74 65 72 20 69 73  Cur parameter is
370d0 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62   the cursor numb
370e0 65 72 20 6f 66 20 61 6e 20 69 6e 64 65 78 2e 20  er of an index. 
370f0 20 49 66 20 0a 2a 2a 20 57 48 45 52 45 5f 4f 4e   If .** WHERE_ON
37100 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 69 73 20 73  ETABLE_ONLY is s
37110 65 74 2c 20 69 49 64 78 43 75 72 20 69 73 20 74  et, iIdxCur is t
37120 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
37130 20 6f 66 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20   of an index.** 
37140 74 6f 20 75 73 65 20 66 6f 72 20 4f 52 20 63 6c  to use for OR cl
37150 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e  ause processing.
37160 20 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75    The WHERE clau
37170 73 65 20 73 68 6f 75 6c 64 20 75 73 65 20 74 68  se should use th
37180 69 73 0a 2a 2a 20 73 70 65 63 69 66 69 63 20 63  is.** specific c
37190 75 72 73 6f 72 2e 20 20 49 66 20 57 48 45 52 45  ursor.  If WHERE
371a0 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
371b0 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 69 49   is set, then iI
371c0 64 78 43 75 72 20 69 73 0a 2a 2a 20 74 68 65 20  dxCur is.** the 
371d0 66 69 72 73 74 20 63 75 72 73 6f 72 20 69 6e 20  first cursor in 
371e0 61 6e 20 61 72 72 61 79 20 6f 66 20 63 75 72 73  an array of curs
371f0 6f 72 73 20 66 6f 72 20 61 6c 6c 20 69 6e 64 69  ors for all indi
37200 63 65 73 2e 20 20 69 49 64 78 43 75 72 20 73 68  ces.  iIdxCur sh
37210 6f 75 6c 64 0a 2a 2a 20 62 65 20 75 73 65 64 20  ould.** be used 
37220 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 61  to compute the a
37230 70 70 72 6f 70 72 69 61 74 65 20 63 75 72 73 6f  ppropriate curso
37240 72 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77  r depending on w
37250 68 69 63 68 20 69 6e 64 65 78 20 69 73 0a 2a 2a  hich index is.**
37260 20 75 73 65 64 2e 0a 2a 2f 0a 57 68 65 72 65 49   used..*/.WhereI
37270 6e 66 6f 20 2a 73 71 6c 69 74 65 33 57 68 65 72  nfo *sqlite3Wher
37280 65 42 65 67 69 6e 28 0a 20 20 50 61 72 73 65 20  eBegin(.  Parse 
37290 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
372a0 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
372b0 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
372c0 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20  st *pTabList,   
372d0 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 3a   /* FROM clause:
372e0 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74   A list of all t
372f0 61 62 6c 65 73 20 74 6f 20 62 65 20 73 63 61 6e  ables to be scan
37300 6e 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ned */.  Expr *p
37310 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f  Where,         /
37320 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
37330 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
37340 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a   *pOrderBy,   /*
37350 20 41 6e 20 4f 52 44 45 52 20 42 59 20 28 6f 72   An ORDER BY (or
37360 20 47 52 4f 55 50 20 42 59 29 20 63 6c 61 75 73   GROUP BY) claus
37370 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  e, or NULL */.  
37380 45 78 70 72 4c 69 73 74 20 2a 70 52 65 73 75 6c  ExprList *pResul
37390 74 53 65 74 2c 20 2f 2a 20 52 65 73 75 6c 74 20  tSet, /* Result 
373a0 73 65 74 20 6f 66 20 74 68 65 20 71 75 65 72 79  set of the query
373b0 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46   */.  u16 wctrlF
373c0 6c 61 67 73 2c 20 20 20 20 20 20 20 2f 2a 20 4f  lags,       /* O
373d0 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f  ne of the WHERE_
373e0 2a 20 66 6c 61 67 73 20 64 65 66 69 6e 65 64 20  * flags defined 
373f0 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 2a  in sqliteInt.h *
37400 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 75 72 20  /.  int iIdxCur 
37410 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
37420 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f  WHERE_ONETABLE_O
37430 4e 4c 59 20 69 73 20 73 65 74 2c 20 69 6e 64 65  NLY is set, inde
37440 78 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  x cursor number 
37450 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74  */.){.  int nByt
37460 65 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  eWInfo;         
37470 20 20 20 2f 2a 20 4e 75 6d 2e 20 62 79 74 65 73     /* Num. bytes
37480 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 57   allocated for W
37490 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 20  hereInfo struct 
374a0 2a 2f 0a 20 20 69 6e 74 20 6e 54 61 62 4c 69 73  */.  int nTabLis
374b0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
374c0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65  /* Number of ele
374d0 6d 65 6e 74 73 20 69 6e 20 70 54 61 62 4c 69 73  ments in pTabLis
374e0 74 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f  t */.  WhereInfo
374f0 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20   *pWInfo;       
37500 20 20 2f 2a 20 57 69 6c 6c 20 62 65 63 6f 6d 65    /* Will become
37510 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
37520 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  e of this functi
37530 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20  on */.  Vdbe *v 
37540 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
37550 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61     /* The virtua
37560 6c 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e  l database engin
37570 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  e */.  Bitmask n
37580 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20 20 20  otReady;        
37590 20 20 2f 2a 20 43 75 72 73 6f 72 73 20 74 68 61    /* Cursors tha
375a0 74 20 61 72 65 20 6e 6f 74 20 79 65 74 20 70 6f  t are not yet po
375b0 73 69 74 69 6f 6e 65 64 20 2a 2f 0a 20 20 57 68  sitioned */.  Wh
375c0 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73  ereLoopBuilder s
375d0 57 4c 42 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  WLB;     /* The 
375e0 57 68 65 72 65 4c 6f 6f 70 20 62 75 69 6c 64 65  WhereLoop builde
375f0 72 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b  r */.  WhereMask
37600 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20  Set *pMaskSet;  
37610 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
37620 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a  ion mask set */.
37630 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
37640 65 76 65 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20  evel;        /* 
37650 41 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69  A single level i
37660 6e 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 2a 2f  n pWInfo->a[] */
37670 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
37680 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  oop;          /*
37690 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 69   Pointer to a si
376a0 6e 67 6c 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f  ngle WhereLoop o
376b0 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69  bject */.  int i
376c0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
376d0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
376e0 75 6e 74 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  unter */.  sqlit
376f0 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
37700 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
37710 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
37720 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
37730 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37740 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
37750 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 20 69  .  /* Variable i
37760 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f  nitialization */
37770 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
37780 64 62 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 57  db;.  memset(&sW
37790 4c 42 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 57  LB, 0, sizeof(sW
377a0 4c 42 29 29 3b 0a 0a 20 20 2f 2a 20 41 6e 20 4f  LB));..  /* An O
377b0 52 44 45 52 2f 47 52 4f 55 50 20 42 59 20 63 6c  RDER/GROUP BY cl
377c0 61 75 73 65 20 6f 66 20 6d 6f 72 65 20 74 68 61  ause of more tha
377d0 6e 20 36 33 20 74 65 72 6d 73 20 63 61 6e 6e 6f  n 63 terms canno
377e0 74 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 2a  t be optimized *
377f0 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 4f  /.  testcase( pO
37800 72 64 65 72 42 79 20 26 26 20 70 4f 72 64 65 72  rderBy && pOrder
37810 42 79 2d 3e 6e 45 78 70 72 3d 3d 42 4d 53 2d 31  By->nExpr==BMS-1
37820 20 29 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72   );.  if( pOrder
37830 42 79 20 26 26 20 70 4f 72 64 65 72 42 79 2d 3e  By && pOrderBy->
37840 6e 45 78 70 72 3e 3d 42 4d 53 20 29 20 70 4f 72  nExpr>=BMS ) pOr
37850 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 73 57 4c  derBy = 0;.  sWL
37860 42 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  B.pOrderBy = pOr
37870 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 44 69 73  derBy;..  /* Dis
37880 61 62 6c 65 20 74 68 65 20 44 49 53 54 49 4e 43  able the DISTINC
37890 54 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  T optimization i
378a0 66 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63  f SQLITE_Distinc
378b0 74 4f 70 74 20 69 73 20 73 65 74 20 76 69 61 0a  tOpt is set via.
378c0 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65 73    ** sqlite3_tes
378d0 74 5f 63 74 72 6c 28 53 51 4c 49 54 45 5f 54 45  t_ctrl(SQLITE_TE
378e0 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54  STCTRL_OPTIMIZAT
378f0 49 4f 4e 53 2c 2e 2e 2e 29 20 2a 2f 0a 20 20 69  IONS,...) */.  i
37900 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44  f( OptimizationD
37910 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  isabled(db, SQLI
37920 54 45 5f 44 69 73 74 69 6e 63 74 4f 70 74 29 20  TE_DistinctOpt) 
37930 29 7b 0a 20 20 20 20 77 63 74 72 6c 46 6c 61 67  ){.    wctrlFlag
37940 73 20 26 3d 20 7e 57 48 45 52 45 5f 57 41 4e 54  s &= ~WHERE_WANT
37950 5f 44 49 53 54 49 4e 43 54 3b 0a 20 20 7d 0a 0a  _DISTINCT;.  }..
37960 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
37970 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  of tables in the
37980 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20   FROM clause is 
37990 6c 69 6d 69 74 65 64 20 62 79 20 74 68 65 20 6e  limited by the n
379a0 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 62 69  umber of.  ** bi
379b0 74 73 20 69 6e 20 61 20 42 69 74 6d 61 73 6b 20  ts in a Bitmask 
379c0 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  .  */.  testcase
379d0 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ( pTabList->nSrc
379e0 3d 3d 42 4d 53 20 29 3b 0a 20 20 69 66 28 20 70  ==BMS );.  if( p
379f0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 42 4d  TabList->nSrc>BM
37a00 53 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  S ){.    sqlite3
37a10 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
37a20 20 22 61 74 20 6d 6f 73 74 20 25 64 20 74 61 62   "at most %d tab
37a30 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e 22 2c 20  les in a join", 
37a40 42 4d 53 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  BMS);.    return
37a50 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68   0;.  }..  /* Th
37a60 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 6d  is function norm
37a70 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 73 20 61  ally generates a
37a80 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 66 6f 72   nested loop for
37a90 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 0a   all tables in .
37aa0 20 20 2a 2a 20 70 54 61 62 4c 69 73 74 2e 20 20    ** pTabList.  
37ab0 42 75 74 20 69 66 20 74 68 65 20 57 48 45 52 45  But if the WHERE
37ac0 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66  _ONETABLE_ONLY f
37ad0 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
37ae0 20 77 65 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20   we should.  ** 
37af0 6f 6e 6c 79 20 67 65 6e 65 72 61 74 65 20 63 6f  only generate co
37b00 64 65 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  de for the first
37b10 20 74 61 62 6c 65 20 69 6e 20 70 54 61 62 4c 69   table in pTabLi
37b20 73 74 20 61 6e 64 20 61 73 73 75 6d 65 20 74 68  st and assume th
37b30 61 74 0a 20 20 2a 2a 20 61 6e 79 20 63 75 72 73  at.  ** any curs
37b40 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ors associated w
37b50 69 74 68 20 73 75 62 73 65 71 75 65 6e 74 20 74  ith subsequent t
37b60 61 62 6c 65 73 20 61 72 65 20 75 6e 69 6e 69 74  ables are uninit
37b70 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20  ialized..  */.  
37b80 6e 54 61 62 4c 69 73 74 20 3d 20 28 77 63 74 72  nTabList = (wctr
37b90 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
37ba0 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20 3f 20  NETABLE_ONLY) ? 
37bb0 31 20 3a 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  1 : pTabList->nS
37bc0 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  rc;..  /* Alloca
37bd0 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  te and initializ
37be0 65 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f 20  e the WhereInfo 
37bf0 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 77  structure that w
37c00 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 0a 20  ill become the. 
37c10 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65   ** return value
37c20 2e 20 41 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63  . A single alloc
37c30 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ation is used to
37c40 20 73 74 6f 72 65 20 74 68 65 20 57 68 65 72 65   store the Where
37c50 49 6e 66 6f 0a 20 20 2a 2a 20 73 74 72 75 63 74  Info.  ** struct
37c60 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  , the contents o
37c70 66 20 57 68 65 72 65 49 6e 66 6f 2e 61 5b 5d 2c  f WhereInfo.a[],
37c80 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   the WhereClause
37c90 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20   structure.  ** 
37ca0 61 6e 64 20 74 68 65 20 57 68 65 72 65 4d 61 73  and the WhereMas
37cb0 6b 53 65 74 20 73 74 72 75 63 74 75 72 65 2e 20  kSet structure. 
37cc0 53 69 6e 63 65 20 57 68 65 72 65 43 6c 61 75 73  Since WhereClaus
37cd0 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 38 2d  e contains an 8-
37ce0 62 79 74 65 0a 20 20 2a 2a 20 66 69 65 6c 64 20  byte.  ** field 
37cf0 28 74 79 70 65 20 42 69 74 6d 61 73 6b 29 20 69  (type Bitmask) i
37d00 74 20 6d 75 73 74 20 62 65 20 61 6c 69 67 6e 65  t must be aligne
37d10 64 20 6f 6e 20 61 6e 20 38 2d 62 79 74 65 20 62  d on an 8-byte b
37d20 6f 75 6e 64 61 72 79 20 6f 6e 0a 20 20 2a 2a 20  oundary on.  ** 
37d30 73 6f 6d 65 20 61 72 63 68 69 74 65 63 74 75 72  some architectur
37d40 65 73 2e 20 48 65 6e 63 65 20 74 68 65 20 52 4f  es. Hence the RO
37d50 55 4e 44 38 28 29 20 62 65 6c 6f 77 2e 0a 20 20  UND8() below..  
37d60 2a 2f 0a 20 20 6e 42 79 74 65 57 49 6e 66 6f 20  */.  nByteWInfo 
37d70 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  = ROUND8(sizeof(
37d80 57 68 65 72 65 49 6e 66 6f 29 2b 28 6e 54 61 62  WhereInfo)+(nTab
37d90 4c 69 73 74 2d 31 29 2a 73 69 7a 65 6f 66 28 57  List-1)*sizeof(W
37da0 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20 70  hereLevel));.  p
37db0 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  WInfo = sqlite3D
37dc0 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
37dd0 6e 42 79 74 65 57 49 6e 66 6f 20 2b 20 73 69 7a  nByteWInfo + siz
37de0 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b  eof(WhereLoop));
37df0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
37e00 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73  cFailed ){.    s
37e10 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
37e20 20 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 70 57   pWInfo);.    pW
37e30 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20 67 6f  Info = 0;.    go
37e40 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
37e50 6f 72 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f  or;.  }.  pWInfo
37e60 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 30  ->aiCurOnePass[0
37e70 5d 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75  ] = pWInfo->aiCu
37e80 72 4f 6e 65 50 61 73 73 5b 31 5d 20 3d 20 2d 31  rOnePass[1] = -1
37e90 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  ;.  pWInfo->nLev
37ea0 65 6c 20 3d 20 6e 54 61 62 4c 69 73 74 3b 0a 20  el = nTabList;. 
37eb0 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20   pWInfo->pParse 
37ec0 3d 20 70 50 61 72 73 65 3b 0a 20 20 70 57 49 6e  = pParse;.  pWIn
37ed0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 20 3d 20 70  fo->pTabList = p
37ee0 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66  TabList;.  pWInf
37ef0 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  o->pOrderBy = pO
37f00 72 64 65 72 42 79 3b 0a 20 20 70 57 49 6e 66 6f  rderBy;.  pWInfo
37f10 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 70  ->pResultSet = p
37f20 52 65 73 75 6c 74 53 65 74 3b 0a 20 20 70 57 49  ResultSet;.  pWI
37f30 6e 66 6f 2d 3e 69 42 72 65 61 6b 20 3d 20 70 57  nfo->iBreak = pW
37f40 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20  Info->iContinue 
37f50 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
37f60 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70 57 49  eLabel(v);.  pWI
37f70 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
37f80 3d 20 77 63 74 72 6c 46 6c 61 67 73 3b 0a 20 20  = wctrlFlags;.  
37f90 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75  pWInfo->savedNQu
37fa0 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65  eryLoop = pParse
37fb0 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20  ->nQueryLoop;.  
37fc0 70 4d 61 73 6b 53 65 74 20 3d 20 26 70 57 49 6e  pMaskSet = &pWIn
37fd0 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a 20 20  fo->sMaskSet;.  
37fe0 73 57 4c 42 2e 70 57 49 6e 66 6f 20 3d 20 70 57  sWLB.pWInfo = pW
37ff0 49 6e 66 6f 3b 0a 20 20 73 57 4c 42 2e 70 57 43  Info;.  sWLB.pWC
38000 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b   = &pWInfo->sWC;
38010 0a 20 20 73 57 4c 42 2e 70 4e 65 77 20 3d 20 28  .  sWLB.pNew = (
38020 57 68 65 72 65 4c 6f 6f 70 2a 29 28 28 28 63 68  WhereLoop*)(((ch
38030 61 72 2a 29 70 57 49 6e 66 6f 29 2b 6e 42 79 74  ar*)pWInfo)+nByt
38040 65 57 49 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72  eWInfo);.  asser
38050 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
38060 49 47 4e 4d 45 4e 54 28 73 57 4c 42 2e 70 4e 65  IGNMENT(sWLB.pNe
38070 77 29 20 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f  w) );.  whereLoo
38080 70 49 6e 69 74 28 73 57 4c 42 2e 70 4e 65 77 29  pInit(sWLB.pNew)
38090 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
380a0 44 45 42 55 47 0a 20 20 73 57 4c 42 2e 70 4e 65  DEBUG.  sWLB.pNe
380b0 77 2d 3e 63 49 64 20 3d 20 27 2a 27 3b 0a 23 65  w->cId = '*';.#e
380c0 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 70 6c 69 74  ndif..  /* Split
380d0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
380e0 65 20 69 6e 74 6f 20 73 65 70 61 72 61 74 65 20  e into separate 
380f0 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 77  subexpressions w
38100 68 65 72 65