/ Hex Artifact Content
Login

Artifact 5b519760ffaeb8ea70c34ba6bd8344d768338c6a7ba907b01746cd92adde04ea:


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 54 52 55 45 20 69 66  * Return TRUE if
05b0: 20 74 68 65 20 69 6e 6e 65 72 6d 6f 73 74 20 6c   the innermost l
05c0: 6f 6f 70 20 6f 66 20 74 68 65 20 57 48 45 52 45  oop of the WHERE
05d0: 20 63 6c 61 75 73 65 20 69 6d 70 6c 65 6d 65 6e   clause implemen
05e0: 74 61 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e  tation.** return
05f0: 73 20 72 6f 77 73 20 69 6e 20 4f 52 44 45 52 20  s rows in ORDER 
0600: 42 59 20 6f 72 64 65 72 20 66 6f 72 20 63 6f 6d  BY order for com
0610: 70 6c 65 74 65 20 72 75 6e 20 6f 66 20 74 68 65  plete run of the
0620: 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e 0a 2a 2a 0a   inner loop..**.
0630: 2a 2a 20 41 63 72 6f 73 73 20 6d 75 6c 74 69 70  ** Across multip
0640: 6c 65 20 69 74 65 72 61 74 69 6f 6e 73 20 6f 66  le iterations of
0650: 20 6f 75 74 65 72 20 6c 6f 6f 70 73 2c 20 74 68   outer loops, th
0660: 65 20 6f 75 74 70 75 74 20 72 6f 77 73 20 6e 65  e output rows ne
0670: 65 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 73 6f 72  ed not be.** sor
0680: 74 65 64 2e 20 20 41 73 20 6c 6f 6e 67 20 61 73  ted.  As long as
0690: 20 72 6f 77 73 20 61 72 65 20 73 6f 72 74 65 64   rows are sorted
06a0: 20 66 6f 72 20 6a 75 73 74 20 74 68 65 20 69 6e   for just the in
06b0: 6e 65 72 6d 6f 73 74 20 6c 6f 6f 70 2c 20 74 68  nermost loop, th
06c0: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 63 61  is.** routine ca
06d0: 6e 20 72 65 74 75 72 6e 20 54 52 55 45 2e 0a 2a  n return TRUE..*
06e0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  /.int sqlite3Whe
06f0: 72 65 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f  reOrderedInnerLo
0700: 6f 70 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  op(WhereInfo *pW
0710: 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20  Info){.  return 
0720: 70 57 49 6e 66 6f 2d 3e 62 4f 72 64 65 72 65 64  pWInfo->bOrdered
0730: 49 6e 6e 65 72 4c 6f 6f 70 3b 0a 7d 0a 0a 2f 2a  InnerLoop;.}../*
0740: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56  .** Return the V
0750: 44 42 45 20 61 64 64 72 65 73 73 20 6f 72 20 6c  DBE address or l
0760: 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20  abel to jump to 
0770: 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 74  in order to cont
0780: 69 6e 75 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74  inue.** immediat
0790: 65 6c 79 20 77 69 74 68 20 74 68 65 20 6e 65 78  ely with the nex
07a0: 74 20 72 6f 77 20 6f 66 20 61 20 57 48 45 52 45  t row of a WHERE
07b0: 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20   clause..*/.int 
07c0: 73 71 6c 69 74 65 33 57 68 65 72 65 43 6f 6e 74  sqlite3WhereCont
07d0: 69 6e 75 65 4c 61 62 65 6c 28 57 68 65 72 65 49  inueLabel(WhereI
07e0: 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20  nfo *pWInfo){.  
07f0: 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
0800: 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20 29 3b 0a  iContinue!=0 );.
0810: 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d    return pWInfo-
0820: 3e 69 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  >iContinue;.}../
0830: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
0840: 56 44 42 45 20 61 64 64 72 65 73 73 20 6f 72 20  VDBE address or 
0850: 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f  label to jump to
0860: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 65   in order to bre
0870: 61 6b 0a 2a 2a 20 6f 75 74 20 6f 66 20 61 20 57  ak.** out of a W
0880: 48 45 52 45 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e  HERE loop..*/.in
0890: 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 72  t sqlite3WhereBr
08a0: 65 61 6b 4c 61 62 65 6c 28 57 68 65 72 65 49 6e  eakLabel(WhereIn
08b0: 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72  fo *pWInfo){.  r
08c0: 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 69 42  eturn pWInfo->iB
08d0: 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  reak;.}../*.** R
08e0: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 61 6e  eturn TRUE if an
08f0: 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
0900: 45 20 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 20  E statement can 
0910: 6f 70 65 72 61 74 65 20 64 69 72 65 63 74 6c 79  operate directly
0920: 20 6f 6e 0a 2a 2a 20 74 68 65 20 72 6f 77 69 64   on.** the rowid
0930: 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 20  s returned by a 
0940: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 52  WHERE clause.  R
0950: 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20 64  eturn FALSE if d
0960: 6f 69 6e 67 20 61 6e 0a 2a 2a 20 55 50 44 41 54  oing an.** UPDAT
0970: 45 20 6f 72 20 44 45 4c 45 54 45 20 6d 69 67 68  E or DELETE migh
0980: 74 20 63 68 61 6e 67 65 20 73 75 62 73 65 71 75  t change subsequ
0990: 65 6e 74 20 57 48 45 52 45 20 63 6c 61 75 73 65  ent WHERE clause
09a0: 20 72 65 73 75 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20   results..**.** 
09b0: 49 66 20 74 68 65 20 4f 4e 45 50 41 53 53 20 6f  If the ONEPASS o
09c0: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75  ptimization is u
09d0: 73 65 64 20 28 69 66 20 74 68 69 73 20 72 6f 75  sed (if this rou
09e0: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 72 75  tine returns tru
09f0: 65 29 0a 2a 2a 20 74 68 65 6e 20 61 6c 73 6f 20  e).** then also 
0a00: 77 72 69 74 65 20 74 68 65 20 69 6e 64 69 63 65  write the indice
0a10: 73 20 6f 66 20 6f 70 65 6e 20 63 75 72 73 6f 72  s of open cursor
0a20: 73 20 75 73 65 64 20 62 79 20 4f 4e 45 50 41 53  s used by ONEPAS
0a30: 53 0a 2a 2a 20 69 6e 74 6f 20 61 69 43 75 72 5b  S.** into aiCur[
0a40: 30 5d 20 61 6e 64 20 61 69 43 75 72 5b 31 5d 2e  0] and aiCur[1].
0a50: 20 20 69 61 43 75 72 5b 30 5d 20 67 65 74 73 20    iaCur[0] gets 
0a60: 74 68 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68  the cursor of th
0a70: 65 20 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20  e data.** table 
0a80: 61 6e 64 20 69 61 43 75 72 5b 31 5d 20 67 65 74  and iaCur[1] get
0a90: 73 20 74 68 65 20 63 75 72 73 6f 72 20 75 73 65  s the cursor use
0aa0: 64 20 62 79 20 61 6e 20 61 75 78 69 6c 69 61 72  d by an auxiliar
0ab0: 79 20 69 6e 64 65 78 2e 0a 2a 2a 20 45 69 74 68  y index..** Eith
0ac0: 65 72 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20  er value may be 
0ad0: 2d 31 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74  -1, indicating t
0ae0: 68 61 74 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  hat cursor is no
0af0: 74 20 75 73 65 64 2e 0a 2a 2a 20 41 6e 79 20 63  t used..** Any c
0b00: 75 72 73 6f 72 73 20 72 65 74 75 72 6e 65 64 20  ursors returned 
0b10: 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 6f  will have been o
0b20: 70 65 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e  pened for writin
0b30: 67 2e 0a 2a 2a 0a 2a 2a 20 61 69 43 75 72 5b 30  g..**.** aiCur[0
0b40: 5d 20 61 6e 64 20 61 69 43 75 72 5b 31 5d 20 62  ] and aiCur[1] b
0b50: 6f 74 68 20 67 65 74 20 2d 31 20 69 66 20 74 68  oth get -1 if th
0b60: 65 20 77 68 65 72 65 2d 63 6c 61 75 73 65 20 6c  e where-clause l
0b70: 6f 67 69 63 20 69 73 0a 2a 2a 20 75 6e 61 62 6c  ogic is.** unabl
0b80: 65 20 74 6f 20 75 73 65 20 74 68 65 20 4f 4e 45  e to use the ONE
0b90: 50 41 53 53 20 6f 70 74 69 6d 69 7a 61 74 69 6f  PASS optimizatio
0ba0: 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
0bb0: 33 57 68 65 72 65 4f 6b 4f 6e 65 50 61 73 73 28  3WhereOkOnePass(
0bc0: 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
0bd0: 6f 2c 20 69 6e 74 20 2a 61 69 43 75 72 29 7b 0a  o, int *aiCur){.
0be0: 20 20 6d 65 6d 63 70 79 28 61 69 43 75 72 2c 20    memcpy(aiCur, 
0bf0: 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65  pWInfo->aiCurOne
0c00: 50 61 73 73 2c 20 73 69 7a 65 6f 66 28 69 6e 74  Pass, sizeof(int
0c10: 29 2a 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  )*2);.  return p
0c20: 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73  WInfo->okOnePass
0c30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
0c40: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70  the content of p
0c50: 53 72 63 20 69 6e 74 6f 20 70 44 65 73 74 0a 2a  Src into pDest.*
0c60: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
0c70: 65 72 65 4f 72 4d 6f 76 65 28 57 68 65 72 65 4f  ereOrMove(WhereO
0c80: 72 53 65 74 20 2a 70 44 65 73 74 2c 20 57 68 65  rSet *pDest, Whe
0c90: 72 65 4f 72 53 65 74 20 2a 70 53 72 63 29 7b 0a  reOrSet *pSrc){.
0ca0: 20 20 70 44 65 73 74 2d 3e 6e 20 3d 20 70 53 72    pDest->n = pSr
0cb0: 63 2d 3e 6e 3b 0a 20 20 6d 65 6d 63 70 79 28 70  c->n;.  memcpy(p
0cc0: 44 65 73 74 2d 3e 61 2c 20 70 53 72 63 2d 3e 61  Dest->a, pSrc->a
0cd0: 2c 20 70 44 65 73 74 2d 3e 6e 2a 73 69 7a 65 6f  , pDest->n*sizeo
0ce0: 66 28 70 44 65 73 74 2d 3e 61 5b 30 5d 29 29 3b  f(pDest->a[0]));
0cf0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f  .}../*.** Try to
0d00: 20 69 6e 73 65 72 74 20 61 20 6e 65 77 20 70 72   insert a new pr
0d10: 65 72 65 71 75 69 73 69 74 65 2f 63 6f 73 74 20  erequisite/cost 
0d20: 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 57  entry into the W
0d30: 68 65 72 65 4f 72 53 65 74 20 70 53 65 74 2e 0a  hereOrSet pSet..
0d40: 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 65 6e  **.** The new en
0d50: 74 72 79 20 6d 69 67 68 74 20 6f 76 65 72 77 72  try might overwr
0d60: 69 74 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20  ite an existing 
0d70: 65 6e 74 72 79 2c 20 6f 72 20 69 74 20 6d 69 67  entry, or it mig
0d80: 68 74 20 62 65 0a 2a 2a 20 61 70 70 65 6e 64 65  ht be.** appende
0d90: 64 2c 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62  d, or it might b
0da0: 65 20 64 69 73 63 61 72 64 65 64 2e 20 20 44 6f  e discarded.  Do
0db0: 20 77 68 61 74 65 76 65 72 20 69 73 20 74 68 65   whatever is the
0dc0: 20 72 69 67 68 74 20 74 68 69 6e 67 0a 2a 2a 20   right thing.** 
0dd0: 73 6f 20 74 68 61 74 20 70 53 65 74 20 6b 65 65  so that pSet kee
0de0: 70 73 20 74 68 65 20 4e 5f 4f 52 5f 43 4f 53 54  ps the N_OR_COST
0df0: 20 62 65 73 74 20 65 6e 74 72 69 65 73 20 73 65   best entries se
0e00: 65 6e 20 73 6f 20 66 61 72 2e 0a 2a 2f 0a 73 74  en so far..*/.st
0e10: 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4f 72  atic int whereOr
0e20: 49 6e 73 65 72 74 28 0a 20 20 57 68 65 72 65 4f  Insert(.  WhereO
0e30: 72 53 65 74 20 2a 70 53 65 74 2c 20 20 20 20 20  rSet *pSet,     
0e40: 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4f 72 53   /* The WhereOrS
0e50: 65 74 20 74 6f 20 62 65 20 75 70 64 61 74 65 64  et to be updated
0e60: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72   */.  Bitmask pr
0e70: 65 72 65 71 2c 20 20 20 20 20 20 20 20 2f 2a 20  ereq,        /* 
0e80: 50 72 65 72 65 71 75 69 73 69 74 65 73 20 6f 66  Prerequisites of
0e90: 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 2a   the new entry *
0ea0: 2f 0a 20 20 4c 6f 67 45 73 74 20 72 52 75 6e 2c  /.  LogEst rRun,
0eb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 75             /* Ru
0ec0: 6e 2d 63 6f 73 74 20 6f 66 20 74 68 65 20 6e 65  n-cost of the ne
0ed0: 77 20 65 6e 74 72 79 20 2a 2f 0a 20 20 4c 6f 67  w entry */.  Log
0ee0: 45 73 74 20 6e 4f 75 74 20 20 20 20 20 20 20 20  Est nOut        
0ef0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0f00: 20 6f 75 74 70 75 74 73 20 66 6f 72 20 74 68 65   outputs for the
0f10: 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a 29 7b   new entry */.){
0f20: 0a 20 20 75 31 36 20 69 3b 0a 20 20 57 68 65 72  .  u16 i;.  Wher
0f30: 65 4f 72 43 6f 73 74 20 2a 70 3b 0a 20 20 66 6f  eOrCost *p;.  fo
0f40: 72 28 69 3d 70 53 65 74 2d 3e 6e 2c 20 70 3d 70  r(i=pSet->n, p=p
0f50: 53 65 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d  Set->a; i>0; i--
0f60: 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , p++){.    if( 
0f70: 72 52 75 6e 3c 3d 70 2d 3e 72 52 75 6e 20 26 26  rRun<=p->rRun &&
0f80: 20 28 70 72 65 72 65 71 20 26 20 70 2d 3e 70 72   (prereq & p->pr
0f90: 65 72 65 71 29 3d 3d 70 72 65 72 65 71 20 29 7b  ereq)==prereq ){
0fa0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72  .      goto wher
0fb0: 65 4f 72 49 6e 73 65 72 74 5f 64 6f 6e 65 3b 0a  eOrInsert_done;.
0fc0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
0fd0: 3e 72 52 75 6e 3c 3d 72 52 75 6e 20 26 26 20 28  >rRun<=rRun && (
0fe0: 70 2d 3e 70 72 65 72 65 71 20 26 20 70 72 65 72  p->prereq & prer
0ff0: 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20 29  eq)==p->prereq )
1000: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
1010: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
1020: 28 20 70 53 65 74 2d 3e 6e 3c 4e 5f 4f 52 5f 43  ( pSet->n<N_OR_C
1030: 4f 53 54 20 29 7b 0a 20 20 20 20 70 20 3d 20 26  OST ){.    p = &
1040: 70 53 65 74 2d 3e 61 5b 70 53 65 74 2d 3e 6e 2b  pSet->a[pSet->n+
1050: 2b 5d 3b 0a 20 20 20 20 70 2d 3e 6e 4f 75 74 20  +];.    p->nOut 
1060: 3d 20 6e 4f 75 74 3b 0a 20 20 7d 65 6c 73 65 7b  = nOut;.  }else{
1070: 0a 20 20 20 20 70 20 3d 20 70 53 65 74 2d 3e 61  .    p = pSet->a
1080: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69  ;.    for(i=1; i
1090: 3c 70 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a  <pSet->n; i++){.
10a0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 52 75        if( p->rRu
10b0: 6e 3e 70 53 65 74 2d 3e 61 5b 69 5d 2e 72 52 75  n>pSet->a[i].rRu
10c0: 6e 20 29 20 70 20 3d 20 70 53 65 74 2d 3e 61 20  n ) p = pSet->a 
10d0: 2b 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  + i;.    }.    i
10e0: 66 28 20 70 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e  f( p->rRun<=rRun
10f0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d   ) return 0;.  }
1100: 0a 77 68 65 72 65 4f 72 49 6e 73 65 72 74 5f 64  .whereOrInsert_d
1110: 6f 6e 65 3a 0a 20 20 70 2d 3e 70 72 65 72 65 71  one:.  p->prereq
1120: 20 3d 20 70 72 65 72 65 71 3b 0a 20 20 70 2d 3e   = prereq;.  p->
1130: 72 52 75 6e 20 3d 20 72 52 75 6e 3b 0a 20 20 69  rRun = rRun;.  i
1140: 66 28 20 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20  f( p->nOut>nOut 
1150: 29 20 70 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74  ) p->nOut = nOut
1160: 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ;.  return 1;.}.
1170: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
1180: 65 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64  e a preallocated
1190: 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72   WhereClause str
11a0: 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ucture..*/.stati
11b0: 63 20 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75  c void whereClau
11c0: 73 65 49 6e 69 74 28 0a 20 20 57 68 65 72 65 43  seInit(.  WhereC
11d0: 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
11e0: 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 43     /* The WhereC
11f0: 6c 61 75 73 65 20 74 6f 20 62 65 20 69 6e 69 74  lause to be init
1200: 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 57 68 65  ialized */.  Whe
1210: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 20  reInfo *pWInfo  
1220: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
1230: 52 45 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f  RE processing co
1240: 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 70 57  ntext */.){.  pW
1250: 43 2d 3e 70 57 49 6e 66 6f 20 3d 20 70 57 49 6e  C->pWInfo = pWIn
1260: 66 6f 3b 0a 20 20 70 57 43 2d 3e 70 4f 75 74 65  fo;.  pWC->pOute
1270: 72 20 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 54  r = 0;.  pWC->nT
1280: 65 72 6d 20 3d 20 30 3b 0a 20 20 70 57 43 2d 3e  erm = 0;.  pWC->
1290: 6e 53 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a  nSlot = ArraySiz
12a0: 65 28 70 57 43 2d 3e 61 53 74 61 74 69 63 29 3b  e(pWC->aStatic);
12b0: 0a 20 20 70 57 43 2d 3e 61 20 3d 20 70 57 43 2d  .  pWC->a = pWC-
12c0: 3e 61 53 74 61 74 69 63 3b 0a 7d 0a 0a 2f 2a 20  >aStatic;.}../* 
12d0: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
12e0: 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  e */.static void
12f0: 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61   whereClauseClea
1300: 72 28 57 68 65 72 65 43 6c 61 75 73 65 2a 29 3b  r(WhereClause*);
1310: 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61  ../*.** Dealloca
1320: 74 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73  te all memory as
1330: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20  sociated with a 
1340: 57 68 65 72 65 4f 72 49 6e 66 6f 20 6f 62 6a 65  WhereOrInfo obje
1350: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ct..*/.static vo
1360: 69 64 20 77 68 65 72 65 4f 72 49 6e 66 6f 44 65  id whereOrInfoDe
1370: 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
1380: 2c 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70  , WhereOrInfo *p
1390: 29 7b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65  ){.  whereClause
13a0: 43 6c 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a 20  Clear(&p->wc);. 
13b0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
13c0: 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  b, p);.}../*.** 
13d0: 44 65 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d  Deallocate all m
13e0: 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
13f0: 20 77 69 74 68 20 61 20 57 68 65 72 65 41 6e 64   with a WhereAnd
1400: 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  Info object..*/.
1410: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
1420: 65 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 73  eAndInfoDelete(s
1430: 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72  qlite3 *db, Wher
1440: 65 41 6e 64 49 6e 66 6f 20 2a 70 29 7b 0a 20 20  eAndInfo *p){.  
1450: 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72  whereClauseClear
1460: 28 26 70 2d 3e 77 63 29 3b 0a 20 20 73 71 6c 69  (&p->wc);.  sqli
1470: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
1480: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c  ;.}../*.** Deall
1490: 6f 63 61 74 65 20 61 20 57 68 65 72 65 43 6c 61  ocate a WhereCla
14a0: 75 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 20  use structure.  
14b0: 54 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  The WhereClause 
14c0: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 74 73  structure.** its
14d0: 65 6c 66 20 69 73 20 6e 6f 74 20 66 72 65 65 64  elf is not freed
14e0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
14f0: 69 73 20 74 68 65 20 69 6e 76 65 72 73 65 20 6f  is the inverse o
1500: 66 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69  f whereClauseIni
1510: 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  t()..*/.static v
1520: 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73 65 43  oid whereClauseC
1530: 6c 65 61 72 28 57 68 65 72 65 43 6c 61 75 73 65  lear(WhereClause
1540: 20 2a 70 57 43 29 7b 0a 20 20 69 6e 74 20 69 3b   *pWC){.  int i;
1550: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 61 3b  .  WhereTerm *a;
1560: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1570: 20 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50   pWC->pWInfo->pP
1580: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 66 6f 72 28  arse->db;.  for(
1590: 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 2c 20  i=pWC->nTerm-1, 
15a0: 61 3d 70 57 43 2d 3e 61 3b 20 69 3e 3d 30 3b 20  a=pWC->a; i>=0; 
15b0: 69 2d 2d 2c 20 61 2b 2b 29 7b 0a 20 20 20 20 69  i--, a++){.    i
15c0: 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20  f( a->wtFlags & 
15d0: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a  TERM_DYNAMIC ){.
15e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
15f0: 72 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 70  rDelete(db, a->p
1600: 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Expr);.    }.   
1610: 20 69 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20   if( a->wtFlags 
1620: 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 29 7b  & TERM_ORINFO ){
1630: 0a 20 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e  .      whereOrIn
1640: 66 6f 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e  foDelete(db, a->
1650: 75 2e 70 4f 72 49 6e 66 6f 29 3b 0a 20 20 20 20  u.pOrInfo);.    
1660: 7d 65 6c 73 65 20 69 66 28 20 61 2d 3e 77 74 46  }else if( a->wtF
1670: 6c 61 67 73 20 26 20 54 45 52 4d 5f 41 4e 44 49  lags & TERM_ANDI
1680: 4e 46 4f 20 29 7b 0a 20 20 20 20 20 20 77 68 65  NFO ){.      whe
1690: 72 65 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28  reAndInfoDelete(
16a0: 64 62 2c 20 61 2d 3e 75 2e 70 41 6e 64 49 6e 66  db, a->u.pAndInf
16b0: 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  o);.    }.  }.  
16c0: 69 66 28 20 70 57 43 2d 3e 61 21 3d 70 57 43 2d  if( pWC->a!=pWC-
16d0: 3e 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20  >aStatic ){.    
16e0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
16f0: 2c 20 70 57 43 2d 3e 61 29 3b 0a 20 20 7d 0a 7d  , pWC->a);.  }.}
1700: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69  ../*.** Add a si
1710: 6e 67 6c 65 20 6e 65 77 20 57 68 65 72 65 54 65  ngle new WhereTe
1720: 72 6d 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20  rm entry to the 
1730: 57 68 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65  WhereClause obje
1740: 63 74 20 70 57 43 2e 0a 2a 2a 20 54 68 65 20 6e  ct pWC..** The n
1750: 65 77 20 57 68 65 72 65 54 65 72 6d 20 6f 62 6a  ew WhereTerm obj
1760: 65 63 74 20 69 73 20 63 6f 6e 73 74 72 75 63 74  ect is construct
1770: 65 64 20 66 72 6f 6d 20 45 78 70 72 20 70 20 61  ed from Expr p a
1780: 6e 64 20 77 69 74 68 20 77 74 46 6c 61 67 73 2e  nd with wtFlags.
1790: 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 69 6e  .** The index in
17a0: 20 70 57 43 2d 3e 61 5b 5d 20 6f 66 20 74 68 65   pWC->a[] of the
17b0: 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20 69   new WhereTerm i
17c0: 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
17d0: 63 63 65 73 73 2e 0a 2a 2a 20 30 20 69 73 20 72  ccess..** 0 is r
17e0: 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 6e  eturned if the n
17f0: 65 77 20 57 68 65 72 65 54 65 72 6d 20 63 6f 75  ew WhereTerm cou
1800: 6c 64 20 6e 6f 74 20 62 65 20 61 64 64 65 64 20  ld not be added 
1810: 64 75 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79 0a  due to a memory.
1820: 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72  ** allocation er
1830: 72 6f 72 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79  ror.  The memory
1840: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
1850: 75 72 65 20 77 69 6c 6c 20 62 65 20 72 65 63 6f  ure will be reco
1860: 72 64 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64  rded in.** the d
1870: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1880: 66 6c 61 67 20 73 6f 20 74 68 61 74 20 68 69 67  flag so that hig
1890: 68 65 72 2d 6c 65 76 65 6c 20 66 75 6e 63 74 69  her-level functi
18a0: 6f 6e 73 20 63 61 6e 20 64 65 74 65 63 74 20 69  ons can detect i
18b0: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  t..**.** This ro
18c0: 75 74 69 6e 65 20 77 69 6c 6c 20 69 6e 63 72 65  utine will incre
18d0: 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ase the size of 
18e0: 74 68 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72  the pWC->a[] arr
18f0: 61 79 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e  ay as necessary.
1900: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 74  .**.** If the wt
1910: 46 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69  Flags argument i
1920: 6e 63 6c 75 64 65 73 20 54 45 52 4d 5f 44 59 4e  ncludes TERM_DYN
1930: 41 4d 49 43 2c 20 74 68 65 6e 20 72 65 73 70 6f  AMIC, then respo
1940: 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20 66 6f 72  nsibility.** for
1950: 20 66 72 65 65 69 6e 67 20 74 68 65 20 65 78 70   freeing the exp
1960: 72 65 73 73 69 6f 6e 20 70 20 69 73 20 61 73 73  ression p is ass
1970: 75 6d 65 64 20 62 79 20 74 68 65 20 57 68 65 72  umed by the Wher
1980: 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 20 70  eClause object p
1990: 57 43 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  WC..** This is t
19a0: 72 75 65 20 65 76 65 6e 20 69 66 20 74 68 69 73  rue even if this
19b0: 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 74   routine fails t
19c0: 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  o allocate a new
19d0: 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a   WhereTerm..**.*
19e0: 2a 20 57 41 52 4e 49 4e 47 3a 20 20 54 68 69 73  * WARNING:  This
19f0: 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72   routine might r
1a00: 65 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 70  eallocate the sp
1a10: 61 63 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72  ace used to stor
1a20: 65 0a 2a 2a 20 57 68 65 72 65 54 65 72 6d 73 2e  e.** WhereTerms.
1a30: 20 20 41 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74    All pointers t
1a40: 6f 20 57 68 65 72 65 54 65 72 6d 73 20 73 68 6f  o WhereTerms sho
1a50: 75 6c 64 20 62 65 20 69 6e 76 61 6c 69 64 61 74  uld be invalidat
1a60: 65 64 20 61 66 74 65 72 0a 2a 2a 20 63 61 6c 6c  ed after.** call
1a70: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
1a80: 2e 20 20 53 75 63 68 20 70 6f 69 6e 74 65 72 73  .  Such pointers
1a90: 20 6d 61 79 20 62 65 20 72 65 69 6e 69 74 69 61   may be reinitia
1aa0: 6c 69 7a 65 64 20 62 79 20 72 65 66 65 72 65 6e  lized by referen
1ab0: 63 69 6e 67 0a 2a 2a 20 74 68 65 20 70 57 43 2d  cing.** the pWC-
1ac0: 3e 61 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73  >a[] array..*/.s
1ad0: 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 43  tatic int whereC
1ae0: 6c 61 75 73 65 49 6e 73 65 72 74 28 57 68 65 72  lauseInsert(Wher
1af0: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78  eClause *pWC, Ex
1b00: 70 72 20 2a 70 2c 20 75 31 36 20 77 74 46 6c 61  pr *p, u16 wtFla
1b10: 67 73 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d  gs){.  WhereTerm
1b20: 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69   *pTerm;.  int i
1b30: 64 78 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  dx;.  testcase( 
1b40: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
1b50: 49 52 54 55 41 4c 20 29 3b 0a 20 20 69 66 28 20  IRTUAL );.  if( 
1b60: 70 57 43 2d 3e 6e 54 65 72 6d 3e 3d 70 57 43 2d  pWC->nTerm>=pWC-
1b70: 3e 6e 53 6c 6f 74 20 29 7b 0a 20 20 20 20 57 68  >nSlot ){.    Wh
1b80: 65 72 65 54 65 72 6d 20 2a 70 4f 6c 64 20 3d 20  ereTerm *pOld = 
1b90: 70 57 43 2d 3e 61 3b 0a 20 20 20 20 73 71 6c 69  pWC->a;.    sqli
1ba0: 74 65 33 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70  te3 *db = pWC->p
1bb0: 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64  WInfo->pParse->d
1bc0: 62 3b 0a 20 20 20 20 70 57 43 2d 3e 61 20 3d 20  b;.    pWC->a = 
1bd0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
1be0: 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 57  aw(db, sizeof(pW
1bf0: 43 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 53  C->a[0])*pWC->nS
1c00: 6c 6f 74 2a 32 20 29 3b 0a 20 20 20 20 69 66 28  lot*2 );.    if(
1c10: 20 70 57 43 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20   pWC->a==0 ){.  
1c20: 20 20 20 20 69 66 28 20 77 74 46 6c 61 67 73 20      if( wtFlags 
1c30: 26 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29  & TERM_DYNAMIC )
1c40: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1c50: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
1c60: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
1c70: 20 20 70 57 43 2d 3e 61 20 3d 20 70 4f 6c 64 3b    pWC->a = pOld;
1c80: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
1c90: 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70  .    }.    memcp
1ca0: 79 28 70 57 43 2d 3e 61 2c 20 70 4f 6c 64 2c 20  y(pWC->a, pOld, 
1cb0: 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d  sizeof(pWC->a[0]
1cc0: 29 2a 70 57 43 2d 3e 6e 54 65 72 6d 29 3b 0a 20  )*pWC->nTerm);. 
1cd0: 20 20 20 69 66 28 20 70 4f 6c 64 21 3d 70 57 43     if( pOld!=pWC
1ce0: 2d 3e 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20  ->aStatic ){.   
1cf0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1d00: 28 64 62 2c 20 70 4f 6c 64 29 3b 0a 20 20 20 20  (db, pOld);.    
1d10: 7d 0a 20 20 20 20 70 57 43 2d 3e 6e 53 6c 6f 74  }.    pWC->nSlot
1d20: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
1d30: 6f 63 53 69 7a 65 28 64 62 2c 20 70 57 43 2d 3e  ocSize(db, pWC->
1d40: 61 29 2f 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61  a)/sizeof(pWC->a
1d50: 5b 30 5d 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  [0]);.    memset
1d60: 28 26 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54  (&pWC->a[pWC->nT
1d70: 65 72 6d 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  erm], 0, sizeof(
1d80: 70 57 43 2d 3e 61 5b 30 5d 29 2a 28 70 57 43 2d  pWC->a[0])*(pWC-
1d90: 3e 6e 53 6c 6f 74 2d 70 57 43 2d 3e 6e 54 65 72  >nSlot-pWC->nTer
1da0: 6d 29 29 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d  m));.  }.  pTerm
1db0: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 20 3d   = &pWC->a[idx =
1dc0: 20 70 57 43 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b 0a   pWC->nTerm++];.
1dd0: 20 20 69 66 28 20 70 20 26 26 20 45 78 70 72 48    if( p && ExprH
1de0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
1df0: 5f 55 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a 20 20  _Unlikely) ){.  
1e00: 20 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72    pTerm->truthPr
1e10: 6f 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ob = sqlite3LogE
1e20: 73 74 28 70 2d 3e 69 54 61 62 6c 65 29 20 2d 20  st(p->iTable) - 
1e30: 32 37 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  270;.  }else{.  
1e40: 20 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72    pTerm->truthPr
1e50: 6f 62 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 54  ob = 1;.  }.  pT
1e60: 65 72 6d 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c  erm->pExpr = sql
1e70: 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
1e80: 61 74 65 28 70 29 3b 0a 20 20 70 54 65 72 6d 2d  ate(p);.  pTerm-
1e90: 3e 77 74 46 6c 61 67 73 20 3d 20 77 74 46 6c 61  >wtFlags = wtFla
1ea0: 67 73 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 57 43  gs;.  pTerm->pWC
1eb0: 20 3d 20 70 57 43 3b 0a 20 20 70 54 65 72 6d 2d   = pWC;.  pTerm-
1ec0: 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20  >iParent = -1;. 
1ed0: 20 72 65 74 75 72 6e 20 69 64 78 3b 0a 7d 0a 0a   return idx;.}..
1ee0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1ef0: 6e 65 20 69 64 65 6e 74 69 66 69 65 73 20 73 75  ne identifies su
1f00: 62 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20  bexpressions in 
1f10: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
1f20: 20 77 68 65 72 65 0a 2a 2a 20 65 61 63 68 20 73   where.** each s
1f30: 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  ubexpression is 
1f40: 73 65 70 61 72 61 74 65 64 20 62 79 20 74 68 65  separated by the
1f50: 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 20 6f 72   AND operator or
1f60: 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 6f   some other.** o
1f70: 70 65 72 61 74 6f 72 20 73 70 65 63 69 66 69 65  perator specifie
1f80: 64 20 69 6e 20 74 68 65 20 6f 70 20 70 61 72 61  d in the op para
1f90: 6d 65 74 65 72 2e 20 20 54 68 65 20 57 68 65 72  meter.  The Wher
1fa0: 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72  eClause structur
1fb0: 65 0a 2a 2a 20 69 73 20 66 69 6c 6c 65 64 20 77  e.** is filled w
1fc0: 69 74 68 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  ith pointers to 
1fd0: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20  subexpressions. 
1fe0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a   For example:.**
1ff0: 0a 2a 2a 20 20 20 20 57 48 45 52 45 20 20 61 3d  .**    WHERE  a=
2000: 3d 27 68 65 6c 6c 6f 27 20 41 4e 44 20 63 6f 61  ='hello' AND coa
2010: 6c 65 73 63 65 28 62 2c 31 31 29 3c 31 30 20 41  lesce(b,11)<10 A
2020: 4e 44 20 28 63 2b 31 32 21 3d 64 20 4f 52 20 63  ND (c+12!=d OR c
2030: 3d 3d 32 32 29 0a 2a 2a 20 20 20 20 20 20 20 20  ==22).**        
2040: 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20     \________/   
2050: 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f    \_____________
2060: 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f  __/     \_______
2070: 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20  _________/.**   
2080: 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 30 5d           slot[0]
2090: 20 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74              slot
20a0: 5b 31 5d 20 20 20 20 20 20 20 20 20 20 20 20 20  [1]             
20b0: 20 20 73 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20    slot[2].**.** 
20c0: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 57 48 45  The original WHE
20d0: 52 45 20 63 6c 61 75 73 65 20 69 6e 20 70 45 78  RE clause in pEx
20e0: 70 72 20 69 73 20 75 6e 61 6c 74 65 72 65 64 2e  pr is unaltered.
20f0: 20 20 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69    All this routi
2100: 6e 65 0a 2a 2a 20 64 6f 65 73 20 69 73 20 6d 61  ne.** does is ma
2110: 6b 65 20 73 6c 6f 74 5b 5d 20 65 6e 74 72 69 65  ke slot[] entrie
2120: 73 20 70 6f 69 6e 74 20 74 6f 20 73 75 62 73 74  s point to subst
2130: 72 75 63 74 75 72 65 20 77 69 74 68 69 6e 20 70  ructure within p
2140: 45 78 70 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  Expr..**.** In t
2150: 68 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74  he previous sent
2160: 65 6e 63 65 20 61 6e 64 20 69 6e 20 74 68 65 20  ence and in the 
2170: 64 69 61 67 72 61 6d 2c 20 22 73 6c 6f 74 5b 5d  diagram, "slot[]
2180: 22 20 72 65 66 65 72 73 20 74 6f 0a 2a 2a 20 74  " refers to.** t
2190: 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 2e 61  he WhereClause.a
21a0: 5b 5d 20 61 72 72 61 79 2e 20 20 54 68 65 20 73  [] array.  The s
21b0: 6c 6f 74 5b 5d 20 61 72 72 61 79 20 67 72 6f 77  lot[] array grow
21c0: 73 20 61 73 20 6e 65 65 64 65 64 20 74 6f 20 63  s as needed to c
21d0: 6f 6e 74 61 69 6e 0a 2a 2a 20 61 6c 6c 20 74 65  ontain.** all te
21e0: 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45  rms of the WHERE
21f0: 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74   clause..*/.stat
2200: 69 63 20 76 6f 69 64 20 77 68 65 72 65 53 70 6c  ic void whereSpl
2210: 69 74 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a  it(WhereClause *
2220: 70 57 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72  pWC, Expr *pExpr
2230: 2c 20 75 38 20 6f 70 29 7b 0a 20 20 70 57 43 2d  , u8 op){.  pWC-
2240: 3e 6f 70 20 3d 20 6f 70 3b 0a 20 20 69 66 28 20  >op = op;.  if( 
2250: 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
2260: 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  n;.  if( pExpr->
2270: 6f 70 21 3d 6f 70 20 29 7b 0a 20 20 20 20 77 68  op!=op ){.    wh
2280: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
2290: 70 57 43 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  pWC, pExpr, 0);.
22a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 65    }else{.    whe
22b0: 72 65 53 70 6c 69 74 28 70 57 43 2c 20 70 45 78  reSplit(pWC, pEx
22c0: 70 72 2d 3e 70 4c 65 66 74 2c 20 6f 70 29 3b 0a  pr->pLeft, op);.
22d0: 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70      whereSplit(p
22e0: 57 43 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  WC, pExpr->pRigh
22f0: 74 2c 20 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  t, op);.  }.}../
2300: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
2310: 61 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 6f  a WhereMaskSet o
2320: 62 6a 65 63 74 0a 2a 2f 0a 23 64 65 66 69 6e 65  bject.*/.#define
2330: 20 69 6e 69 74 4d 61 73 6b 53 65 74 28 50 29 20   initMaskSet(P) 
2340: 20 28 50 29 2d 3e 6e 3d 30 0a 0a 2f 2a 0a 2a 2a   (P)->n=0../*.**
2350: 20 52 65 74 75 72 6e 20 74 68 65 20 62 69 74 6d   Return the bitm
2360: 61 73 6b 20 66 6f 72 20 74 68 65 20 67 69 76 65  ask for the give
2370: 6e 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e  n cursor number.
2380: 20 20 52 65 74 75 72 6e 20 30 20 69 66 0a 2a 2a    Return 0 if.**
2390: 20 69 43 75 72 73 6f 72 20 69 73 20 6e 6f 74 20   iCursor is not 
23a0: 69 6e 20 74 68 65 20 73 65 74 2e 0a 2a 2f 0a 73  in the set..*/.s
23b0: 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 67 65  tatic Bitmask ge
23c0: 74 4d 61 73 6b 28 57 68 65 72 65 4d 61 73 6b 53  tMask(WhereMaskS
23d0: 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e  et *pMaskSet, in
23e0: 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e  t iCursor){.  in
23f0: 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t i;.  assert( p
2400: 4d 61 73 6b 53 65 74 2d 3e 6e 3c 3d 28 69 6e 74  MaskSet->n<=(int
2410: 29 73 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29  )sizeof(Bitmask)
2420: 2a 38 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  *8 );.  for(i=0;
2430: 20 69 3c 70 4d 61 73 6b 53 65 74 2d 3e 6e 3b 20   i<pMaskSet->n; 
2440: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4d  i++){.    if( pM
2450: 61 73 6b 53 65 74 2d 3e 69 78 5b 69 5d 3d 3d 69  askSet->ix[i]==i
2460: 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20  Cursor ){.      
2470: 72 65 74 75 72 6e 20 4d 41 53 4b 42 49 54 28 69  return MASKBIT(i
2480: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
2490: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
24a0: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6d  * Create a new m
24b0: 61 73 6b 20 66 6f 72 20 63 75 72 73 6f 72 20 69  ask for cursor i
24c0: 43 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  Cursor..**.** Th
24d0: 65 72 65 20 69 73 20 6f 6e 65 20 63 75 72 73 6f  ere is one curso
24e0: 72 20 70 65 72 20 74 61 62 6c 65 20 69 6e 20 74  r per table in t
24f0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  he FROM clause. 
2500: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   The number of.*
2510: 2a 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  * tables in the 
2520: 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c  FROM clause is l
2530: 69 6d 69 74 65 64 20 62 79 20 61 20 74 65 73 74  imited by a test
2540: 20 65 61 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a   early in the.**
2550: 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
2560: 69 6e 28 29 20 72 6f 75 74 69 6e 65 2e 20 20 53  in() routine.  S
2570: 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  o we know that t
2580: 68 65 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b  he pMaskSet->ix[
2590: 5d 0a 2a 2a 20 61 72 72 61 79 20 77 69 6c 6c 20  ].** array will 
25a0: 6e 65 76 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a  never overflow..
25b0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
25c0: 72 65 61 74 65 4d 61 73 6b 28 57 68 65 72 65 4d  reateMask(WhereM
25d0: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
25e0: 2c 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a  , int iCursor){.
25f0: 20 20 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53    assert( pMaskS
2600: 65 74 2d 3e 6e 20 3c 20 41 72 72 61 79 53 69 7a  et->n < ArraySiz
2610: 65 28 70 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20  e(pMaskSet->ix) 
2620: 29 3b 0a 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69  );.  pMaskSet->i
2630: 78 5b 70 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d  x[pMaskSet->n++]
2640: 20 3d 20 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f   = iCursor;.}../
2650: 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69  *.** These routi
2660: 6e 65 73 20 77 61 6c 6b 20 28 72 65 63 75 72 73  nes walk (recurs
2670: 69 76 65 6c 79 29 20 61 6e 20 65 78 70 72 65 73  ively) an expres
2680: 73 69 6f 6e 20 74 72 65 65 20 61 6e 64 20 67 65  sion tree and ge
2690: 6e 65 72 61 74 65 0a 2a 2a 20 61 20 62 69 74 6d  nerate.** a bitm
26a0: 61 73 6b 20 69 6e 64 69 63 61 74 69 6e 67 20 77  ask indicating w
26b0: 68 69 63 68 20 74 61 62 6c 65 73 20 61 72 65 20  hich tables are 
26c0: 75 73 65 64 20 69 6e 20 74 68 61 74 20 65 78 70  used in that exp
26d0: 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e  ression.** tree.
26e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61  .*/.static Bitma
26f0: 73 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65  sk exprListTable
2700: 55 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53  Usage(WhereMaskS
2710: 65 74 2a 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b  et*, ExprList*);
2720: 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20  .static Bitmask 
2730: 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55  exprSelectTableU
2740: 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65  sage(WhereMaskSe
2750: 74 2a 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 73 74  t*, Select*);.st
2760: 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70  atic Bitmask exp
2770: 72 54 61 62 6c 65 55 73 61 67 65 28 57 68 65 72  rTableUsage(Wher
2780: 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  eMaskSet *pMaskS
2790: 65 74 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20  et, Expr *p){.  
27a0: 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30  Bitmask mask = 0
27b0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
27c0: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
27d0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
27e0: 29 7b 0a 20 20 20 20 6d 61 73 6b 20 3d 20 67 65  ){.    mask = ge
27f0: 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  tMask(pMaskSet, 
2800: 70 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20  p->iTable);.    
2810: 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d  return mask;.  }
2820: 0a 20 20 6d 61 73 6b 20 3d 20 65 78 70 72 54 61  .  mask = exprTa
2830: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
2840: 74 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20  t, p->pRight);. 
2850: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62   mask |= exprTab
2860: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
2870: 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69  , p->pLeft);.  i
2880: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
2890: 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65  ty(p, EP_xIsSele
28a0: 63 74 29 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20  ct) ){.    mask 
28b0: 7c 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61 62  |= exprSelectTab
28c0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
28d0: 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b  , p->x.pSelect);
28e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 61  .  }else{.    ma
28f0: 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61  sk |= exprListTa
2900: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
2910: 74 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  t, p->x.pList);.
2920: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73    }.  return mas
2930: 6b 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d  k;.}.static Bitm
2940: 61 73 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c  ask exprListTabl
2950: 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b  eUsage(WhereMask
2960: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45  Set *pMaskSet, E
2970: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
2980: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 42 69 74 6d  .  int i;.  Bitm
2990: 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20  ask mask = 0;.  
29a0: 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
29b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
29c0: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
29d0: 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78        mask |= ex
29e0: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
29f0: 73 6b 53 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b  skSet, pList->a[
2a00: 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d  i].pExpr);.    }
2a10: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61  .  }.  return ma
2a20: 73 6b 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69 74  sk;.}.static Bit
2a30: 6d 61 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54  mask exprSelectT
2a40: 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d  ableUsage(WhereM
2a50: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
2a60: 2c 20 53 65 6c 65 63 74 20 2a 70 53 29 7b 0a 20  , Select *pS){. 
2a70: 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20   Bitmask mask = 
2a80: 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 20 29  0;.  while( pS )
2a90: 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70  {.    SrcList *p
2aa0: 53 72 63 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a  Src = pS->pSrc;.
2ab0: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72      mask |= expr
2ac0: 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70  ListTableUsage(p
2ad0: 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c  MaskSet, pS->pEL
2ae0: 69 73 74 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c  ist);.    mask |
2af0: 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  = exprListTableU
2b00: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
2b10: 53 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20  S->pGroupBy);.  
2b20: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69    mask |= exprLi
2b30: 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  stTableUsage(pMa
2b40: 73 6b 53 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65  skSet, pS->pOrde
2b50: 72 42 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c  rBy);.    mask |
2b60: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
2b70: 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70  (pMaskSet, pS->p
2b80: 57 68 65 72 65 29 3b 0a 20 20 20 20 6d 61 73 6b  Where);.    mask
2b90: 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61   |= exprTableUsa
2ba0: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d  ge(pMaskSet, pS-
2bb0: 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 69  >pHaving);.    i
2bc0: 66 28 20 41 4c 57 41 59 53 28 70 53 72 63 21 3d  f( ALWAYS(pSrc!=
2bd0: 30 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  0) ){.      int 
2be0: 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  i;.      for(i=0
2bf0: 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20  ; i<pSrc->nSrc; 
2c00: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d 61  i++){.        ma
2c10: 73 6b 20 7c 3d 20 65 78 70 72 53 65 6c 65 63 74  sk |= exprSelect
2c20: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
2c30: 53 65 74 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e  Set, pSrc->a[i].
2c40: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
2c50: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61    mask |= exprTa
2c60: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
2c70: 74 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 4f  t, pSrc->a[i].pO
2c80: 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n);.      }.    
2c90: 7d 0a 20 20 20 20 70 53 20 3d 20 70 53 2d 3e 70  }.    pS = pS->p
2ca0: 50 72 69 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74  Prior;.  }.  ret
2cb0: 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a  urn mask;.}../*.
2cc0: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
2cd0: 66 20 74 68 65 20 67 69 76 65 6e 20 6f 70 65 72  f the given oper
2ce0: 61 74 6f 72 20 69 73 20 6f 6e 65 20 6f 66 20 74  ator is one of t
2cf0: 68 65 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61  he operators tha
2d00: 74 20 69 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20  t is.** allowed 
2d10: 66 6f 72 20 61 6e 20 69 6e 64 65 78 61 62 6c 65  for an indexable
2d20: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
2d30: 72 6d 2e 20 20 54 68 65 20 61 6c 6c 6f 77 65 64  rm.  The allowed
2d40: 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65 0a 2a   operators are.*
2d50: 2a 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3e 22 2c  * "=", "<", ">",
2d60: 20 22 3c 3d 22 2c 20 22 3e 3d 22 2c 20 22 49 4e   "<=", ">=", "IN
2d70: 22 2c 20 61 6e 64 20 22 49 53 20 4e 55 4c 4c 22  ", and "IS NULL"
2d80: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
2d90: 6c 6c 6f 77 65 64 4f 70 28 69 6e 74 20 6f 70 29  llowedOp(int op)
2da0: 7b 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47  {.  assert( TK_G
2db0: 54 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 47 54  T>TK_EQ && TK_GT
2dc0: 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65  <TK_GE );.  asse
2dd0: 72 74 28 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20  rt( TK_LT>TK_EQ 
2de0: 26 26 20 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29  && TK_LT<TK_GE )
2df0: 3b 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c  ;.  assert( TK_L
2e00: 45 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 45  E>TK_EQ && TK_LE
2e10: 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65  <TK_GE );.  asse
2e20: 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51  rt( TK_GE==TK_EQ
2e30: 2b 34 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f  +4 );.  return o
2e40: 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e  p==TK_IN || (op>
2e50: 3d 54 4b 5f 45 51 20 26 26 20 6f 70 3c 3d 54 4b  =TK_EQ && op<=TK
2e60: 5f 47 45 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49  _GE) || op==TK_I
2e70: 53 4e 55 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  SNULL;.}../*.** 
2e80: 43 6f 6d 6d 75 74 65 20 61 20 63 6f 6d 70 61 72  Commute a compar
2e90: 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20  ison operator.  
2ea0: 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74  Expressions of t
2eb0: 68 65 20 66 6f 72 6d 20 22 58 20 6f 70 20 59 22  he form "X op Y"
2ec0: 0a 2a 2a 20 61 72 65 20 63 6f 6e 76 65 72 74 65  .** are converte
2ed0: 64 20 69 6e 74 6f 20 22 59 20 6f 70 20 58 22 2e  d into "Y op X".
2ee0: 0a 2a 2a 0a 2a 2a 20 49 66 20 6c 65 66 74 2f 72  .**.** If left/r
2ef0: 69 67 68 74 20 70 72 65 63 65 64 65 6e 63 65 20  ight precedence 
2f00: 72 75 6c 65 73 20 63 6f 6d 65 20 69 6e 74 6f 20  rules come into 
2f10: 70 6c 61 79 20 77 68 65 6e 20 64 65 74 65 72 6d  play when determ
2f20: 69 6e 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6c  ining the.** col
2f30: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2c  lating sequence,
2f40: 20 74 68 65 6e 20 43 4f 4c 4c 41 54 45 20 6f 70   then COLLATE op
2f50: 65 72 61 74 6f 72 73 20 61 72 65 20 61 64 6a 75  erators are adju
2f60: 73 74 65 64 20 74 6f 20 65 6e 73 75 72 65 0a 2a  sted to ensure.*
2f70: 2a 20 74 68 61 74 20 74 68 65 20 63 6f 6c 6c 61  * that the colla
2f80: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 64 6f  ting sequence do
2f90: 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 2e 20 20  es not change.  
2fa0: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 20  For example:.** 
2fb0: 22 59 20 63 6f 6c 6c 61 74 65 20 4e 4f 43 41 53  "Y collate NOCAS
2fc0: 45 20 6f 70 20 58 22 20 62 65 63 6f 6d 65 73 20  E op X" becomes 
2fd0: 22 58 20 6f 70 20 59 22 20 62 65 63 61 75 73 65  "X op Y" because
2fe0: 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   any collation s
2ff0: 65 71 75 65 6e 63 65 20 6f 6e 0a 2a 2a 20 74 68  equence on.** th
3000: 65 20 6c 65 66 74 20 68 61 6e 64 20 73 69 64 65  e left hand side
3010: 20 6f 66 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e   of a comparison
3020: 20 6f 76 65 72 72 69 64 65 73 20 61 6e 79 20 63   overrides any c
3030: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
3040: 65 20 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 74  e .** attached t
3050: 6f 20 74 68 65 20 72 69 67 68 74 2e 20 46 6f 72  o the right. For
3060: 20 74 68 65 20 73 61 6d 65 20 72 65 61 73 6f 6e   the same reason
3070: 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20   the EP_Collate 
3080: 66 6c 61 67 0a 2a 2a 20 69 73 20 6e 6f 74 20 63  flag.** is not c
3090: 6f 6d 6d 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  ommuted..*/.stat
30a0: 69 63 20 76 6f 69 64 20 65 78 70 72 43 6f 6d 6d  ic void exprComm
30b0: 75 74 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ute(Parse *pPars
30c0: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
30d0: 0a 20 20 75 31 36 20 65 78 70 52 69 67 68 74 20  .  u16 expRight 
30e0: 3d 20 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  = (pExpr->pRight
30f0: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c  ->flags & EP_Col
3100: 6c 61 74 65 29 3b 0a 20 20 75 31 36 20 65 78 70  late);.  u16 exp
3110: 4c 65 66 74 20 3d 20 28 70 45 78 70 72 2d 3e 70  Left = (pExpr->p
3120: 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50  Left->flags & EP
3130: 5f 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 61 73 73  _Collate);.  ass
3140: 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70  ert( allowedOp(p
3150: 45 78 70 72 2d 3e 6f 70 29 20 26 26 20 70 45 78  Expr->op) && pEx
3160: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 20 29 3b  pr->op!=TK_IN );
3170: 0a 20 20 69 66 28 20 65 78 70 52 69 67 68 74 3d  .  if( expRight=
3180: 3d 65 78 70 4c 65 66 74 20 29 7b 0a 20 20 20 20  =expLeft ){.    
3190: 2f 2a 20 45 69 74 68 65 72 20 58 20 61 6e 64 20  /* Either X and 
31a0: 59 20 62 6f 74 68 20 68 61 76 65 20 43 4f 4c 4c  Y both have COLL
31b0: 41 54 45 20 6f 70 65 72 61 74 6f 72 20 6f 72 20  ATE operator or 
31c0: 6e 65 69 74 68 65 72 20 64 6f 20 2a 2f 0a 20 20  neither do */.  
31d0: 20 20 69 66 28 20 65 78 70 52 69 67 68 74 20 29    if( expRight )
31e0: 7b 0a 20 20 20 20 20 20 2f 2a 20 42 6f 74 68 20  {.      /* Both 
31f0: 58 20 61 6e 64 20 59 20 68 61 76 65 20 43 4f 4c  X and Y have COL
3200: 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 73 2e 20  LATE operators. 
3210: 20 4d 61 6b 65 20 73 75 72 65 20 58 20 69 73 20   Make sure X is 
3220: 61 6c 77 61 79 73 0a 20 20 20 20 20 20 2a 2a 20  always.      ** 
3230: 75 73 65 64 20 62 79 20 63 6c 65 61 72 69 6e 67  used by clearing
3240: 20 74 68 65 20 45 50 5f 43 6f 6c 6c 61 74 65 20   the EP_Collate 
3250: 66 6c 61 67 20 66 72 6f 6d 20 59 2e 20 2a 2f 0a  flag from Y. */.
3260: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69        pExpr->pRi
3270: 67 68 74 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 45  ght->flags &= ~E
3280: 50 5f 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 7d  P_Collate;.    }
3290: 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
32a0: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
32b0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
32c0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )!=0 ){.      /*
32d0: 20 4e 65 69 74 68 65 72 20 58 20 6e 6f 72 20 59   Neither X nor Y
32e0: 20 68 61 76 65 20 43 4f 4c 4c 41 54 45 20 6f 70   have COLLATE op
32f0: 65 72 61 74 6f 72 73 2c 20 62 75 74 20 58 20 68  erators, but X h
3300: 61 73 20 61 20 6e 6f 6e 2d 64 65 66 61 75 6c 74  as a non-default
3310: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74  .      ** collat
3320: 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 20 20 53  ing sequence.  S
3330: 6f 20 61 64 64 20 74 68 65 20 45 50 5f 43 6f 6c  o add the EP_Col
3340: 6c 61 74 65 20 6d 61 72 6b 65 72 20 6f 6e 20 58  late marker on X
3350: 20 74 6f 20 63 61 75 73 65 0a 20 20 20 20 20 20   to cause.      
3360: 2a 2a 20 69 74 20 74 6f 20 62 65 20 73 65 61 72  ** it to be sear
3370: 63 68 65 64 20 66 69 72 73 74 2e 20 2a 2f 0a 20  ched first. */. 
3380: 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66       pExpr->pLef
3390: 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 43  t->flags |= EP_C
33a0: 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20  ollate;.    }.  
33b0: 7d 0a 20 20 53 57 41 50 28 45 78 70 72 2a 2c 70  }.  SWAP(Expr*,p
33c0: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 70 45 78  Expr->pRight,pEx
33d0: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66  pr->pLeft);.  if
33e0: 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f  ( pExpr->op>=TK_
33f0: 47 54 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  GT ){.    assert
3400: 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32  ( TK_LT==TK_GT+2
3410: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
3420: 54 4b 5f 47 45 3d 3d 54 4b 5f 4c 45 2b 32 20 29  TK_GE==TK_LE+2 )
3430: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b  ;.    assert( TK
3440: 5f 47 54 3e 54 4b 5f 45 51 20 29 3b 0a 20 20 20  _GT>TK_EQ );.   
3450: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3c 54   assert( TK_GT<T
3460: 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73 73 65  K_LE );.    asse
3470: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54  rt( pExpr->op>=T
3480: 4b 5f 47 54 20 26 26 20 70 45 78 70 72 2d 3e 6f  K_GT && pExpr->o
3490: 70 3c 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20  p<=TK_GE );.    
34a0: 70 45 78 70 72 2d 3e 6f 70 20 3d 20 28 28 70 45  pExpr->op = ((pE
34b0: 78 70 72 2d 3e 6f 70 2d 54 4b 5f 47 54 29 5e 32  xpr->op-TK_GT)^2
34c0: 29 2b 54 4b 5f 47 54 3b 0a 20 20 7d 0a 7d 0a 0a  )+TK_GT;.  }.}..
34d0: 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20  /*.** Translate 
34e0: 66 72 6f 6d 20 54 4b 5f 78 78 20 6f 70 65 72 61  from TK_xx opera
34f0: 74 6f 72 20 74 6f 20 57 4f 5f 78 78 20 62 69 74  tor to WO_xx bit
3500: 6d 61 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mask..*/.static 
3510: 75 31 36 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b  u16 operatorMask
3520: 28 69 6e 74 20 6f 70 29 7b 0a 20 20 75 31 36 20  (int op){.  u16 
3530: 63 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6c 6c  c;.  assert( all
3540: 6f 77 65 64 4f 70 28 6f 70 29 20 29 3b 0a 20 20  owedOp(op) );.  
3550: 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b  if( op==TK_IN ){
3560: 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49 4e 3b 0a  .    c = WO_IN;.
3570: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d    }else if( op==
3580: 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20  TK_ISNULL ){.   
3590: 20 63 20 3d 20 57 4f 5f 49 53 4e 55 4c 4c 3b 0a   c = WO_ISNULL;.
35a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
35b0: 65 72 74 28 20 28 57 4f 5f 45 51 3c 3c 28 6f 70  ert( (WO_EQ<<(op
35c0: 2d 54 4b 5f 45 51 29 29 20 3c 20 30 78 37 66 66  -TK_EQ)) < 0x7ff
35d0: 66 20 29 3b 0a 20 20 20 20 63 20 3d 20 28 75 31  f );.    c = (u1
35e0: 36 29 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b  6)(WO_EQ<<(op-TK
35f0: 5f 45 51 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73  _EQ));.  }.  ass
3600: 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49 53 4e 55  ert( op!=TK_ISNU
3610: 4c 4c 20 7c 7c 20 63 3d 3d 57 4f 5f 49 53 4e 55  LL || c==WO_ISNU
3620: 4c 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  LL );.  assert( 
3630: 6f 70 21 3d 54 4b 5f 49 4e 20 7c 7c 20 63 3d 3d  op!=TK_IN || c==
3640: 57 4f 5f 49 4e 20 29 3b 0a 20 20 61 73 73 65 72  WO_IN );.  asser
3650: 74 28 20 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20  t( op!=TK_EQ || 
3660: 63 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 61 73  c==WO_EQ );.  as
3670: 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 54 20  sert( op!=TK_LT 
3680: 7c 7c 20 63 3d 3d 57 4f 5f 4c 54 20 29 3b 0a 20  || c==WO_LT );. 
3690: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
36a0: 4c 45 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 45 20 29  LE || c==WO_LE )
36b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d  ;.  assert( op!=
36c0: 54 4b 5f 47 54 20 7c 7c 20 63 3d 3d 57 4f 5f 47  TK_GT || c==WO_G
36d0: 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  T );.  assert( o
36e0: 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 63 3d 3d 57  p!=TK_GE || c==W
36f0: 4f 5f 47 45 20 29 3b 0a 20 20 72 65 74 75 72 6e  O_GE );.  return
3700: 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76   c;.}../*.** Adv
3710: 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74  ance to the next
3720: 20 57 68 65 72 65 54 65 72 6d 20 74 68 61 74 20   WhereTerm that 
3730: 6d 61 74 63 68 65 73 20 61 63 63 6f 72 64 69 6e  matches accordin
3740: 67 20 74 6f 20 74 68 65 20 63 72 69 74 65 72 69  g to the criteri
3750: 61 0a 2a 2a 20 65 73 74 61 62 6c 69 73 68 65 64  a.** established
3760: 20 77 68 65 6e 20 74 68 65 20 70 53 63 61 6e 20   when the pScan 
3770: 6f 62 6a 65 63 74 20 77 61 73 20 69 6e 69 74 69  object was initi
3780: 61 6c 69 7a 65 64 20 62 79 20 77 68 65 72 65 53  alized by whereS
3790: 63 61 6e 49 6e 69 74 28 29 2e 0a 2a 2a 20 52 65  canInit()..** Re
37a0: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65  turn NULL if the
37b0: 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6d  re are no more m
37c0: 61 74 63 68 69 6e 67 20 57 68 65 72 65 54 65 72  atching WhereTer
37d0: 6d 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68  ms..*/.static Wh
37e0: 65 72 65 54 65 72 6d 20 2a 77 68 65 72 65 53 63  ereTerm *whereSc
37f0: 61 6e 4e 65 78 74 28 57 68 65 72 65 53 63 61 6e  anNext(WhereScan
3800: 20 2a 70 53 63 61 6e 29 7b 0a 20 20 69 6e 74 20   *pScan){.  int 
3810: 69 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20  iCur;           
3820: 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f   /* The cursor o
3830: 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65  n the LHS of the
3840: 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 69   term */.  int i
3850: 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20  Column;         
3860: 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6f 6e  /* The column on
3870: 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20   the LHS of the 
3880: 74 65 72 6d 2e 20 20 2d 31 20 66 6f 72 20 49 50  term.  -1 for IP
3890: 4b 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 58 3b  K */.  Expr *pX;
38a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
38b0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 62 65 69  n expression bei
38c0: 6e 67 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 57  ng tested */.  W
38d0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
38e0: 20 20 20 20 2f 2a 20 53 68 6f 72 74 68 61 6e 64      /* Shorthand
38f0: 20 66 6f 72 20 70 53 63 61 6e 2d 3e 70 57 43 20   for pScan->pWC 
3900: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
3910: 70 54 65 72 6d 3b 20 20 20 20 2f 2a 20 54 68 65  pTerm;    /* The
3920: 20 74 65 72 6d 20 62 65 69 6e 67 20 74 65 73 74   term being test
3930: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6b 20 3d 20  ed */.  int k = 
3940: 70 53 63 61 6e 2d 3e 6b 3b 20 20 20 20 2f 2a 20  pScan->k;    /* 
3950: 57 68 65 72 65 20 74 6f 20 73 74 61 72 74 20 73  Where to start s
3960: 63 61 6e 6e 69 6e 67 20 2a 2f 0a 0a 20 20 77 68  canning */..  wh
3970: 69 6c 65 28 20 70 53 63 61 6e 2d 3e 69 45 71 75  ile( pScan->iEqu
3980: 69 76 3c 3d 70 53 63 61 6e 2d 3e 6e 45 71 75 69  iv<=pScan->nEqui
3990: 76 20 29 7b 0a 20 20 20 20 69 43 75 72 20 3d 20  v ){.    iCur = 
39a0: 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 70 53  pScan->aEquiv[pS
39b0: 63 61 6e 2d 3e 69 45 71 75 69 76 2d 32 5d 3b 0a  can->iEquiv-2];.
39c0: 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 53      iColumn = pS
39d0: 63 61 6e 2d 3e 61 45 71 75 69 76 5b 70 53 63 61  can->aEquiv[pSca
39e0: 6e 2d 3e 69 45 71 75 69 76 2d 31 5d 3b 0a 20 20  n->iEquiv-1];.  
39f0: 20 20 77 68 69 6c 65 28 20 28 70 57 43 20 3d 20    while( (pWC = 
3a00: 70 53 63 61 6e 2d 3e 70 57 43 29 21 3d 30 20 29  pScan->pWC)!=0 )
3a10: 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 54 65 72  {.      for(pTer
3a20: 6d 3d 70 57 43 2d 3e 61 2b 6b 3b 20 6b 3c 70 57  m=pWC->a+k; k<pW
3a30: 43 2d 3e 6e 54 65 72 6d 3b 20 6b 2b 2b 2c 20 70  C->nTerm; k++, p
3a40: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
3a50: 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74   if( pTerm->left
3a60: 43 75 72 73 6f 72 3d 3d 69 43 75 72 0a 20 20 20  Cursor==iCur.   
3a70: 20 20 20 20 20 20 26 26 20 70 54 65 72 6d 2d 3e        && pTerm->
3a80: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43  u.leftColumn==iC
3a90: 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20 20 20 26  olumn.         &
3aa0: 26 20 28 70 53 63 61 6e 2d 3e 69 45 71 75 69 76  & (pScan->iEquiv
3ab0: 3c 3d 32 20 7c 7c 20 21 45 78 70 72 48 61 73 50  <=2 || !ExprHasP
3ac0: 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70  roperty(pTerm->p
3ad0: 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
3ae0: 6e 29 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  n)).        ){. 
3af0: 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54           if( (pT
3b00: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
3b10: 20 57 4f 5f 45 51 55 49 56 29 21 3d 30 0a 20 20   WO_EQUIV)!=0.  
3b20: 20 20 20 20 20 20 20 20 20 26 26 20 70 53 63 61           && pSca
3b30: 6e 2d 3e 6e 45 71 75 69 76 3c 41 72 72 61 79 53  n->nEquiv<ArrayS
3b40: 69 7a 65 28 70 53 63 61 6e 2d 3e 61 45 71 75 69  ize(pScan->aEqui
3b50: 76 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a  v).          ){.
3b60: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
3b70: 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  j;.            p
3b80: 58 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  X = sqlite3ExprS
3b90: 6b 69 70 43 6f 6c 6c 61 74 65 28 70 54 65 72 6d  kipCollate(pTerm
3ba0: 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  ->pExpr->pRight)
3bb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ;.            as
3bc0: 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b  sert( pX->op==TK
3bd0: 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
3be0: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
3bf0: 6a 3c 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 3b  j<pScan->nEquiv;
3c00: 20 6a 2b 3d 32 29 7b 0a 20 20 20 20 20 20 20 20   j+=2){.        
3c10: 20 20 20 20 20 20 69 66 28 20 70 53 63 61 6e 2d        if( pScan-
3c20: 3e 61 45 71 75 69 76 5b 6a 5d 3d 3d 70 58 2d 3e  >aEquiv[j]==pX->
3c30: 69 54 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20  iTable.         
3c40: 20 20 20 20 20 20 26 26 20 70 53 63 61 6e 2d 3e        && pScan->
3c50: 61 45 71 75 69 76 5b 6a 2b 31 5d 3d 3d 70 58 2d  aEquiv[j+1]==pX-
3c60: 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >iColumn ){.    
3c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
3c80: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
3c90: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
3ca0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
3cb0: 66 28 20 6a 3d 3d 70 53 63 61 6e 2d 3e 6e 45 71  f( j==pScan->nEq
3cc0: 75 69 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20  uiv ){.         
3cd0: 20 20 20 20 20 70 53 63 61 6e 2d 3e 61 45 71 75       pScan->aEqu
3ce0: 69 76 5b 6a 5d 20 3d 20 70 58 2d 3e 69 54 61 62  iv[j] = pX->iTab
3cf0: 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  le;.            
3d00: 20 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b    pScan->aEquiv[
3d10: 6a 2b 31 5d 20 3d 20 70 58 2d 3e 69 43 6f 6c 75  j+1] = pX->iColu
3d20: 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  mn;.            
3d30: 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20    pScan->nEquiv 
3d40: 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20  += 2;.          
3d50: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
3d60: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
3d70: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
3d80: 26 20 70 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 29  & pScan->opMask)
3d90: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
3da0: 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 65     /* Verify the
3db0: 20 61 66 66 69 6e 69 74 79 20 61 6e 64 20 63 6f   affinity and co
3dc0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
3dd0: 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20   match */.      
3de0: 20 20 20 20 20 20 69 66 28 20 70 53 63 61 6e 2d        if( pScan-
3df0: 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 26 26 20 28 70  >zCollName && (p
3e00: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
3e10: 26 20 57 4f 5f 49 53 4e 55 4c 4c 29 3d 3d 30 20  & WO_ISNULL)==0 
3e20: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
3e30: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
3e40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50  .              P
3e50: 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
3e60: 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72  WC->pWInfo->pPar
3e70: 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se;.            
3e80: 20 20 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45    pX = pTerm->pE
3e90: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
3ea0: 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49     if( !sqlite3I
3eb0: 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70  ndexAffinityOk(p
3ec0: 58 2c 20 70 53 63 61 6e 2d 3e 69 64 78 61 66 66  X, pScan->idxaff
3ed0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
3ee0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
3f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
3f10: 65 72 74 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a  ert(pX->pLeft);.
3f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
3f30: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e  oll = sqlite3Bin
3f40: 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
3f50: 71 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  q(pParse,.      
3f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f80: 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e              pX->
3f90: 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68  pLeft, pX->pRigh
3fa0: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
3fb0: 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29    if( pColl==0 )
3fc0: 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d   pColl = pParse-
3fd0: 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a  >db->pDfltColl;.
3fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
3ff0: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
4000: 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70  (pColl->zName, p
4010: 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 29  Scan->zCollName)
4020: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
4030: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
4040: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
4050: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
4060: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65          if( (pTe
4070: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
4080: 57 4f 5f 45 51 29 21 3d 30 0a 20 20 20 20 20 20  WO_EQ)!=0.      
4090: 20 20 20 20 20 20 20 26 26 20 28 70 58 20 3d 20         && (pX = 
40a0: 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52  pTerm->pExpr->pR
40b0: 69 67 68 74 29 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  ight)->op==TK_CO
40c0: 4c 55 4d 4e 0a 20 20 20 20 20 20 20 20 20 20 20  LUMN.           
40d0: 20 20 26 26 20 70 58 2d 3e 69 54 61 62 6c 65 3d    && pX->iTable=
40e0: 3d 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 30  =pScan->aEquiv[0
40f0: 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26  ].             &
4100: 26 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70  & pX->iColumn==p
4110: 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 31 5d 0a  Scan->aEquiv[1].
4120: 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20              ){. 
4130: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
4140: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
4150: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
4160: 20 70 53 63 61 6e 2d 3e 6b 20 3d 20 6b 2b 31 3b   pScan->k = k+1;
4170: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
4180: 75 72 6e 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  urn pTerm;.     
4190: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
41a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
41b0: 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70 53 63 61  Scan->pWC = pSca
41c0: 6e 2d 3e 70 57 43 2d 3e 70 4f 75 74 65 72 3b 0a  n->pWC->pOuter;.
41d0: 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20        k = 0;.   
41e0: 20 7d 0a 20 20 20 20 70 53 63 61 6e 2d 3e 70 57   }.    pScan->pW
41f0: 43 20 3d 20 70 53 63 61 6e 2d 3e 70 4f 72 69 67  C = pScan->pOrig
4200: 57 43 3b 0a 20 20 20 20 6b 20 3d 20 30 3b 0a 20  WC;.    k = 0;. 
4210: 20 20 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76     pScan->iEquiv
4220: 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20 72 65 74   += 2;.  }.  ret
4230: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
4240: 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 57 48 45  Initialize a WHE
4250: 52 45 20 63 6c 61 75 73 65 20 73 63 61 6e 6e 65  RE clause scanne
4260: 72 20 6f 62 6a 65 63 74 2e 20 20 52 65 74 75 72  r object.  Retur
4270: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
4280: 68 65 0a 2a 2a 20 66 69 72 73 74 20 6d 61 74 63  he.** first matc
4290: 68 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  h.  Return NULL 
42a0: 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  if there are no 
42b0: 6d 61 74 63 68 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  matches..**.** T
42c0: 68 65 20 73 63 61 6e 6e 65 72 20 77 69 6c 6c 20  he scanner will 
42d0: 62 65 20 73 65 61 72 63 68 69 6e 67 20 74 68 65  be searching the
42e0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 57   WHERE clause pW
42f0: 43 2e 20 20 49 74 20 77 69 6c 6c 20 6c 6f 6f 6b  C.  It will look
4300: 0a 2a 2a 20 66 6f 72 20 74 65 72 6d 73 20 6f 66  .** for terms of
4310: 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70   the form "X <op
4320: 3e 20 3c 65 78 70 72 3e 22 20 77 68 65 72 65 20  > <expr>" where 
4330: 58 20 69 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c  X is column iCol
4340: 75 6d 6e 20 6f 66 20 74 61 62 6c 65 0a 2a 2a 20  umn of table.** 
4350: 69 43 75 72 2e 20 20 54 68 65 20 3c 6f 70 3e 20  iCur.  The <op> 
4360: 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 74  must be one of t
4370: 68 65 20 6f 70 65 72 61 74 6f 72 73 20 64 65 73  he operators des
4380: 63 72 69 62 65 64 20 62 79 20 6f 70 4d 61 73 6b  cribed by opMask
4390: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73  ..**.** If the s
43a0: 65 61 72 63 68 20 69 73 20 66 6f 72 20 58 20 61  earch is for X a
43b0: 6e 64 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  nd the WHERE cla
43c0: 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 74 65 72  use contains ter
43d0: 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 66 6f 72  ms of the.** for
43e0: 6d 20 58 3d 59 20 74 68 65 6e 20 74 68 69 73 20  m X=Y then this 
43f0: 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 61 6c  routine might al
4400: 73 6f 20 72 65 74 75 72 6e 20 74 65 72 6d 73 20  so return terms 
4410: 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 20 22  of the form.** "
4420: 59 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 2e 20  Y <op> <expr>". 
4430: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c   The number of l
4440: 65 76 65 6c 73 20 6f 66 20 74 72 61 6e 73 69 74  evels of transit
4450: 69 76 69 74 79 20 69 73 20 6c 69 6d 69 74 65 64  ivity is limited
4460: 2c 0a 2a 2a 20 62 75 74 20 69 73 20 65 6e 6f 75  ,.** but is enou
4470: 67 68 20 74 6f 20 68 61 6e 64 6c 65 20 6d 6f 73  gh to handle mos
4480: 74 20 63 6f 6d 6d 6f 6e 6c 79 20 6f 63 63 75 72  t commonly occur
4490: 72 69 6e 67 20 53 51 4c 20 73 74 61 74 65 6d 65  ring SQL stateme
44a0: 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20  nts..**.** If X 
44b0: 69 73 20 6e 6f 74 20 74 68 65 20 49 4e 54 45 47  is not the INTEG
44c0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 74  ER PRIMARY KEY t
44d0: 68 65 6e 20 58 20 6d 75 73 74 20 62 65 20 63 6f  hen X must be co
44e0: 6d 70 61 74 69 62 6c 65 20 77 69 74 68 0a 2a 2a  mpatible with.**
44f0: 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2f 0a   index pIdx..*/.
4500: 73 74 61 74 69 63 20 57 68 65 72 65 54 65 72 6d  static WhereTerm
4510: 20 2a 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28   *whereScanInit(
4520: 0a 20 20 57 68 65 72 65 53 63 61 6e 20 2a 70 53  .  WhereScan *pS
4530: 63 61 6e 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  can,       /* Th
4540: 65 20 57 68 65 72 65 53 63 61 6e 20 6f 62 6a 65  e WhereScan obje
4550: 63 74 20 62 65 69 6e 67 20 69 6e 69 74 69 61 6c  ct being initial
4560: 69 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 43  ized */.  WhereC
4570: 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
4580: 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
4590: 6c 61 75 73 65 20 74 6f 20 62 65 20 73 63 61 6e  lause to be scan
45a0: 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  ned */.  int iCu
45b0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
45c0: 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 73 63   /* Cursor to sc
45d0: 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  an for */.  int 
45e0: 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20  iColumn,        
45f0: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f      /* Column to
4600: 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 75   scan for */.  u
4610: 33 32 20 6f 70 4d 61 73 6b 2c 20 20 20 20 20 20  32 opMask,      
4620: 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 72 61 74         /* Operat
4630: 6f 72 28 73 29 20 74 6f 20 73 63 61 6e 20 66 6f  or(s) to scan fo
4640: 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  r */.  Index *pI
4650: 64 78 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  dx             /
4660: 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d 70 61 74  * Must be compat
4670: 69 62 6c 65 20 77 69 74 68 20 74 68 69 73 20 69  ible with this i
4680: 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ndex */.){.  int
4690: 20 6a 3b 0a 0a 20 20 2f 2a 20 6d 65 6d 73 65 74   j;..  /* memset
46a0: 28 70 53 63 61 6e 2c 20 30 2c 20 73 69 7a 65 6f  (pScan, 0, sizeo
46b0: 66 28 2a 70 53 63 61 6e 29 29 3b 20 2a 2f 0a 20  f(*pScan)); */. 
46c0: 20 70 53 63 61 6e 2d 3e 70 4f 72 69 67 57 43 20   pScan->pOrigWC 
46d0: 3d 20 70 57 43 3b 0a 20 20 70 53 63 61 6e 2d 3e  = pWC;.  pScan->
46e0: 70 57 43 20 3d 20 70 57 43 3b 0a 20 20 69 66 28  pWC = pWC;.  if(
46f0: 20 70 49 64 78 20 26 26 20 69 43 6f 6c 75 6d 6e   pIdx && iColumn
4700: 3e 3d 30 20 29 7b 0a 20 20 20 20 70 53 63 61 6e  >=0 ){.    pScan
4710: 2d 3e 69 64 78 61 66 66 20 3d 20 70 49 64 78 2d  ->idxaff = pIdx-
4720: 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43  >pTable->aCol[iC
4730: 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b  olumn].affinity;
4740: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 70 49  .    for(j=0; pI
4750: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 21  dx->aiColumn[j]!
4760: 3d 69 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a  =iColumn; j++){.
4770: 20 20 20 20 20 20 69 66 28 20 4e 45 56 45 52 28        if( NEVER(
4780: 6a 3e 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29  j>pIdx->nColumn)
4790: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
47a0: 20 7d 0a 20 20 20 20 70 53 63 61 6e 2d 3e 7a 43   }.    pScan->zC
47b0: 6f 6c 6c 4e 61 6d 65 20 3d 20 70 49 64 78 2d 3e  ollName = pIdx->
47c0: 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 7d 65 6c  azColl[j];.  }el
47d0: 73 65 7b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69  se{.    pScan->i
47e0: 64 78 61 66 66 20 3d 20 30 3b 0a 20 20 20 20 70  dxaff = 0;.    p
47f0: 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20  Scan->zCollName 
4800: 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 53 63 61 6e  = 0;.  }.  pScan
4810: 2d 3e 6f 70 4d 61 73 6b 20 3d 20 6f 70 4d 61 73  ->opMask = opMas
4820: 6b 3b 0a 20 20 70 53 63 61 6e 2d 3e 6b 20 3d 20  k;.  pScan->k = 
4830: 30 3b 0a 20 20 70 53 63 61 6e 2d 3e 61 45 71 75  0;.  pScan->aEqu
4840: 69 76 5b 30 5d 20 3d 20 69 43 75 72 3b 0a 20 20  iv[0] = iCur;.  
4850: 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 31 5d  pScan->aEquiv[1]
4860: 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70 53   = iColumn;.  pS
4870: 63 61 6e 2d 3e 6e 45 71 75 69 76 20 3d 20 32 3b  can->nEquiv = 2;
4880: 0a 20 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76  .  pScan->iEquiv
4890: 20 3d 20 32 3b 0a 20 20 72 65 74 75 72 6e 20 77   = 2;.  return w
48a0: 68 65 72 65 53 63 61 6e 4e 65 78 74 28 70 53 63  hereScanNext(pSc
48b0: 61 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  an);.}../*.** Se
48c0: 61 72 63 68 20 66 6f 72 20 61 20 74 65 72 6d 20  arch for a term 
48d0: 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
48e0: 75 73 65 20 74 68 61 74 20 69 73 20 6f 66 20 74  use that is of t
48f0: 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20  he form "X <op> 
4900: 3c 65 78 70 72 3e 22 0a 2a 2a 20 77 68 65 72 65  <expr>".** where
4910: 20 58 20 69 73 20 61 20 72 65 66 65 72 65 6e 63   X is a referenc
4920: 65 20 74 6f 20 74 68 65 20 69 43 6f 6c 75 6d 6e  e to the iColumn
4930: 20 6f 66 20 74 61 62 6c 65 20 69 43 75 72 20 61   of table iCur a
4940: 6e 64 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f  nd <op> is one o
4950: 66 0a 2a 2a 20 74 68 65 20 57 4f 5f 78 78 20 6f  f.** the WO_xx o
4960: 70 65 72 61 74 6f 72 20 63 6f 64 65 73 20 73 70  perator codes sp
4970: 65 63 69 66 69 65 64 20 62 79 20 74 68 65 20 6f  ecified by the o
4980: 70 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20  p parameter..** 
4990: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
49a0: 20 74 6f 20 74 68 65 20 74 65 72 6d 2e 20 20 52   to the term.  R
49b0: 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 20 66  eturn 0 if not f
49c0: 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ound..**.** The 
49d0: 74 65 72 6d 20 72 65 74 75 72 6e 65 64 20 6d 69  term returned mi
49e0: 67 68 74 20 62 79 20 59 3d 3c 65 78 70 72 3e 20  ght by Y=<expr> 
49f0: 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 6f 74  if there is anot
4a00: 68 65 72 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  her constraint i
4a10: 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63  n.** the WHERE c
4a20: 6c 61 75 73 65 20 74 68 61 74 20 73 70 65 63 69  lause that speci
4a30: 66 69 65 73 20 74 68 61 74 20 58 3d 59 2e 20 20  fies that X=Y.  
4a40: 41 6e 79 20 73 75 63 68 20 63 6f 6e 73 74 72 61  Any such constra
4a50: 69 6e 74 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  ints will be.** 
4a60: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68  identified by th
4a70: 65 20 57 4f 5f 45 51 55 49 56 20 62 69 74 20 69  e WO_EQUIV bit i
4a80: 6e 20 74 68 65 20 70 54 65 72 6d 2d 3e 65 4f 70  n the pTerm->eOp
4a90: 65 72 61 74 6f 72 20 66 69 65 6c 64 2e 20 20 54  erator field.  T
4aa0: 68 65 0a 2a 2a 20 61 45 71 75 69 76 5b 5d 20 61  he.** aEquiv[] a
4ab0: 72 72 61 79 20 68 6f 6c 64 73 20 58 20 61 6e 64  rray holds X and
4ac0: 20 61 6c 6c 20 69 74 73 20 65 71 75 69 76 61 6c   all its equival
4ad0: 65 6e 74 73 2c 20 77 69 74 68 20 65 61 63 68 20  ents, with each 
4ae0: 53 51 4c 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20  SQL variable.** 
4af0: 74 61 6b 69 6e 67 20 75 70 20 74 77 6f 20 73 6c  taking up two sl
4b00: 6f 74 73 20 69 6e 20 61 45 71 75 69 76 5b 5d 2e  ots in aEquiv[].
4b10: 20 20 54 68 65 20 66 69 72 73 74 20 73 6c 6f 74    The first slot
4b20: 20 69 73 20 66 6f 72 20 74 68 65 20 63 75 72 73   is for the curs
4b30: 6f 72 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 6e 64  or number.** and
4b40: 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20 66   the second is f
4b50: 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75  or the column nu
4b60: 6d 62 65 72 2e 20 20 54 68 65 72 65 20 61 72 65  mber.  There are
4b70: 20 32 32 20 73 6c 6f 74 73 20 69 6e 20 61 45 71   22 slots in aEq
4b80: 75 69 76 5b 5d 0a 2a 2a 20 73 6f 20 74 68 61 74  uiv[].** so that
4b90: 20 6d 65 61 6e 73 20 77 65 20 63 61 6e 20 6c 6f   means we can lo
4ba0: 6f 6b 20 66 6f 72 20 58 20 70 6c 75 73 20 75 70  ok for X plus up
4bb0: 20 74 6f 20 31 30 20 6f 74 68 65 72 20 65 71 75   to 10 other equ
4bc0: 69 76 61 6c 65 6e 74 20 76 61 6c 75 65 73 2e 0a  ivalent values..
4bd0: 2a 2a 20 48 65 6e 63 65 20 61 20 73 65 61 72 63  ** Hence a searc
4be0: 68 20 66 6f 72 20 58 20 77 69 6c 6c 20 72 65 74  h for X will ret
4bf0: 75 72 6e 20 3c 65 78 70 72 3e 20 69 66 20 58 3d  urn <expr> if X=
4c00: 41 31 20 61 6e 64 20 41 31 3d 41 32 20 61 6e 64  A1 and A1=A2 and
4c10: 20 41 32 3d 41 33 0a 2a 2a 20 61 6e 64 20 2e 2e   A2=A3.** and ..
4c20: 2e 20 61 6e 64 20 41 39 3d 41 31 30 20 61 6e 64  . and A9=A10 and
4c30: 20 41 31 30 3d 3c 65 78 70 72 3e 2e 0a 2a 2a 0a   A10=<expr>..**.
4c40: 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
4c50: 6d 75 6c 74 69 70 6c 65 20 74 65 72 6d 73 20 69  multiple terms i
4c60: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
4c70: 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  se of the form "
4c80: 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a  X <op> <expr>".*
4c90: 2a 20 74 68 65 6e 20 74 72 79 20 66 6f 72 20 74  * then try for t
4ca0: 68 65 20 6f 6e 65 20 77 69 74 68 20 6e 6f 20 64  he one with no d
4cb0: 65 70 65 6e 64 65 6e 63 69 65 73 20 6f 6e 20 3c  ependencies on <
4cc0: 65 78 70 72 3e 20 2d 20 69 6e 20 6f 74 68 65 72  expr> - in other
4cd0: 20 77 6f 72 64 73 20 77 68 65 72 65 0a 2a 2a 20   words where.** 
4ce0: 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6e 73  <expr> is a cons
4cf0: 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20  tant expression 
4d00: 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 20 20 4f  of some kind.  O
4d10: 6e 6c 79 20 72 65 74 75 72 6e 20 65 6e 74 72 69  nly return entri
4d20: 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72  es of.** the for
4d30: 6d 20 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65  m "X <op> Y" whe
4d40: 72 65 20 59 20 69 73 20 61 20 63 6f 6c 75 6d 6e  re Y is a column
4d50: 20 69 6e 20 61 6e 6f 74 68 65 72 20 74 61 62 6c   in another tabl
4d60: 65 20 69 66 20 6e 6f 20 74 65 72 6d 73 20 6f 66  e if no terms of
4d70: 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20 22 58 20  .** the form "X 
4d80: 3c 6f 70 3e 20 3c 63 6f 6e 73 74 2d 65 78 70 72  <op> <const-expr
4d90: 3e 22 20 65 78 69 73 74 2e 20 20 20 49 66 20 6e  >" exist.   If n
4da0: 6f 20 74 65 72 6d 73 20 77 69 74 68 20 61 20 63  o terms with a c
4db0: 6f 6e 73 74 61 6e 74 20 52 48 53 0a 2a 2a 20 65  onstant RHS.** e
4dc0: 78 69 73 74 2c 20 74 72 79 20 74 6f 20 72 65 74  xist, try to ret
4dd0: 75 72 6e 20 61 20 74 65 72 6d 20 74 68 61 74 20  urn a term that 
4de0: 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 57 4f 5f  does not use WO_
4df0: 45 51 55 49 56 2e 0a 2a 2f 0a 73 74 61 74 69 63  EQUIV..*/.static
4e00: 20 57 68 65 72 65 54 65 72 6d 20 2a 66 69 6e 64   WhereTerm *find
4e10: 54 65 72 6d 28 0a 20 20 57 68 65 72 65 43 6c 61  Term(.  WhereCla
4e20: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a  use *pWC,     /*
4e30: 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
4e40: 65 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64  e to be searched
4e50: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20   */.  int iCur, 
4e60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
4e70: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
4e80: 4c 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  LHS */.  int iCo
4e90: 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 2f  lumn,          /
4ea0: 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  * Column number 
4eb0: 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 42 69 74 6d  of LHS */.  Bitm
4ec0: 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20  ask notReady,   
4ed0: 20 20 2f 2a 20 52 48 53 20 6d 75 73 74 20 6e 6f    /* RHS must no
4ee0: 74 20 6f 76 65 72 6c 61 70 20 77 69 74 68 20 74  t overlap with t
4ef0: 68 69 73 20 6d 61 73 6b 20 2a 2f 0a 20 20 75 33  his mask */.  u3
4f00: 32 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  2 op,           
4f10: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 57      /* Mask of W
4f20: 4f 5f 78 78 20 76 61 6c 75 65 73 20 64 65 73 63  O_xx values desc
4f30: 72 69 62 69 6e 67 20 6f 70 65 72 61 74 6f 72 20  ribing operator 
4f40: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
4f50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75             /* Mu
4f60: 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65  st be compatible
4f70: 20 77 69 74 68 20 74 68 69 73 20 69 6e 64 65 78   with this index
4f80: 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f  , if not NULL */
4f90: 0a 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  .){.  WhereTerm 
4fa0: 2a 70 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20  *pResult = 0;.  
4fb0: 57 68 65 72 65 54 65 72 6d 20 2a 70 3b 0a 20 20  WhereTerm *p;.  
4fc0: 57 68 65 72 65 53 63 61 6e 20 73 63 61 6e 3b 0a  WhereScan scan;.
4fd0: 0a 20 20 70 20 3d 20 77 68 65 72 65 53 63 61 6e  .  p = whereScan
4fe0: 49 6e 69 74 28 26 73 63 61 6e 2c 20 70 57 43 2c  Init(&scan, pWC,
4ff0: 20 69 43 75 72 2c 20 69 43 6f 6c 75 6d 6e 2c 20   iCur, iColumn, 
5000: 6f 70 2c 20 70 49 64 78 29 3b 0a 20 20 77 68 69  op, pIdx);.  whi
5010: 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28  le( p ){.    if(
5020: 20 28 70 2d 3e 70 72 65 72 65 71 52 69 67 68 74   (p->prereqRight
5030: 20 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20   & notReady)==0 
5040: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
5050: 70 72 65 72 65 71 52 69 67 68 74 3d 3d 30 20 26  prereqRight==0 &
5060: 26 20 28 70 2d 3e 65 4f 70 65 72 61 74 6f 72 26  & (p->eOperator&
5070: 57 4f 5f 45 51 29 21 3d 30 20 29 7b 0a 20 20 20  WO_EQ)!=0 ){.   
5080: 20 20 20 20 20 72 65 74 75 72 6e 20 70 3b 0a 20       return p;. 
5090: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
50a0: 20 70 52 65 73 75 6c 74 3d 3d 30 20 29 20 70 52   pResult==0 ) pR
50b0: 65 73 75 6c 74 20 3d 20 70 3b 0a 20 20 20 20 7d  esult = p;.    }
50c0: 0a 20 20 20 20 70 20 3d 20 77 68 65 72 65 53 63  .    p = whereSc
50d0: 61 6e 4e 65 78 74 28 26 73 63 61 6e 29 3b 0a 20  anNext(&scan);. 
50e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 73   }.  return pRes
50f0: 75 6c 74 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61  ult;.}../* Forwa
5100: 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a  rd reference */.
5110: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72  static void expr
5120: 41 6e 61 6c 79 7a 65 28 53 72 63 4c 69 73 74 2a  Analyze(SrcList*
5130: 2c 20 57 68 65 72 65 43 6c 61 75 73 65 2a 2c 20  , WhereClause*, 
5140: 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c  int);../*.** Cal
5150: 6c 20 65 78 70 72 41 6e 61 6c 79 7a 65 20 6f 6e  l exprAnalyze on
5160: 20 61 6c 6c 20 74 65 72 6d 73 20 69 6e 20 61 20   all terms in a 
5170: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 0a  WHERE clause.  .
5180: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
5190: 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 0a 20  xprAnalyzeAll(. 
51a0: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
51b0: 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 74 68 65  st,       /* the
51c0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
51d0: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
51e0: 57 43 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68  WC         /* th
51f0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
5200: 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  o be analyzed */
5210: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  .){.  int i;.  f
5220: 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d  or(i=pWC->nTerm-
5230: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
5240: 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70     exprAnalyze(p
5250: 54 61 62 4c 69 73 74 2c 20 70 57 43 2c 20 69 29  TabList, pWC, i)
5260: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
5270: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b   SQLITE_OMIT_LIK
5280: 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f  E_OPTIMIZATION./
5290: 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  *.** Check to se
52a0: 65 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 65  e if the given e
52b0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 4c  xpression is a L
52c0: 49 4b 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72  IKE or GLOB oper
52d0: 61 74 6f 72 20 74 68 61 74 0a 2a 2a 20 63 61 6e  ator that.** can
52e0: 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 75 73   be optimized us
52f0: 69 6e 67 20 69 6e 65 71 75 61 6c 69 74 79 20 63  ing inequality c
5300: 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 52 65 74  onstraints.  Ret
5310: 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69  urn TRUE if it i
5320: 73 0a 2a 2a 20 73 6f 20 61 6e 64 20 66 61 6c 73  s.** so and fals
5330: 65 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20  e if not..**.** 
5340: 49 6e 20 6f 72 64 65 72 20 66 6f 72 20 74 68 65  In order for the
5350: 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20   operator to be 
5360: 6f 70 74 69 6d 69 7a 69 62 6c 65 2c 20 74 68 65  optimizible, the
5370: 20 52 48 53 20 6d 75 73 74 20 62 65 20 61 20 73   RHS must be a s
5380: 74 72 69 6e 67 0a 2a 2a 20 6c 69 74 65 72 61 6c  tring.** literal
5390: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 62   that does not b
53a0: 65 67 69 6e 20 77 69 74 68 20 61 20 77 69 6c 64  egin with a wild
53b0: 63 61 72 64 2e 20 20 54 68 65 20 4c 48 53 20 6d  card.  The LHS m
53c0: 75 73 74 20 62 65 20 61 20 63 6f 6c 75 6d 6e 0a  ust be a column.
53d0: 2a 2a 20 74 68 61 74 20 6d 61 79 20 6f 6e 6c 79  ** that may only
53e0: 20 62 65 20 4e 55 4c 4c 2c 20 61 20 73 74 72 69   be NULL, a stri
53f0: 6e 67 2c 20 6f 72 20 61 20 42 4c 4f 42 2c 20 6e  ng, or a BLOB, n
5400: 65 76 65 72 20 61 20 6e 75 6d 62 65 72 2e 20 28  ever a number. (
5410: 54 68 69 73 20 6d 65 61 6e 73 0a 2a 2a 20 74 68  This means.** th
5420: 61 74 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  at virtual table
5430: 73 20 63 61 6e 6e 6f 74 20 70 61 72 74 69 63 69  s cannot partici
5440: 70 61 74 65 20 69 6e 20 74 68 65 20 4c 49 4b 45  pate in the LIKE
5450: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 29 20   optimization.) 
5460: 20 49 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 6c 61   If the.** colla
5470: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
5480: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 6e 20  r the column on 
5490: 74 68 65 20 4c 48 53 20 6d 75 73 74 20 62 65 20  the LHS must be 
54a0: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 0a  appropriate for.
54b0: 2a 2a 20 74 68 65 20 6f 70 65 72 61 74 6f 72 2e  ** the operator.
54c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
54d0: 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 0a 20 20 50  sLikeOrGlob(.  P
54e0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
54f0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20   /* Parsing and 
5500: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
5510: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
5520: 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f  r *pExpr,      /
5530: 2a 20 54 65 73 74 20 74 68 69 73 20 65 78 70 72  * Test this expr
5540: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72  ession */.  Expr
5550: 20 2a 2a 70 70 50 72 65 66 69 78 2c 20 20 2f 2a   **ppPrefix,  /*
5560: 20 50 6f 69 6e 74 65 72 20 74 6f 20 54 4b 5f 53   Pointer to TK_S
5570: 54 52 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e  TRING expression
5580: 20 77 69 74 68 20 70 61 74 74 65 72 6e 20 70 72   with pattern pr
5590: 65 66 69 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  efix */.  int *p
55a0: 69 73 43 6f 6d 70 6c 65 74 65 2c 20 2f 2a 20 54  isComplete, /* T
55b0: 72 75 65 20 69 66 20 74 68 65 20 6f 6e 6c 79 20  rue if the only 
55c0: 77 69 6c 64 63 61 72 64 20 69 73 20 25 20 69 6e  wildcard is % in
55d0: 20 74 68 65 20 6c 61 73 74 20 63 68 61 72 61 63   the last charac
55e0: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ter */.  int *pn
55f0: 6f 43 61 73 65 20 20 20 20 20 20 2f 2a 20 54 72  oCase      /* Tr
5600: 75 65 20 69 66 20 75 70 70 65 72 63 61 73 65 20  ue if uppercase 
5610: 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
5620: 20 6c 6f 77 65 72 63 61 73 65 20 2a 2f 0a 29 7b   lowercase */.){
5630: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5640: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
5650: 20 53 74 72 69 6e 67 20 6f 6e 20 52 48 53 20 6f   String on RHS o
5660: 66 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20  f LIKE operator 
5670: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68  */.  Expr *pRigh
5680: 74 2c 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20  t, *pLeft;      
5690: 2f 2a 20 52 69 67 68 74 20 61 6e 64 20 6c 65 66  /* Right and lef
56a0: 74 20 73 69 7a 65 20 6f 66 20 4c 49 4b 45 20 6f  t size of LIKE o
56b0: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70  perator */.  Exp
56c0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20  rList *pList;   
56d0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
56e0: 6f 66 20 6f 70 65 72 61 6e 64 73 20 74 6f 20 74  of operands to t
56f0: 68 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72  he LIKE operator
5700: 20 2a 2f 0a 20 20 69 6e 74 20 63 3b 20 20 20 20   */.  int c;    
5710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5720: 20 2f 2a 20 4f 6e 65 20 63 68 61 72 61 63 74 65   /* One characte
5730: 72 20 69 6e 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e  r in z[] */.  in
5740: 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20  t cnt;          
5750: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
5760: 65 72 20 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63 61  er of non-wildca
5770: 72 64 20 70 72 65 66 69 78 20 63 68 61 72 61 63  rd prefix charac
5780: 74 65 72 73 20 2a 2f 0a 20 20 63 68 61 72 20 77  ters */.  char w
5790: 63 5b 33 5d 3b 20 20 20 20 20 20 20 20 20 20 20  c[3];           
57a0: 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64       /* Wildcard
57b0: 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20   characters */. 
57c0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
57d0: 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44  Parse->db;  /* D
57e0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
57f0: 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  on */.  sqlite3_
5800: 76 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b  value *pVal = 0;
5810: 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20  .  int op;      
5820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5830: 20 4f 70 63 6f 64 65 20 6f 66 20 70 52 69 67 68   Opcode of pRigh
5840: 74 20 2a 2f 0a 0a 20 20 69 66 28 20 21 73 71 6c  t */..  if( !sql
5850: 69 74 65 33 49 73 4c 69 6b 65 46 75 6e 63 74 69  ite3IsLikeFuncti
5860: 6f 6e 28 64 62 2c 20 70 45 78 70 72 2c 20 70 6e  on(db, pExpr, pn
5870: 6f 43 61 73 65 2c 20 77 63 29 20 29 7b 0a 20 20  oCase, wc) ){.  
5880: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
5890: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 42  #ifdef SQLITE_EB
58a0: 43 44 49 43 0a 20 20 69 66 28 20 2a 70 6e 6f 43  CDIC.  if( *pnoC
58b0: 61 73 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ase ) return 0;.
58c0: 23 65 6e 64 69 66 0a 20 20 70 4c 69 73 74 20 3d  #endif.  pList =
58d0: 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
58e0: 0a 20 20 70 4c 65 66 74 20 3d 20 70 4c 69 73 74  .  pLeft = pList
58f0: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[1].pExpr;.  
5900: 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 21 3d 54  if( pLeft->op!=T
5910: 4b 5f 43 4f 4c 55 4d 4e 20 0a 20 20 20 7c 7c 20  K_COLUMN .   || 
5920: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
5930: 69 74 79 28 70 4c 65 66 74 29 21 3d 53 51 4c 49  ity(pLeft)!=SQLI
5940: 54 45 5f 41 46 46 5f 54 45 58 54 20 0a 20 20 20  TE_AFF_TEXT .   
5950: 7c 7c 20 49 73 56 69 72 74 75 61 6c 28 70 4c 65  || IsVirtual(pLe
5960: 66 74 2d 3e 70 54 61 62 29 20 20 2f 2a 20 56 61  ft->pTab)  /* Va
5970: 6c 75 65 20 6d 69 67 68 74 20 62 65 20 6e 75 6d  lue might be num
5980: 65 72 69 63 20 2a 2f 0a 20 20 29 7b 0a 20 20 20  eric */.  ){.   
5990: 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 32 30 36 35   /* IMP: R-02065
59a0: 2d 34 39 34 36 35 20 54 68 65 20 6c 65 66 74 2d  -49465 The left-
59b0: 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
59c0: 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20 6f 70   LIKE or GLOB op
59d0: 65 72 61 74 6f 72 20 6d 75 73 74 0a 20 20 20 20  erator must.    
59e0: 2a 2a 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f  ** be the name o
59f0: 66 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c  f an indexed col
5a00: 75 6d 6e 20 77 69 74 68 20 54 45 58 54 20 61 66  umn with TEXT af
5a10: 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 72  finity. */.    r
5a20: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61  eturn 0;.  }.  a
5a30: 73 73 65 72 74 28 20 70 4c 65 66 74 2d 3e 69 43  ssert( pLeft->iC
5a40: 6f 6c 75 6d 6e 21 3d 28 2d 31 29 20 29 3b 20 2f  olumn!=(-1) ); /
5a50: 2a 20 42 65 63 61 75 73 65 20 49 50 4b 20 6e 65  * Because IPK ne
5a60: 76 65 72 20 68 61 73 20 41 46 46 5f 54 45 58 54  ver has AFF_TEXT
5a70: 20 2a 2f 0a 0a 20 20 70 52 69 67 68 74 20 3d 20   */..  pRight = 
5a80: 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
5a90: 6f 6c 6c 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b  ollate(pList->a[
5aa0: 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 6f 70 20  0].pExpr);.  op 
5ab0: 3d 20 70 52 69 67 68 74 2d 3e 6f 70 3b 0a 20 20  = pRight->op;.  
5ac0: 69 66 28 20 6f 70 3d 3d 54 4b 5f 56 41 52 49 41  if( op==TK_VARIA
5ad0: 42 4c 45 20 29 7b 0a 20 20 20 20 56 64 62 65 20  BLE ){.    Vdbe 
5ae0: 2a 70 52 65 70 72 65 70 61 72 65 20 3d 20 70 50  *pReprepare = pP
5af0: 61 72 73 65 2d 3e 70 52 65 70 72 65 70 61 72 65  arse->pReprepare
5b00: 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d  ;.    int iCol =
5b10: 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e   pRight->iColumn
5b20: 3b 0a 20 20 20 20 70 56 61 6c 20 3d 20 73 71 6c  ;.    pVal = sql
5b30: 69 74 65 33 56 64 62 65 47 65 74 42 6f 75 6e 64  ite3VdbeGetBound
5b40: 56 61 6c 75 65 28 70 52 65 70 72 65 70 61 72 65  Value(pReprepare
5b50: 2c 20 69 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 41  , iCol, SQLITE_A
5b60: 46 46 5f 4e 4f 4e 45 29 3b 0a 20 20 20 20 69 66  FF_NONE);.    if
5b70: 28 20 70 56 61 6c 20 26 26 20 73 71 6c 69 74 65  ( pVal && sqlite
5b80: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 56 61  3_value_type(pVa
5b90: 6c 29 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20  l)==SQLITE_TEXT 
5ba0: 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 28 63 68  ){.      z = (ch
5bb0: 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  ar *)sqlite3_val
5bc0: 75 65 5f 74 65 78 74 28 70 56 61 6c 29 3b 0a 20  ue_text(pVal);. 
5bd0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
5be0: 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 70  VdbeSetVarmask(p
5bf0: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 69 43  Parse->pVdbe, iC
5c00: 6f 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ol);.    assert(
5c10: 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f   pRight->op==TK_
5c20: 56 41 52 49 41 42 4c 45 20 7c 7c 20 70 52 69 67  VARIABLE || pRig
5c30: 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  ht->op==TK_REGIS
5c40: 54 45 52 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69  TER );.  }else i
5c50: 66 28 20 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47  f( op==TK_STRING
5c60: 20 29 7b 0a 20 20 20 20 7a 20 3d 20 70 52 69 67   ){.    z = pRig
5c70: 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  ht->u.zToken;.  
5c80: 7d 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20  }.  if( z ){.   
5c90: 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77 68   cnt = 0;.    wh
5ca0: 69 6c 65 28 20 28 63 3d 7a 5b 63 6e 74 5d 29 21  ile( (c=z[cnt])!
5cb0: 3d 30 20 26 26 20 63 21 3d 77 63 5b 30 5d 20 26  =0 && c!=wc[0] &
5cc0: 26 20 63 21 3d 77 63 5b 31 5d 20 26 26 20 63 21  & c!=wc[1] && c!
5cd0: 3d 77 63 5b 32 5d 20 29 7b 0a 20 20 20 20 20 20  =wc[2] ){.      
5ce0: 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  cnt++;.    }.   
5cf0: 20 69 66 28 20 63 6e 74 21 3d 30 20 26 26 20 32   if( cnt!=0 && 2
5d00: 35 35 21 3d 28 75 38 29 7a 5b 63 6e 74 2d 31 5d  55!=(u8)z[cnt-1]
5d10: 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
5d20: 70 50 72 65 66 69 78 3b 0a 20 20 20 20 20 20 2a  pPrefix;.      *
5d30: 70 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 63 3d  pisComplete = c=
5d40: 3d 77 63 5b 30 5d 20 26 26 20 7a 5b 63 6e 74 2b  =wc[0] && z[cnt+
5d50: 31 5d 3d 3d 30 3b 0a 20 20 20 20 20 20 70 50 72  1]==0;.      pPr
5d60: 65 66 69 78 20 3d 20 73 71 6c 69 74 65 33 45 78  efix = sqlite3Ex
5d70: 70 72 28 64 62 2c 20 54 4b 5f 53 54 52 49 4e 47  pr(db, TK_STRING
5d80: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , z);.      if( 
5d90: 70 50 72 65 66 69 78 20 29 20 70 50 72 65 66 69  pPrefix ) pPrefi
5da0: 78 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 63 6e 74 5d  x->u.zToken[cnt]
5db0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 2a 70 70 50   = 0;.      *ppP
5dc0: 72 65 66 69 78 20 3d 20 70 50 72 65 66 69 78 3b  refix = pPrefix;
5dd0: 0a 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 54  .      if( op==T
5de0: 4b 5f 56 41 52 49 41 42 4c 45 20 29 7b 0a 20 20  K_VARIABLE ){.  
5df0: 20 20 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20        Vdbe *v = 
5e00: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
5e10: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5e20: 62 65 53 65 74 56 61 72 6d 61 73 6b 28 76 2c 20  beSetVarmask(v, 
5e30: 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 29  pRight->iColumn)
5e40: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 70  ;.        if( *p
5e50: 69 73 43 6f 6d 70 6c 65 74 65 20 26 26 20 70 52  isComplete && pR
5e60: 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31  ight->u.zToken[1
5e70: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ] ){.          /
5e80: 2a 20 49 66 20 74 68 65 20 72 68 73 20 6f 66 20  * If the rhs of 
5e90: 74 68 65 20 4c 49 4b 45 20 65 78 70 72 65 73 73  the LIKE express
5ea0: 69 6f 6e 20 69 73 20 61 20 76 61 72 69 61 62 6c  ion is a variabl
5eb0: 65 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65  e, and the curre
5ec0: 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nt.          ** 
5ed0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 76 61 72  value of the var
5ee0: 69 61 62 6c 65 20 6d 65 61 6e 73 20 74 68 65 72  iable means ther
5ef0: 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
5f00: 69 6e 76 6f 6b 65 20 74 68 65 20 4c 49 4b 45 0a  invoke the LIKE.
5f10: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e            ** fun
5f20: 63 74 69 6f 6e 2c 20 74 68 65 6e 20 6e 6f 20 4f  ction, then no O
5f30: 50 5f 56 61 72 69 61 62 6c 65 20 77 69 6c 6c 20  P_Variable will 
5f40: 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  be added to the 
5f50: 70 72 6f 67 72 61 6d 2e 0a 20 20 20 20 20 20 20  program..       
5f60: 20 20 20 2a 2a 20 54 68 69 73 20 63 61 75 73 65     ** This cause
5f70: 73 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20 74  s problems for t
5f80: 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  he sqlite3_bind_
5f90: 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 29  parameter_name()
5fa0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 41 50  .          ** AP
5fb0: 49 2e 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  I. To work aroun
5fc0: 64 20 74 68 65 6d 2c 20 61 64 64 20 61 20 64 75  d them, add a du
5fd0: 6d 6d 79 20 4f 50 5f 56 61 72 69 61 62 6c 65 20  mmy OP_Variable 
5fe0: 68 65 72 65 2e 0a 20 20 20 20 20 20 20 20 20 20  here..          
5ff0: 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20 69 6e  */ .          in
6000: 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
6010: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
6020: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
6030: 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
6040: 74 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  t(pParse, pRight
6050: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20  , r1);.         
6060: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
6070: 67 65 50 33 28 76 2c 20 73 71 6c 69 74 65 33 56  geP3(v, sqlite3V
6080: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
6090: 29 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  )-1, 0);.       
60a0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
60b0: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
60c0: 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a   r1);.        }.
60d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
60e0: 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 30 3b 0a  e{.      z = 0;.
60f0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c      }.  }..  sql
6100: 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56  ite3ValueFree(pV
6110: 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 7a  al);.  return (z
6120: 21 3d 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  !=0);.}.#endif /
6130: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49  * SQLITE_OMIT_LI
6140: 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  KE_OPTIMIZATION 
6150: 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  */...#ifndef SQL
6160: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
6170: 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 43 68 65 63  TABLE./*.** Chec
6180: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
6190: 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
61a0: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a   is of the form.
61b0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6f  **.**         co
61c0: 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78 70 72 0a  lumn MATCH expr.
61d0: 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 74  **.** If it is t
61e0: 68 65 6e 20 72 65 74 75 72 6e 20 54 52 55 45 2e  hen return TRUE.
61f0: 20 20 49 66 20 6e 6f 74 2c 20 72 65 74 75 72 6e    If not, return
6200: 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69   FALSE..*/.stati
6210: 63 20 69 6e 74 20 69 73 4d 61 74 63 68 4f 66 43  c int isMatchOfC
6220: 6f 6c 75 6d 6e 28 0a 20 20 45 78 70 72 20 2a 70  olumn(.  Expr *p
6230: 45 78 70 72 20 20 20 20 20 20 2f 2a 20 54 65 73  Expr      /* Tes
6240: 74 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f  t this expressio
6250: 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69  n */.){.  ExprLi
6260: 73 74 20 2a 70 4c 69 73 74 3b 0a 0a 20 20 69 66  st *pList;..  if
6270: 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
6280: 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20  FUNCTION ){.    
6290: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
62a0: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
62b0: 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  mp(pExpr->u.zTok
62c0: 65 6e 2c 22 6d 61 74 63 68 22 29 21 3d 30 20 29  en,"match")!=0 )
62d0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
62e0: 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20 70 45    }.  pList = pE
62f0: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
6300: 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  if( pList->nExpr
6310: 21 3d 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=2 ){.    retur
6320: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 0;.  }.  if( p
6330: 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
6340: 2d 3e 6f 70 20 21 3d 20 54 4b 5f 43 4f 4c 55 4d  ->op != TK_COLUM
6350: 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  N ){.    return 
6360: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
6370: 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  1;.}.#endif /* S
6380: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
6390: 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a  ALTABLE */../*.*
63a0: 2a 20 49 66 20 74 68 65 20 70 42 61 73 65 20 65  * If the pBase e
63b0: 78 70 72 65 73 73 69 6f 6e 20 6f 72 69 67 69 6e  xpression origin
63c0: 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f  ated in the ON o
63d0: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  r USING clause o
63e0: 66 0a 2a 2a 20 61 20 6a 6f 69 6e 2c 20 74 68 65  f.** a join, the
63f0: 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65 20 61  n transfer the a
6400: 70 70 72 6f 70 72 69 61 74 65 20 6d 61 72 6b 69  ppropriate marki
6410: 6e 67 73 20 6f 76 65 72 20 74 6f 20 64 65 72 69  ngs over to deri
6420: 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ved..*/.static v
6430: 6f 69 64 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e  oid transferJoin
6440: 4d 61 72 6b 69 6e 67 73 28 45 78 70 72 20 2a 70  Markings(Expr *p
6450: 44 65 72 69 76 65 64 2c 20 45 78 70 72 20 2a 70  Derived, Expr *p
6460: 42 61 73 65 29 7b 0a 20 20 69 66 28 20 70 44 65  Base){.  if( pDe
6470: 72 69 76 65 64 20 29 7b 0a 20 20 20 20 70 44 65  rived ){.    pDe
6480: 72 69 76 65 64 2d 3e 66 6c 61 67 73 20 7c 3d 20  rived->flags |= 
6490: 70 42 61 73 65 2d 3e 66 6c 61 67 73 20 26 20 45  pBase->flags & E
64a0: 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 20 20  P_FromJoin;.    
64b0: 70 44 65 72 69 76 65 64 2d 3e 69 52 69 67 68 74  pDerived->iRight
64c0: 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70 42 61 73  JoinTable = pBas
64d0: 65 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  e->iRightJoinTab
64e0: 6c 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  le;.  }.}../*.**
64f0: 20 4d 61 72 6b 20 74 65 72 6d 20 69 43 68 69 6c   Mark term iChil
6500: 64 20 61 73 20 62 65 69 6e 67 20 61 20 63 68 69  d as being a chi
6510: 6c 64 20 6f 66 20 74 65 72 6d 20 69 50 61 72 65  ld of term iPare
6520: 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  nt.*/.static voi
6530: 64 20 6d 61 72 6b 54 65 72 6d 41 73 43 68 69 6c  d markTermAsChil
6540: 64 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70  d(WhereClause *p
6550: 57 43 2c 20 69 6e 74 20 69 43 68 69 6c 64 2c 20  WC, int iChild, 
6560: 69 6e 74 20 69 50 61 72 65 6e 74 29 7b 0a 20 20  int iParent){.  
6570: 70 57 43 2d 3e 61 5b 69 43 68 69 6c 64 5d 2e 69  pWC->a[iChild].i
6580: 50 61 72 65 6e 74 20 3d 20 69 50 61 72 65 6e 74  Parent = iParent
6590: 3b 0a 20 20 70 57 43 2d 3e 61 5b 69 43 68 69 6c  ;.  pWC->a[iChil
65a0: 64 5d 2e 74 72 75 74 68 50 72 6f 62 20 3d 20 70  d].truthProb = p
65b0: 57 43 2d 3e 61 5b 69 50 61 72 65 6e 74 5d 2e 74  WC->a[iParent].t
65c0: 72 75 74 68 50 72 6f 62 3b 0a 20 20 70 57 43 2d  ruthProb;.  pWC-
65d0: 3e 61 5b 69 50 61 72 65 6e 74 5d 2e 6e 43 68 69  >a[iParent].nChi
65e0: 6c 64 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ld++;.}../*.** R
65f0: 65 74 75 72 6e 20 74 68 65 20 4e 2d 74 68 20 41  eturn the N-th A
6600: 4e 44 2d 63 6f 6e 6e 65 63 74 65 64 20 73 75 62  ND-connected sub
6610: 74 65 72 6d 20 6f 66 20 70 54 65 72 6d 2e 20 20  term of pTerm.  
6620: 4f 72 20 69 66 20 70 54 65 72 6d 20 69 73 20 6e  Or if pTerm is n
6630: 6f 74 0a 2a 2a 20 61 20 63 6f 6e 6a 75 6e 63 74  ot.** a conjunct
6640: 69 6f 6e 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  ion, then return
6650: 20 6a 75 73 74 20 70 54 65 72 6d 20 77 68 65 6e   just pTerm when
6660: 20 4e 3d 3d 30 2e 20 20 49 66 20 4e 20 69 73 20   N==0.  If N is 
6670: 65 78 63 65 65 64 73 0a 2a 2a 20 74 68 65 20 6e  exceeds.** the n
6680: 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62  umber of availab
6690: 6c 65 20 73 75 62 74 65 72 6d 73 2c 20 72 65 74  le subterms, ret
66a0: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61  urn NULL..*/.sta
66b0: 74 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a 77  tic WhereTerm *w
66c0: 68 65 72 65 4e 74 68 53 75 62 74 65 72 6d 28 57  hereNthSubterm(W
66d0: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c  hereTerm *pTerm,
66e0: 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70   int N){.  if( p
66f0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21  Term->eOperator!
6700: 3d 57 4f 5f 41 4e 44 20 29 7b 0a 20 20 20 20 72  =WO_AND ){.    r
6710: 65 74 75 72 6e 20 4e 3d 3d 30 20 3f 20 70 54 65  eturn N==0 ? pTe
6720: 72 6d 20 3a 20 30 3b 0a 20 20 7d 0a 20 20 69 66  rm : 0;.  }.  if
6730: 28 20 4e 3c 70 54 65 72 6d 2d 3e 75 2e 70 41 6e  ( N<pTerm->u.pAn
6740: 64 49 6e 66 6f 2d 3e 77 63 2e 6e 54 65 72 6d 20  dInfo->wc.nTerm 
6750: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 70  ){.    return &p
6760: 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f  Term->u.pAndInfo
6770: 2d 3e 77 63 2e 61 5b 4e 5d 3b 0a 20 20 7d 0a 20  ->wc.a[N];.  }. 
6780: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
6790: 0a 2a 2a 20 53 75 62 74 65 72 6d 73 20 70 4f 6e  .** Subterms pOn
67a0: 65 20 61 6e 64 20 70 54 77 6f 20 61 72 65 20 63  e and pTwo are c
67b0: 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20  ontained within 
67c0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 57 43  WHERE clause pWC
67d0: 2e 20 20 54 68 65 0a 2a 2a 20 74 77 6f 20 73 75  .  The.** two su
67e0: 62 74 65 72 6d 73 20 61 72 65 20 69 6e 20 64 69  bterms are in di
67f0: 73 6a 75 6e 63 74 69 6f 6e 20 2d 20 74 68 65 79  sjunction - they
6800: 20 61 72 65 20 4f 52 2d 65 64 20 74 6f 67 65 74   are OR-ed toget
6810: 68 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  her..**.** If th
6820: 65 73 65 20 74 77 6f 20 74 65 72 6d 73 20 61 72  ese two terms ar
6830: 65 20 62 6f 74 68 20 6f 66 20 74 68 65 20 66 6f  e both of the fo
6840: 72 6d 3a 20 20 22 41 20 6f 70 20 42 22 20 77 69  rm:  "A op B" wi
6850: 74 68 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 41  th the same.** A
6860: 20 61 6e 64 20 42 20 76 61 6c 75 65 73 20 62 75   and B values bu
6870: 74 20 64 69 66 66 65 72 65 6e 74 20 6f 70 65 72  t different oper
6880: 61 74 6f 72 73 20 61 6e 64 20 69 66 20 74 68 65  ators and if the
6890: 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65 0a 2a   operators are.*
68a0: 2a 20 63 6f 6d 70 61 74 69 62 6c 65 20 28 69 66  * compatible (if
68b0: 20 6f 6e 65 20 69 73 20 3d 20 61 6e 64 20 74 68   one is = and th
68c0: 65 20 6f 74 68 65 72 20 69 73 20 3c 2c 20 66 6f  e other is <, fo
68d0: 72 20 65 78 61 6d 70 6c 65 29 20 74 68 65 6e 0a  r example) then.
68e0: 2a 2a 20 61 64 64 20 61 20 6e 65 77 20 76 69 72  ** add a new vir
68f0: 74 75 61 6c 20 41 4e 44 20 74 65 72 6d 20 74 6f  tual AND term to
6900: 20 70 57 43 20 74 68 61 74 20 69 73 20 74 68 65   pWC that is the
6910: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20   combination of 
6920: 74 68 65 0a 2a 2a 20 74 77 6f 2e 0a 2a 2a 0a 2a  the.** two..**.*
6930: 2a 20 53 6f 6d 65 20 65 78 61 6d 70 6c 65 73 3a  * Some examples:
6940: 0a 2a 2a 0a 2a 2a 20 20 20 20 78 3c 79 20 4f 52  .**.**    x<y OR
6950: 20 78 3d 79 20 20 20 20 2d 2d 3e 20 20 20 20 20   x=y    -->     
6960: 78 3c 3d 79 0a 2a 2a 20 20 20 20 78 3d 79 20 4f  x<=y.**    x=y O
6970: 52 20 78 3d 79 20 20 20 20 2d 2d 3e 20 20 20 20  R x=y    -->    
6980: 20 78 3d 79 0a 2a 2a 20 20 20 20 78 3c 3d 79 20   x=y.**    x<=y 
6990: 4f 52 20 78 3c 79 20 20 20 2d 2d 3e 20 20 20 20  OR x<y   -->    
69a0: 20 78 3c 3d 79 0a 2a 2a 0a 2a 2a 20 54 68 65 20   x<=y.**.** The 
69b0: 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 4e 4f 54  following is NOT
69c0: 20 67 65 6e 65 72 61 74 65 64 3a 0a 2a 2a 0a 2a   generated:.**.*
69d0: 2a 20 20 20 20 78 3c 79 20 4f 52 20 78 3e 79 20  *    x<y OR x>y 
69e0: 20 20 20 2d 2d 3e 20 20 20 20 20 78 21 3d 79 20     -->     x!=y 
69f0: 20 20 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76      .*/.static v
6a00: 6f 69 64 20 77 68 65 72 65 43 6f 6d 62 69 6e 65  oid whereCombine
6a10: 44 69 73 6a 75 6e 63 74 73 28 0a 20 20 53 72 63  Disjuncts(.  Src
6a20: 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
6a30: 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20      /* the FROM 
6a40: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  clause */.  Wher
6a50: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
6a60: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65     /* The comple
6a70: 74 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  te WHERE clause 
6a80: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
6a90: 70 4f 6e 65 2c 20 20 20 20 20 20 20 2f 2a 20 46  pOne,       /* F
6aa0: 69 72 73 74 20 64 69 73 6a 75 6e 63 74 20 2a 2f  irst disjunct */
6ab0: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
6ac0: 77 6f 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63  wo        /* Sec
6ad0: 6f 6e 64 20 64 69 73 6a 75 6e 63 74 20 2a 2f 0a  ond disjunct */.
6ae0: 29 7b 0a 20 20 75 31 36 20 65 4f 70 20 3d 20 70  ){.  u16 eOp = p
6af0: 4f 6e 65 2d 3e 65 4f 70 65 72 61 74 6f 72 20 7c  One->eOperator |
6b00: 20 70 54 77 6f 2d 3e 65 4f 70 65 72 61 74 6f 72   pTwo->eOperator
6b10: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
6b20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
6b30: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
6b40: 6e 20 28 66 6f 72 20 6d 61 6c 6c 6f 63 29 20 2a  n (for malloc) *
6b50: 2f 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 20  /.  Expr *pNew; 
6b60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
6b70: 77 20 76 69 72 74 75 61 6c 20 65 78 70 72 65 73  w virtual expres
6b80: 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  sion */.  int op
6b90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6ba0: 20 2f 2a 20 4f 70 65 72 61 74 6f 72 20 66 6f 72   /* Operator for
6bb0: 20 74 68 65 20 63 6f 6d 62 69 6e 65 64 20 65 78   the combined ex
6bc0: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e  pression */.  in
6bd0: 74 20 69 64 78 4e 65 77 3b 20 20 20 20 20 20 20  t idxNew;       
6be0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
6bf0: 20 70 57 43 20 6f 66 20 74 68 65 20 6e 65 78 74   pWC of the next
6c00: 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 2a 2f   virtual term */
6c10: 0a 0a 20 20 69 66 28 20 28 70 4f 6e 65 2d 3e 65  ..  if( (pOne->e
6c20: 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45  Operator & (WO_E
6c30: 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f  Q|WO_LT|WO_LE|WO
6c40: 5f 47 54 7c 57 4f 5f 47 45 29 29 3d 3d 30 20 29  _GT|WO_GE))==0 )
6c50: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28   return;.  if( (
6c60: 70 54 77 6f 2d 3e 65 4f 70 65 72 61 74 6f 72 20  pTwo->eOperator 
6c70: 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57  & (WO_EQ|WO_LT|W
6c80: 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45  O_LE|WO_GT|WO_GE
6c90: 29 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ))==0 ) return;.
6ca0: 20 20 69 66 28 20 28 65 4f 70 20 26 20 28 57 4f    if( (eOp & (WO
6cb0: 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29  _EQ|WO_LT|WO_LE)
6cc0: 29 21 3d 65 4f 70 0a 20 20 20 26 26 20 28 65 4f  )!=eOp.   && (eO
6cd0: 70 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 47 54  p & (WO_EQ|WO_GT
6ce0: 7c 57 4f 5f 47 45 29 29 21 3d 65 4f 70 20 29 20  |WO_GE))!=eOp ) 
6cf0: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
6d00: 28 20 70 4f 6e 65 2d 3e 70 45 78 70 72 2d 3e 70  ( pOne->pExpr->p
6d10: 4c 65 66 74 21 3d 30 20 26 26 20 70 4f 6e 65 2d  Left!=0 && pOne-
6d20: 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 21 3d  >pExpr->pRight!=
6d30: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
6d40: 54 77 6f 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66  Two->pExpr->pLef
6d50: 74 21 3d 30 20 26 26 20 70 54 77 6f 2d 3e 70 45  t!=0 && pTwo->pE
6d60: 78 70 72 2d 3e 70 52 69 67 68 74 21 3d 30 20 29  xpr->pRight!=0 )
6d70: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45  ;.  if( sqlite3E
6d80: 78 70 72 43 6f 6d 70 61 72 65 28 70 4f 6e 65 2d  xprCompare(pOne-
6d90: 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70  >pExpr->pLeft, p
6da0: 54 77 6f 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66  Two->pExpr->pLef
6db0: 74 2c 20 2d 31 29 20 29 20 72 65 74 75 72 6e 3b  t, -1) ) return;
6dc0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
6dd0: 70 72 43 6f 6d 70 61 72 65 28 70 4f 6e 65 2d 3e  prCompare(pOne->
6de0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 70  pExpr->pRight, p
6df0: 54 77 6f 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  Two->pExpr->pRig
6e00: 68 74 2c 20 2d 31 29 20 29 72 65 74 75 72 6e 3b  ht, -1) )return;
6e10: 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63  .  /* If we reac
6e20: 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74  h this point, it
6e30: 20 6d 65 61 6e 73 20 74 68 65 20 74 77 6f 20 73   means the two s
6e40: 75 62 74 65 72 6d 73 20 63 61 6e 20 62 65 20 63  ubterms can be c
6e50: 6f 6d 62 69 6e 65 64 20 2a 2f 0a 20 20 69 66 28  ombined */.  if(
6e60: 20 28 65 4f 70 20 26 20 28 65 4f 70 2d 31 29 29   (eOp & (eOp-1))
6e70: 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 65  !=0 ){.    if( e
6e80: 4f 70 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c  Op & (WO_LT|WO_L
6e90: 45 29 20 29 7b 0a 20 20 20 20 20 20 65 4f 70 20  E) ){.      eOp 
6ea0: 3d 20 57 4f 5f 4c 45 3b 0a 20 20 20 20 7d 65 6c  = WO_LE;.    }el
6eb0: 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
6ec0: 28 20 65 4f 70 20 26 20 28 57 4f 5f 47 54 7c 57  ( eOp & (WO_GT|W
6ed0: 4f 5f 47 45 29 20 29 3b 0a 20 20 20 20 20 20 65  O_GE) );.      e
6ee0: 4f 70 20 3d 20 57 4f 5f 47 45 3b 0a 20 20 20 20  Op = WO_GE;.    
6ef0: 7d 0a 20 20 7d 0a 20 20 64 62 20 3d 20 70 57 43  }.  }.  db = pWC
6f00: 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  ->pWInfo->pParse
6f10: 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73  ->db;.  pNew = s
6f20: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
6f30: 2c 20 70 4f 6e 65 2d 3e 70 45 78 70 72 2c 20 30  , pOne->pExpr, 0
6f40: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
6f50: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
6f60: 28 6f 70 3d 54 4b 5f 45 51 3b 20 65 4f 70 21 3d  (op=TK_EQ; eOp!=
6f70: 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45  (WO_EQ<<(op-TK_E
6f80: 51 29 29 3b 20 6f 70 2b 2b 29 7b 20 61 73 73 65  Q)); op++){ asse
6f90: 72 74 28 20 6f 70 3c 54 4b 5f 47 45 20 29 3b 20  rt( op<TK_GE ); 
6fa0: 7d 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 6f  }.  pNew->op = o
6fb0: 70 3b 0a 20 20 69 64 78 4e 65 77 20 3d 20 77 68  p;.  idxNew = wh
6fc0: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
6fd0: 70 57 43 2c 20 70 4e 65 77 2c 20 54 45 52 4d 5f  pWC, pNew, TERM_
6fe0: 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
6ff0: 41 4d 49 43 29 3b 0a 20 20 65 78 70 72 41 6e 61  AMIC);.  exprAna
7000: 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20  lyze(pSrc, pWC, 
7010: 69 64 78 4e 65 77 29 3b 0a 7d 0a 0a 23 69 66 20  idxNew);.}..#if 
7020: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
7030: 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
7040: 54 49 4f 4e 29 20 26 26 20 21 64 65 66 69 6e 65  TION) && !define
7050: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
7060: 42 51 55 45 52 59 29 0a 2f 2a 0a 2a 2a 20 41 6e  BQUERY)./*.** An
7070: 61 6c 79 7a 65 20 61 20 74 65 72 6d 20 74 68 61  alyze a term tha
7080: 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 77  t consists of tw
7090: 6f 20 6f 72 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e  o or more OR-con
70a0: 6e 65 63 74 65 64 0a 2a 2a 20 73 75 62 74 65 72  nected.** subter
70b0: 6d 73 2e 20 20 53 6f 20 69 6e 3a 0a 2a 2a 0a 2a  ms.  So in:.**.*
70c0: 2a 20 20 20 20 20 2e 2e 2e 20 57 48 45 52 45 20  *     ... WHERE 
70d0: 20 28 61 3d 35 29 20 41 4e 44 20 28 62 3d 37 20   (a=5) AND (b=7 
70e0: 4f 52 20 63 3d 39 20 4f 52 20 64 3d 31 33 29 20  OR c=9 OR d=13) 
70f0: 41 4e 44 20 28 64 3d 31 33 29 0a 2a 2a 20 20 20  AND (d=13).**   
7100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7110: 20 20 20 20 20 20 20 5e 5e 5e 5e 5e 5e 5e 5e 5e         ^^^^^^^^^
7120: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a  ^^^^^^^^^^^.**.*
7130: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
7140: 6e 61 6c 79 7a 65 73 20 74 65 72 6d 73 20 73 75  nalyzes terms su
7150: 63 68 20 61 73 20 74 68 65 20 6d 69 64 64 6c 65  ch as the middle
7160: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 61 62 6f   term in the abo
7170: 76 65 20 65 78 61 6d 70 6c 65 2e 0a 2a 2a 20 41  ve example..** A
7180: 20 57 68 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a   WhereOrTerm obj
7190: 65 63 74 20 69 73 20 63 6f 6d 70 75 74 65 64 20  ect is computed 
71a0: 61 6e 64 20 61 74 74 61 63 68 65 64 20 74 6f 20  and attached to 
71b0: 74 68 65 20 74 65 72 6d 20 75 6e 64 65 72 0a 2a  the term under.*
71c0: 2a 20 61 6e 61 6c 79 73 69 73 2c 20 72 65 67 61  * analysis, rega
71d0: 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 6f 75  rdless of the ou
71e0: 74 63 6f 6d 65 20 6f 66 20 74 68 65 20 61 6e 61  tcome of the ana
71f0: 6c 79 73 69 73 2e 20 20 48 65 6e 63 65 3a 0a 2a  lysis.  Hence:.*
7200: 2a 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65  *.**     WhereTe
7210: 72 6d 2e 77 74 46 6c 61 67 73 20 20 20 7c 3d 20  rm.wtFlags   |= 
7220: 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 0a 2a 2a 20   TERM_ORINFO.** 
7230: 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 75 2e      WhereTerm.u.
7240: 70 4f 72 49 6e 66 6f 20 20 3d 20 20 61 20 64 79  pOrInfo  =  a dy
7250: 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61  namically alloca
7260: 74 65 64 20 57 68 65 72 65 4f 72 54 65 72 6d 20  ted WhereOrTerm 
7270: 6f 62 6a 65 63 74 0a 2a 2a 0a 2a 2a 20 54 68 65  object.**.** The
7280: 20 74 65 72 6d 20 62 65 69 6e 67 20 61 6e 61 6c   term being anal
7290: 79 7a 65 64 20 6d 75 73 74 20 68 61 76 65 20 74  yzed must have t
72a0: 77 6f 20 6f 72 20 6d 6f 72 65 20 6f 66 20 4f 52  wo or more of OR
72b0: 2d 63 6f 6e 6e 65 63 74 65 64 20 73 75 62 74 65  -connected subte
72c0: 72 6d 73 2e 0a 2a 2a 20 41 20 73 69 6e 67 6c 65  rms..** A single
72d0: 20 73 75 62 74 65 72 6d 20 6d 69 67 68 74 20 62   subterm might b
72e0: 65 20 61 20 73 65 74 20 6f 66 20 41 4e 44 2d 63  e a set of AND-c
72f0: 6f 6e 6e 65 63 74 65 64 20 73 75 62 2d 73 75 62  onnected sub-sub
7300: 74 65 72 6d 73 2e 0a 2a 2a 20 45 78 61 6d 70 6c  terms..** Exampl
7310: 65 73 20 6f 66 20 74 65 72 6d 73 20 75 6e 64 65  es of terms unde
7320: 72 20 61 6e 61 6c 79 73 69 73 3a 0a 2a 2a 0a 2a  r analysis:.**.*
7330: 2a 20 20 20 20 20 28 41 29 20 20 20 20 20 74 31  *     (A)     t1
7340: 2e 78 3d 74 32 2e 79 20 4f 52 20 74 31 2e 78 3d  .x=t2.y OR t1.x=
7350: 74 32 2e 7a 20 4f 52 20 74 31 2e 79 3d 31 35 20  t2.z OR t1.y=15 
7360: 4f 52 20 74 31 2e 7a 3d 74 33 2e 61 2b 35 0a 2a  OR t1.z=t3.a+5.*
7370: 2a 20 20 20 20 20 28 42 29 20 20 20 20 20 78 3d  *     (B)     x=
7380: 65 78 70 72 31 20 4f 52 20 65 78 70 72 32 3d 78  expr1 OR expr2=x
7390: 20 4f 52 20 78 3d 65 78 70 72 33 0a 2a 2a 20 20   OR x=expr3.**  
73a0: 20 20 20 28 43 29 20 20 20 20 20 74 31 2e 78 3d     (C)     t1.x=
73b0: 74 32 2e 79 20 4f 52 20 28 74 31 2e 78 3d 74 32  t2.y OR (t1.x=t2
73c0: 2e 7a 20 41 4e 44 20 74 31 2e 79 3d 31 35 29 0a  .z AND t1.y=15).
73d0: 2a 2a 20 20 20 20 20 28 44 29 20 20 20 20 20 78  **     (D)     x
73e0: 3d 65 78 70 72 31 20 4f 52 20 28 79 3e 31 31 20  =expr1 OR (y>11 
73f0: 41 4e 44 20 79 3c 32 32 20 41 4e 44 20 7a 20 4c  AND y<22 AND z L
7400: 49 4b 45 20 27 2a 68 65 6c 6c 6f 2a 27 29 0a 2a  IKE '*hello*').*
7410: 2a 20 20 20 20 20 28 45 29 20 20 20 20 20 28 70  *     (E)     (p
7420: 2e 61 3d 31 20 41 4e 44 20 71 2e 62 3d 32 20 41  .a=1 AND q.b=2 A
7430: 4e 44 20 72 2e 63 3d 33 29 20 4f 52 20 28 70 2e  ND r.c=3) OR (p.
7440: 78 3d 34 20 41 4e 44 20 71 2e 79 3d 35 20 41 4e  x=4 AND q.y=5 AN
7450: 44 20 72 2e 7a 3d 36 29 0a 2a 2a 20 20 20 20 20  D r.z=6).**     
7460: 28 46 29 20 20 20 20 20 78 3e 41 20 4f 52 20 28  (F)     x>A OR (
7470: 78 3d 41 20 41 4e 44 20 79 3e 3d 42 29 0a 2a 2a  x=A AND y>=B).**
7480: 0a 2a 2a 20 43 41 53 45 20 31 3a 0a 2a 2a 0a 2a  .** CASE 1:.**.*
7490: 2a 20 49 66 20 61 6c 6c 20 73 75 62 74 65 72 6d  * If all subterm
74a0: 73 20 61 72 65 20 6f 66 20 74 68 65 20 66 6f 72  s are of the for
74b0: 6d 20 54 2e 43 3d 65 78 70 72 20 66 6f 72 20 73  m T.C=expr for s
74c0: 6f 6d 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  ome single colum
74d0: 6e 20 6f 66 20 43 20 61 6e 64 0a 2a 2a 20 61 20  n of C and.** a 
74e0: 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 54 20 28  single table T (
74f0: 61 73 20 73 68 6f 77 6e 20 69 6e 20 65 78 61 6d  as shown in exam
7500: 70 6c 65 20 42 20 61 62 6f 76 65 29 20 74 68 65  ple B above) the
7510: 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 76  n create a new v
7520: 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 74  irtual.** term t
7530: 68 61 74 20 69 73 20 61 6e 20 65 71 75 69 76 61  hat is an equiva
7540: 6c 65 6e 74 20 49 4e 20 65 78 70 72 65 73 73 69  lent IN expressi
7550: 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  on.  In other wo
7560: 72 64 73 2c 20 69 66 20 74 68 65 20 74 65 72 6d  rds, if the term
7570: 0a 2a 2a 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a  .** being analyz
7580: 65 64 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ed is:.**.**    
7590: 20 20 78 20 3d 20 65 78 70 72 31 20 20 4f 52 20    x = expr1  OR 
75a0: 20 65 78 70 72 32 20 3d 20 78 20 20 4f 52 20 20   expr2 = x  OR  
75b0: 78 20 3d 20 65 78 70 72 33 0a 2a 2a 0a 2a 2a 20  x = expr3.**.** 
75c0: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65  then create a ne
75d0: 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6c  w virtual term l
75e0: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
75f0: 20 20 20 20 20 78 20 49 4e 20 28 65 78 70 72 31       x IN (expr1
7600: 2c 65 78 70 72 32 2c 65 78 70 72 33 29 0a 2a 2a  ,expr2,expr3).**
7610: 0a 2a 2a 20 43 41 53 45 20 32 3a 0a 2a 2a 0a 2a  .** CASE 2:.**.*
7620: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 65  * If there are e
7630: 78 61 63 74 6c 79 20 74 77 6f 20 64 69 73 6a 75  xactly two disju
7640: 6e 63 74 73 20 6f 6e 65 20 73 69 64 65 20 68 61  ncts one side ha
7650: 73 20 78 3e 41 20 61 6e 64 20 74 68 65 20 6f 74  s x>A and the ot
7660: 68 65 72 20 73 69 64 65 0a 2a 2a 20 68 61 73 20  her side.** has 
7670: 78 3d 41 20 28 66 6f 72 20 74 68 65 20 73 61 6d  x=A (for the sam
7680: 65 20 78 20 61 6e 64 20 41 29 20 74 68 65 6e 20  e x and A) then 
7690: 61 64 64 20 61 20 6e 65 77 20 76 69 72 74 75 61  add a new virtua
76a0: 6c 20 63 6f 6e 6a 75 6e 63 74 20 74 65 72 6d 20  l conjunct term 
76b0: 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20  to the.** WHERE 
76c0: 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f  clause of the fo
76d0: 72 6d 20 22 78 3e 3d 41 22 2e 20 20 45 78 61 6d  rm "x>=A".  Exam
76e0: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ple:.**.**      
76f0: 78 3e 41 20 4f 52 20 28 78 3d 41 20 41 4e 44 20  x>A OR (x=A AND 
7700: 79 3e 42 29 20 20 20 20 61 64 64 73 3a 20 20 20  y>B)    adds:   
7710: 20 78 3e 3d 41 0a 2a 2a 0a 2a 2a 20 54 68 65 20   x>=A.**.** The 
7720: 61 64 64 65 64 20 63 6f 6e 6a 75 6e 63 74 20 63  added conjunct c
7730: 61 6e 20 73 6f 6d 65 74 69 6d 65 73 20 62 65 20  an sometimes be 
7740: 68 65 6c 70 66 75 6c 20 69 6e 20 71 75 65 72 79  helpful in query
7750: 20 70 6c 61 6e 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a   planning..**.**
7760: 20 43 41 53 45 20 33 3a 0a 2a 2a 0a 2a 2a 20 49   CASE 3:.**.** I
7770: 66 20 61 6c 6c 20 73 75 62 74 65 72 6d 73 20 61  f all subterms a
7780: 72 65 20 69 6e 64 65 78 61 62 6c 65 20 62 79 20  re indexable by 
7790: 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 54  a single table T
77a0: 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a 0a 2a 2a  , then set.**.**
77b0: 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 65       WhereTerm.e
77c0: 4f 70 65 72 61 74 6f 72 20 20 20 20 20 20 20 20  Operator        
77d0: 20 20 20 20 20 20 3d 20 20 57 4f 5f 4f 52 0a 2a        =  WO_OR.*
77e0: 2a 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e  *     WhereTerm.
77f0: 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78  u.pOrInfo->index
7800: 61 62 6c 65 20 20 7c 3d 20 20 74 68 65 20 63 75  able  |=  the cu
7810: 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
7820: 74 61 62 6c 65 20 54 0a 2a 2a 0a 2a 2a 20 41 20  table T.**.** A 
7830: 73 75 62 74 65 72 6d 20 69 73 20 22 69 6e 64 65  subterm is "inde
7840: 78 61 62 6c 65 22 20 69 66 20 69 74 20 69 73 20  xable" if it is 
7850: 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 20 22  of the form.** "
7860: 54 2e 43 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22  T.C <op> <expr>"
7870: 20 77 68 65 72 65 20 43 20 69 73 20 61 6e 79 20   where C is any 
7880: 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20  column of table 
7890: 54 20 61 6e 64 20 0a 2a 2a 20 3c 6f 70 3e 20 69  T and .** <op> i
78a0: 73 20 6f 6e 65 20 6f 66 20 22 3d 22 2c 20 22 3c  s one of "=", "<
78b0: 22 2c 20 22 3c 3d 22 2c 20 22 3e 22 2c 20 22 3e  ", "<=", ">", ">
78c0: 3d 22 2c 20 22 49 53 20 4e 55 4c 4c 22 2c 20 6f  =", "IS NULL", o
78d0: 72 20 22 49 4e 22 2e 0a 2a 2a 20 41 20 73 75 62  r "IN"..** A sub
78e0: 74 65 72 6d 20 69 73 20 61 6c 73 6f 20 69 6e 64  term is also ind
78f0: 65 78 61 62 6c 65 20 69 66 20 69 74 20 69 73 20  exable if it is 
7900: 61 6e 20 41 4e 44 20 6f 66 20 74 77 6f 20 6f 72  an AND of two or
7910: 20 6d 6f 72 65 0a 2a 2a 20 73 75 62 73 75 62 74   more.** subsubt
7920: 65 72 6d 73 20 61 74 20 6c 65 61 73 74 20 6f 6e  erms at least on
7930: 65 20 6f 66 20 77 68 69 63 68 20 69 73 20 69 6e  e of which is in
7940: 64 65 78 61 62 6c 65 2e 20 20 49 6e 64 65 78 61  dexable.  Indexa
7950: 62 6c 65 20 41 4e 44 20 0a 2a 2a 20 73 75 62 74  ble AND .** subt
7960: 65 72 6d 73 20 68 61 76 65 20 74 68 65 69 72 20  erms have their 
7970: 65 4f 70 65 72 61 74 6f 72 20 73 65 74 20 74 6f  eOperator set to
7980: 20 57 4f 5f 41 4e 44 20 61 6e 64 20 74 68 65 79   WO_AND and they
7990: 20 68 61 76 65 0a 2a 2a 20 75 2e 70 41 6e 64 49   have.** u.pAndI
79a0: 6e 66 6f 20 73 65 74 20 74 6f 20 61 20 64 79 6e  nfo set to a dyn
79b0: 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74  amically allocat
79c0: 65 64 20 57 68 65 72 65 41 6e 64 54 65 72 6d 20  ed WhereAndTerm 
79d0: 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 46 72  object..**.** Fr
79e0: 6f 6d 20 61 6e 6f 74 68 65 72 20 70 6f 69 6e 74  om another point
79f0: 20 6f 66 20 76 69 65 77 2c 20 22 69 6e 64 65 78   of view, "index
7a00: 61 62 6c 65 22 20 6d 65 61 6e 73 20 74 68 61 74  able" means that
7a10: 20 74 68 65 20 73 75 62 74 65 72 6d 20 63 6f 75   the subterm cou
7a20: 6c 64 0a 2a 2a 20 70 6f 74 65 6e 74 69 61 6c 6c  ld.** potentiall
7a30: 79 20 62 65 20 75 73 65 64 20 77 69 74 68 20 61  y be used with a
7a40: 6e 20 69 6e 64 65 78 20 69 66 20 61 6e 20 61 70  n index if an ap
7a50: 70 72 6f 70 72 69 61 74 65 20 69 6e 64 65 78 20  propriate index 
7a60: 65 78 69 73 74 73 2e 0a 2a 2a 20 54 68 69 73 20  exists..** This 
7a70: 61 6e 61 6c 79 73 69 73 20 64 6f 65 73 20 6e 6f  analysis does no
7a80: 74 20 63 6f 6e 73 69 64 65 72 20 77 68 65 74 68  t consider wheth
7a90: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 69 6e  er or not the in
7aa0: 64 65 78 20 65 78 69 73 74 73 3b 20 74 68 61 74  dex exists; that
7ab0: 0a 2a 2a 20 69 73 20 64 65 63 69 64 65 64 20 65  .** is decided e
7ac0: 6c 73 65 77 68 65 72 65 2e 20 20 54 68 69 73 20  lsewhere.  This 
7ad0: 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 6c 6f  analysis only lo
7ae0: 6f 6b 73 20 61 74 20 77 68 65 74 68 65 72 20 73  oks at whether s
7af0: 75 62 74 65 72 6d 73 0a 2a 2a 20 61 70 70 72 6f  ubterms.** appro
7b00: 70 72 69 61 74 65 20 66 6f 72 20 69 6e 64 65 78  priate for index
7b10: 69 6e 67 20 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a  ing exist..**.**
7b20: 20 41 6c 6c 20 65 78 61 6d 70 6c 65 73 20 41 20   All examples A 
7b30: 74 68 72 6f 75 67 68 20 45 20 61 62 6f 76 65 20  through E above 
7b40: 73 61 74 69 73 66 79 20 63 61 73 65 20 32 2e 20  satisfy case 2. 
7b50: 20 42 75 74 20 69 66 20 61 20 74 65 72 6d 0a 2a   But if a term.*
7b60: 2a 20 61 6c 73 6f 20 73 61 74 69 73 66 69 65 73  * also satisfies
7b70: 20 63 61 73 65 20 31 20 28 73 75 63 68 20 61 73   case 1 (such as
7b80: 20 42 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74   B) we know that
7b90: 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 77   the optimizer w
7ba0: 69 6c 6c 0a 2a 2a 20 61 6c 77 61 79 73 20 70 72  ill.** always pr
7bb0: 65 66 65 72 20 63 61 73 65 20 31 2c 20 73 6f 20  efer case 1, so 
7bc0: 69 6e 20 74 68 61 74 20 63 61 73 65 20 77 65 20  in that case we 
7bd0: 70 72 65 74 65 6e 64 20 74 68 61 74 20 63 61 73  pretend that cas
7be0: 65 20 32 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 61  e 2 is not.** sa
7bf0: 74 69 73 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  tisfied..**.** I
7c00: 74 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63  t might be the c
7c10: 61 73 65 20 74 68 61 74 20 6d 75 6c 74 69 70 6c  ase that multipl
7c20: 65 20 74 61 62 6c 65 73 20 61 72 65 20 69 6e 64  e tables are ind
7c30: 65 78 61 62 6c 65 2e 20 20 46 6f 72 20 65 78 61  exable.  For exa
7c40: 6d 70 6c 65 2c 0a 2a 2a 20 28 45 29 20 61 62 6f  mple,.** (E) abo
7c50: 76 65 20 69 73 20 69 6e 64 65 78 61 62 6c 65 20  ve is indexable 
7c60: 6f 6e 20 74 61 62 6c 65 73 20 50 2c 20 51 2c 20  on tables P, Q, 
7c70: 61 6e 64 20 52 2e 0a 2a 2a 0a 2a 2a 20 54 65 72  and R..**.** Ter
7c80: 6d 73 20 74 68 61 74 20 73 61 74 69 73 66 79 20  ms that satisfy 
7c90: 63 61 73 65 20 32 20 61 72 65 20 63 61 6e 64 69  case 2 are candi
7ca0: 64 61 74 65 73 20 66 6f 72 20 6c 6f 6f 6b 75 70  dates for lookup
7cb0: 20 62 79 20 75 73 69 6e 67 0a 2a 2a 20 73 65 70   by using.** sep
7cc0: 61 72 61 74 65 20 69 6e 64 69 63 65 73 20 74 6f  arate indices to
7cd0: 20 66 69 6e 64 20 72 6f 77 69 64 73 20 66 6f 72   find rowids for
7ce0: 20 65 61 63 68 20 73 75 62 74 65 72 6d 20 61 6e   each subterm an
7cf0: 64 20 63 6f 6d 70 6f 73 69 6e 67 0a 2a 2a 20 74  d composing.** t
7d00: 68 65 20 75 6e 69 6f 6e 20 6f 66 20 61 6c 6c 20  he union of all 
7d10: 72 6f 77 69 64 73 20 75 73 69 6e 67 20 61 20 52  rowids using a R
7d20: 6f 77 53 65 74 20 6f 62 6a 65 63 74 2e 20 20 54  owSet object.  T
7d30: 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72 0a 2a  his is similar.*
7d40: 2a 20 74 6f 20 22 62 69 74 6d 61 70 20 69 6e 64  * to "bitmap ind
7d50: 69 63 65 73 22 20 69 6e 20 6f 74 68 65 72 20 64  ices" in other d
7d60: 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65 73 2e  atabase engines.
7d70: 0a 2a 2a 0a 2a 2a 20 4f 54 48 45 52 57 49 53 45  .**.** OTHERWISE
7d80: 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65 69 74 68  :.**.** If neith
7d90: 65 72 20 63 61 73 65 20 31 20 6e 6f 72 20 63 61  er case 1 nor ca
7da0: 73 65 20 32 20 61 70 70 6c 79 2c 20 74 68 65 6e  se 2 apply, then
7db0: 20 6c 65 61 76 65 20 74 68 65 20 65 4f 70 65 72   leave the eOper
7dc0: 61 74 6f 72 20 73 65 74 20 74 6f 0a 2a 2a 20 7a  ator set to.** z
7dd0: 65 72 6f 2e 20 20 54 68 69 73 20 74 65 72 6d 20  ero.  This term 
7de0: 69 73 20 6e 6f 74 20 75 73 65 66 75 6c 20 66 6f  is not useful fo
7df0: 72 20 73 65 61 72 63 68 2e 0a 2a 2f 0a 73 74 61  r search..*/.sta
7e00: 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61  tic void exprAna
7e10: 6c 79 7a 65 4f 72 54 65 72 6d 28 0a 20 20 53 72  lyzeOrTerm(.  Sr
7e20: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
7e30: 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46          /* the F
7e40: 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
7e50: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
7e60: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65  ,         /* the
7e70: 20 63 6f 6d 70 6c 65 74 65 20 57 48 45 52 45 20   complete WHERE 
7e80: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
7e90: 69 64 78 54 65 72 6d 20 20 20 20 20 20 20 20 20  idxTerm         
7ea0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
7eb0: 66 20 74 68 65 20 4f 52 2d 74 65 72 6d 20 74 6f  f the OR-term to
7ec0: 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a   be analyzed */.
7ed0: 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
7ee0: 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57  pWInfo = pWC->pW
7ef0: 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 2f 2a 20  Info;        /* 
7f00: 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f  WHERE clause pro
7f10: 63 65 73 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  cessing context 
7f20: 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
7f30: 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  se = pWInfo->pPa
7f40: 72 73 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  rse;         /* 
7f50: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
7f60: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
7f70: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
7f80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
7f90: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
7fa0: 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  on */.  WhereTer
7fb0: 6d 20 2a 70 54 65 72 6d 20 3d 20 26 70 57 43 2d  m *pTerm = &pWC-
7fc0: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 20 20 20 20  >a[idxTerm];    
7fd0: 2f 2a 20 54 68 65 20 74 65 72 6d 20 74 6f 20 62  /* The term to b
7fe0: 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20  e analyzed */.  
7ff0: 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54  Expr *pExpr = pT
8000: 65 72 6d 2d 3e 70 45 78 70 72 3b 20 20 20 20 20  erm->pExpr;     
8010: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65          /* The e
8020: 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 68 65  xpression of the
8030: 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 69   term */.  int i
8040: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8060: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
8070: 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ers */.  WhereCl
8080: 61 75 73 65 20 2a 70 4f 72 57 63 3b 20 20 20 20  ause *pOrWc;    
8090: 20 20 20 2f 2a 20 42 72 65 61 6b 75 70 20 6f 66     /* Breakup of
80a0: 20 70 54 65 72 6d 20 69 6e 74 6f 20 73 75 62 74   pTerm into subt
80b0: 65 72 6d 73 20 2a 2f 0a 20 20 57 68 65 72 65 54  erms */.  WhereT
80c0: 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 20 20 20  erm *pOrTerm;   
80d0: 20 20 20 20 2f 2a 20 41 20 53 75 62 2d 74 65 72      /* A Sub-ter
80e0: 6d 20 77 69 74 68 69 6e 20 74 68 65 20 70 4f 72  m within the pOr
80f0: 57 63 20 2a 2f 0a 20 20 57 68 65 72 65 4f 72 49  Wc */.  WhereOrI
8100: 6e 66 6f 20 2a 70 4f 72 49 6e 66 6f 3b 20 20 20  nfo *pOrInfo;   
8110: 20 20 2f 2a 20 41 64 64 69 74 69 6f 6e 61 6c 20    /* Additional 
8120: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 73 73 6f  information asso
8130: 63 69 61 74 65 64 20 77 69 74 68 20 70 54 65 72  ciated with pTer
8140: 6d 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 63  m */.  Bitmask c
8150: 68 6e 67 54 6f 49 4e 3b 20 20 20 20 20 20 20 20  hngToIN;        
8160: 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74 20   /* Tables that 
8170: 6d 69 67 68 74 20 73 61 74 69 73 66 79 20 63 61  might satisfy ca
8180: 73 65 20 31 20 2a 2f 0a 20 20 42 69 74 6d 61 73  se 1 */.  Bitmas
8190: 6b 20 69 6e 64 65 78 61 62 6c 65 3b 20 20 20 20  k indexable;    
81a0: 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74 68      /* Tables th
81b0: 61 74 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65  at are indexable
81c0: 2c 20 73 61 74 69 73 66 79 69 6e 67 20 63 61 73  , satisfying cas
81d0: 65 20 32 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a  e 2 */..  /*.  *
81e0: 2a 20 42 72 65 61 6b 20 74 68 65 20 4f 52 20 63  * Break the OR c
81f0: 6c 61 75 73 65 20 69 6e 74 6f 20 69 74 73 20 73  lause into its s
8200: 65 70 61 72 61 74 65 20 73 75 62 74 65 72 6d 73  eparate subterms
8210: 2e 20 20 54 68 65 20 73 75 62 74 65 72 6d 73 20  .  The subterms 
8220: 61 72 65 0a 20 20 2a 2a 20 73 74 6f 72 65 64 20  are.  ** stored 
8230: 69 6e 20 61 20 57 68 65 72 65 43 6c 61 75 73 65  in a WhereClause
8240: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
8250: 69 6e 69 6e 67 20 77 69 74 68 69 6e 20 74 68 65  ining within the
8260: 20 57 68 65 72 65 4f 72 49 6e 66 6f 0a 20 20 2a   WhereOrInfo.  *
8270: 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 73  * object that is
8280: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65   attached to the
8290: 20 6f 72 69 67 69 6e 61 6c 20 4f 52 20 63 6c 61   original OR cla
82a0: 75 73 65 20 74 65 72 6d 2e 0a 20 20 2a 2f 0a 20  use term..  */. 
82b0: 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d   assert( (pTerm-
82c0: 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d  >wtFlags & (TERM
82d0: 5f 44 59 4e 41 4d 49 43 7c 54 45 52 4d 5f 4f 52  _DYNAMIC|TERM_OR
82e0: 49 4e 46 4f 7c 54 45 52 4d 5f 41 4e 44 49 4e 46  INFO|TERM_ANDINF
82f0: 4f 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  O))==0 );.  asse
8300: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
8310: 4b 5f 4f 52 20 29 3b 0a 20 20 70 54 65 72 6d 2d  K_OR );.  pTerm-
8320: 3e 75 2e 70 4f 72 49 6e 66 6f 20 3d 20 70 4f 72  >u.pOrInfo = pOr
8330: 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62  Info = sqlite3Db
8340: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
8350: 69 7a 65 6f 66 28 2a 70 4f 72 49 6e 66 6f 29 29  izeof(*pOrInfo))
8360: 3b 0a 20 20 69 66 28 20 70 4f 72 49 6e 66 6f 3d  ;.  if( pOrInfo=
8370: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  =0 ) return;.  p
8380: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d  Term->wtFlags |=
8390: 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 3b 0a 20 20   TERM_ORINFO;.  
83a0: 70 4f 72 57 63 20 3d 20 26 70 4f 72 49 6e 66 6f  pOrWc = &pOrInfo
83b0: 2d 3e 77 63 3b 0a 20 20 77 68 65 72 65 43 6c 61  ->wc;.  whereCla
83c0: 75 73 65 49 6e 69 74 28 70 4f 72 57 63 2c 20 70  useInit(pOrWc, p
83d0: 57 49 6e 66 6f 29 3b 0a 20 20 77 68 65 72 65 53  WInfo);.  whereS
83e0: 70 6c 69 74 28 70 4f 72 57 63 2c 20 70 45 78 70  plit(pOrWc, pExp
83f0: 72 2c 20 54 4b 5f 4f 52 29 3b 0a 20 20 65 78 70  r, TK_OR);.  exp
8400: 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63  rAnalyzeAll(pSrc
8410: 2c 20 70 4f 72 57 63 29 3b 0a 20 20 69 66 28 20  , pOrWc);.  if( 
8420: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
8430: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
8440: 65 72 74 28 20 70 4f 72 57 63 2d 3e 6e 54 65 72  ert( pOrWc->nTer
8450: 6d 3e 3d 32 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20  m>=2 );..  /*.  
8460: 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 73  ** Compute the s
8470: 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61  et of tables tha
8480: 74 20 6d 69 67 68 74 20 73 61 74 69 73 66 79 20  t might satisfy 
8490: 63 61 73 65 73 20 31 20 6f 72 20 32 2e 0a 20 20  cases 1 or 2..  
84a0: 2a 2f 0a 20 20 69 6e 64 65 78 61 62 6c 65 20 3d  */.  indexable =
84b0: 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20   ~(Bitmask)0;.  
84c0: 63 68 6e 67 54 6f 49 4e 20 3d 20 7e 28 42 69 74  chngToIN = ~(Bit
84d0: 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69 3d  mask)0;.  for(i=
84e0: 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c 20  pOrWc->nTerm-1, 
84f0: 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d 3e 61  pOrTerm=pOrWc->a
8500: 3b 20 69 3e 3d 30 20 26 26 20 69 6e 64 65 78 61  ; i>=0 && indexa
8510: 62 6c 65 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72  ble; i--, pOrTer
8520: 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70  m++){.    if( (p
8530: 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
8540: 72 20 26 20 57 4f 5f 53 49 4e 47 4c 45 29 3d 3d  r & WO_SINGLE)==
8550: 30 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65  0 ){.      Where
8560: 41 6e 64 49 6e 66 6f 20 2a 70 41 6e 64 49 6e 66  AndInfo *pAndInf
8570: 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  o;.      assert(
8580: 20 28 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61   (pOrTerm->wtFla
8590: 67 73 20 26 20 28 54 45 52 4d 5f 41 4e 44 49 4e  gs & (TERM_ANDIN
85a0: 46 4f 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 29  FO|TERM_ORINFO))
85b0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 68 6e  ==0 );.      chn
85c0: 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20  gToIN = 0;.     
85d0: 20 70 41 6e 64 49 6e 66 6f 20 3d 20 73 71 6c 69   pAndInfo = sqli
85e0: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
85f0: 62 2c 20 73 69 7a 65 6f 66 28 2a 70 41 6e 64 49  b, sizeof(*pAndI
8600: 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 69 66 28  nfo));.      if(
8610: 20 70 41 6e 64 49 6e 66 6f 20 29 7b 0a 20 20 20   pAndInfo ){.   
8620: 20 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65       WhereClause
8630: 20 2a 70 41 6e 64 57 43 3b 0a 20 20 20 20 20 20   *pAndWC;.      
8640: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 41 6e    WhereTerm *pAn
8650: 64 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69  dTerm;.        i
8660: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 42 69  nt j;.        Bi
8670: 74 6d 61 73 6b 20 62 20 3d 20 30 3b 0a 20 20 20  tmask b = 0;.   
8680: 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 75 2e       pOrTerm->u.
8690: 70 41 6e 64 49 6e 66 6f 20 3d 20 70 41 6e 64 49  pAndInfo = pAndI
86a0: 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 70 4f 72  nfo;.        pOr
86b0: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d  Term->wtFlags |=
86c0: 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 3b 0a 20   TERM_ANDINFO;. 
86d0: 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e         pOrTerm->
86e0: 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 41  eOperator = WO_A
86f0: 4e 44 3b 0a 20 20 20 20 20 20 20 20 70 41 6e 64  ND;.        pAnd
8700: 57 43 20 3d 20 26 70 41 6e 64 49 6e 66 6f 2d 3e  WC = &pAndInfo->
8710: 77 63 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72  wc;.        wher
8720: 65 43 6c 61 75 73 65 49 6e 69 74 28 70 41 6e 64  eClauseInit(pAnd
8730: 57 43 2c 20 70 57 43 2d 3e 70 57 49 6e 66 6f 29  WC, pWC->pWInfo)
8740: 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 53  ;.        whereS
8750: 70 6c 69 74 28 70 41 6e 64 57 43 2c 20 70 4f 72  plit(pAndWC, pOr
8760: 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 54 4b 5f  Term->pExpr, TK_
8770: 41 4e 44 29 3b 0a 20 20 20 20 20 20 20 20 65 78  AND);.        ex
8780: 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 53 72  prAnalyzeAll(pSr
8790: 63 2c 20 70 41 6e 64 57 43 29 3b 0a 20 20 20 20  c, pAndWC);.    
87a0: 20 20 20 20 70 41 6e 64 57 43 2d 3e 70 4f 75 74      pAndWC->pOut
87b0: 65 72 20 3d 20 70 57 43 3b 0a 20 20 20 20 20 20  er = pWC;.      
87c0: 20 20 74 65 73 74 63 61 73 65 28 20 64 62 2d 3e    testcase( db->
87d0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
87e0: 20 20 20 20 20 20 20 20 69 66 28 20 21 64 62 2d          if( !db-
87f0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
8800: 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a  .          for(j
8810: 3d 30 2c 20 70 41 6e 64 54 65 72 6d 3d 70 41 6e  =0, pAndTerm=pAn
8820: 64 57 43 2d 3e 61 3b 20 6a 3c 70 41 6e 64 57 43  dWC->a; j<pAndWC
8830: 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 41  ->nTerm; j++, pA
8840: 6e 64 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20  ndTerm++){.     
8850: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
8860: 41 6e 64 54 65 72 6d 2d 3e 70 45 78 70 72 20 29  AndTerm->pExpr )
8870: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
8880: 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70 41 6e 64  ( allowedOp(pAnd
8890: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 29  Term->pExpr->op)
88a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
88b0: 20 20 62 20 7c 3d 20 67 65 74 4d 61 73 6b 28 26    b |= getMask(&
88c0: 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
88d0: 2c 20 70 41 6e 64 54 65 72 6d 2d 3e 6c 65 66 74  , pAndTerm->left
88e0: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20  Cursor);.       
88f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
8900: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
8910: 20 20 20 20 20 69 6e 64 65 78 61 62 6c 65 20 26       indexable &
8920: 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = b;.      }.   
8930: 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65   }else if( pOrTe
8940: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
8950: 52 4d 5f 43 4f 50 49 45 44 20 29 7b 0a 20 20 20  RM_COPIED ){.   
8960: 20 20 20 2f 2a 20 53 6b 69 70 20 74 68 69 73 20     /* Skip this 
8970: 74 65 72 6d 20 66 6f 72 20 6e 6f 77 2e 20 20 57  term for now.  W
8980: 65 20 72 65 76 69 73 69 74 20 69 74 20 77 68 65  e revisit it whe
8990: 6e 20 77 65 20 70 72 6f 63 65 73 73 20 74 68 65  n we process the
89a0: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 65 73  .      ** corres
89b0: 70 6f 6e 64 69 6e 67 20 54 45 52 4d 5f 56 49 52  ponding TERM_VIR
89c0: 54 55 41 4c 20 74 65 72 6d 20 2a 2f 0a 20 20 20  TUAL term */.   
89d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 69   }else{.      Bi
89e0: 74 6d 61 73 6b 20 62 3b 0a 20 20 20 20 20 20 62  tmask b;.      b
89f0: 20 3d 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e   = getMask(&pWIn
8a00: 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 4f  fo->sMaskSet, pO
8a10: 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  rTerm->leftCurso
8a20: 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  r);.      if( pO
8a30: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
8a40: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 7b   TERM_VIRTUAL ){
8a50: 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 54 65  .        WhereTe
8a60: 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 4f  rm *pOther = &pO
8a70: 72 57 63 2d 3e 61 5b 70 4f 72 54 65 72 6d 2d 3e  rWc->a[pOrTerm->
8a80: 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20  iParent];.      
8a90: 20 20 62 20 7c 3d 20 67 65 74 4d 61 73 6b 28 26    b |= getMask(&
8aa0: 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
8ab0: 2c 20 70 4f 74 68 65 72 2d 3e 6c 65 66 74 43 75  , pOther->leftCu
8ac0: 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rsor);.      }. 
8ad0: 20 20 20 20 20 69 6e 64 65 78 61 62 6c 65 20 26       indexable &
8ae0: 3d 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20 28  = b;.      if( (
8af0: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
8b00: 6f 72 20 26 20 57 4f 5f 45 51 29 3d 3d 30 20 29  or & WO_EQ)==0 )
8b10: 7b 0a 20 20 20 20 20 20 20 20 63 68 6e 67 54 6f  {.        chngTo
8b20: 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  IN = 0;.      }e
8b30: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 68 6e  lse{.        chn
8b40: 67 54 6f 49 4e 20 26 3d 20 62 3b 0a 20 20 20 20  gToIN &= b;.    
8b50: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
8b60: 20 2f 2a 0a 20 20 2a 2a 20 52 65 63 6f 72 64 20   /*.  ** Record 
8b70: 74 68 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65  the set of table
8b80: 73 20 74 68 61 74 20 73 61 74 69 73 66 79 20 63  s that satisfy c
8b90: 61 73 65 20 33 2e 20 20 54 68 65 20 73 65 74 20  ase 3.  The set 
8ba0: 6d 69 67 68 74 20 62 65 0a 20 20 2a 2a 20 65 6d  might be.  ** em
8bb0: 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 70 4f 72 49  pty..  */.  pOrI
8bc0: 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 3d  nfo->indexable =
8bd0: 20 69 6e 64 65 78 61 62 6c 65 3b 0a 20 20 70 54   indexable;.  pT
8be0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d  erm->eOperator =
8bf0: 20 69 6e 64 65 78 61 62 6c 65 3d 3d 30 20 3f 20   indexable==0 ? 
8c00: 30 20 3a 20 57 4f 5f 4f 52 3b 0a 0a 20 20 2f 2a  0 : WO_OR;..  /*
8c10: 20 46 6f 72 20 61 20 74 77 6f 2d 77 61 79 20 4f   For a two-way O
8c20: 52 2c 20 61 74 74 65 6d 70 74 20 74 6f 20 69 6d  R, attempt to im
8c30: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 63 61 73  plementation cas
8c40: 65 20 32 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  e 2..  */.  if( 
8c50: 69 6e 64 65 78 61 62 6c 65 20 26 26 20 70 4f 72  indexable && pOr
8c60: 57 63 2d 3e 6e 54 65 72 6d 3d 3d 32 20 29 7b 0a  Wc->nTerm==2 ){.
8c70: 20 20 20 20 69 6e 74 20 69 4f 6e 65 20 3d 20 30      int iOne = 0
8c80: 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  ;.    WhereTerm 
8c90: 2a 70 4f 6e 65 3b 0a 20 20 20 20 77 68 69 6c 65  *pOne;.    while
8ca0: 28 20 28 70 4f 6e 65 20 3d 20 77 68 65 72 65 4e  ( (pOne = whereN
8cb0: 74 68 53 75 62 74 65 72 6d 28 26 70 4f 72 57 63  thSubterm(&pOrWc
8cc0: 2d 3e 61 5b 30 5d 2c 69 4f 6e 65 2b 2b 29 29 21  ->a[0],iOne++))!
8cd0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
8ce0: 69 54 77 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20  iTwo = 0;.      
8cf0: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 77 6f 3b  WhereTerm *pTwo;
8d00: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 70  .      while( (p
8d10: 54 77 6f 20 3d 20 77 68 65 72 65 4e 74 68 53 75  Two = whereNthSu
8d20: 62 74 65 72 6d 28 26 70 4f 72 57 63 2d 3e 61 5b  bterm(&pOrWc->a[
8d30: 31 5d 2c 69 54 77 6f 2b 2b 29 29 21 3d 30 20 29  1],iTwo++))!=0 )
8d40: 7b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 43  {.        whereC
8d50: 6f 6d 62 69 6e 65 44 69 73 6a 75 6e 63 74 73 28  ombineDisjuncts(
8d60: 70 53 72 63 2c 20 70 57 43 2c 20 70 4f 6e 65 2c  pSrc, pWC, pOne,
8d70: 20 70 54 77 6f 29 3b 0a 20 20 20 20 20 20 7d 0a   pTwo);.      }.
8d80: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a      }.  }..  /*.
8d90: 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 68 6f    ** chngToIN ho
8da0: 6c 64 73 20 61 20 73 65 74 20 6f 66 20 74 61 62  lds a set of tab
8db0: 6c 65 73 20 74 68 61 74 20 2a 6d 69 67 68 74 2a  les that *might*
8dc0: 20 73 61 74 69 73 66 79 20 63 61 73 65 20 31 2e   satisfy case 1.
8dd0: 20 20 42 75 74 0a 20 20 2a 2a 20 77 65 20 68 61    But.  ** we ha
8de0: 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20 61 64  ve to do some ad
8df0: 64 69 74 69 6f 6e 61 6c 20 63 68 65 63 6b 69 6e  ditional checkin
8e00: 67 20 74 6f 20 73 65 65 20 69 66 20 63 61 73 65  g to see if case
8e10: 20 31 20 72 65 61 6c 6c 79 0a 20 20 2a 2a 20 69   1 really.  ** i
8e20: 73 20 73 61 74 69 73 66 69 65 64 2e 0a 20 20 2a  s satisfied..  *
8e30: 2a 0a 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20  *.  ** chngToIN 
8e40: 77 69 6c 6c 20 68 6f 6c 64 20 65 69 74 68 65 72  will hold either
8e50: 20 30 2c 20 31 2c 20 6f 72 20 32 20 62 69 74 73   0, 1, or 2 bits
8e60: 2e 20 20 54 68 65 20 30 2d 62 69 74 20 63 61 73  .  The 0-bit cas
8e70: 65 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61  e means.  ** tha
8e80: 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f  t there is no po
8e90: 73 73 69 62 69 6c 69 74 79 20 6f 66 20 74 72 61  ssibility of tra
8ea0: 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65 20 4f 52  nsforming the OR
8eb0: 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 61 6e 0a   clause into an.
8ec0: 20 20 2a 2a 20 49 4e 20 6f 70 65 72 61 74 6f 72    ** IN operator
8ed0: 20 62 65 63 61 75 73 65 20 6f 6e 65 20 6f 72 20   because one or 
8ee0: 6d 6f 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68  more terms in th
8ef0: 65 20 4f 52 20 63 6c 61 75 73 65 20 63 6f 6e 74  e OR clause cont
8f00: 61 69 6e 0a 20 20 2a 2a 20 73 6f 6d 65 74 68 69  ain.  ** somethi
8f10: 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 3d 3d  ng other than ==
8f20: 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   on a column in 
8f30: 74 68 65 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  the single table
8f40: 2e 20 20 54 68 65 20 31 2d 62 69 74 0a 20 20 2a  .  The 1-bit.  *
8f50: 2a 20 63 61 73 65 20 6d 65 61 6e 73 20 74 68 61  * case means tha
8f60: 74 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20  t every term of 
8f70: 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 69 73  the OR clause is
8f80: 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 20 20 2a   of the form.  *
8f90: 2a 20 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 3d  * "table.column=
8fa0: 65 78 70 72 22 20 66 6f 72 20 73 6f 6d 65 20 73  expr" for some s
8fb0: 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20 20 54 68  ingle table.  Th
8fc0: 65 20 6f 6e 65 20 62 69 74 20 74 68 61 74 20 69  e one bit that i
8fd0: 73 20 73 65 74 0a 20 20 2a 2a 20 77 69 6c 6c 20  s set.  ** will 
8fe0: 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68  correspond to th
8ff0: 65 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 2e 20  e common table. 
9000: 20 57 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74   We still need t
9010: 6f 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 0a  o check to make.
9020: 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20 73 61    ** sure the sa
9030: 6d 65 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65  me column is use
9040: 64 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 2e 20  d on all terms. 
9050: 20 54 68 65 20 32 2d 62 69 74 20 63 61 73 65 20   The 2-bit case 
9060: 69 73 20 77 68 65 6e 0a 20 20 2a 2a 20 74 68 65  is when.  ** the
9070: 20 61 6c 6c 20 74 65 72 6d 73 20 61 72 65 20 6f   all terms are o
9080: 66 20 74 68 65 20 66 6f 72 6d 20 22 74 61 62 6c  f the form "tabl
9090: 65 31 2e 63 6f 6c 75 6d 6e 3d 74 61 62 6c 65 32  e1.column=table2
90a0: 2e 63 6f 6c 75 6d 6e 22 2e 20 20 49 74 0a 20 20  .column".  It.  
90b0: 2a 2a 20 6d 69 67 68 74 20 62 65 20 70 6f 73 73  ** might be poss
90c0: 69 62 6c 65 20 74 6f 20 66 6f 72 6d 20 61 6e 20  ible to form an 
90d0: 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68  IN operator with
90e0: 20 65 69 74 68 65 72 20 74 61 62 6c 65 31 2e 63   either table1.c
90f0: 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6f 72 20 74 61  olumn.  ** or ta
9100: 62 6c 65 32 2e 63 6f 6c 75 6d 6e 20 61 73 20 74  ble2.column as t
9110: 68 65 20 4c 48 53 20 69 66 20 65 69 74 68 65 72  he LHS if either
9120: 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76   is common to ev
9130: 65 72 79 20 74 65 72 6d 20 6f 66 0a 20 20 2a 2a  ery term of.  **
9140: 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 2e 0a   the OR clause..
9150: 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74    **.  ** Note t
9160: 68 61 74 20 74 65 72 6d 73 20 6f 66 20 74 68 65  hat terms of the
9170: 20 66 6f 72 6d 20 22 74 61 62 6c 65 2e 63 6f 6c   form "table.col
9180: 75 6d 6e 31 3d 74 61 62 6c 65 2e 63 6f 6c 75 6d  umn1=table.colum
9190: 6e 32 22 20 28 74 68 65 0a 20 20 2a 2a 20 73 61  n2" (the.  ** sa
91a0: 6d 65 20 74 61 62 6c 65 20 6f 6e 20 62 6f 74 68  me table on both
91b0: 20 73 69 7a 65 73 20 6f 66 20 74 68 65 20 3d 3d   sizes of the ==
91c0: 29 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69  ) cannot be opti
91d0: 6d 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  mized..  */.  if
91e0: 28 20 63 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20  ( chngToIN ){.  
91f0: 20 20 69 6e 74 20 6f 6b 54 6f 43 68 6e 67 54 6f    int okToChngTo
9200: 49 4e 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54  IN = 0;     /* T
9210: 72 75 65 20 69 66 20 74 68 65 20 63 6f 6e 76 65  rue if the conve
9220: 72 73 69 6f 6e 20 74 6f 20 49 4e 20 69 73 20 76  rsion to IN is v
9230: 61 6c 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  alid */.    int 
9240: 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 20 20 20  iColumn = -1;   
9250: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
9260: 69 6e 64 65 78 20 6f 6e 20 6c 68 73 20 6f 66 20  index on lhs of 
9270: 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
9280: 20 20 20 69 6e 74 20 69 43 75 72 73 6f 72 20 3d     int iCursor =
9290: 20 2d 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   -1;         /* 
92a0: 54 61 62 6c 65 20 63 75 72 73 6f 72 20 63 6f 6d  Table cursor com
92b0: 6d 6f 6e 20 74 6f 20 61 6c 6c 20 74 65 72 6d 73  mon to all terms
92c0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20   */.    int j = 
92d0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
92e0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
92f0: 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 61  r */..    /* Sea
9300: 72 63 68 20 66 6f 72 20 61 20 74 61 62 6c 65 20  rch for a table 
9310: 61 6e 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  and column that 
9320: 61 70 70 65 61 72 73 20 6f 6e 20 6f 6e 65 20 73  appears on one s
9330: 69 64 65 20 6f 72 20 74 68 65 0a 20 20 20 20 2a  ide or the.    *
9340: 2a 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 3d  * other of the =
9350: 3d 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 65 76  = operator in ev
9360: 65 72 79 20 73 75 62 74 65 72 6d 2e 20 20 54 68  ery subterm.  Th
9370: 61 74 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c  at table and col
9380: 75 6d 6e 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20  umn.    ** will 
9390: 62 65 20 72 65 63 6f 72 64 65 64 20 69 6e 20 69  be recorded in i
93a0: 43 75 72 73 6f 72 20 61 6e 64 20 69 43 6f 6c 75  Cursor and iColu
93b0: 6d 6e 2e 20 20 54 68 65 72 65 20 6d 69 67 68 74  mn.  There might
93c0: 20 6e 6f 74 20 62 65 20 61 6e 79 0a 20 20 20 20   not be any.    
93d0: 2a 2a 20 73 75 63 68 20 74 61 62 6c 65 20 61 6e  ** such table an
93e0: 64 20 63 6f 6c 75 6d 6e 2e 20 20 53 65 74 20 6f  d column.  Set o
93f0: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69 66 20 61  kToChngToIN if a
9400: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 74 61  n appropriate ta
9410: 62 6c 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 63  ble.    ** and c
9420: 6f 6c 75 6d 6e 20 69 73 20 66 6f 75 6e 64 20 62  olumn is found b
9430: 75 74 20 6c 65 61 76 65 20 6f 6b 54 6f 43 68 6e  ut leave okToChn
9440: 67 54 6f 49 4e 20 66 61 6c 73 65 20 69 66 20 6e  gToIN false if n
9450: 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 20 20 2a 2f  ot found..    */
9460: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
9470: 32 20 26 26 20 21 6f 6b 54 6f 43 68 6e 67 54 6f  2 && !okToChngTo
9480: 49 4e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  IN; j++){.      
9490: 70 4f 72 54 65 72 6d 20 3d 20 70 4f 72 57 63 2d  pOrTerm = pOrWc-
94a0: 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  >a;.      for(i=
94b0: 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 3b 20  pOrWc->nTerm-1; 
94c0: 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72 54 65  i>=0; i--, pOrTe
94d0: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61  rm++){.        a
94e0: 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e  ssert( pOrTerm->
94f0: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45  eOperator & WO_E
9500: 51 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 72  Q );.        pOr
9510: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 3d  Term->wtFlags &=
9520: 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20   ~TERM_OR_OK;.  
9530: 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72        if( pOrTer
9540: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  m->leftCursor==i
9550: 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20  Cursor ){.      
9560: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
9570: 68 65 20 32 2d 62 69 74 20 63 61 73 65 20 61 6e  he 2-bit case an
9580: 64 20 77 65 20 61 72 65 20 6f 6e 20 74 68 65 20  d we are on the 
9590: 73 65 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e  second iteration
95a0: 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a   and.          *
95b0: 2a 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 69  * current term i
95c0: 73 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74  s from the first
95d0: 20 69 74 65 72 61 74 69 6f 6e 2e 20 20 53 6f 20   iteration.  So 
95e0: 73 6b 69 70 20 74 68 69 73 20 74 65 72 6d 2e 20  skip this term. 
95f0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
9600: 65 72 74 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20  ert( j==1 );.   
9610: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
9620: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
9630: 20 20 20 69 66 28 20 28 63 68 6e 67 54 6f 49 4e     if( (chngToIN
9640: 20 26 20 67 65 74 4d 61 73 6b 28 26 70 57 49 6e   & getMask(&pWIn
9650: 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 4f  fo->sMaskSet, pO
9660: 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  rTerm->leftCurso
9670: 72 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  r))==0 ){.      
9680: 20 20 20 20 2f 2a 20 54 68 69 73 20 74 65 72 6d      /* This term
9690: 20 6d 75 73 74 20 62 65 20 6f 66 20 74 68 65 20   must be of the 
96a0: 66 6f 72 6d 20 74 31 2e 61 3d 3d 74 32 2e 62 20  form t1.a==t2.b 
96b0: 77 68 65 72 65 20 74 32 20 69 73 20 69 6e 20 74  where t2 is in t
96c0: 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
96d0: 63 68 6e 67 54 6f 49 4e 20 73 65 74 20 62 75 74  chngToIN set but
96e0: 20 74 31 20 69 73 20 6e 6f 74 2e 20 20 54 68 69   t1 is not.  Thi
96f0: 73 20 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 65  s term will be e
9700: 69 74 68 65 72 20 70 72 65 63 65 64 65 64 0a 20  ither preceded. 
9710: 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 66           ** or f
9720: 6f 6c 6c 77 65 64 20 62 79 20 61 6e 20 69 6e 76  ollwed by an inv
9730: 65 72 74 65 64 20 63 6f 70 79 20 28 74 32 2e 62  erted copy (t2.b
9740: 3d 3d 74 31 2e 61 29 2e 20 20 53 6b 69 70 20 74  ==t1.a).  Skip t
9750: 68 69 73 20 74 65 72 6d 20 0a 20 20 20 20 20 20  his term .      
9760: 20 20 20 20 2a 2a 20 61 6e 64 20 75 73 65 20 69      ** and use i
9770: 74 73 20 69 6e 76 65 72 73 69 6f 6e 2e 20 2a 2f  ts inversion. */
9780: 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
9790: 61 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74  ase( pOrTerm->wt
97a0: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50  Flags & TERM_COP
97b0: 49 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 20  IED );.         
97c0: 20 74 65 73 74 63 61 73 65 28 20 70 4f 72 54 65   testcase( pOrTe
97d0: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
97e0: 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20  RM_VIRTUAL );.  
97f0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9800: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
9810: 20 26 20 28 54 45 52 4d 5f 43 4f 50 49 45 44 7c   & (TERM_COPIED|
9820: 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 20 29 3b  TERM_VIRTUAL) );
9830: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
9840: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nue;.        }. 
9850: 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d         iColumn =
9860: 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   pOrTerm->u.left
9870: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
9880: 69 43 75 72 73 6f 72 20 3d 20 70 4f 72 54 65 72  iCursor = pOrTer
9890: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3b 0a 20  m->leftCursor;. 
98a0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
98b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
98c0: 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  i<0 ){.        /
98d0: 2a 20 4e 6f 20 63 61 6e 64 69 64 61 74 65 20 74  * No candidate t
98e0: 61 62 6c 65 2b 63 6f 6c 75 6d 6e 20 77 61 73 20  able+column was 
98f0: 66 6f 75 6e 64 2e 20 20 54 68 69 73 20 63 61 6e  found.  This can
9900: 20 6f 6e 6c 79 20 6f 63 63 75 72 0a 20 20 20 20   only occur.    
9910: 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73 65      ** on the se
9920: 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20 2a  cond iteration *
9930: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
9940: 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  ( j==1 );.      
9950: 20 20 61 73 73 65 72 74 28 20 49 73 50 6f 77 65    assert( IsPowe
9960: 72 4f 66 54 77 6f 28 63 68 6e 67 54 6f 49 4e 29  rOfTwo(chngToIN)
9970: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
9980: 72 74 28 20 63 68 6e 67 54 6f 49 4e 3d 3d 67 65  rt( chngToIN==ge
9990: 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73  tMask(&pWInfo->s
99a0: 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 73 6f 72  MaskSet, iCursor
99b0: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ) );.        bre
99c0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
99d0: 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 31    testcase( j==1
99e0: 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 65   );..      /* We
99f0: 20 68 61 76 65 20 66 6f 75 6e 64 20 61 20 63 61   have found a ca
9a00: 6e 64 69 64 61 74 65 20 74 61 62 6c 65 20 61 6e  ndidate table an
9a10: 64 20 63 6f 6c 75 6d 6e 2e 20 20 43 68 65 63 6b  d column.  Check
9a20: 20 74 6f 20 73 65 65 20 69 66 20 74 68 61 74 0a   to see if that.
9a30: 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61        ** table a
9a40: 6e 64 20 63 6f 6c 75 6d 6e 20 69 73 20 63 6f 6d  nd column is com
9a50: 6d 6f 6e 20 74 6f 20 65 76 65 72 79 20 74 65 72  mon to every ter
9a60: 6d 20 69 6e 20 74 68 65 20 4f 52 20 63 6c 61 75  m in the OR clau
9a70: 73 65 20 2a 2f 0a 20 20 20 20 20 20 6f 6b 54 6f  se */.      okTo
9a80: 43 68 6e 67 54 6f 49 4e 20 3d 20 31 3b 0a 20 20  ChngToIN = 1;.  
9a90: 20 20 20 20 66 6f 72 28 3b 20 69 3e 3d 30 20 26      for(; i>=0 &
9aa0: 26 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20  & okToChngToIN; 
9ab0: 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b  i--, pOrTerm++){
9ac0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
9ad0: 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61   pOrTerm->eOpera
9ae0: 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20  tor & WO_EQ );. 
9af0: 20 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65         if( pOrTe
9b00: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d  rm->leftCursor!=
9b10: 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20  iCursor ){.     
9b20: 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74       pOrTerm->wt
9b30: 46 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f  Flags &= ~TERM_O
9b40: 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65  R_OK;.        }e
9b50: 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d  lse if( pOrTerm-
9b60: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 21 3d 69  >u.leftColumn!=i
9b70: 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
9b80: 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e      okToChngToIN
9b90: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
9ba0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
9bb0: 6e 74 20 61 66 66 4c 65 66 74 2c 20 61 66 66 52  nt affLeft, affR
9bc0: 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20  ight;.          
9bd0: 2f 2a 20 49 66 20 74 68 65 20 72 69 67 68 74 2d  /* If the right-
9be0: 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 6c 73  hand side is als
9bf0: 6f 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e  o a column, then
9c00: 20 74 68 65 20 61 66 66 69 6e 69 74 69 65 73 0a   the affinities.
9c10: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20            ** of 
9c20: 62 6f 74 68 20 72 69 67 68 74 20 61 6e 64 20 6c  both right and l
9c30: 65 66 74 20 73 69 64 65 73 20 6d 75 73 74 20 62  eft sides must b
9c40: 65 20 73 75 63 68 20 74 68 61 74 20 6e 6f 20 74  e such that no t
9c50: 79 70 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ype.          **
9c60: 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 61 72 65   conversions are
9c70: 20 72 65 71 75 69 72 65 64 20 6f 6e 20 74 68 65   required on the
9c80: 20 72 69 67 68 74 2e 20 20 28 54 69 63 6b 65 74   right.  (Ticket
9c90: 20 23 32 32 34 39 29 0a 20 20 20 20 20 20 20 20   #2249).        
9ca0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61    */.          a
9cb0: 66 66 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65  ffRight = sqlite
9cc0: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4f  3ExprAffinity(pO
9cd0: 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52  rTerm->pExpr->pR
9ce0: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20  ight);.         
9cf0: 20 61 66 66 4c 65 66 74 20 3d 20 73 71 6c 69 74   affLeft = sqlit
9d00: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
9d10: 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70  OrTerm->pExpr->p
9d20: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Left);.         
9d30: 20 69 66 28 20 61 66 66 52 69 67 68 74 21 3d 30   if( affRight!=0
9d40: 20 26 26 20 61 66 66 52 69 67 68 74 21 3d 61 66   && affRight!=af
9d50: 66 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20  fLeft ){.       
9d60: 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49       okToChngToI
9d70: 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  N = 0;.         
9d80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
9d90: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46      pOrTerm->wtF
9da0: 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 5f  lags |= TERM_OR_
9db0: 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  OK;.          }.
9dc0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9dd0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
9de0: 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6f  At this point, o
9df0: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69 73 20 74  kToChngToIN is t
9e00: 72 75 65 20 69 66 20 6f 72 69 67 69 6e 61 6c 20  rue if original 
9e10: 70 54 65 72 6d 20 73 61 74 69 73 66 69 65 73 0a  pTerm satisfies.
9e20: 20 20 20 20 2a 2a 20 63 61 73 65 20 31 2e 20 20      ** case 1.  
9e30: 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 63 6f  In that case, co
9e40: 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 76 69  nstruct a new vi
9e50: 72 74 75 61 6c 20 74 65 72 6d 20 74 68 61 74 20  rtual term that 
9e60: 69 73 20 0a 20 20 20 20 2a 2a 20 70 54 65 72 6d  is .    ** pTerm
9e70: 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
9e80: 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a  an IN operator..
9e90: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f      */.    if( o
9ea0: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 29 7b 0a 20  kToChngToIN ){. 
9eb0: 20 20 20 20 20 45 78 70 72 20 2a 70 44 75 70 3b       Expr *pDup;
9ec0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
9ed0: 20 74 72 61 6e 73 69 65 6e 74 20 64 75 70 6c 69   transient dupli
9ee0: 63 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20  cate expression 
9ef0: 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73  */.      ExprLis
9f00: 74 20 2a 70 4c 69 73 74 20 3d 20 30 3b 20 20 20  t *pList = 0;   
9f10: 2f 2a 20 54 68 65 20 52 48 53 20 6f 66 20 74 68  /* The RHS of th
9f20: 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  e IN operator */
9f30: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65  .      Expr *pLe
9f40: 66 74 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  ft = 0;       /*
9f50: 20 54 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20   The LHS of the 
9f60: 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
9f70: 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b       Expr *pNew;
9f80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
9f90: 68 65 20 63 6f 6d 70 6c 65 74 65 20 49 4e 20 6f  he complete IN o
9fa0: 70 65 72 61 74 6f 72 20 2a 2f 0a 0a 20 20 20 20  perator */..    
9fb0: 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e    for(i=pOrWc->n
9fc0: 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d  Term-1, pOrTerm=
9fd0: 70 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 3b 20  pOrWc->a; i>=0; 
9fe0: 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b  i--, pOrTerm++){
9ff0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4f  .        if( (pO
a000: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
a010: 20 54 45 52 4d 5f 4f 52 5f 4f 4b 29 3d 3d 30 20   TERM_OR_OK)==0 
a020: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
a030: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54      assert( pOrT
a040: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
a050: 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20   WO_EQ );.      
a060: 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72    assert( pOrTer
a070: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  m->leftCursor==i
a080: 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 20 20  Cursor );.      
a090: 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72    assert( pOrTer
a0a0: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d  m->u.leftColumn=
a0b0: 3d 69 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20  =iColumn );.    
a0c0: 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74      pDup = sqlit
a0d0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f  e3ExprDup(db, pO
a0e0: 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52  rTerm->pExpr->pR
a0f0: 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  ight, 0);.      
a100: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
a110: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
a120: 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20  pWInfo->pParse, 
a130: 70 4c 69 73 74 2c 20 70 44 75 70 29 3b 0a 20 20  pList, pDup);.  
a140: 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 70 4f        pLeft = pO
a150: 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c  rTerm->pExpr->pL
a160: 65 66 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eft;.      }.   
a170: 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74     assert( pLeft
a180: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 44 75  !=0 );.      pDu
a190: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  p = sqlite3ExprD
a1a0: 75 70 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29  up(db, pLeft, 0)
a1b0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73  ;.      pNew = s
a1c0: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
a1d0: 73 65 2c 20 54 4b 5f 49 4e 2c 20 70 44 75 70 2c  se, TK_IN, pDup,
a1e0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
a1f0: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( pNew ){.      
a200: 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20    int idxNew;.  
a210: 20 20 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f        transferJo
a220: 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 2c  inMarkings(pNew,
a230: 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20   pExpr);.       
a240: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
a250: 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20  sProperty(pNew, 
a260: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
a270: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78  .        pNew->x
a280: 2e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a  .pList = pList;.
a290: 20 20 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d          idxNew =
a2a0: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
a2b0: 72 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 54 45  rt(pWC, pNew, TE
a2c0: 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f  RM_VIRTUAL|TERM_
a2d0: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
a2e0: 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e    testcase( idxN
a2f0: 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ew==0 );.       
a300: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72   exprAnalyze(pSr
a310: 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b  c, pWC, idxNew);
a320: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d  .        pTerm =
a330: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
a340: 5d 3b 0a 20 20 20 20 20 20 20 20 6d 61 72 6b 54  ];.        markT
a350: 65 72 6d 41 73 43 68 69 6c 64 28 70 57 43 2c 20  ermAsChild(pWC, 
a360: 69 64 78 4e 65 77 2c 20 69 64 78 54 65 72 6d 29  idxNew, idxTerm)
a370: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
a380: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
a390: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
a3a0: 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d   pList);.      }
a3b0: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f  .      pTerm->eO
a3c0: 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4e 4f 4f  perator = WO_NOO
a3d0: 50 3b 20 20 2f 2a 20 63 61 73 65 20 31 20 74 72  P;  /* case 1 tr
a3e0: 75 6d 70 73 20 63 61 73 65 20 33 20 2a 2f 0a 20  umps case 3 */. 
a3f0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
a400: 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49  f /* !SQLITE_OMI
a410: 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  T_OR_OPTIMIZATIO
a420: 4e 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49  N && !SQLITE_OMI
a430: 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f  T_SUBQUERY */../
a440: 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74 20 74  *.** The input t
a450: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
a460: 73 20 61 6e 20 57 68 65 72 65 54 65 72 6d 20 73  s an WhereTerm s
a470: 74 72 75 63 74 75 72 65 20 77 69 74 68 20 6f 6e  tructure with on
a480: 6c 79 20 74 68 65 0a 2a 2a 20 22 70 45 78 70 72  ly the.** "pExpr
a490: 22 20 66 69 65 6c 64 20 66 69 6c 6c 65 64 20 69  " field filled i
a4a0: 6e 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66 20 74  n.  The job of t
a4b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
a4c0: 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65 0a 2a 2a  o analyze the.**
a4d0: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 61   subexpression a
a4e0: 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6c 6c 20  nd populate all 
a4f0: 74 68 65 20 6f 74 68 65 72 20 66 69 65 6c 64 73  the other fields
a500: 20 6f 66 20 74 68 65 20 57 68 65 72 65 54 65 72   of the WhereTer
a510: 6d 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a  m.** structure..
a520: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  **.** If the exp
a530: 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68  ression is of th
a540: 65 20 66 6f 72 6d 20 22 3c 65 78 70 72 3e 20 3c  e form "<expr> <
a550: 6f 70 3e 20 58 22 20 69 74 20 67 65 74 73 20 63  op> X" it gets c
a560: 6f 6d 6d 75 74 65 64 0a 2a 2a 20 74 6f 20 74 68  ommuted.** to th
a570: 65 20 73 74 61 6e 64 61 72 64 20 66 6f 72 6d 20  e standard form 
a580: 6f 66 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  of "X <op> <expr
a590: 3e 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  >"..**.** If the
a5a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f   expression is o
a5b0: 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f  f the form "X <o
a5c0: 70 3e 20 59 22 20 77 68 65 72 65 20 62 6f 74 68  p> Y" where both
a5d0: 20 58 20 61 6e 64 20 59 20 61 72 65 0a 2a 2a 20   X and Y are.** 
a5e0: 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 74 68  columns, then th
a5f0: 65 20 6f 72 69 67 69 6e 61 6c 20 65 78 70 72 65  e original expre
a600: 73 73 69 6f 6e 20 69 73 20 75 6e 63 68 61 6e 67  ssion is unchang
a610: 65 64 20 61 6e 64 20 61 20 6e 65 77 20 76 69 72  ed and a new vir
a620: 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 6f 66 20  tual.** term of 
a630: 74 68 65 20 66 6f 72 6d 20 22 59 20 3c 6f 70 3e  the form "Y <op>
a640: 20 58 22 20 69 73 20 61 64 64 65 64 20 74 6f 20   X" is added to 
a650: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
a660: 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64   and.** analyzed
a670: 20 73 65 70 61 72 61 74 65 6c 79 2e 20 20 54 68   separately.  Th
a680: 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d 20  e original term 
a690: 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20 54  is marked with T
a6a0: 45 52 4d 5f 43 4f 50 49 45 44 0a 2a 2a 20 61 6e  ERM_COPIED.** an
a6b0: 64 20 74 68 65 20 6e 65 77 20 74 65 72 6d 20 69  d the new term i
a6c0: 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20 54 45  s marked with TE
a6d0: 52 4d 5f 44 59 4e 41 4d 49 43 20 28 62 65 63 61  RM_DYNAMIC (beca
a6e0: 75 73 65 20 69 74 27 73 20 70 45 78 70 72 0a 2a  use it's pExpr.*
a6f0: 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72  * needs to be fr
a700: 65 65 64 20 77 69 74 68 20 74 68 65 20 57 68 65  eed with the Whe
a710: 72 65 43 6c 61 75 73 65 29 20 61 6e 64 20 54 45  reClause) and TE
a720: 52 4d 5f 56 49 52 54 55 41 4c 20 28 62 65 63 61  RM_VIRTUAL (beca
a730: 75 73 65 20 69 74 0a 2a 2a 20 69 73 20 61 20 63  use it.** is a c
a740: 6f 6d 6d 75 74 65 64 20 63 6f 70 79 20 6f 66 20  ommuted copy of 
a750: 61 20 70 72 69 6f 72 20 74 65 72 6d 2e 29 20 20  a prior term.)  
a760: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72  The original ter
a770: 6d 20 68 61 73 20 6e 43 68 69 6c 64 3d 31 0a 2a  m has nChild=1.*
a780: 2a 20 61 6e 64 20 74 68 65 20 63 6f 70 79 20 68  * and the copy h
a790: 61 73 20 69 64 78 50 61 72 65 6e 74 20 73 65 74  as idxParent set
a7a0: 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
a7b0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65   the original te
a7c0: 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  rm..*/.static vo
a7d0: 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 0a  id exprAnalyze(.
a7e0: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c    SrcList *pSrc,
a7f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74              /* t
a800: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
a810: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
a820: 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a  *pWC,         /*
a830: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
a840: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 54 65  e */.  int idxTe
a850: 72 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rm              
a860: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
a870: 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c   term to be anal
a880: 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57 68 65  yzed */.){.  Whe
a890: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d  reInfo *pWInfo =
a8a0: 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 20 2f 2a   pWC->pWInfo; /*
a8b0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72   WHERE clause pr
a8c0: 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74 65 78 74  ocessing context
a8d0: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
a8e0: 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  *pTerm;         
a8f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65         /* The te
a900: 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65  rm to be analyze
a910: 64 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b  d */.  WhereMask
a920: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20  Set *pMaskSet;  
a930: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6f          /* Set o
a940: 66 20 74 61 62 6c 65 20 69 6e 64 65 78 20 6d 61  f table index ma
a950: 73 6b 73 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  sks */.  Expr *p
a960: 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20  Expr;           
a970: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
a980: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62   expression to b
a990: 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20  e analyzed */.  
a9a0: 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 4c 65  Bitmask prereqLe
a9b0: 66 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ft;             
a9c0: 20 2f 2a 20 50 72 65 72 65 71 75 65 73 69 74 65   /* Prerequesite
a9d0: 73 20 6f 66 20 74 68 65 20 70 45 78 70 72 2d 3e  s of the pExpr->
a9e0: 70 4c 65 66 74 20 2a 2f 0a 20 20 42 69 74 6d 61  pLeft */.  Bitma
a9f0: 73 6b 20 70 72 65 72 65 71 41 6c 6c 3b 20 20 20  sk prereqAll;   
aa00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
aa10: 72 65 72 65 71 75 65 73 69 74 65 73 20 6f 66 20  rerequesites of 
aa20: 70 45 78 70 72 20 2a 2f 0a 20 20 42 69 74 6d 61  pExpr */.  Bitma
aa30: 73 6b 20 65 78 74 72 61 52 69 67 68 74 20 3d 20  sk extraRight = 
aa40: 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  0;          /* E
aa50: 78 74 72 61 20 64 65 70 65 6e 64 65 6e 63 69 65  xtra dependencie
aa60: 73 20 6f 6e 20 4c 45 46 54 20 4a 4f 49 4e 20 2a  s on LEFT JOIN *
aa70: 2f 0a 20 20 45 78 70 72 20 2a 70 53 74 72 31 20  /.  Expr *pStr1 
aa80: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
aa90: 20 20 20 20 20 2f 2a 20 52 48 53 20 6f 66 20 4c       /* RHS of L
aaa0: 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f  IKE/GLOB operato
aab0: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d  r */.  int isCom
aac0: 70 6c 65 74 65 20 3d 20 30 3b 20 20 20 20 20 20  plete = 0;      
aad0: 20 20 20 20 20 20 20 20 2f 2a 20 52 48 53 20 6f          /* RHS o
aae0: 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 65 6e 64 73  f LIKE/GLOB ends
aaf0: 20 77 69 74 68 20 77 69 6c 64 63 61 72 64 20 2a   with wildcard *
ab00: 2f 0a 20 20 69 6e 74 20 6e 6f 43 61 73 65 20 3d  /.  int noCase =
ab10: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
ab20: 20 20 20 20 20 2f 2a 20 75 70 70 65 72 63 61 73       /* uppercas
ab30: 65 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  e equivalent to 
ab40: 6c 6f 77 65 72 63 61 73 65 20 2a 2f 0a 20 20 69  lowercase */.  i
ab50: 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
ab60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab70: 2f 2a 20 54 6f 70 2d 6c 65 76 65 6c 20 6f 70 65  /* Top-level ope
ab80: 72 61 74 6f 72 2e 20 20 70 45 78 70 72 2d 3e 6f  rator.  pExpr->o
ab90: 70 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  p */.  Parse *pP
aba0: 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  arse = pWInfo->p
abb0: 50 61 72 73 65 3b 20 20 2f 2a 20 50 61 72 73 69  Parse;  /* Parsi
abc0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
abd0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
abe0: 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20  arse->db;       
abf0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
ac00: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66  nection */..  if
ac10: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
ac20: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
ac30: 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20  ;.  }.  pTerm = 
ac40: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
ac50: 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 26  ;.  pMaskSet = &
ac60: 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
ac70: 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 54 65 72  ;.  pExpr = pTer
ac80: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 61 73 73 65  m->pExpr;.  asse
ac90: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
aca0: 4b 5f 41 53 20 26 26 20 70 45 78 70 72 2d 3e 6f  K_AS && pExpr->o
acb0: 70 21 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b  p!=TK_COLLATE );
acc0: 0a 20 20 70 72 65 72 65 71 4c 65 66 74 20 3d 20  .  prereqLeft = 
acd0: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
ace0: 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e  MaskSet, pExpr->
acf0: 70 4c 65 66 74 29 3b 0a 20 20 6f 70 20 3d 20 70  pLeft);.  op = p
ad00: 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20  Expr->op;.  if( 
ad10: 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20  op==TK_IN ){.   
ad20: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
ad30: 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20  pRight==0 );.   
ad40: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
ad50: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
ad60: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
ad70: 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71     pTerm->prereq
ad80: 52 69 67 68 74 20 3d 20 65 78 70 72 53 65 6c 65  Right = exprSele
ad90: 63 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  ctTableUsage(pMa
ada0: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e  skSet, pExpr->x.
adb0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65  pSelect);.    }e
adc0: 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 65 72 6d  lse{.      pTerm
add0: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20  ->prereqRight = 
ade0: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
adf0: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78  ge(pMaskSet, pEx
ae00: 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20  pr->x.pList);.  
ae10: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
ae20: 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b  op==TK_ISNULL ){
ae30: 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72  .    pTerm->prer
ae40: 65 71 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 7d  eqRight = 0;.  }
ae50: 65 6c 73 65 7b 0a 20 20 20 20 70 54 65 72 6d 2d  else{.    pTerm-
ae60: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 65  >prereqRight = e
ae70: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
ae80: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70  askSet, pExpr->p
ae90: 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70 72  Right);.  }.  pr
aea0: 65 72 65 71 41 6c 6c 20 3d 20 65 78 70 72 54 61  ereqAll = exprTa
aeb0: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
aec0: 74 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28  t, pExpr);.  if(
aed0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
aee0: 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
aef0: 6f 69 6e 29 20 29 7b 0a 20 20 20 20 42 69 74 6d  oin) ){.    Bitm
af00: 61 73 6b 20 78 20 3d 20 67 65 74 4d 61 73 6b 28  ask x = getMask(
af10: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d  pMaskSet, pExpr-
af20: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
af30: 29 3b 0a 20 20 20 20 70 72 65 72 65 71 41 6c 6c  );.    prereqAll
af40: 20 7c 3d 20 78 3b 0a 20 20 20 20 65 78 74 72 61   |= x;.    extra
af50: 52 69 67 68 74 20 3d 20 78 2d 31 3b 20 20 2f 2a  Right = x-1;  /*
af60: 20 4f 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73   ON clause terms
af70: 20 6d 61 79 20 6e 6f 74 20 62 65 20 75 73 65 64   may not be used
af80: 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 0a 20   with an index. 
af90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
afa0: 20 20 20 20 20 20 2a 2a 20 6f 6e 20 6c 65 66 74        ** on left
afb0: 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54   table of a LEFT
afc0: 20 4a 4f 49 4e 2e 20 20 54 69 63 6b 65 74 20 23   JOIN.  Ticket #
afd0: 33 30 31 35 20 2a 2f 0a 20 20 7d 0a 20 20 70 54  3015 */.  }.  pT
afe0: 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d  erm->prereqAll =
aff0: 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 70 54   prereqAll;.  pT
b000: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  erm->leftCursor 
b010: 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 69  = -1;.  pTerm->i
b020: 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 70  Parent = -1;.  p
b030: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
b040: 3d 20 30 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 77  = 0;.  if( allow
b050: 65 64 4f 70 28 6f 70 29 20 29 7b 0a 20 20 20 20  edOp(op) ){.    
b060: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 73 71  Expr *pLeft = sq
b070: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
b080: 6c 61 74 65 28 70 45 78 70 72 2d 3e 70 4c 65 66  late(pExpr->pLef
b090: 74 29 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52  t);.    Expr *pR
b0a0: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78  ight = sqlite3Ex
b0b0: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45  prSkipCollate(pE
b0c0: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
b0d0: 20 20 75 31 36 20 6f 70 4d 61 73 6b 20 3d 20 28    u16 opMask = (
b0e0: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
b0f0: 68 74 20 26 20 70 72 65 72 65 71 4c 65 66 74 29  ht & prereqLeft)
b100: 3d 3d 30 20 3f 20 57 4f 5f 41 4c 4c 20 3a 20 57  ==0 ? WO_ALL : W
b110: 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20 69 66 28  O_EQUIV;.    if(
b120: 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43   pLeft->op==TK_C
b130: 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 70  OLUMN ){.      p
b140: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
b150: 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65   = pLeft->iTable
b160: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 75  ;.      pTerm->u
b170: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c  .leftColumn = pL
b180: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  eft->iColumn;.  
b190: 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72      pTerm->eOper
b1a0: 61 74 6f 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d  ator = operatorM
b1b0: 61 73 6b 28 6f 70 29 20 26 20 6f 70 4d 61 73 6b  ask(op) & opMask
b1c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
b1d0: 70 52 69 67 68 74 20 26 26 20 70 52 69 67 68 74  pRight && pRight
b1e0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
b1f0: 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ){.      WhereTe
b200: 72 6d 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20  rm *pNew;.      
b210: 45 78 70 72 20 2a 70 44 75 70 3b 0a 20 20 20 20  Expr *pDup;.    
b220: 20 20 75 31 36 20 65 45 78 74 72 61 4f 70 20 3d    u16 eExtraOp =
b230: 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 78   0;        /* Ex
b240: 74 72 61 20 62 69 74 73 20 66 6f 72 20 70 4e 65  tra bits for pNe
b250: 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20 2a 2f 0a  w->eOperator */.
b260: 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
b270: 3e 6c 65 66 74 43 75 72 73 6f 72 3e 3d 30 20 29  >leftCursor>=0 )
b280: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 64  {.        int id
b290: 78 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70 44  xNew;.        pD
b2a0: 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  up = sqlite3Expr
b2b0: 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30  Dup(db, pExpr, 0
b2c0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64  );.        if( d
b2d0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
b2e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
b2f0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
b300: 62 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20  b, pDup);.      
b310: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
b320: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 64      }.        id
b330: 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
b340: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 44  seInsert(pWC, pD
b350: 75 70 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  up, TERM_VIRTUAL
b360: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
b370: 20 20 20 20 20 20 20 20 69 66 28 20 69 64 78 4e          if( idxN
b380: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ew==0 ) return;.
b390: 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 26          pNew = &
b3a0: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a  pWC->a[idxNew];.
b3b0: 20 20 20 20 20 20 20 20 6d 61 72 6b 54 65 72 6d          markTerm
b3c0: 41 73 43 68 69 6c 64 28 70 57 43 2c 20 69 64 78  AsChild(pWC, idx
b3d0: 4e 65 77 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20  New, idxTerm);. 
b3e0: 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26         pTerm = &
b3f0: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
b400: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  .        pTerm->
b410: 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
b420: 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20 20 20  COPIED;.        
b430: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
b440: 4b 5f 45 51 0a 20 20 20 20 20 20 20 20 20 26 26  K_EQ.         &&
b450: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
b460: 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  y(pExpr, EP_From
b470: 4a 6f 69 6e 29 0a 20 20 20 20 20 20 20 20 20 26  Join).         &
b480: 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  & OptimizationEn
b490: 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
b4a0: 5f 54 72 61 6e 73 69 74 69 76 65 29 0a 20 20 20  _Transitive).   
b4b0: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
b4c0: 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74    pTerm->eOperat
b4d0: 6f 72 20 7c 3d 20 57 4f 5f 45 51 55 49 56 3b 0a  or |= WO_EQUIV;.
b4e0: 20 20 20 20 20 20 20 20 20 20 65 45 78 74 72 61            eExtra
b4f0: 4f 70 20 3d 20 57 4f 5f 45 51 55 49 56 3b 0a 20  Op = WO_EQUIV;. 
b500: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
b510: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44  else{.        pD
b520: 75 70 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  up = pExpr;.    
b530: 20 20 20 20 70 4e 65 77 20 3d 20 70 54 65 72 6d      pNew = pTerm
b540: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b550: 65 78 70 72 43 6f 6d 6d 75 74 65 28 70 50 61 72  exprCommute(pPar
b560: 73 65 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20  se, pDup);.     
b570: 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33   pLeft = sqlite3
b580: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
b590: 70 44 75 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  pDup->pLeft);.  
b5a0: 20 20 20 20 70 4e 65 77 2d 3e 6c 65 66 74 43 75      pNew->leftCu
b5b0: 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54  rsor = pLeft->iT
b5c0: 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77  able;.      pNew
b5d0: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d  ->u.leftColumn =
b5e0: 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b   pLeft->iColumn;
b5f0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
b600: 20 28 70 72 65 72 65 71 4c 65 66 74 20 7c 20 65   (prereqLeft | e
b610: 78 74 72 61 52 69 67 68 74 29 20 21 3d 20 70 72  xtraRight) != pr
b620: 65 72 65 71 4c 65 66 74 20 29 3b 0a 20 20 20 20  ereqLeft );.    
b630: 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 52 69    pNew->prereqRi
b640: 67 68 74 20 3d 20 70 72 65 72 65 71 4c 65 66 74  ght = prereqLeft
b650: 20 7c 20 65 78 74 72 61 52 69 67 68 74 3b 0a 20   | extraRight;. 
b660: 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65       pNew->prere
b670: 71 41 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c  qAll = prereqAll
b680: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 65 4f  ;.      pNew->eO
b690: 70 65 72 61 74 6f 72 20 3d 20 28 6f 70 65 72 61  perator = (opera
b6a0: 74 6f 72 4d 61 73 6b 28 70 44 75 70 2d 3e 6f 70  torMask(pDup->op
b6b0: 29 20 2b 20 65 45 78 74 72 61 4f 70 29 20 26 20  ) + eExtraOp) & 
b6c0: 6f 70 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20  opMask;.    }.  
b6d0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
b6e0: 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f  E_OMIT_BETWEEN_O
b6f0: 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a  PTIMIZATION.  /*
b700: 20 49 66 20 61 20 74 65 72 6d 20 69 73 20 74 68   If a term is th
b710: 65 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74  e BETWEEN operat
b720: 6f 72 2c 20 63 72 65 61 74 65 20 74 77 6f 20 6e  or, create two n
b730: 65 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73  ew virtual terms
b740: 0a 20 20 2a 2a 20 74 68 61 74 20 64 65 66 69 6e  .  ** that defin
b750: 65 20 74 68 65 20 72 61 6e 67 65 20 74 68 61 74  e the range that
b760: 20 74 68 65 20 42 45 54 57 45 45 4e 20 69 6d 70   the BETWEEN imp
b770: 6c 65 6d 65 6e 74 73 2e 20 20 46 6f 72 20 65 78  lements.  For ex
b780: 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ample:.  **.  **
b790: 20 20 20 20 20 20 61 20 42 45 54 57 45 45 4e 20        a BETWEEN 
b7a0: 62 20 41 4e 44 20 63 0a 20 20 2a 2a 0a 20 20 2a  b AND c.  **.  *
b7b0: 2a 20 69 73 20 63 6f 6e 76 65 72 74 65 64 20 69  * is converted i
b7c0: 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  nto:.  **.  **  
b7d0: 20 20 20 20 28 61 20 42 45 54 57 45 45 4e 20 62      (a BETWEEN b
b7e0: 20 41 4e 44 20 63 29 20 41 4e 44 20 28 61 3e 3d   AND c) AND (a>=
b7f0: 62 29 20 41 4e 44 20 28 61 3c 3d 63 29 0a 20 20  b) AND (a<=c).  
b800: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 74 77 6f 20  **.  ** The two 
b810: 6e 65 77 20 74 65 72 6d 73 20 61 72 65 20 61 64  new terms are ad
b820: 64 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  ded onto the end
b830: 20 6f 66 20 74 68 65 20 57 68 65 72 65 43 6c 61   of the WhereCla
b840: 75 73 65 20 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a  use object..  **
b850: 20 54 68 65 20 6e 65 77 20 74 65 72 6d 73 20 61   The new terms a
b860: 72 65 20 22 64 79 6e 61 6d 69 63 22 20 61 6e 64  re "dynamic" and
b870: 20 61 72 65 20 63 68 69 6c 64 72 65 6e 20 6f 66   are children of
b880: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 42 45   the original BE
b890: 54 57 45 45 4e 0a 20 20 2a 2a 20 74 65 72 6d 2e  TWEEN.  ** term.
b8a0: 20 20 54 68 61 74 20 6d 65 61 6e 73 20 74 68 61    That means tha
b8b0: 74 20 69 66 20 74 68 65 20 42 45 54 57 45 45 4e  t if the BETWEEN
b8c0: 20 74 65 72 6d 20 69 73 20 63 6f 64 65 64 2c 20   term is coded, 
b8d0: 74 68 65 20 63 68 69 6c 64 72 65 6e 20 61 72 65  the children are
b8e0: 0a 20 20 2a 2a 20 73 6b 69 70 70 65 64 2e 20 20  .  ** skipped.  
b8f0: 4f 72 2c 20 69 66 20 74 68 65 20 63 68 69 6c 64  Or, if the child
b900: 72 65 6e 20 61 72 65 20 73 61 74 69 73 66 69 65  ren are satisfie
b910: 64 20 62 79 20 61 6e 20 69 6e 64 65 78 2c 20 74  d by an index, t
b920: 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a  he original.  **
b930: 20 42 45 54 57 45 45 4e 20 74 65 72 6d 20 69 73   BETWEEN term is
b940: 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20   skipped..  */. 
b950: 20 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d   else if( pExpr-
b960: 3e 6f 70 3d 3d 54 4b 5f 42 45 54 57 45 45 4e 20  >op==TK_BETWEEN 
b970: 26 26 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41  && pWC->op==TK_A
b980: 4e 44 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69  ND ){.    ExprLi
b990: 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70  st *pList = pExp
b9a0: 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
b9b0: 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 61 74 69  int i;.    stati
b9c0: 63 20 63 6f 6e 73 74 20 75 38 20 6f 70 73 5b 5d  c const u8 ops[]
b9d0: 20 3d 20 7b 54 4b 5f 47 45 2c 20 54 4b 5f 4c 45   = {TK_GE, TK_LE
b9e0: 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  };.    assert( p
b9f0: 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 61  List!=0 );.    a
ba00: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
ba10: 78 70 72 3d 3d 32 20 29 3b 0a 20 20 20 20 66 6f  xpr==2 );.    fo
ba20: 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29  r(i=0; i<2; i++)
ba30: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e  {.      Expr *pN
ba40: 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e  ewExpr;.      in
ba50: 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20  t idxNew;.      
ba60: 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74  pNewExpr = sqlit
ba70: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
ba80: 6f 70 73 5b 69 5d 2c 20 0a 20 20 20 20 20 20 20  ops[i], .       
ba90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
baa0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
bab0: 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 2d 3e  rDup(db, pExpr->
bac0: 70 4c 65 66 74 2c 20 30 29 2c 0a 20 20 20 20 20  pLeft, 0),.     
bad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bae0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
baf0: 78 70 72 44 75 70 28 64 62 2c 20 70 4c 69 73 74  xprDup(db, pList
bb00: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 30 29  ->a[i].pExpr, 0)
bb10: 2c 20 30 29 3b 0a 20 20 20 20 20 20 74 72 61 6e  , 0);.      tran
bb20: 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73  sferJoinMarkings
bb30: 28 70 4e 65 77 45 78 70 72 2c 20 70 45 78 70 72  (pNewExpr, pExpr
bb40: 29 3b 0a 20 20 20 20 20 20 69 64 78 4e 65 77 20  );.      idxNew 
bb50: 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73  = whereClauseIns
bb60: 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70  ert(pWC, pNewExp
bb70: 72 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  r, TERM_VIRTUAL|
bb80: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  TERM_DYNAMIC);. 
bb90: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
bba0: 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20  dxNew==0 );.    
bbb0: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53    exprAnalyze(pS
bbc0: 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29  rc, pWC, idxNew)
bbd0: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
bbe0: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
bbf0: 3b 0a 20 20 20 20 20 20 6d 61 72 6b 54 65 72 6d  ;.      markTerm
bc00: 41 73 43 68 69 6c 64 28 70 57 43 2c 20 69 64 78  AsChild(pWC, idx
bc10: 4e 65 77 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20  New, idxTerm);. 
bc20: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20     }.  }.#endif 
bc30: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  /* SQLITE_OMIT_B
bc40: 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41 54  ETWEEN_OPTIMIZAT
bc50: 49 4f 4e 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66  ION */..#if !def
bc60: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
bc70: 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  _OR_OPTIMIZATION
bc80: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
bc90: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
bca0: 52 59 29 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65  RY).  /* Analyze
bcb0: 20 61 20 74 65 72 6d 20 74 68 61 74 20 69 73 20   a term that is 
bcc0: 63 6f 6d 70 6f 73 65 64 20 6f 66 20 74 77 6f 20  composed of two 
bcd0: 6f 72 20 6d 6f 72 65 20 73 75 62 74 65 72 6d 73  or more subterms
bce0: 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20 20   connected by.  
bcf0: 2a 2a 20 61 6e 20 4f 52 20 6f 70 65 72 61 74 6f  ** an OR operato
bd00: 72 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69  r..  */.  else i
bd10: 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
bd20: 5f 4f 52 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OR ){.    asser
bd30: 74 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41  t( pWC->op==TK_A
bd40: 4e 44 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e  ND );.    exprAn
bd50: 61 6c 79 7a 65 4f 72 54 65 72 6d 28 70 53 72 63  alyzeOrTerm(pSrc
bd60: 2c 20 70 57 43 2c 20 69 64 78 54 65 72 6d 29 3b  , pWC, idxTerm);
bd70: 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57  .    pTerm = &pW
bd80: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
bd90: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
bda0: 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49  ITE_OMIT_OR_OPTI
bdb0: 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66  MIZATION */..#if
bdc0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
bdd0: 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49  _LIKE_OPTIMIZATI
bde0: 4f 4e 0a 20 20 2f 2a 20 41 64 64 20 63 6f 6e 73  ON.  /* Add cons
bdf0: 74 72 61 69 6e 74 73 20 74 6f 20 72 65 64 75 63  traints to reduc
be00: 65 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61  e the search spa
be10: 63 65 20 6f 6e 20 61 20 4c 49 4b 45 20 6f 72 20  ce on a LIKE or 
be20: 47 4c 4f 42 0a 20 20 2a 2a 20 6f 70 65 72 61 74  GLOB.  ** operat
be30: 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20  or..  **.  ** A 
be40: 6c 69 6b 65 20 70 61 74 74 65 72 6e 20 6f 66 20  like pattern of 
be50: 74 68 65 20 66 6f 72 6d 20 22 78 20 4c 49 4b 45  the form "x LIKE
be60: 20 27 61 42 63 25 27 22 20 69 73 20 63 68 61 6e   'aBc%'" is chan
be70: 67 65 64 20 69 6e 74 6f 20 63 6f 6e 73 74 72 61  ged into constra
be80: 69 6e 74 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ints.  **.  **  
be90: 20 20 20 20 20 20 20 20 78 3e 3d 27 41 42 43 27          x>='ABC'
bea0: 20 41 4e 44 20 78 3c 27 61 62 64 27 20 41 4e 44   AND x<'abd' AND
beb0: 20 78 20 4c 49 4b 45 20 27 61 42 63 25 27 0a 20   x LIKE 'aBc%'. 
bec0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 61 73   **.  ** The las
bed0: 74 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 74  t character of t
bee0: 68 65 20 70 72 65 66 69 78 20 22 61 62 63 22 20  he prefix "abc" 
bef0: 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 74  is incremented t
bf00: 6f 20 66 6f 72 6d 20 74 68 65 0a 20 20 2a 2a 20  o form the.  ** 
bf10: 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 6e 64  termination cond
bf20: 69 74 69 6f 6e 20 22 61 62 64 22 2e 20 20 49 66  ition "abd".  If
bf30: 20 63 61 73 65 20 69 73 20 6e 6f 74 20 73 69 67   case is not sig
bf40: 6e 69 66 69 63 61 6e 74 20 28 74 68 65 20 64 65  nificant (the de
bf50: 66 61 75 6c 74 0a 20 20 2a 2a 20 66 6f 72 20 4c  fault.  ** for L
bf60: 49 4b 45 29 20 74 68 65 6e 20 74 68 65 20 6c 6f  IKE) then the lo
bf70: 77 65 72 2d 62 6f 75 6e 64 20 69 73 20 6d 61 64  wer-bound is mad
bf80: 65 20 61 6c 6c 20 75 70 70 65 72 63 61 73 65 20  e all uppercase 
bf90: 61 6e 64 20 74 68 65 20 75 70 70 65 72 2d 0a 20  and the upper-. 
bfa0: 20 2a 2a 20 62 6f 75 6e 64 20 69 73 20 6d 61 64   ** bound is mad
bfb0: 65 20 61 6c 6c 20 6c 6f 77 65 72 63 61 73 65 20  e all lowercase 
bfc0: 73 6f 20 74 68 61 74 20 74 68 65 20 62 6f 75 6e  so that the boun
bfd0: 64 73 20 61 6c 73 6f 20 77 6f 72 6b 20 77 68 65  ds also work whe
bfe0: 6e 20 63 6f 6d 70 61 72 69 6e 67 0a 20 20 2a 2a  n comparing.  **
bff0: 20 42 4c 4f 42 73 2e 0a 20 20 2a 2f 0a 20 20 69   BLOBs..  */.  i
c000: 66 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41  f( pWC->op==TK_A
c010: 4e 44 20 0a 20 20 20 26 26 20 69 73 4c 69 6b 65  ND .   && isLike
c020: 4f 72 47 6c 6f 62 28 70 50 61 72 73 65 2c 20 70  OrGlob(pParse, p
c030: 45 78 70 72 2c 20 26 70 53 74 72 31 2c 20 26 69  Expr, &pStr1, &i
c040: 73 43 6f 6d 70 6c 65 74 65 2c 20 26 6e 6f 43 61  sComplete, &noCa
c050: 73 65 29 0a 20 20 29 7b 0a 20 20 20 20 45 78 70  se).  ){.    Exp
c060: 72 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20  r *pLeft;       
c070: 2f 2a 20 4c 48 53 20 6f 66 20 4c 49 4b 45 2f 47  /* LHS of LIKE/G
c080: 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  LOB operator */.
c090: 20 20 20 20 45 78 70 72 20 2a 70 53 74 72 32 3b      Expr *pStr2;
c0a0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f         /* Copy o
c0b0: 66 20 70 53 74 72 31 20 2d 20 52 48 53 20 6f 66  f pStr1 - RHS of
c0c0: 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61   LIKE/GLOB opera
c0d0: 74 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 20  tor */.    Expr 
c0e0: 2a 70 4e 65 77 45 78 70 72 31 3b 0a 20 20 20 20  *pNewExpr1;.    
c0f0: 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 32 3b  Expr *pNewExpr2;
c100: 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 31  .    int idxNew1
c110: 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77  ;.    int idxNew
c120: 32 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  2;.    const cha
c130: 72 20 2a 7a 43 6f 6c 6c 53 65 71 4e 61 6d 65 3b  r *zCollSeqName;
c140: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
c150: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
c160: 63 65 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  ce */.    const 
c170: 75 31 36 20 77 74 46 6c 61 67 73 20 3d 20 54 45  u16 wtFlags = TE
c180: 52 4d 5f 4c 49 4b 45 4f 50 54 20 7c 20 54 45 52  RM_LIKEOPT | TER
c190: 4d 5f 56 49 52 54 55 41 4c 20 7c 20 54 45 52 4d  M_VIRTUAL | TERM
c1a0: 5f 44 59 4e 41 4d 49 43 3b 0a 0a 20 20 20 20 70  _DYNAMIC;..    p
c1b0: 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  Left = pExpr->x.
c1c0: 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
c1d0: 72 3b 0a 20 20 20 20 70 53 74 72 32 20 3d 20 73  r;.    pStr2 = s
c1e0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
c1f0: 2c 20 70 53 74 72 31 2c 20 30 29 3b 0a 0a 20 20  , pStr1, 0);..  
c200: 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65    /* Convert the
c210: 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 74 6f 20   lower bound to 
c220: 75 70 70 65 72 2d 63 61 73 65 20 61 6e 64 20 74  upper-case and t
c230: 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64 20 74  he upper bound t
c240: 6f 0a 20 20 20 20 2a 2a 20 6c 6f 77 65 72 2d 63  o.    ** lower-c
c250: 61 73 65 20 28 75 70 70 65 72 2d 63 61 73 65 20  ase (upper-case 
c260: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6c 6f 77  is less than low
c270: 65 72 2d 63 61 73 65 20 69 6e 20 41 53 43 49 49  er-case in ASCII
c280: 29 20 73 6f 20 74 68 61 74 0a 20 20 20 20 2a 2a  ) so that.    **
c290: 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 73 74   the range const
c2a0: 72 61 69 6e 74 73 20 61 6c 73 6f 20 77 6f 72 6b  raints also work
c2b0: 20 66 6f 72 20 42 4c 4f 42 73 0a 20 20 20 20 2a   for BLOBs.    *
c2c0: 2f 0a 20 20 20 20 69 66 28 20 6e 6f 43 61 73 65  /.    if( noCase
c2d0: 20 26 26 20 21 70 50 61 72 73 65 2d 3e 64 62 2d   && !pParse->db-
c2e0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
c2f0: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
c300: 20 20 20 20 63 68 61 72 20 63 3b 0a 20 20 20 20      char c;.    
c310: 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73    pTerm->wtFlags
c320: 20 7c 3d 20 54 45 52 4d 5f 4c 49 4b 45 3b 0a 20   |= TERM_LIKE;. 
c330: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 28 63       for(i=0; (c
c340: 20 3d 20 70 53 74 72 31 2d 3e 75 2e 7a 54 6f 6b   = pStr1->u.zTok
c350: 65 6e 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b  en[i])!=0; i++){
c360: 0a 20 20 20 20 20 20 20 20 70 53 74 72 31 2d 3e  .        pStr1->
c370: 75 2e 7a 54 6f 6b 65 6e 5b 69 5d 20 3d 20 73 71  u.zToken[i] = sq
c380: 6c 69 74 65 33 54 6f 75 70 70 65 72 28 63 29 3b  lite3Toupper(c);
c390: 0a 20 20 20 20 20 20 20 20 70 53 74 72 32 2d 3e  .        pStr2->
c3a0: 75 2e 7a 54 6f 6b 65 6e 5b 69 5d 20 3d 20 73 71  u.zToken[i] = sq
c3b0: 6c 69 74 65 33 54 6f 6c 6f 77 65 72 28 63 29 3b  lite3Tolower(c);
c3c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
c3d0: 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c      if( !db->mal
c3e0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
c3f0: 20 20 20 75 38 20 63 2c 20 2a 70 43 3b 20 20 20     u8 c, *pC;   
c400: 20 20 20 20 2f 2a 20 4c 61 73 74 20 63 68 61 72      /* Last char
c410: 61 63 74 65 72 20 62 65 66 6f 72 65 20 74 68 65  acter before the
c420: 20 66 69 72 73 74 20 77 69 6c 64 63 61 72 64 20   first wildcard 
c430: 2a 2f 0a 20 20 20 20 20 20 70 43 20 3d 20 28 75  */.      pC = (u
c440: 38 2a 29 26 70 53 74 72 32 2d 3e 75 2e 7a 54 6f  8*)&pStr2->u.zTo
c450: 6b 65 6e 5b 73 71 6c 69 74 65 33 53 74 72 6c 65  ken[sqlite3Strle
c460: 6e 33 30 28 70 53 74 72 32 2d 3e 75 2e 7a 54 6f  n30(pStr2->u.zTo
c470: 6b 65 6e 29 2d 31 5d 3b 0a 20 20 20 20 20 20 63  ken)-1];.      c
c480: 20 3d 20 2a 70 43 3b 0a 20 20 20 20 20 20 69 66   = *pC;.      if
c490: 28 20 6e 6f 43 61 73 65 20 29 7b 0a 20 20 20 20  ( noCase ){.    
c4a0: 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
c4b0: 20 69 73 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74   is to increment
c4c0: 20 74 68 65 20 6c 61 73 74 20 63 68 61 72 61 63   the last charac
c4d0: 74 65 72 20 62 65 66 6f 72 65 20 74 68 65 20 66  ter before the f
c4e0: 69 72 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  irst.        ** 
c4f0: 77 69 6c 64 63 61 72 64 2e 20 20 42 75 74 20 69  wildcard.  But i
c500: 66 20 77 65 20 69 6e 63 72 65 6d 65 6e 74 20 27  f we increment '
c510: 40 27 2c 20 74 68 61 74 20 77 69 6c 6c 20 70 75  @', that will pu
c520: 73 68 20 69 74 20 69 6e 74 6f 20 74 68 65 0a 20  sh it into the. 
c530: 20 20 20 20 20 20 20 2a 2a 20 61 6c 70 68 61 62         ** alphab
c540: 65 74 69 63 20 72 61 6e 67 65 20 77 68 65 72 65  etic range where
c550: 20 63 61 73 65 20 63 6f 6e 76 65 72 73 69 6f 6e   case conversion
c560: 73 20 77 69 6c 6c 20 6d 65 73 73 20 75 70 20 74  s will mess up t
c570: 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  he .        ** i
c580: 6e 65 71 75 61 6c 69 74 79 2e 20 20 54 6f 20 61  nequality.  To a
c590: 76 6f 69 64 20 74 68 69 73 2c 20 6d 61 6b 65 20  void this, make 
c5a0: 73 75 72 65 20 74 6f 20 61 6c 73 6f 20 72 75 6e  sure to also run
c5b0: 20 74 68 65 20 66 75 6c 6c 0a 20 20 20 20 20 20   the full.      
c5c0: 20 20 2a 2a 20 4c 49 4b 45 20 6f 6e 20 61 6c 6c    ** LIKE on all
c5d0: 20 63 61 6e 64 69 64 61 74 65 20 65 78 70 72 65   candidate expre
c5e0: 73 73 69 6f 6e 73 20 62 79 20 63 6c 65 61 72 69  ssions by cleari
c5f0: 6e 67 20 74 68 65 20 69 73 43 6f 6d 70 6c 65 74  ng the isComplet
c600: 65 20 66 6c 61 67 0a 20 20 20 20 20 20 20 20 2a  e flag.        *
c610: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d  /.        if( c=
c620: 3d 27 41 27 2d 31 20 29 20 69 73 43 6f 6d 70 6c  ='A'-1 ) isCompl
c630: 65 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ete = 0;.       
c640: 20 63 20 3d 20 73 71 6c 69 74 65 33 55 70 70 65   c = sqlite3Uppe
c650: 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a 20 20 20  rToLower[c];.   
c660: 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 43 20 3d     }.      *pC =
c670: 20 63 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20   c + 1;.    }.  
c680: 20 20 7a 43 6f 6c 6c 53 65 71 4e 61 6d 65 20 3d    zCollSeqName =
c690: 20 6e 6f 43 61 73 65 20 3f 20 22 4e 4f 43 41 53   noCase ? "NOCAS
c6a0: 45 22 20 3a 20 22 42 49 4e 41 52 59 22 3b 0a 20  E" : "BINARY";. 
c6b0: 20 20 20 70 4e 65 77 45 78 70 72 31 20 3d 20 73     pNewExpr1 = s
c6c0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
c6d0: 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20  , pLeft, 0);.   
c6e0: 20 70 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c   pNewExpr1 = sql
c6f0: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
c700: 2c 20 54 4b 5f 47 45 2c 0a 20 20 20 20 20 20 20  , TK_GE,.       
c710: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
c720: 64 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28  ddCollateString(
c730: 70 50 61 72 73 65 2c 70 4e 65 77 45 78 70 72 31  pParse,pNewExpr1
c740: 2c 7a 43 6f 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a  ,zCollSeqName),.
c750: 20 20 20 20 20 20 20 20 20 20 20 70 53 74 72 31             pStr1
c760: 2c 20 30 29 3b 0a 20 20 20 20 74 72 61 6e 73 66  , 0);.    transf
c770: 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70  erJoinMarkings(p
c780: 4e 65 77 45 78 70 72 31 2c 20 70 45 78 70 72 29  NewExpr1, pExpr)
c790: 3b 0a 20 20 20 20 69 64 78 4e 65 77 31 20 3d 20  ;.    idxNew1 = 
c7a0: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
c7b0: 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 31  t(pWC, pNewExpr1
c7c0: 2c 20 77 74 46 6c 61 67 73 29 3b 0a 20 20 20 20  , wtFlags);.    
c7d0: 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77  testcase( idxNew
c7e0: 31 3d 3d 30 20 29 3b 0a 20 20 20 20 65 78 70 72  1==0 );.    expr
c7f0: 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57  Analyze(pSrc, pW
c800: 43 2c 20 69 64 78 4e 65 77 31 29 3b 0a 20 20 20  C, idxNew1);.   
c810: 20 70 4e 65 77 45 78 70 72 32 20 3d 20 73 71 6c   pNewExpr2 = sql
c820: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
c830: 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 70  pLeft, 0);.    p
c840: 4e 65 77 45 78 70 72 32 20 3d 20 73 71 6c 69 74  NewExpr2 = sqlit
c850: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
c860: 54 4b 5f 4c 54 2c 0a 20 20 20 20 20 20 20 20 20  TK_LT,.         
c870: 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 64 64    sqlite3ExprAdd
c880: 43 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28 70 50  CollateString(pP
c890: 61 72 73 65 2c 70 4e 65 77 45 78 70 72 32 2c 7a  arse,pNewExpr2,z
c8a0: 43 6f 6c 6c 53 65 71 4e 61 6d 65 29 2c 0a 20 20  CollSeqName),.  
c8b0: 20 20 20 20 20 20 20 20 20 70 53 74 72 32 2c 20           pStr2, 
c8c0: 30 29 3b 0a 20 20 20 20 74 72 61 6e 73 66 65 72  0);.    transfer
c8d0: 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65  JoinMarkings(pNe
c8e0: 77 45 78 70 72 32 2c 20 70 45 78 70 72 29 3b 0a  wExpr2, pExpr);.
c8f0: 20 20 20 20 69 64 78 4e 65 77 32 20 3d 20 77 68      idxNew2 = wh
c900: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
c910: 70 57 43 2c 20 70 4e 65 77 45 78 70 72 32 2c 20  pWC, pNewExpr2, 
c920: 77 74 46 6c 61 67 73 29 3b 0a 20 20 20 20 74 65  wtFlags);.    te
c930: 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 32 3d  stcase( idxNew2=
c940: 3d 30 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e  =0 );.    exprAn
c950: 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c  alyze(pSrc, pWC,
c960: 20 69 64 78 4e 65 77 32 29 3b 0a 20 20 20 20 70   idxNew2);.    p
c970: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
c980: 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 69 66 28  dxTerm];.    if(
c990: 20 69 73 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20   isComplete ){. 
c9a0: 20 20 20 20 20 6d 61 72 6b 54 65 72 6d 41 73 43       markTermAsC
c9b0: 68 69 6c 64 28 70 57 43 2c 20 69 64 78 4e 65 77  hild(pWC, idxNew
c9c0: 31 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20 20 20  1, idxTerm);.   
c9d0: 20 20 20 6d 61 72 6b 54 65 72 6d 41 73 43 68 69     markTermAsChi
c9e0: 6c 64 28 70 57 43 2c 20 69 64 78 4e 65 77 32 2c  ld(pWC, idxNew2,
c9f0: 20 69 64 78 54 65 72 6d 29 3b 0a 20 20 20 20 7d   idxTerm);.    }
ca00: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
ca10: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f  QLITE_OMIT_LIKE_
ca20: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a  OPTIMIZATION */.
ca30: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
ca40: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
ca50: 45 0a 20 20 2f 2a 20 41 64 64 20 61 20 57 4f 5f  E.  /* Add a WO_
ca60: 4d 41 54 43 48 20 61 75 78 69 6c 69 61 72 79 20  MATCH auxiliary 
ca70: 74 65 72 6d 20 74 6f 20 74 68 65 20 63 6f 6e 73  term to the cons
ca80: 74 72 61 69 6e 74 20 73 65 74 20 69 66 20 74 68  traint set if th
ca90: 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 65  e.  ** current e
caa0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20  xpression is of 
cab0: 74 68 65 20 66 6f 72 6d 3a 20 20 63 6f 6c 75 6d  the form:  colum
cac0: 6e 20 4d 41 54 43 48 20 65 78 70 72 2e 0a 20 20  n MATCH expr..  
cad0: 2a 2a 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  ** This informat
cae0: 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20 74  ion is used by t
caf0: 68 65 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65  he xBestIndex me
cb00: 74 68 6f 64 73 20 6f 66 0a 20 20 2a 2a 20 76 69  thods of.  ** vi
cb10: 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 20 20 54  rtual tables.  T
cb20: 68 65 20 6e 61 74 69 76 65 20 71 75 65 72 79 20  he native query 
cb30: 6f 70 74 69 6d 69 7a 65 72 20 64 6f 65 73 20 6e  optimizer does n
cb40: 6f 74 20 61 74 74 65 6d 70 74 0a 20 20 2a 2a 20  ot attempt.  ** 
cb50: 74 6f 20 64 6f 20 61 6e 79 74 68 69 6e 67 20 77  to do anything w
cb60: 69 74 68 20 4d 41 54 43 48 20 66 75 6e 63 74 69  ith MATCH functi
cb70: 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
cb80: 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e 28  isMatchOfColumn(
cb90: 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 69 6e  pExpr) ){.    in
cba0: 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 45 78  t idxNew;.    Ex
cbb0: 70 72 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65  pr *pRight, *pLe
cbc0: 66 74 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72  ft;.    WhereTer
cbd0: 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 20 20 20  m *pNewTerm;.   
cbe0: 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 43   Bitmask prereqC
cbf0: 6f 6c 75 6d 6e 2c 20 70 72 65 72 65 71 45 78 70  olumn, prereqExp
cc00: 72 3b 0a 0a 20 20 20 20 70 52 69 67 68 74 20 3d  r;..    pRight =
cc10: 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
cc20: 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[0].pExpr;.   
cc30: 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e   pLeft = pExpr->
cc40: 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  x.pList->a[1].pE
cc50: 78 70 72 3b 0a 20 20 20 20 70 72 65 72 65 71 45  xpr;.    prereqE
cc60: 78 70 72 20 3d 20 65 78 70 72 54 61 62 6c 65 55  xpr = exprTableU
cc70: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
cc80: 52 69 67 68 74 29 3b 0a 20 20 20 20 70 72 65 72  Right);.    prer
cc90: 65 71 43 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 54  eqColumn = exprT
cca0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
ccb0: 65 74 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20  et, pLeft);.    
ccc0: 69 66 28 20 28 70 72 65 72 65 71 45 78 70 72 20  if( (prereqExpr 
ccd0: 26 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 29 3d  & prereqColumn)=
cce0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  =0 ){.      Expr
ccf0: 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20   *pNewExpr;.    
cd00: 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c    pNewExpr = sql
cd10: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
cd20: 2c 20 54 4b 5f 4d 41 54 43 48 2c 20 0a 20 20 20  , TK_MATCH, .   
cd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd40: 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 73 71             0, sq
cd50: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
cd60: 20 70 52 69 67 68 74 2c 20 30 29 2c 20 30 29 3b   pRight, 0), 0);
cd70: 0a 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20  .      idxNew = 
cd80: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
cd90: 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c  t(pWC, pNewExpr,
cda0: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
cdb0: 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
cdc0: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78     testcase( idx
cdd0: 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  New==0 );.      
cde0: 70 4e 65 77 54 65 72 6d 20 3d 20 26 70 57 43 2d  pNewTerm = &pWC-
cdf0: 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20  >a[idxNew];.    
ce00: 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72    pNewTerm->prer
ce10: 65 71 52 69 67 68 74 20 3d 20 70 72 65 72 65 71  eqRight = prereq
ce20: 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77  Expr;.      pNew
ce30: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
ce40: 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65   = pLeft->iTable
ce50: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
ce60: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d  ->u.leftColumn =
ce70: 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b   pLeft->iColumn;
ce80: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
ce90: 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f  >eOperator = WO_
cea0: 4d 41 54 43 48 3b 0a 20 20 20 20 20 20 6d 61 72  MATCH;.      mar
ceb0: 6b 54 65 72 6d 41 73 43 68 69 6c 64 28 70 57 43  kTermAsChild(pWC
cec0: 2c 20 69 64 78 4e 65 77 2c 20 69 64 78 54 65 72  , idxNew, idxTer
ced0: 6d 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20  m);.      pTerm 
cee0: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72  = &pWC->a[idxTer
cef0: 6d 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d  m];.      pTerm-
cf00: 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
cf10: 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20 70  _COPIED;.      p
cf20: 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 41  NewTerm->prereqA
cf30: 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72  ll = pTerm->prer
cf40: 65 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d  eqAll;.    }.  }
cf50: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
cf60: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
cf70: 42 4c 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  BLE */..#ifdef S
cf80: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
cf90: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 2f 2a  T3_OR_STAT4.  /*
cfa0: 20 57 68 65 6e 20 73 71 6c 69 74 65 5f 73 74 61   When sqlite_sta
cfb0: 74 33 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74  t3 histogram dat
cfc0: 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 61  a is available a
cfd0: 6e 20 6f 70 65 72 61 74 6f 72 20 6f 66 20 74 68  n operator of th
cfe0: 65 0a 20 20 2a 2a 20 66 6f 72 6d 20 22 78 20 49  e.  ** form "x I
cff0: 53 20 4e 4f 54 20 4e 55 4c 4c 22 20 63 61 6e 20  S NOT NULL" can 
d000: 73 6f 6d 65 74 69 6d 65 73 20 62 65 20 65 76 61  sometimes be eva
d010: 6c 75 61 74 65 64 20 6d 6f 72 65 20 65 66 66 69  luated more effi
d020: 63 69 65 6e 74 6c 79 0a 20 20 2a 2a 20 61 73 20  ciently.  ** as 
d030: 22 78 3e 4e 55 4c 4c 22 20 69 66 20 78 20 69 73  "x>NULL" if x is
d040: 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20   not an INTEGER 
d050: 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 53 6f  PRIMARY KEY.  So
d060: 20 63 6f 6e 73 74 72 75 63 74 20 61 0a 20 20 2a   construct a.  *
d070: 2a 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6f  * virtual term o
d080: 66 20 74 68 61 74 20 66 6f 72 6d 2e 0a 20 20 2a  f that form..  *
d090: 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74  *.  ** Note that
d0a0: 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 65 72   the virtual ter
d0b0: 6d 20 6d 75 73 74 20 62 65 20 74 61 67 67 65 64  m must be tagged
d0c0: 20 77 69 74 68 20 54 45 52 4d 5f 56 4e 55 4c 4c   with TERM_VNULL
d0d0: 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 54 45 52  .  This.  ** TER
d0e0: 4d 5f 56 4e 55 4c 4c 20 74 61 67 20 77 69 6c 6c  M_VNULL tag will
d0f0: 20 73 75 70 70 72 65 73 73 20 74 68 65 20 6e 6f   suppress the no
d100: 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20 61 74 20  t-null check at 
d110: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20  the beginning.  
d120: 2a 2a 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20  ** of the loop. 
d130: 20 57 69 74 68 6f 75 74 20 74 68 65 20 54 45 52   Without the TER
d140: 4d 5f 56 4e 55 4c 4c 20 66 6c 61 67 2c 20 74 68  M_VNULL flag, th
d150: 65 20 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b  e not-null check
d160: 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 73 74 61   at.  ** the sta
d170: 72 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 77  rt of the loop w
d180: 69 6c 6c 20 70 72 65 76 65 6e 74 20 61 6e 79 20  ill prevent any 
d190: 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 62 65 69  results from bei
d1a0: 6e 67 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a  ng returned..  *
d1b0: 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  /.  if( pExpr->o
d1c0: 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20  p==TK_NOTNULL.  
d1d0: 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 65 66 74   && pExpr->pLeft
d1e0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a  ->op==TK_COLUMN.
d1f0: 20 20 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 65     && pExpr->pLe
d200: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20  ft->iColumn>=0. 
d210: 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f    && Optimizatio
d220: 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  nEnabled(db, SQL
d230: 49 54 45 5f 53 74 61 74 33 34 29 0a 20 20 29 7b  ITE_Stat34).  ){
d240: 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45  .    Expr *pNewE
d250: 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  xpr;.    Expr *p
d260: 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
d270: 65 66 74 3b 0a 20 20 20 20 69 6e 74 20 69 64 78  eft;.    int idx
d280: 4e 65 77 3b 0a 20 20 20 20 57 68 65 72 65 54 65  New;.    WhereTe
d290: 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 0a 20  rm *pNewTerm;.. 
d2a0: 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71     pNewExpr = sq
d2b0: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
d2c0: 65 2c 20 54 4b 5f 47 54 2c 0a 20 20 20 20 20 20  e, TK_GT,.      
d2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
d2f0: 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74 2c 20  rDup(db, pLeft, 
d300: 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  0),.            
d310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d320: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
d330: 72 73 65 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c  rse, TK_NULL, 0,
d340: 20 30 2c 20 30 29 2c 20 30 29 3b 0a 0a 20 20 20   0, 0), 0);..   
d350: 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43   idxNew = whereC
d360: 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
d370: 20 70 4e 65 77 45 78 70 72 2c 0a 20 20 20 20 20   pNewExpr,.     
d380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d390: 20 20 20 20 20 20 20 20 20 54 45 52 4d 5f 56 49           TERM_VI
d3a0: 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d  RTUAL|TERM_DYNAM
d3b0: 49 43 7c 54 45 52 4d 5f 56 4e 55 4c 4c 29 3b 0a  IC|TERM_VNULL);.
d3c0: 20 20 20 20 69 66 28 20 69 64 78 4e 65 77 20 29      if( idxNew )
d3d0: 7b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  {.      pNewTerm
d3e0: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65   = &pWC->a[idxNe
d3f0: 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  w];.      pNewTe
d400: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
d410: 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  = 0;.      pNewT
d420: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  erm->leftCursor 
d430: 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b  = pLeft->iTable;
d440: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
d450: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20  >u.leftColumn = 
d460: 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pLeft->iColumn;.
d470: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
d480: 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 47  eOperator = WO_G
d490: 54 3b 0a 20 20 20 20 20 20 6d 61 72 6b 54 65 72  T;.      markTer
d4a0: 6d 41 73 43 68 69 6c 64 28 70 57 43 2c 20 69 64  mAsChild(pWC, id
d4b0: 78 4e 65 77 2c 20 69 64 78 54 65 72 6d 29 3b 0a  xNew, idxTerm);.
d4c0: 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
d4d0: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
d4e0: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46        pTerm->wtF
d4f0: 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50  lags |= TERM_COP
d500: 49 45 44 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  IED;.      pNewT
d510: 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d  erm->prereqAll =
d520: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c   pTerm->prereqAl
d530: 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  l;.    }.  }.#en
d540: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
d550: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
d560: 41 54 34 20 2a 2f 0a 0a 20 20 2f 2a 20 50 72 65  AT4 */..  /* Pre
d570: 76 65 6e 74 20 4f 4e 20 63 6c 61 75 73 65 20 74  vent ON clause t
d580: 65 72 6d 73 20 6f 66 20 61 20 4c 45 46 54 20 4a  erms of a LEFT J
d590: 4f 49 4e 20 66 72 6f 6d 20 62 65 69 6e 67 20 75  OIN from being u
d5a0: 73 65 64 20 74 6f 20 64 72 69 76 65 0a 20 20 2a  sed to drive.  *
d5b0: 2a 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 20 74  * an index for t
d5c0: 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66  ables to the lef
d5d0: 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20  t of the join.. 
d5e0: 20 2a 2f 0a 20 20 70 54 65 72 6d 2d 3e 70 72 65   */.  pTerm->pre
d5f0: 72 65 71 52 69 67 68 74 20 7c 3d 20 65 78 74 72  reqRight |= extr
d600: 61 52 69 67 68 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  aRight;.}../*.**
d610: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   This function s
d620: 65 61 72 63 68 65 73 20 70 4c 69 73 74 20 66 6f  earches pList fo
d630: 72 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20  r an entry that 
d640: 6d 61 74 63 68 65 73 20 74 68 65 20 69 43 6f 6c  matches the iCol
d650: 2d 74 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66  -th column.** of
d660: 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a   index pIdx..**.
d670: 2a 2a 20 49 66 20 73 75 63 68 20 61 6e 20 65 78  ** If such an ex
d680: 70 72 65 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e  pression is foun
d690: 64 2c 20 69 74 73 20 69 6e 64 65 78 20 69 6e 20  d, its index in 
d6a0: 70 4c 69 73 74 2d 3e 61 5b 5d 20 69 73 20 72 65  pList->a[] is re
d6b0: 74 75 72 6e 65 64 2e 20 49 66 0a 2a 2a 20 6e 6f  turned. If.** no
d6c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66   expression is f
d6d0: 6f 75 6e 64 2c 20 2d 31 20 69 73 20 72 65 74 75  ound, -1 is retu
d6e0: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
d6f0: 69 6e 74 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c  int findIndexCol
d700: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
d710: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
d720: 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
d730: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
d740: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  st *pList,      
d750: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
d760: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20  ression list to 
d770: 73 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20  search */.  int 
d780: 69 42 61 73 65 2c 20 20 20 20 20 20 20 20 20 20  iBase,          
d790: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
d7a0: 75 72 73 6f 72 20 66 6f 72 20 74 61 62 6c 65 20  ursor for table 
d7b0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
d7c0: 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20  pIdx */.  Index 
d7d0: 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20 20 20  *pIdx,          
d7e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
d7f0: 65 78 20 74 6f 20 6d 61 74 63 68 20 63 6f 6c 75  ex to match colu
d800: 6d 6e 20 6f 66 20 2a 2f 0a 20 20 69 6e 74 20 69  mn of */.  int i
d810: 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20 20 20  Col             
d820: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
d830: 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74 6f  lumn of index to
d840: 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69   match */.){.  i
d850: 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68  nt i;.  const ch
d860: 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78  ar *zColl = pIdx
d870: 2d 3e 61 7a 43 6f 6c 6c 5b 69 43 6f 6c 5d 3b 0a  ->azColl[iCol];.
d880: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
d890: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
d8a0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20  {.    Expr *p = 
d8b0: 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
d8c0: 6f 6c 6c 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b  ollate(pList->a[
d8d0: 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69  i].pExpr);.    i
d8e0: 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  f( p->op==TK_COL
d8f0: 55 4d 4e 0a 20 20 20 20 20 26 26 20 70 2d 3e 69  UMN.     && p->i
d900: 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69  Column==pIdx->ai
d910: 43 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 0a 20 20 20  Column[iCol].   
d920: 20 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d    && p->iTable==
d930: 69 42 61 73 65 0a 20 20 20 20 29 7b 0a 20 20 20  iBase.    ){.   
d940: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
d950: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
d960: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
d970: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
d980: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57  );.      if( ALW
d990: 41 59 53 28 70 43 6f 6c 6c 29 20 26 26 20 30 3d  AYS(pColl) && 0=
d9a0: 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
d9b0: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43  pColl->zName, zC
d9c0: 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  oll) ){.        
d9d0: 72 65 74 75 72 6e 20 69 3b 0a 20 20 20 20 20 20  return i;.      
d9e0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
d9f0: 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a  eturn -1;.}../*.
da00: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
da10: 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 65  f the DISTINCT e
da20: 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20 70  xpression-list p
da30: 61 73 73 65 64 20 61 73 20 74 68 65 20 74 68 69  assed as the thi
da40: 72 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69  rd argument.** i
da50: 73 20 72 65 64 75 6e 64 61 6e 74 2e 0a 2a 2a 0a  s redundant..**.
da60: 2a 2a 20 41 20 44 49 53 54 49 4e 43 54 20 6c 69  ** A DISTINCT li
da70: 73 74 20 69 73 20 72 65 64 75 6e 64 61 6e 74 20  st is redundant 
da80: 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
da90: 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 73 75  contains some su
daa0: 62 73 65 74 20 6f 66 0a 2a 2a 20 63 6f 6c 75 6d  bset of.** colum
dab0: 6e 73 20 74 68 61 74 20 61 72 65 20 75 6e 69 71  ns that are uniq
dac0: 75 65 20 61 6e 64 20 6e 6f 6e 2d 6e 75 6c 6c 2e  ue and non-null.
dad0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
dae0: 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e 64 61  sDistinctRedunda
daf0: 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  nt(.  Parse *pPa
db00: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
db10: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
db20: 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
db30: 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20  *pTabList,      
db40: 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
db50: 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  ause */.  WhereC
db60: 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
db70: 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
db80: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
db90: 72 4c 69 73 74 20 2a 70 44 69 73 74 69 6e 63 74  rList *pDistinct
dba0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
dbb0: 73 75 6c 74 20 73 65 74 20 74 68 61 74 20 6e 65  sult set that ne
dbc0: 65 64 73 20 74 6f 20 62 65 20 44 49 53 54 49 4e  eds to be DISTIN
dbd0: 43 54 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  CT */.){.  Table
dbe0: 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20   *pTab;.  Index 
dbf0: 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 69 3b 20  *pIdx;.  int i; 
dc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc10: 20 20 20 20 20 20 20 20 20 0a 20 20 69 6e 74 20           .  int 
dc20: 69 42 61 73 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  iBase;..  /* If 
dc30: 74 68 65 72 65 20 69 73 20 6d 6f 72 65 20 74 68  there is more th
dc40: 61 6e 20 6f 6e 65 20 74 61 62 6c 65 20 6f 72 20  an one table or 
dc50: 73 75 62 2d 73 65 6c 65 63 74 20 69 6e 20 74 68  sub-select in th
dc60: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
dc70: 0a 20 20 2a 2a 20 74 68 69 73 20 71 75 65 72 79  .  ** this query
dc80: 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 6e  , then it will n
dc90: 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ot be possible t
dca0: 6f 20 73 68 6f 77 20 74 68 61 74 20 74 68 65 20  o show that the 
dcb0: 44 49 53 54 49 4e 43 54 20 0a 20 20 2a 2a 20 63  DISTINCT .  ** c
dcc0: 6c 61 75 73 65 20 69 73 20 72 65 64 75 6e 64 61  lause is redunda
dcd0: 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  nt. */.  if( pTa
dce0: 62 4c 69 73 74 2d 3e 6e 53 72 63 21 3d 31 20 29  bList->nSrc!=1 )
dcf0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 42 61   return 0;.  iBa
dd00: 73 65 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  se = pTabList->a
dd10: 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 70  [0].iCursor;.  p
dd20: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
dd30: 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a  a[0].pTab;..  /*
dd40: 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 65   If any of the e
dd50: 78 70 72 65 73 73 69 6f 6e 73 20 69 73 20 61 6e  xpressions is an
dd60: 20 49 50 4b 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74   IPK column on t
dd70: 61 62 6c 65 20 69 42 61 73 65 2c 20 74 68 65 6e  able iBase, then
dd80: 20 72 65 74 75 72 6e 20 0a 20 20 2a 2a 20 74 72   return .  ** tr
dd90: 75 65 2e 20 4e 6f 74 65 3a 20 54 68 65 20 28 70  ue. Note: The (p
dda0: 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 29  ->iTable==iBase)
ddb0: 20 70 61 72 74 20 6f 66 20 74 68 69 73 20 74 65   part of this te
ddc0: 73 74 20 6d 61 79 20 62 65 20 66 61 6c 73 65 20  st may be false 
ddd0: 69 66 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72  if the.  ** curr
dde0: 65 6e 74 20 53 45 4c 45 43 54 20 69 73 20 61 20  ent SELECT is a 
ddf0: 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 2d 71  correlated sub-q
de00: 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  uery..  */.  for
de10: 28 69 3d 30 3b 20 69 3c 70 44 69 73 74 69 6e 63  (i=0; i<pDistinc
de20: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
de30: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71      Expr *p = sq
de40: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
de50: 6c 61 74 65 28 70 44 69 73 74 69 6e 63 74 2d 3e  late(pDistinct->
de60: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
de70: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43   if( p->op==TK_C
de80: 4f 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54 61 62  OLUMN && p->iTab
de90: 6c 65 3d 3d 69 42 61 73 65 20 26 26 20 70 2d 3e  le==iBase && p->
dea0: 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75  iColumn<0 ) retu
deb0: 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
dec0: 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c  Loop through all
ded0: 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20   indices on the 
dee0: 74 61 62 6c 65 2c 20 63 68 65 63 6b 69 6e 67 20  table, checking 
def0: 65 61 63 68 20 74 6f 20 73 65 65 20 69 66 20 69  each to see if i
df00: 74 20 6d 61 6b 65 73 0a 20 20 2a 2a 20 74 68 65  t makes.  ** the
df10: 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69 66   DISTINCT qualif
df20: 69 65 72 20 72 65 64 75 6e 64 61 6e 74 2e 20 49  ier redundant. I
df30: 74 20 64 6f 65 73 20 73 6f 20 69 66 3a 0a 20 20  t does so if:.  
df40: 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 54 68 65  **.  **   1. The
df50: 20 69 6e 64 65 78 20 69 73 20 69 74 73 65 6c 66   index is itself
df60: 20 55 4e 49 51 55 45 2c 20 61 6e 64 0a 20 20 2a   UNIQUE, and.  *
df70: 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 41 6c 6c 20  *.  **   2. All 
df80: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69  of the columns i
df90: 6e 20 74 68 65 20 69 6e 64 65 78 20 61 72 65 20  n the index are 
dfa0: 65 69 74 68 65 72 20 70 61 72 74 20 6f 66 20 74  either part of t
dfb0: 68 65 20 70 44 69 73 74 69 6e 63 74 0a 20 20 2a  he pDistinct.  *
dfc0: 2a 20 20 20 20 20 20 6c 69 73 74 2c 20 6f 72 20  *      list, or 
dfd0: 65 6c 73 65 20 74 68 65 20 57 48 45 52 45 20 63  else the WHERE c
dfe0: 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61  lause contains a
dff0: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 72   term of the for
e000: 6d 20 22 63 6f 6c 3d 58 22 2c 0a 20 20 2a 2a 20  m "col=X",.  ** 
e010: 20 20 20 20 20 77 68 65 72 65 20 58 20 69 73 20       where X is 
e020: 61 20 63 6f 6e 73 74 61 6e 74 20 76 61 6c 75 65  a constant value
e030: 2e 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  . The collation 
e040: 73 65 71 75 65 6e 63 65 73 20 6f 66 20 74 68 65  sequences of the
e050: 0a 20 20 2a 2a 20 20 20 20 20 20 63 6f 6d 70 61  .  **      compa
e060: 72 69 73 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74  rison and select
e070: 2d 6c 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e  -list expression
e080: 73 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68 6f  s must match tho
e090: 73 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  se of the index.
e0a0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 33 2e 20  .  **.  **   3. 
e0b0: 41 6c 6c 20 6f 66 20 74 68 6f 73 65 20 69 6e 64  All of those ind
e0c0: 65 78 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 77  ex columns for w
e0d0: 68 69 63 68 20 74 68 65 20 57 48 45 52 45 20 63  hich the WHERE c
e0e0: 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 0a 20  lause does not. 
e0f0: 20 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61 69 6e   **      contain
e100: 20 61 20 22 63 6f 6c 3d 58 22 20 74 65 72 6d 20   a "col=X" term 
e110: 61 72 65 20 73 75 62 6a 65 63 74 20 74 6f 20 61  are subject to a
e120: 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72   NOT NULL constr
e130: 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  aint..  */.  for
e140: 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
e150: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
e160: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
e170: 20 69 66 28 20 21 49 73 55 6e 69 71 75 65 49 6e   if( !IsUniqueIn
e180: 64 65 78 28 70 49 64 78 29 20 29 20 63 6f 6e 74  dex(pIdx) ) cont
e190: 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d  inue;.    for(i=
e1a0: 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 4b 65 79 43  0; i<pIdx->nKeyC
e1b0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
e1c0: 69 31 36 20 69 43 6f 6c 20 3d 20 70 49 64 78 2d  i16 iCol = pIdx-
e1d0: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20  >aiColumn[i];.  
e1e0: 20 20 20 20 69 66 28 20 30 3d 3d 66 69 6e 64 54      if( 0==findT
e1f0: 65 72 6d 28 70 57 43 2c 20 69 42 61 73 65 2c 20  erm(pWC, iBase, 
e200: 69 43 6f 6c 2c 20 7e 28 42 69 74 6d 61 73 6b 29  iCol, ~(Bitmask)
e210: 30 2c 20 57 4f 5f 45 51 2c 20 70 49 64 78 29 20  0, WO_EQ, pIdx) 
e220: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
e230: 49 64 78 43 6f 6c 20 3d 20 66 69 6e 64 49 6e 64  IdxCol = findInd
e240: 65 78 43 6f 6c 28 70 50 61 72 73 65 2c 20 70 44  exCol(pParse, pD
e250: 69 73 74 69 6e 63 74 2c 20 69 42 61 73 65 2c 20  istinct, iBase, 
e260: 70 49 64 78 2c 20 69 29 3b 0a 20 20 20 20 20 20  pIdx, i);.      
e270: 20 20 69 66 28 20 69 49 64 78 43 6f 6c 3c 30 20    if( iIdxCol<0 
e280: 7c 7c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  || pTab->aCol[iC
e290: 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29  ol].notNull==0 )
e2a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  {.          brea
e2b0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
e2c0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
e2d0: 66 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 4b 65 79  f( i==pIdx->nKey
e2e0: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Col ){.      /* 
e2f0: 54 68 69 73 20 69 6e 64 65 78 20 69 6d 70 6c 69  This index impli
e300: 65 73 20 74 68 61 74 20 74 68 65 20 44 49 53 54  es that the DIST
e310: 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72 20 69  INCT qualifier i
e320: 73 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a  s redundant. */.
e330: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
e340: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
e350: 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  urn 0;.}.../*.**
e360: 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6c 6f   Estimate the lo
e370: 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65 20 69  garithm of the i
e380: 6e 70 75 74 20 76 61 6c 75 65 20 74 6f 20 62 61  nput value to ba
e390: 73 65 20 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  se 2..*/.static 
e3a0: 4c 6f 67 45 73 74 20 65 73 74 4c 6f 67 28 4c 6f  LogEst estLog(Lo
e3b0: 67 45 73 74 20 4e 29 7b 0a 20 20 72 65 74 75 72  gEst N){.  retur
e3c0: 6e 20 4e 3c 3d 31 30 20 3f 20 30 20 3a 20 73 71  n N<=10 ? 0 : sq
e3d0: 6c 69 74 65 33 4c 6f 67 45 73 74 28 4e 29 20 2d  lite3LogEst(N) -
e3e0: 20 33 33 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77   33;.}../*.** Tw
e3f0: 6f 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 70  o routines for p
e400: 72 69 6e 74 69 6e 67 20 74 68 65 20 63 6f 6e 74  rinting the cont
e410: 65 6e 74 20 6f 66 20 61 6e 20 73 71 6c 69 74 65  ent of an sqlite
e420: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a 2a 2a 20  3_index_info.** 
e430: 73 74 72 75 63 74 75 72 65 2e 20 20 55 73 65 64  structure.  Used
e440: 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
e450: 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
e460: 20 20 49 66 20 6e 65 69 74 68 65 72 0a 2a 2a 20    If neither.** 
e470: 53 51 4c 49 54 45 5f 54 45 53 54 20 6f 72 20 53  SQLITE_TEST or S
e480: 51 4c 49 54 45 5f 44 45 42 55 47 20 61 72 65 20  QLITE_DEBUG are 
e490: 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 74 68  defined, then th
e4a0: 65 73 65 20 72 6f 75 74 69 6e 65 73 0a 2a 2a 20  ese routines.** 
e4b0: 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23  are no-ops..*/.#
e4c0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
e4d0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
e4e0: 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64  ABLE) && defined
e4f0: 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42  (WHERETRACE_ENAB
e500: 4c 45 44 29 0a 73 74 61 74 69 63 20 76 6f 69 64  LED).static void
e510: 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54   TRACE_IDX_INPUT
e520: 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  S(sqlite3_index_
e530: 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20  info *p){.  int 
e540: 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  i;.  if( !sqlite
e550: 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72 65  3WhereTrace ) re
e560: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
e570: 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e   i<p->nConstrain
e580: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  t; i++){.    sql
e590: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
e5a0: 22 20 20 63 6f 6e 73 74 72 61 69 6e 74 5b 25 64  "  constraint[%d
e5b0: 5d 3a 20 63 6f 6c 3d 25 64 20 74 65 72 6d 69 64  ]: col=%d termid
e5c0: 3d 25 64 20 6f 70 3d 25 64 20 75 73 61 62 6c 65  =%d op=%d usable
e5d0: 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d=%d\n",.       
e5e0: 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  i,.       p->aCo
e5f0: 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 43 6f 6c  nstraint[i].iCol
e600: 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61  umn,.       p->a
e610: 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 54  Constraint[i].iT
e620: 65 72 6d 4f 66 66 73 65 74 2c 0a 20 20 20 20 20  ermOffset,.     
e630: 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
e640: 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20 20 20 20 70  [i].op,.       p
e650: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
e660: 2e 75 73 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20  .usable);.  }.  
e670: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
e680: 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
e690: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
e6a0: 69 6e 74 66 28 22 20 20 6f 72 64 65 72 62 79 5b  intf("  orderby[
e6b0: 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 64 65 73 63  %d]: col=%d desc
e6c0: 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69  =%d\n",.       i
e6d0: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64  ,.       p->aOrd
e6e0: 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c  erBy[i].iColumn,
e6f0: 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65  .       p->aOrde
e700: 72 42 79 5b 69 5d 2e 64 65 73 63 29 3b 0a 20 20  rBy[i].desc);.  
e710: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
e720: 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54  TRACE_IDX_OUTPUT
e730: 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  S(sqlite3_index_
e740: 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20  info *p){.  int 
e750: 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  i;.  if( !sqlite
e760: 33 57 68 65 72 65 54 72 61 63 65 20 29 20 72 65  3WhereTrace ) re
e770: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
e780: 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e   i<p->nConstrain
e790: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  t; i++){.    sql
e7a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
e7b0: 22 20 20 75 73 61 67 65 5b 25 64 5d 3a 20 61 72  "  usage[%d]: ar
e7c0: 67 76 49 64 78 3d 25 64 20 6f 6d 69 74 3d 25 64  gvIdx=%d omit=%d
e7d0: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20  \n",.       i,. 
e7e0: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
e7f0: 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67  aintUsage[i].arg
e800: 76 49 6e 64 65 78 2c 0a 20 20 20 20 20 20 20 70  vIndex,.       p
e810: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
e820: 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20 20 7d  ge[i].omit);.  }
e830: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
e840: 72 69 6e 74 66 28 22 20 20 69 64 78 4e 75 6d 3d  rintf("  idxNum=
e850: 25 64 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e 75 6d  %d\n", p->idxNum
e860: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  );.  sqlite3Debu
e870: 67 50 72 69 6e 74 66 28 22 20 20 69 64 78 53 74  gPrintf("  idxSt
e880: 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69 64 78 53  r=%s\n", p->idxS
e890: 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  tr);.  sqlite3De
e8a0: 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64  bugPrintf("  ord
e8b0: 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d 25 64 5c  erByConsumed=%d\
e8c0: 6e 22 2c 20 70 2d 3e 6f 72 64 65 72 42 79 43 6f  n", p->orderByCo
e8d0: 6e 73 75 6d 65 64 29 3b 0a 20 20 73 71 6c 69 74  nsumed);.  sqlit
e8e0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
e8f0: 20 65 73 74 69 6d 61 74 65 64 43 6f 73 74 3d 25   estimatedCost=%
e900: 67 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74  g\n", p->estimat
e910: 65 64 43 6f 73 74 29 3b 0a 20 20 73 71 6c 69 74  edCost);.  sqlit
e920: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
e930: 20 65 73 74 69 6d 61 74 65 64 52 6f 77 73 3d 25   estimatedRows=%
e940: 6c 6c 64 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d  lld\n", p->estim
e950: 61 74 65 64 52 6f 77 73 29 3b 0a 7d 0a 23 65 6c  atedRows);.}.#el
e960: 73 65 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45  se.#define TRACE
e970: 5f 49 44 58 5f 49 4e 50 55 54 53 28 41 29 0a 23  _IDX_INPUTS(A).#
e980: 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58  define TRACE_IDX
e990: 5f 4f 55 54 50 55 54 53 28 41 29 0a 23 65 6e 64  _OUTPUTS(A).#end
e9a0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
e9b0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49  TE_OMIT_AUTOMATI
e9c0: 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 52 65  C_INDEX./*.** Re
e9d0: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
e9e0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
e9f0: 72 6d 20 70 54 65 72 6d 20 69 73 20 6f 66 20 61  rm pTerm is of a
ea00: 20 66 6f 72 6d 20 77 68 65 72 65 20 69 74 0a 2a   form where it.*
ea10: 2a 20 63 6f 75 6c 64 20 62 65 20 75 73 65 64 20  * could be used 
ea20: 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20 74 6f  with an index to
ea30: 20 61 63 63 65 73 73 20 70 53 72 63 2c 20 61 73   access pSrc, as
ea40: 73 75 6d 69 6e 67 20 61 6e 20 61 70 70 72 6f 70  suming an approp
ea50: 72 69 61 74 65 0a 2a 2a 20 69 6e 64 65 78 20 65  riate.** index e
ea60: 78 69 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  xisted..*/.stati
ea70: 63 20 69 6e 74 20 74 65 72 6d 43 61 6e 44 72 69  c int termCanDri
ea80: 76 65 49 6e 64 65 78 28 0a 20 20 57 68 65 72 65  veIndex(.  Where
ea90: 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20 20  Term *pTerm,    
eaa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45            /* WHE
eab0: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74  RE clause term t
eac0: 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 73 74 72  o check */.  str
ead0: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
eae0: 20 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a 20 54   *pSrc,     /* T
eaf0: 61 62 6c 65 20 77 65 20 61 72 65 20 74 72 79 69  able we are tryi
eb00: 6e 67 20 74 6f 20 61 63 63 65 73 73 20 2a 2f 0a  ng to access */.
eb10: 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
eb20: 64 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  dy              
eb30: 20 2f 2a 20 54 61 62 6c 65 73 20 69 6e 20 6f 75   /* Tables in ou
eb40: 74 65 72 20 6c 6f 6f 70 73 20 6f 66 20 74 68 65  ter loops of the
eb50: 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68   join */.){.  ch
eb60: 61 72 20 61 66 66 3b 0a 20 20 69 66 28 20 70 54  ar aff;.  if( pT
eb70: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21  erm->leftCursor!
eb80: 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29  =pSrc->iCursor )
eb90: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
eba0: 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
ebb0: 6f 72 20 26 20 57 4f 5f 45 51 29 3d 3d 30 20 29  or & WO_EQ)==0 )
ebc0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
ebd0: 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52   (pTerm->prereqR
ebe0: 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29  ight & notReady)
ebf0: 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=0 ) return 0;.
ec00: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 75 2e 6c    if( pTerm->u.l
ec10: 65 66 74 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65  eftColumn<0 ) re
ec20: 74 75 72 6e 20 30 3b 0a 20 20 61 66 66 20 3d 20  turn 0;.  aff = 
ec30: 70 53 72 63 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c  pSrc->pTab->aCol
ec40: 5b 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f  [pTerm->u.leftCo
ec50: 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a  lumn].affinity;.
ec60: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e    if( !sqlite3In
ec70: 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 54  dexAffinityOk(pT
ec80: 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61 66 66 29  erm->pExpr, aff)
ec90: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
eca0: 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
ecb0: 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  f...#ifndef SQLI
ecc0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49  TE_OMIT_AUTOMATI
ecd0: 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 47 65  C_INDEX./*.** Ge
ece0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 63  nerate code to c
ecf0: 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49 6e 64  onstruct the Ind
ed00: 65 78 20 6f 62 6a 65 63 74 20 66 6f 72 20 61 6e  ex object for an
ed10: 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
ed20: 0a 2a 2a 20 61 6e 64 20 74 6f 20 73 65 74 20 75  .** and to set u
ed30: 70 20 74 68 65 20 57 68 65 72 65 4c 65 76 65 6c  p the WhereLevel
ed40: 20 6f 62 6a 65 63 74 20 70 4c 65 76 65 6c 20 73   object pLevel s
ed50: 6f 20 74 68 61 74 20 74 68 65 20 63 6f 64 65 20  o that the code 
ed60: 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 6d 61 6b  generator.** mak
ed70: 65 73 20 75 73 65 20 6f 66 20 74 68 65 20 61 75  es use of the au
ed80: 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 0a 2a  tomatic index..*
ed90: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
eda0: 6e 73 74 72 75 63 74 41 75 74 6f 6d 61 74 69 63  nstructAutomatic
edb0: 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a  Index(.  Parse *
edc0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
edd0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
ede0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
edf0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
ee00: 43 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  C,           /* 
ee10: 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
ee20: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
ee30: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c  List_item *pSrc,
ee40: 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
ee50: 61 75 73 65 20 74 65 72 6d 20 74 6f 20 67 65 74  ause term to get
ee60: 20 74 68 65 20 6e 65 78 74 20 69 6e 64 65 78 20   the next index 
ee70: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
ee80: 52 65 61 64 79 2c 20 20 20 20 20 20 20 20 20 20  Ready,          
ee90: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73   /* Mask of curs
eea0: 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74  ors that are not
eeb0: 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20   available */.  
eec0: 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
eed0: 65 6c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  el          /* W
eee0: 72 69 74 65 20 6e 65 77 20 69 6e 64 65 78 20 68  rite new index h
eef0: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
ef00: 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20 20 20 20  nKeyCol;        
ef10: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
ef20: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
ef30: 74 68 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20  the constructed 
ef40: 69 6e 64 65 78 20 2a 2f 0a 20 20 57 68 65 72 65  index */.  Where
ef50: 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
ef60: 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67         /* A sing
ef70: 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57  le term of the W
ef80: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
ef90: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45   WhereTerm *pWCE
efa0: 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nd;          /* 
efb0: 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b 5d 20  End of pWC->a[] 
efc0: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
efd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
efe0: 20 2f 2a 20 4f 62 6a 65 63 74 20 64 65 73 63 72   /* Object descr
eff0: 69 62 69 6e 67 20 74 68 65 20 74 72 61 6e 73 69  ibing the transi
f000: 65 6e 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56  ent index */.  V
f010: 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
f020: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
f030: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
f040: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
f050: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ion */.  int add
f060: 72 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20  rInit;          
f070: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
f080: 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a  of the initializ
f090: 61 74 69 6f 6e 20 62 79 70 61 73 73 20 6a 75 6d  ation bypass jum
f0a0: 70 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  p */.  Table *pT
f0b0: 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  able;           
f0c0: 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
f0d0: 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20 2a 2f  being indexed */
f0e0: 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20  .  int addrTop; 
f0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f100: 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 64  * Top of the ind
f110: 65 78 20 66 69 6c 6c 20 6c 6f 6f 70 20 2a 2f 0a  ex fill loop */.
f120: 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b    int regRecord;
f130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f140: 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
f150: 67 20 61 6e 20 69 6e 64 65 78 20 72 65 63 6f 72  g an index recor
f160: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  d */.  int n;   
f170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f180: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63 6f 75     /* Column cou
f190: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  nter */.  int i;
f1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1b0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
f1c0: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6d  unter */.  int m
f1d0: 78 42 69 74 43 6f 6c 3b 20 20 20 20 20 20 20 20  xBitCol;        
f1e0: 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
f1f0: 6d 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 53 72 63  m column in pSrc
f200: 2d 3e 63 6f 6c 55 73 65 64 20 2a 2f 0a 20 20 43  ->colUsed */.  C
f210: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20  ollSeq *pColl;  
f220: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
f230: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
f240: 20 74 6f 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20   to on a column 
f250: 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
f260: 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  pLoop;          
f270: 20 2f 2a 20 54 68 65 20 4c 6f 6f 70 20 6f 62 6a   /* The Loop obj
f280: 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ect */.  char *z
f290: 4e 6f 74 55 73 65 64 3b 20 20 20 20 20 20 20 20  NotUsed;        
f2a0: 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 73 70       /* Extra sp
f2b0: 61 63 65 20 6f 6e 20 74 68 65 20 65 6e 64 20 6f  ace on the end o
f2c0: 66 20 70 49 64 78 20 2a 2f 0a 20 20 42 69 74 6d  f pIdx */.  Bitm
f2d0: 61 73 6b 20 69 64 78 43 6f 6c 73 3b 20 20 20 20  ask idxCols;    
f2e0: 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61          /* Bitma
f2f0: 70 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 75 73 65  p of columns use
f300: 64 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 2a  d for indexing *
f310: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65 78 74 72  /.  Bitmask extr
f320: 61 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20 20  aCols;          
f330: 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20 61 64 64  /* Bitmap of add
f340: 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20  itional columns 
f350: 2a 2f 0a 20 20 75 38 20 73 65 6e 74 57 61 72 6e  */.  u8 sentWarn
f360: 69 6e 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ing = 0;        
f370: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 77 61   /* True if a wa
f380: 72 6e 6e 69 6e 67 20 68 61 73 20 62 65 65 6e 20  rnning has been 
f390: 69 73 73 75 65 64 20 2a 2f 0a 20 20 45 78 70 72  issued */.  Expr
f3a0: 20 2a 70 50 61 72 74 69 61 6c 20 3d 20 30 3b 20   *pPartial = 0; 
f3b0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 74 69          /* Parti
f3c0: 61 6c 20 49 6e 64 65 78 20 45 78 70 72 65 73 73  al Index Express
f3d0: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  ion */.  int iCo
f3e0: 6e 74 69 6e 75 65 20 3d 20 30 3b 20 20 20 20 20  ntinue = 0;     
f3f0: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
f400: 65 20 74 6f 20 73 6b 69 70 20 65 78 63 6c 75 64  e to skip exclud
f410: 65 64 20 72 6f 77 73 20 2a 2f 0a 0a 20 20 2f 2a  ed rows */..  /*
f420: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
f430: 6f 20 73 6b 69 70 20 6f 76 65 72 20 74 68 65 20  o skip over the 
f440: 63 72 65 61 74 69 6f 6e 20 61 6e 64 20 69 6e 69  creation and ini
f450: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74  tialization of t
f460: 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 69 65 6e  he.  ** transien
f470: 74 20 69 6e 64 65 78 20 6f 6e 20 32 6e 64 20 61  t index on 2nd a
f480: 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 69 74  nd subsequent it
f490: 65 72 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  erations of the 
f4a0: 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 76 20 3d 20 70  loop. */.  v = p
f4b0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
f4c0: 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
f4d0: 20 20 61 64 64 72 49 6e 69 74 20 3d 20 73 71 6c    addrInit = sql
f4e0: 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61  ite3CodeOnce(pPa
f4f0: 72 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  rse); VdbeCovera
f500: 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75  ge(v);..  /* Cou
f510: 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
f520: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 69   columns that wi
f530: 6c 6c 20 62 65 20 61 64 64 65 64 20 74 6f 20 74  ll be added to t
f540: 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 61 6e  he index.  ** an
f550: 64 20 75 73 65 64 20 74 6f 20 6d 61 74 63 68 20  d used to match 
f560: 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
f570: 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 6e 4b  straints */.  nK
f580: 65 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61  eyCol = 0;.  pTa
f590: 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54 61 62  ble = pSrc->pTab
f5a0: 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 26 70 57  ;.  pWCEnd = &pW
f5b0: 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d  C->a[pWC->nTerm]
f5c0: 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76  ;.  pLoop = pLev
f5d0: 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 69 64  el->pWLoop;.  id
f5e0: 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72  xCols = 0;.  for
f5f0: 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70  (pTerm=pWC->a; p
f600: 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65  Term<pWCEnd; pTe
f610: 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20  rm++){.    Expr 
f620: 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e  *pExpr = pTerm->
f630: 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72  pExpr;.    asser
f640: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
f650: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72  rty(pExpr, EP_Fr
f660: 6f 6d 4a 6f 69 6e 29 20 20 20 20 2f 2a 20 70 72  omJoin)    /* pr
f670: 65 72 65 71 20 61 6c 77 61 79 73 20 6e 6f 6e 2d  ereq always non-
f680: 7a 65 72 6f 20 2a 2f 0a 20 20 20 20 20 20 20 20  zero */.        
f690: 20 7c 7c 20 70 45 78 70 72 2d 3e 69 52 69 67 68   || pExpr->iRigh
f6a0: 74 4a 6f 69 6e 54 61 62 6c 65 21 3d 70 53 72 63  tJoinTable!=pSrc
f6b0: 2d 3e 69 43 75 72 73 6f 72 20 20 20 2f 2a 20 20  ->iCursor   /*  
f6c0: 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 68   for the right-h
f6d0: 61 6e 64 20 20 20 2a 2f 0a 20 20 20 20 20 20 20  and   */.       
f6e0: 20 20 7c 7c 20 70 4c 6f 6f 70 2d 3e 70 72 65 72    || pLoop->prer
f6f0: 65 71 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20  eq!=0 );        
f700: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f710: 20 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46    table of a LEF
f720: 54 20 4a 4f 49 4e 20 2a 2f 0a 20 20 20 20 69 66  T JOIN */.    if
f730: 28 20 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 3d  ( pLoop->prereq=
f740: 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 72  =0.     && (pTer
f750: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
f760: 4d 5f 56 49 52 54 55 41 4c 29 3d 3d 30 0a 20 20  M_VIRTUAL)==0.  
f770: 20 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72     && !ExprHasPr
f780: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
f790: 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20  _FromJoin).     
f7a0: 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  && sqlite3ExprIs
f7b0: 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 70 45  TableConstant(pE
f7c0: 78 70 72 2c 20 70 53 72 63 2d 3e 69 43 75 72 73  xpr, pSrc->iCurs
f7d0: 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61  or) ){.      pPa
f7e0: 72 74 69 61 6c 20 3d 20 73 71 6c 69 74 65 33 45  rtial = sqlite3E
f7f0: 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64  xprAnd(pParse->d
f800: 62 2c 20 70 50 61 72 74 69 61 6c 2c 0a 20 20 20  b, pPartial,.   
f810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f820: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
f830: 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61 72  ite3ExprDup(pPar
f840: 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 30  se->db, pExpr, 0
f850: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ));.    }.    if
f860: 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e  ( termCanDriveIn
f870: 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c  dex(pTerm, pSrc,
f880: 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20   notReady) ){.  
f890: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
f8a0: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
f8b0: 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73  mn;.      Bitmas
f8c0: 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d  k cMask = iCol>=
f8d0: 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28 42 4d  BMS ? MASKBIT(BM
f8e0: 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54 28 69  S-1) : MASKBIT(i
f8f0: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Col);.      test
f900: 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20  case( iCol==BMS 
f910: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
f920: 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29  e( iCol==BMS-1 )
f930: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 73 65 6e  ;.      if( !sen
f940: 74 57 61 72 6e 69 6e 67 20 29 7b 0a 20 20 20 20  tWarning ){.    
f950: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
f960: 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41  SQLITE_WARNING_A
f970: 55 54 4f 49 4e 44 45 58 2c 0a 20 20 20 20 20 20  UTOINDEX,.      
f980: 20 20 20 20 20 20 22 61 75 74 6f 6d 61 74 69 63        "automatic
f990: 20 69 6e 64 65 78 20 6f 6e 20 25 73 28 25 73 29   index on %s(%s)
f9a0: 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  ", pTable->zName
f9b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 54  ,.            pT
f9c0: 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  able->aCol[iCol]
f9d0: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  .zName);.       
f9e0: 20 73 65 6e 74 57 61 72 6e 69 6e 67 20 3d 20 31   sentWarning = 1
f9f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
fa00: 69 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63  if( (idxCols & c
fa10: 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Mask)==0 ){.    
fa20: 20 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f      if( whereLoo
fa30: 70 52 65 73 69 7a 65 28 70 50 61 72 73 65 2d 3e  pResize(pParse->
fa40: 64 62 2c 20 70 4c 6f 6f 70 2c 20 6e 4b 65 79 43  db, pLoop, nKeyC
fa50: 6f 6c 2b 31 29 20 29 7b 0a 20 20 20 20 20 20 20  ol+1) ){.       
fa60: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 75 74 6f     goto end_auto
fa70: 5f 69 6e 64 65 78 5f 63 72 65 61 74 65 3b 0a 20  _index_create;. 
fa80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
fa90: 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6e   pLoop->aLTerm[n
faa0: 4b 65 79 43 6f 6c 2b 2b 5d 20 3d 20 70 54 65 72  KeyCol++] = pTer
fab0: 6d 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f  m;.        idxCo
fac0: 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20  ls |= cMask;.   
fad0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
fae0: 20 61 73 73 65 72 74 28 20 6e 4b 65 79 43 6f 6c   assert( nKeyCol
faf0: 3e 30 20 29 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75  >0 );.  pLoop->u
fb00: 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 70 4c 6f  .btree.nEq = pLo
fb10: 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6e 4b 65  op->nLTerm = nKe
fb20: 79 43 6f 6c 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77  yCol;.  pLoop->w
fb30: 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43  sFlags = WHERE_C
fb40: 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52 45  OLUMN_EQ | WHERE
fb50: 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45 52  _IDX_ONLY | WHER
fb60: 45 5f 49 4e 44 45 58 45 44 0a 20 20 20 20 20 20  E_INDEXED.      
fb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
fb80: 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
fb90: 58 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74  X;..  /* Count t
fba0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 64 64  he number of add
fbb0: 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20  itional columns 
fbc0: 6e 65 65 64 65 64 20 74 6f 20 63 72 65 61 74 65  needed to create
fbd0: 20 61 0a 20 20 2a 2a 20 63 6f 76 65 72 69 6e 67   a.  ** covering
fbe0: 20 69 6e 64 65 78 2e 20 20 41 20 22 63 6f 76 65   index.  A "cove
fbf0: 72 69 6e 67 20 69 6e 64 65 78 22 20 69 73 20 61  ring index" is a
fc00: 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e  n index that con
fc10: 74 61 69 6e 73 20 61 6c 6c 0a 20 20 2a 2a 20 63  tains all.  ** c
fc20: 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20  olumns that are 
fc30: 6e 65 65 64 65 64 20 62 79 20 74 68 65 20 71 75  needed by the qu
fc40: 65 72 79 2e 20 20 57 69 74 68 20 61 20 63 6f 76  ery.  With a cov
fc50: 65 72 69 6e 67 20 69 6e 64 65 78 2c 20 74 68 65  ering index, the
fc60: 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74  .  ** original t
fc70: 61 62 6c 65 20 6e 65 76 65 72 20 6e 65 65 64 73  able never needs
fc80: 20 74 6f 20 62 65 20 61 63 63 65 73 73 65 64 2e   to be accessed.
fc90: 20 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 69    Automatic indi
fca0: 63 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65  ces must.  ** be
fcb0: 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
fcc0: 78 20 62 65 63 61 75 73 65 20 74 68 65 20 69 6e  x because the in
fcd0: 64 65 78 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  dex will not be 
fce0: 75 70 64 61 74 65 64 20 69 66 20 74 68 65 0a 20  updated if the. 
fcf0: 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61 62   ** original tab
fd00: 6c 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20 74  le changes and t
fd10: 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62  he index and tab
fd20: 6c 65 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20 62  le cannot both b
fd30: 65 20 75 73 65 64 0a 20 20 2a 2a 20 69 66 20 74  e used.  ** if t
fd40: 68 65 79 20 67 6f 20 6f 75 74 20 6f 66 20 73 79  hey go out of sy
fd50: 6e 63 2e 0a 20 20 2a 2f 0a 20 20 65 78 74 72 61  nc..  */.  extra
fd60: 43 6f 6c 73 20 3d 20 70 53 72 63 2d 3e 63 6f 6c  Cols = pSrc->col
fd70: 55 73 65 64 20 26 20 28 7e 69 64 78 43 6f 6c 73  Used & (~idxCols
fd80: 20 7c 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31   | MASKBIT(BMS-1
fd90: 29 29 3b 0a 20 20 6d 78 42 69 74 43 6f 6c 20 3d  ));.  mxBitCol =
fda0: 20 4d 49 4e 28 42 4d 53 2d 31 2c 70 54 61 62 6c   MIN(BMS-1,pTabl
fdb0: 65 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 74 65 73 74  e->nCol);.  test
fdc0: 63 61 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43  case( pTable->nC
fdd0: 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 74  ol==BMS-1 );.  t
fde0: 65 73 74 63 61 73 65 28 20 70 54 61 62 6c 65 2d  estcase( pTable-
fdf0: 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 32 20 29 3b 0a  >nCol==BMS-2 );.
fe00: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42    for(i=0; i<mxB
fe10: 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  itCol; i++){.   
fe20: 20 69 66 28 20 65 78 74 72 61 43 6f 6c 73 20 26   if( extraCols &
fe30: 20 4d 41 53 4b 42 49 54 28 69 29 20 29 20 6e 4b   MASKBIT(i) ) nK
fe40: 65 79 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a 20 20 69  eyCol++;.  }.  i
fe50: 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64  f( pSrc->colUsed
fe60: 20 26 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31   & MASKBIT(BMS-1
fe70: 29 20 29 7b 0a 20 20 20 20 6e 4b 65 79 43 6f 6c  ) ){.    nKeyCol
fe80: 20 2b 3d 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c   += pTable->nCol
fe90: 20 2d 20 42 4d 53 20 2b 20 31 3b 0a 20 20 7d 0a   - BMS + 1;.  }.
fea0: 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20  .  /* Construct 
feb0: 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  the Index object
fec0: 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 69   to describe thi
fed0: 73 20 69 6e 64 65 78 20 2a 2f 0a 20 20 70 49 64  s index */.  pId
fee0: 78 20 3d 20 73 71 6c 69 74 65 33 41 6c 6c 6f 63  x = sqlite3Alloc
fef0: 61 74 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 70  ateIndexObject(p
ff00: 50 61 72 73 65 2d 3e 64 62 2c 20 6e 4b 65 79 43  Parse->db, nKeyC
ff10: 6f 6c 2b 31 2c 20 30 2c 20 26 7a 4e 6f 74 55 73  ol+1, 0, &zNotUs
ff20: 65 64 29 3b 0a 20 20 69 66 28 20 70 49 64 78 3d  ed);.  if( pIdx=
ff30: 3d 30 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61 75  =0 ) goto end_au
ff40: 74 6f 5f 69 6e 64 65 78 5f 63 72 65 61 74 65 3b  to_index_create;
ff50: 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  .  pLoop->u.btre
ff60: 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b  e.pIndex = pIdx;
ff70: 0a 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3d  .  pIdx->zName =
ff80: 20 22 61 75 74 6f 2d 69 6e 64 65 78 22 3b 0a 20   "auto-index";. 
ff90: 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 20 3d 20   pIdx->pTable = 
ffa0: 70 54 61 62 6c 65 3b 0a 20 20 6e 20 3d 20 30 3b  pTable;.  n = 0;
ffb0: 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a  .  idxCols = 0;.
ffc0: 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
ffd0: 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64  >a; pTerm<pWCEnd
ffe0: 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; pTerm++){.    
fff0: 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65  if( termCanDrive
10000 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72  Index(pTerm, pSr
10010 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a  c, notReady) ){.
10020 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
10030 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
10040 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d  lumn;.      Bitm
10050 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c  ask cMask = iCol
10060 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28  >=BMS ? MASKBIT(
10070 42 4d 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54  BMS-1) : MASKBIT
10080 28 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65  (iCol);.      te
10090 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d  stcase( iCol==BM
100a0 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73  S-1 );.      tes
100b0 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53  tcase( iCol==BMS
100c0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69   );.      if( (i
100d0 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d  dxCols & cMask)=
100e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78  =0 ){.        Ex
100f0 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e  pr *pX = pTerm->
10100 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69  pExpr;.        i
10110 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b  dxCols |= cMask;
10120 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61  .        pIdx->a
10130 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 70 54 65  iColumn[n] = pTe
10140 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
10150 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  ;.        pColl 
10160 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43  = sqlite3BinaryC
10170 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50  ompareCollSeq(pP
10180 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c  arse, pX->pLeft,
10190 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20   pX->pRight);.  
101a0 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f        pIdx->azCo
101b0 6c 6c 5b 6e 5d 20 3d 20 41 4c 57 41 59 53 28 70  ll[n] = ALWAYS(p
101c0 43 6f 6c 6c 29 20 3f 20 70 43 6f 6c 6c 2d 3e 7a  Coll) ? pColl->z
101d0 4e 61 6d 65 20 3a 20 22 42 49 4e 41 52 59 22 3b  Name : "BINARY";
101e0 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20  .        n++;.  
101f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
10200 20 20 61 73 73 65 72 74 28 20 28 75 33 32 29 6e    assert( (u32)n
10210 3d 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  ==pLoop->u.btree
10220 2e 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 41 64  .nEq );..  /* Ad
10230 64 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c  d additional col
10240 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20 6d  umns needed to m
10250 61 6b 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69  ake the automati
10260 63 20 69 6e 64 65 78 20 69 6e 74 6f 0a 20 20 2a  c index into.  *
10270 2a 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  * a covering ind
10280 65 78 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  ex */.  for(i=0;
10290 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b   i<mxBitCol; i++
102a0 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72 61  ){.    if( extra
102b0 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54 28 69  Cols & MASKBIT(i
102c0 29 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d  ) ){.      pIdx-
102d0 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69  >aiColumn[n] = i
102e0 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a  ;.      pIdx->az
102f0 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52  Coll[n] = "BINAR
10300 59 22 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20  Y";.      n++;. 
10310 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
10320 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d  Src->colUsed & M
10330 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 29 7b  ASKBIT(BMS-1) ){
10340 0a 20 20 20 20 66 6f 72 28 69 3d 42 4d 53 2d 31  .    for(i=BMS-1
10350 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  ; i<pTable->nCol
10360 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 49  ; i++){.      pI
10370 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20  dx->aiColumn[n] 
10380 3d 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78 2d  = i;.      pIdx-
10390 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49  >azColl[n] = "BI
103a0 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 6e 2b 2b  NARY";.      n++
103b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
103c0 73 65 72 74 28 20 6e 3d 3d 6e 4b 65 79 43 6f 6c  sert( n==nKeyCol
103d0 20 29 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f   );.  pIdx->aiCo
103e0 6c 75 6d 6e 5b 6e 5d 20 3d 20 2d 31 3b 0a 20 20  lumn[n] = -1;.  
103f0 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20  pIdx->azColl[n] 
10400 3d 20 22 42 49 4e 41 52 59 22 3b 0a 0a 20 20 2f  = "BINARY";..  /
10410 2a 20 43 72 65 61 74 65 20 74 68 65 20 61 75 74  * Create the aut
10420 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 2a 2f 0a  omatic index */.
10430 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c    assert( pLevel
10440 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a  ->iIdxCur>=0 );.
10450 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75    pLevel->iIdxCu
10460 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
10470 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  ++;.  sqlite3Vdb
10480 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
10490 65 6e 41 75 74 6f 69 6e 64 65 78 2c 20 70 4c 65  enAutoindex, pLe
104a0 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 6e 4b  vel->iIdxCur, nK
104b0 65 79 43 6f 6c 2b 31 29 3b 0a 20 20 73 71 6c 69  eyCol+1);.  sqli
104c0 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49  te3VdbeSetP4KeyI
104d0 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78  nfo(pParse, pIdx
104e0 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  );.  VdbeComment
104f0 28 28 76 2c 20 22 66 6f 72 20 25 73 22 2c 20 70  ((v, "for %s", p
10500 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  Table->zName));.
10510 0a 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 61  .  /* Fill the a
10520 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 77  utomatic index w
10530 69 74 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  ith content */. 
10540 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
10550 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
10560 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74   addrTop = sqlit
10570 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
10580 4f 50 5f 52 65 77 69 6e 64 2c 20 70 4c 65 76 65  OP_Rewind, pLeve
10590 6c 2d 3e 69 54 61 62 43 75 72 29 3b 20 56 64 62  l->iTabCur); Vdb
105a0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
105b0 69 66 28 20 70 50 61 72 74 69 61 6c 20 29 7b 0a  if( pPartial ){.
105c0 20 20 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20      iContinue = 
105d0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
105e0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 73 71 6c  abel(v);.    sql
105f0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
10600 70 50 61 72 73 65 2c 20 70 50 61 72 74 69 61 6c  pParse, pPartial
10610 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 53 51 4c  , iContinue, SQL
10620 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
10630 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c  .    pLoop->wsFl
10640 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 50 41 52  ags |= WHERE_PAR
10650 54 49 41 4c 49 44 58 3b 0a 20 20 7d 0a 20 20 72  TIALIDX;.  }.  r
10660 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74  egRecord = sqlit
10670 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
10680 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 47  rse);.  sqlite3G
10690 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28  enerateIndexKey(
106a0 70 50 61 72 73 65 2c 20 70 49 64 78 2c 20 70 4c  pParse, pIdx, pL
106b0 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20 72  evel->iTabCur, r
106c0 65 67 52 65 63 6f 72 64 2c 20 30 2c 20 30 2c 20  egRecord, 0, 0, 
106d0 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  0, 0);.  sqlite3
106e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
106f0 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 4c 65 76  _IdxInsert, pLev
10700 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 72 65 67  el->iIdxCur, reg
10710 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74  Record);.  sqlit
10720 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
10730 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b  , OPFLAG_USESEEK
10740 52 45 53 55 4c 54 29 3b 0a 20 20 69 66 28 20 70  RESULT);.  if( p
10750 50 61 72 74 69 61 6c 20 29 20 73 71 6c 69 74 65  Partial ) sqlite
10760 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
10770 6c 28 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  l(v, iContinue);
10780 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
10790 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
107a0 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
107b0 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b 20 56 64  , addrTop+1); Vd
107c0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
107d0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
107e0 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 53  geP5(v, SQLITE_S
107f0 54 4d 54 53 54 41 54 55 53 5f 41 55 54 4f 49 4e  TMTSTATUS_AUTOIN
10800 44 45 58 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  DEX);.  sqlite3V
10810 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
10820 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74  ddrTop);.  sqlit
10830 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
10840 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f  (pParse, regReco
10850 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  rd);.  sqlite3Ex
10860 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
10870 65 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a 75 6d 70  e);.  .  /* Jump
10880 20 68 65 72 65 20 77 68 65 6e 20 73 6b 69 70 70   here when skipp
10890 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c 69  ing the initiali
108a0 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69  zation */.  sqli
108b0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
108c0 76 2c 20 61 64 64 72 49 6e 69 74 29 3b 0a 0a 65  v, addrInit);..e
108d0 6e 64 5f 61 75 74 6f 5f 69 6e 64 65 78 5f 63 72  nd_auto_index_cr
108e0 65 61 74 65 3a 0a 20 20 73 71 6c 69 74 65 33 45  eate:.  sqlite3E
108f0 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65  xprDelete(pParse
10900 2d 3e 64 62 2c 20 70 50 61 72 74 69 61 6c 29 3b  ->db, pPartial);
10910 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
10920 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
10930 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 23 69 66  IC_INDEX */..#if
10940 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10950 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
10960 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  .** Allocate and
10970 20 70 6f 70 75 6c 61 74 65 20 61 6e 20 73 71 6c   populate an sql
10980 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
10990 73 74 72 75 63 74 75 72 65 2e 20 49 74 20 69 73  structure. It is
109a0 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73   the .** respons
109b0 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
109c0 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
109d0 6c 6c 79 20 72 65 6c 65 61 73 65 20 74 68 65 20  lly release the 
109e0 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 62 79 20  structure.** by 
109f0 70 61 73 73 69 6e 67 20 74 68 65 20 70 6f 69 6e  passing the poin
10a00 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20  ter returned by 
10a10 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f  this function to
10a20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e   sqlite3_free().
10a30 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74  .*/.static sqlit
10a40 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 61  e3_index_info *a
10a50 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f  llocateIndexInfo
10a60 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
10a70 65 2c 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  e,.  WhereClause
10a80 20 2a 70 57 43 2c 0a 20 20 73 74 72 75 63 74 20   *pWC,.  struct 
10a90 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
10aa0 72 63 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  rc,.  ExprList *
10ab0 70 4f 72 64 65 72 42 79 0a 29 7b 0a 20 20 69 6e  pOrderBy.){.  in
10ac0 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54  t i, j;.  int nT
10ad0 65 72 6d 3b 0a 20 20 73 74 72 75 63 74 20 73 71  erm;.  struct sq
10ae0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
10af0 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73  traint *pIdxCons
10b00 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
10b10 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79  e3_index_orderby
10b20 20 2a 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20   *pIdxOrderBy;. 
10b30 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
10b40 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
10b50 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a  _usage *pUsage;.
10b60 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
10b70 72 6d 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72  rm;.  int nOrder
10b80 42 79 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  By;.  sqlite3_in
10b90 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e  dex_info *pIdxIn
10ba0 66 6f 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20  fo;..  /* Count 
10bb0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f  the number of po
10bc0 73 73 69 62 6c 65 20 57 48 45 52 45 20 63 6c 61  ssible WHERE cla
10bd0 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  use constraints 
10be0 72 65 66 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74  referring.  ** t
10bf0 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 74  o this virtual t
10c00 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  able */.  for(i=
10c10 6e 54 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70  nTerm=0, pTerm=p
10c20 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54  WC->a; i<pWC->nT
10c30 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b  erm; i++, pTerm+
10c40 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72  +){.    if( pTer
10c50 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d  m->leftCursor !=
10c60 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29   pSrc->iCursor )
10c70 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61   continue;.    a
10c80 73 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66  ssert( IsPowerOf
10c90 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  Two(pTerm->eOper
10ca0 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56  ator & ~WO_EQUIV
10cb0 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  ) );.    testcas
10cc0 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
10cd0 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20  tor & WO_IN );. 
10ce0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
10cf0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
10d00 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  WO_ISNULL );.   
10d10 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
10d20 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
10d30 5f 41 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20  _ALL );.    if( 
10d40 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
10d50 72 20 26 20 7e 28 57 4f 5f 49 53 4e 55 4c 4c 7c  r & ~(WO_ISNULL|
10d60 57 4f 5f 45 51 55 49 56 29 29 3d 3d 30 20 29 20  WO_EQUIV))==0 ) 
10d70 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
10d80 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
10d90 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20   & TERM_VNULL ) 
10da0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6e 54  continue;.    nT
10db0 65 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  erm++;.  }..  /*
10dc0 20 49 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   If the ORDER BY
10dd0 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73   clause contains
10de0 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20 69 6e   only columns in
10df0 20 74 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20   the current .  
10e00 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ** virtual table
10e10 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 73   then allocate s
10e20 70 61 63 65 20 66 6f 72 20 74 68 65 20 61 4f 72  pace for the aOr
10e30 64 65 72 42 79 20 70 61 72 74 20 6f 66 0a 20 20  derBy part of.  
10e40 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ** the sqlite3_i
10e50 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
10e60 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 72 64  ure..  */.  nOrd
10e70 65 72 42 79 20 3d 20 30 3b 0a 20 20 69 66 28 20  erBy = 0;.  if( 
10e80 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
10e90 69 6e 74 20 6e 20 3d 20 70 4f 72 64 65 72 42 79  int n = pOrderBy
10ea0 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72  ->nExpr;.    for
10eb0 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  (i=0; i<n; i++){
10ec0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78  .      Expr *pEx
10ed0 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  pr = pOrderBy->a
10ee0 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
10ef0 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
10f00 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78  TK_COLUMN || pEx
10f10 70 72 2d 3e 69 54 61 62 6c 65 21 3d 70 53 72 63  pr->iTable!=pSrc
10f20 2d 3e 69 43 75 72 73 6f 72 20 29 20 62 72 65 61  ->iCursor ) brea
10f30 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
10f40 20 69 3d 3d 6e 29 7b 0a 20 20 20 20 20 20 6e 4f   i==n){.      nO
10f50 72 64 65 72 42 79 20 3d 20 6e 3b 0a 20 20 20 20  rderBy = n;.    
10f60 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  }.  }..  /* Allo
10f70 63 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 33  cate the sqlite3
10f80 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
10f90 63 74 75 72 65 0a 20 20 2a 2f 0a 20 20 70 49 64  cture.  */.  pId
10fa0 78 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  xInfo = sqlite3D
10fb0 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72  bMallocZero(pPar
10fc0 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a  se->db, sizeof(*
10fd0 70 49 64 78 49 6e 66 6f 29 0a 20 20 20 20 20 20  pIdxInfo).      
10fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ff0 20 20 20 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a       + (sizeof(*
11000 70 49 64 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65  pIdxCons) + size
11010 6f 66 28 2a 70 55 73 61 67 65 29 29 2a 6e 54 65  of(*pUsage))*nTe
11020 72 6d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  rm.             
11030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
11040 73 69 7a 65 6f 66 28 2a 70 49 64 78 4f 72 64 65  sizeof(*pIdxOrde
11050 72 42 79 29 2a 6e 4f 72 64 65 72 42 79 20 29 3b  rBy)*nOrderBy );
11060 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d  .  if( pIdxInfo=
11070 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
11080 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
11090 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  , "out of memory
110a0 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  ");.    return 0
110b0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74  ;.  }..  /* Init
110c0 69 61 6c 69 7a 65 20 74 68 65 20 73 74 72 75 63  ialize the struc
110d0 74 75 72 65 2e 20 20 54 68 65 20 73 71 6c 69 74  ture.  The sqlit
110e0 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
110f0 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
11100 0a 20 20 2a 2a 20 6d 61 6e 79 20 66 69 65 6c 64  .  ** many field
11110 73 20 74 68 61 74 20 61 72 65 20 64 65 63 6c 61  s that are decla
11120 72 65 64 20 22 63 6f 6e 73 74 22 20 74 6f 20 70  red "const" to p
11130 72 65 76 65 6e 74 20 78 42 65 73 74 49 6e 64 65  revent xBestInde
11140 78 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 68 61 6e  x from.  ** chan
11150 67 69 6e 67 20 74 68 65 6d 2e 20 20 57 65 20 68  ging them.  We h
11160 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66  ave to do some f
11170 75 6e 6b 79 20 63 61 73 74 69 6e 67 20 69 6e 20  unky casting in 
11180 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20 69 6e  order to.  ** in
11190 69 74 69 61 6c 69 7a 65 20 74 68 6f 73 65 20 66  itialize those f
111a0 69 65 6c 64 73 2e 0a 20 20 2a 2f 0a 20 20 70 49  ields..  */.  pI
111b0 64 78 43 6f 6e 73 20 3d 20 28 73 74 72 75 63 74  dxCons = (struct
111c0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
111d0 6f 6e 73 74 72 61 69 6e 74 2a 29 26 70 49 64 78  onstraint*)&pIdx
111e0 49 6e 66 6f 5b 31 5d 3b 0a 20 20 70 49 64 78 4f  Info[1];.  pIdxO
111f0 72 64 65 72 42 79 20 3d 20 28 73 74 72 75 63 74  rderBy = (struct
11200 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f   sqlite3_index_o
11210 72 64 65 72 62 79 2a 29 26 70 49 64 78 43 6f 6e  rderby*)&pIdxCon
11220 73 5b 6e 54 65 72 6d 5d 3b 0a 20 20 70 55 73 61  s[nTerm];.  pUsa
11230 67 65 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c  ge = (struct sql
11240 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
11250 72 61 69 6e 74 5f 75 73 61 67 65 2a 29 26 70 49  raint_usage*)&pI
11260 64 78 4f 72 64 65 72 42 79 5b 6e 4f 72 64 65 72  dxOrderBy[nOrder
11270 42 79 5d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70  By];.  *(int*)&p
11280 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72  IdxInfo->nConstr
11290 61 69 6e 74 20 3d 20 6e 54 65 72 6d 3b 0a 20 20  aint = nTerm;.  
112a0 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f  *(int*)&pIdxInfo
112b0 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72  ->nOrderBy = nOr
112c0 64 65 72 42 79 3b 0a 20 20 2a 28 73 74 72 75 63  derBy;.  *(struc
112d0 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
112e0 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49  constraint**)&pI
112f0 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
11300 69 6e 74 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a  int = pIdxCons;.
11310 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74    *(struct sqlit
11320 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79  e3_index_orderby
11330 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f  **)&pIdxInfo->aO
11340 72 64 65 72 42 79 20 3d 20 70 49 64 78 4f 72 64  rderBy = pIdxOrd
11350 65 72 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74  erBy;.  *(struct
11360 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
11370 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a  onstraint_usage*
11380 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f  *)&pIdxInfo->aCo
11390 6e 73 74 72 61 69 6e 74 55 73 61 67 65 20 3d 0a  nstraintUsage =.
113a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113e0 20 20 20 70 55 73 61 67 65 3b 0a 0a 20 20 66 6f     pUsage;..  fo
113f0 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70  r(i=j=0, pTerm=p
11400 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54  WC->a; i<pWC->nT
11410 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b  erm; i++, pTerm+
11420 2b 29 7b 0a 20 20 20 20 75 38 20 6f 70 3b 0a 20  +){.    u8 op;. 
11430 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65     if( pTerm->le
11440 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63  ftCursor != pSrc
11450 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74  ->iCursor ) cont
11460 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74  inue;.    assert
11470 28 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 70  ( IsPowerOfTwo(p
11480 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
11490 26 20 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a  & ~WO_EQUIV) );.
114a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
114b0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
114c0 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65   WO_IN );.    te
114d0 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
114e0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53  Operator & WO_IS
114f0 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73 74  NULL );.    test
11500 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
11510 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 20  erator & WO_ALL 
11520 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  );.    if( (pTer
11530 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 7e  m->eOperator & ~
11540 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51  (WO_ISNULL|WO_EQ
11550 55 49 56 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69  UIV))==0 ) conti
11560 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65  nue;.    if( pTe
11570 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
11580 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69  RM_VNULL ) conti
11590 6e 75 65 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e  nue;.    pIdxCon
115a0 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70  s[j].iColumn = p
115b0 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
115c0 6d 6e 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73  mn;.    pIdxCons
115d0 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 20  [j].iTermOffset 
115e0 3d 20 69 3b 0a 20 20 20 20 6f 70 20 3d 20 28 75  = i;.    op = (u
115f0 38 29 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  8)pTerm->eOperat
11600 6f 72 20 26 20 57 4f 5f 41 4c 4c 3b 0a 20 20 20  or & WO_ALL;.   
11610 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 49 4e 20 29   if( op==WO_IN )
11620 20 6f 70 20 3d 20 57 4f 5f 45 51 3b 0a 20 20 20   op = WO_EQ;.   
11630 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20   pIdxCons[j].op 
11640 3d 20 6f 70 3b 0a 20 20 20 20 2f 2a 20 54 68 65  = op;.    /* The
11650 20 64 69 72 65 63 74 20 61 73 73 69 67 6e 6d 65   direct assignme
11660 6e 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f  nt in the previo
11670 75 73 20 6c 69 6e 65 20 69 73 20 70 6f 73 73 69  us line is possi
11680 62 6c 65 20 6f 6e 6c 79 20 62 65 63 61 75 73 65  ble only because
11690 0a 20 20 20 20 2a 2a 20 74 68 65 20 57 4f 5f 20  .    ** the WO_ 
116a0 61 6e 64 20 53 51 4c 49 54 45 5f 49 4e 44 45 58  and SQLITE_INDEX
116b0 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 20 63 6f 64  _CONSTRAINT_ cod
116c0 65 73 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c  es are identical
116d0 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 66 6f  .  The.    ** fo
116e0 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20  llowing asserts 
116f0 76 65 72 69 66 79 20 74 68 69 73 20 66 61 63 74  verify this fact
11700 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
11710 20 57 4f 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49   WO_EQ==SQLITE_I
11720 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
11730 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  EQ );.    assert
11740 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f  ( WO_LT==SQLITE_
11750 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
11760 5f 4c 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _LT );.    asser
11770 74 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45  t( WO_LE==SQLITE
11780 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
11790 54 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73 73 65  T_LE );.    asse
117a0 72 74 28 20 57 4f 5f 47 54 3d 3d 53 51 4c 49 54  rt( WO_GT==SQLIT
117b0 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
117c0 4e 54 5f 47 54 20 29 3b 0a 20 20 20 20 61 73 73  NT_GT );.    ass
117d0 65 72 74 28 20 57 4f 5f 47 45 3d 3d 53 51 4c 49  ert( WO_GE==SQLI
117e0 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
117f0 49 4e 54 5f 47 45 20 29 3b 0a 20 20 20 20 61 73  INT_GE );.    as
11800 73 65 72 74 28 20 57 4f 5f 4d 41 54 43 48 3d 3d  sert( WO_MATCH==
11810 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
11820 53 54 52 41 49 4e 54 5f 4d 41 54 43 48 20 29 3b  STRAINT_MATCH );
11830 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
11840 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
11850 28 57 4f 5f 49 4e 7c 57 4f 5f 45 51 7c 57 4f 5f  (WO_IN|WO_EQ|WO_
11860 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57  LT|WO_LE|WO_GT|W
11870 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43 48 29 20 29  O_GE|WO_MATCH) )
11880 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20  ;.    j++;.  }. 
11890 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64   for(i=0; i<nOrd
118a0 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
118b0 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f  Expr *pExpr = pO
118c0 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
118d0 70 72 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65  pr;.    pIdxOrde
118e0 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d  rBy[i].iColumn =
118f0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
11900 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79  .    pIdxOrderBy
11910 5b 69 5d 2e 64 65 73 63 20 3d 20 70 4f 72 64 65  [i].desc = pOrde
11920 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  rBy->a[i].sortOr
11930 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  der;.  }..  retu
11940 72 6e 20 70 49 64 78 49 6e 66 6f 3b 0a 7d 0a 0a  rn pIdxInfo;.}..
11950 2f 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20  /*.** The table 
11960 6f 62 6a 65 63 74 20 72 65 66 65 72 65 6e 63 65  object reference
11970 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
11980 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
11990 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  o this function.
119a0 2a 2a 20 6d 75 73 74 20 72 65 70 72 65 73 65 6e  ** must represen
119b0 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  t a virtual tabl
119c0 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
119d0 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 78 42 65   invokes the xBe
119e0 73 74 49 6e 64 65 78 28 29 0a 2a 2a 20 6d 65 74  stIndex().** met
119f0 68 6f 64 20 6f 66 20 74 68 65 20 76 69 72 74 75  hod of the virtu
11a00 61 6c 20 74 61 62 6c 65 20 77 69 74 68 20 74 68  al table with th
11a10 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
11a20 69 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74  info object that
11a30 0a 2a 2a 20 63 6f 6d 65 73 20 69 6e 20 61 73 20  .** comes in as 
11a40 74 68 65 20 33 72 64 20 61 72 67 75 6d 65 6e 74  the 3rd argument
11a50 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
11a60 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  n..**.** If an e
11a70 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 70 50 61  rror occurs, pPa
11a80 72 73 65 20 69 73 20 70 6f 70 75 6c 61 74 65 64  rse is populated
11a90 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 6d   with an error m
11aa0 65 73 73 61 67 65 20 61 6e 64 20 61 0a 2a 2a 20  essage and a.** 
11ab0 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69  non-zero value i
11ac0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
11ad0 72 77 69 73 65 2c 20 30 20 69 73 20 72 65 74 75  rwise, 0 is retu
11ae0 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6f 75 74  rned and the out
11af0 70 75 74 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74  put.** part of t
11b00 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
11b10 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  _info structure 
11b20 69 73 20 6c 65 66 74 20 70 6f 70 75 6c 61 74 65  is left populate
11b30 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72  d..**.** Whether
11b40 20 6f 72 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72   or not an error
11b50 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74   is returned, it
11b60 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
11b70 62 69 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a  bility of the.**
11b80 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74   caller to event
11b90 75 61 6c 6c 79 20 66 72 65 65 20 70 2d 3e 69 64  ually free p->id
11ba0 78 53 74 72 20 69 66 20 70 2d 3e 6e 65 65 64 54  xStr if p->needT
11bb0 6f 46 72 65 65 49 64 78 53 74 72 20 69 6e 64 69  oFreeIdxStr indi
11bc0 63 61 74 65 73 0a 2a 2a 20 74 68 61 74 20 74 68  cates.** that th
11bd0 69 73 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  is is required..
11be0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 74  */.static int vt
11bf0 61 62 42 65 73 74 49 6e 64 65 78 28 50 61 72 73  abBestIndex(Pars
11c00 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
11c10 20 2a 70 54 61 62 2c 20 73 71 6c 69 74 65 33 5f   *pTab, sqlite3_
11c20 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a  index_info *p){.
11c30 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
11c40 70 56 74 61 62 20 3d 20 73 71 6c 69 74 65 33 47  pVtab = sqlite3G
11c50 65 74 56 54 61 62 6c 65 28 70 50 61 72 73 65 2d  etVTable(pParse-
11c60 3e 64 62 2c 20 70 54 61 62 29 2d 3e 70 56 74 61  >db, pTab)->pVta
11c70 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  b;.  int i;.  in
11c80 74 20 72 63 3b 0a 0a 20 20 54 52 41 43 45 5f 49  t rc;..  TRACE_I
11c90 44 58 5f 49 4e 50 55 54 53 28 70 29 3b 0a 20 20  DX_INPUTS(p);.  
11ca0 72 63 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64  rc = pVtab->pMod
11cb0 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64 65 78 28  ule->xBestIndex(
11cc0 70 56 74 61 62 2c 20 70 29 3b 0a 20 20 54 52 41  pVtab, p);.  TRA
11cd0 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 70  CE_IDX_OUTPUTS(p
11ce0 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  );..  if( rc!=SQ
11cf0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
11d00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
11d10 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 70 50 61  MEM ){.      pPa
11d20 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
11d30 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  ailed = 1;.    }
11d40 65 6c 73 65 20 69 66 28 20 21 70 56 74 61 62 2d  else if( !pVtab-
11d50 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20  >zErrMsg ){.    
11d60 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
11d70 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20  g(pParse, "%s", 
11d80 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63  sqlite3ErrStr(rc
11d90 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
11da0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
11db0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
11dc0 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  ", pVtab->zErrMs
11dd0 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  g);.    }.  }.  
11de0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74  sqlite3_free(pVt
11df0 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ab->zErrMsg);.  
11e00 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d  pVtab->zErrMsg =
11e10 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20   0;..  for(i=0; 
11e20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  i<p->nConstraint
11e30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
11e40 21 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b  !p->aConstraint[
11e50 69 5d 2e 75 73 61 62 6c 65 20 26 26 20 70 2d 3e  i].usable && p->
11e60 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
11e70 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30 20  [i].argvIndex>0 
11e80 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
11e90 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
11ea0 20 0a 20 20 20 20 20 20 20 20 20 20 22 74 61 62   .          "tab
11eb0 6c 65 20 25 73 3a 20 78 42 65 73 74 49 6e 64 65  le %s: xBestInde
11ec0 78 20 72 65 74 75 72 6e 65 64 20 61 6e 20 69 6e  x returned an in
11ed0 76 61 6c 69 64 20 70 6c 61 6e 22 2c 20 70 54 61  valid plan", pTa
11ee0 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  b->zName);.    }
11ef0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
11f00 50 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 23  Parse->nErr;.}.#
11f10 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
11f20 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
11f30 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a  RTUALTABLE) */..
11f40 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
11f50 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
11f60 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61  AT4./*.** Estima
11f70 74 65 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20  te the location 
11f80 6f 66 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  of a particular 
11f90 6b 65 79 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65  key among all ke
11fa0 79 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65  ys in an.** inde
11fb0 78 2e 20 20 53 74 6f 72 65 20 74 68 65 20 72 65  x.  Store the re
11fc0 73 75 6c 74 73 20 69 6e 20 61 53 74 61 74 20 61  sults in aStat a
11fd0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
11fe0 20 20 20 20 61 53 74 61 74 5b 30 5d 20 20 20 20      aStat[0]    
11ff0 20 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66    Est. number of
12000 20 72 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20   rows less than 
12010 70 52 65 63 0a 2a 2a 20 20 20 20 61 53 74 61 74  pRec.**    aStat
12020 5b 31 5d 20 20 20 20 20 20 45 73 74 2e 20 6e 75  [1]      Est. nu
12030 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 65 71 75  mber of rows equ
12040 61 6c 20 74 6f 20 70 52 65 63 0a 2a 2a 0a 2a 2a  al to pRec.**.**
12050 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
12060 78 20 6f 66 20 74 68 65 20 73 61 6d 70 6c 65 20  x of the sample 
12070 74 68 61 74 20 69 73 20 74 68 65 20 73 6d 61 6c  that is the smal
12080 6c 65 73 74 20 73 61 6d 70 6c 65 20 74 68 61 74  lest sample that
12090 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74  .** is greater t
120a0 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
120b0 70 52 65 63 2e 20 4e 6f 74 65 20 74 68 61 74 20  pRec. Note that 
120c0 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 6e 6f  this index is no
120d0 74 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 69 6e  t an index.** in
120e0 74 6f 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d  to the aSample[]
120f0 20 61 72 72 61 79 20 2d 20 69 74 20 69 73 20 61   array - it is a
12100 6e 20 69 6e 64 65 78 20 69 6e 74 6f 20 61 20 76  n index into a v
12110 69 72 74 75 61 6c 20 73 65 74 20 6f 66 20 73 61  irtual set of sa
12120 6d 70 6c 65 73 0a 2a 2a 20 62 61 73 65 64 20 6f  mples.** based o
12130 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  n the contents o
12140 66 20 61 53 61 6d 70 6c 65 5b 5d 20 61 6e 64 20  f aSample[] and 
12150 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69  the number of fi
12160 65 6c 64 73 20 69 6e 20 72 65 63 6f 72 64 20 0a  elds in record .
12170 2a 2a 20 70 52 65 63 2e 20 0a 2a 2f 0a 73 74 61  ** pRec. .*/.sta
12180 74 69 63 20 69 6e 74 20 77 68 65 72 65 4b 65 79  tic int whereKey
12190 53 74 61 74 73 28 0a 20 20 50 61 72 73 65 20 2a  Stats(.  Parse *
121a0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
121b0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
121c0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
121d0 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20   Index *pIdx,   
121e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
121f0 49 6e 64 65 78 20 74 6f 20 63 6f 6e 73 69 64 65  Index to conside
12200 72 20 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a 20  r domain of */. 
12210 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
12220 2a 70 52 65 63 2c 20 20 20 20 20 20 20 2f 2a 20  *pRec,       /* 
12230 56 65 63 74 6f 72 20 6f 66 20 76 61 6c 75 65 73  Vector of values
12240 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 2a 2f 0a   to consider */.
12250 20 20 69 6e 74 20 72 6f 75 6e 64 55 70 2c 20 20    int roundUp,  
12260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12270 20 52 6f 75 6e 64 20 75 70 20 69 66 20 74 72 75   Round up if tru
12280 65 2e 20 20 52 6f 75 6e 64 20 64 6f 77 6e 20 69  e.  Round down i
12290 66 20 66 61 6c 73 65 20 2a 2f 0a 20 20 74 52 6f  f false */.  tRo
122a0 77 63 6e 74 20 2a 61 53 74 61 74 20 20 20 20 20  wcnt *aStat     
122b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
122c0 20 73 74 61 74 73 20 77 72 69 74 74 65 6e 20 68   stats written h
122d0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65  ere */.){.  Inde
122e0 78 53 61 6d 70 6c 65 20 2a 61 53 61 6d 70 6c 65  xSample *aSample
122f0 20 3d 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65   = pIdx->aSample
12300 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20  ;.  int iCol;   
12310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12320 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 65 71 75  /* Index of requ
12330 69 72 65 64 20 73 74 61 74 73 20 69 6e 20 61 6e  ired stats in an
12340 45 71 5b 5d 20 65 74 63 2e 20 2a 2f 0a 20 20 69  Eq[] etc. */.  i
12350 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
12360 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
12370 64 65 78 20 6f 66 20 66 69 72 73 74 20 73 61 6d  dex of first sam
12380 70 6c 65 20 3e 3d 20 70 52 65 63 20 2a 2f 0a 20  ple >= pRec */. 
12390 20 69 6e 74 20 69 53 61 6d 70 6c 65 3b 20 20 20   int iSample;   
123a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
123b0 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20  Smallest sample 
123c0 6c 61 72 67 65 72 20 74 68 61 6e 20 6f 72 20 65  larger than or e
123d0 71 75 61 6c 20 74 6f 20 70 52 65 63 20 2a 2f 0a  qual to pRec */.
123e0 20 20 69 6e 74 20 69 4d 69 6e 20 3d 20 30 3b 20    int iMin = 0; 
123f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12400 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65   Smallest sample
12410 20 6e 6f 74 20 79 65 74 20 74 65 73 74 65 64 20   not yet tested 
12420 2a 2f 0a 20 20 69 6e 74 20 69 54 65 73 74 3b 20  */.  int iTest; 
12430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12440 20 2f 2a 20 4e 65 78 74 20 73 61 6d 70 6c 65 20   /* Next sample 
12450 74 6f 20 74 65 73 74 20 2a 2f 0a 20 20 69 6e 74  to test */.  int
12460 20 72 65 73 3b 20 20 20 20 20 20 20 20 20 20 20   res;           
12470 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
12480 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  lt of comparison
12490 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   operation */.  
124a0 69 6e 74 20 6e 46 69 65 6c 64 3b 20 20 20 20 20  int nField;     
124b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
124c0 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20  umber of fields 
124d0 69 6e 20 70 52 65 63 20 2a 2f 0a 20 20 74 52 6f  in pRec */.  tRo
124e0 77 63 6e 74 20 69 4c 6f 77 65 72 20 3d 20 30 3b  wcnt iLower = 0;
124f0 20 20 20 20 20 20 20 20 20 2f 2a 20 61 6e 4c 74           /* anLt
12500 5b 5d 20 2b 20 61 6e 45 71 5b 5d 20 6f 66 20 6c  [] + anEq[] of l
12510 61 72 67 65 73 74 20 73 61 6d 70 6c 65 20 70 52  argest sample pR
12520 65 63 20 69 73 20 3e 20 2a 2f 0a 0a 23 69 66 6e  ec is > */..#ifn
12530 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
12540 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
12550 54 45 52 28 20 70 50 61 72 73 65 20 29 3b 0a 23  TER( pParse );.#
12560 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
12570 70 52 65 63 21 3d 30 20 29 3b 0a 20 20 61 73 73  pRec!=0 );.  ass
12580 65 72 74 28 20 70 49 64 78 2d 3e 6e 53 61 6d 70  ert( pIdx->nSamp
12590 6c 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  le>0 );.  assert
125a0 28 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3e 30  ( pRec->nField>0
125b0 20 26 26 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64   && pRec->nField
125c0 3c 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 43  <=pIdx->nSampleC
125d0 6f 6c 20 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20 61  ol );..  /* Do a
125e0 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 20 74   binary search t
125f0 6f 20 66 69 6e 64 20 74 68 65 20 66 69 72 73 74  o find the first
12600 20 73 61 6d 70 6c 65 20 67 72 65 61 74 65 72 20   sample greater 
12610 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 20 20  than or equal.  
12620 2a 2a 20 74 6f 20 70 52 65 63 2e 20 49 66 20 70  ** to pRec. If p
12630 52 65 63 20 63 6f 6e 74 61 69 6e 73 20 61 20 73  Rec contains a s
12640 69 6e 67 6c 65 20 66 69 65 6c 64 2c 20 74 68 65  ingle field, the
12650 20 73 65 74 20 6f 66 20 73 61 6d 70 6c 65 73 20   set of samples 
12660 74 6f 20 73 65 61 72 63 68 0a 20 20 2a 2a 20 69  to search.  ** i
12670 73 20 73 69 6d 70 6c 79 20 74 68 65 20 61 53 61  s simply the aSa
12680 6d 70 6c 65 5b 5d 20 61 72 72 61 79 2e 20 49 66  mple[] array. If
12690 20 74 68 65 20 73 61 6d 70 6c 65 73 20 69 6e 20   the samples in 
126a0 61 53 61 6d 70 6c 65 5b 5d 20 63 6f 6e 74 61 69  aSample[] contai
126b0 6e 20 6d 6f 72 65 0a 20 20 2a 2a 20 74 68 61 6e  n more.  ** than
126c0 20 6f 6e 65 20 66 69 65 6c 64 73 2c 20 61 6c 6c   one fields, all
126d0 20 66 69 65 6c 64 73 20 66 6f 6c 6c 6f 77 69 6e   fields followin
126e0 67 20 74 68 65 20 66 69 72 73 74 20 61 72 65 20  g the first are 
126f0 69 67 6e 6f 72 65 64 2e 0a 20 20 2a 2a 0a 20 20  ignored..  **.  
12700 2a 2a 20 49 66 20 70 52 65 63 20 63 6f 6e 74 61  ** If pRec conta
12710 69 6e 73 20 4e 20 66 69 65 6c 64 73 2c 20 77 68  ins N fields, wh
12720 65 72 65 20 4e 20 69 73 20 6d 6f 72 65 20 74 68  ere N is more th
12730 61 6e 20 6f 6e 65 2c 20 74 68 65 6e 20 61 73 20  an one, then as 
12740 77 65 6c 6c 20 61 73 20 74 68 65 0a 20 20 2a 2a  well as the.  **
12750 20 73 61 6d 70 6c 65 73 20 69 6e 20 61 53 61 6d   samples in aSam
12760 70 6c 65 5b 5d 20 28 74 72 75 6e 63 61 74 65 64  ple[] (truncated
12770 20 74 6f 20 4e 20 66 69 65 6c 64 73 29 2c 20 74   to N fields), t
12780 68 65 20 73 65 61 72 63 68 20 61 6c 73 6f 20 68  he search also h
12790 61 73 20 74 6f 0a 20 20 2a 2a 20 63 6f 6e 73 69  as to.  ** consi
127a0 64 65 72 20 70 72 65 66 69 78 65 73 20 6f 66 20  der prefixes of 
127b0 74 68 6f 73 65 20 73 61 6d 70 6c 65 73 2e 20 46  those samples. F
127c0 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  or example, if t
127d0 68 65 20 73 65 74 20 6f 66 20 73 61 6d 70 6c 65  he set of sample
127e0 73 0a 20 20 2a 2a 20 69 6e 20 61 53 61 6d 70 6c  s.  ** in aSampl
127f0 65 20 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  e is:.  **.  ** 
12800 20 20 20 20 61 53 61 6d 70 6c 65 5b 30 5d 20 3d      aSample[0] =
12810 20 28 61 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20   (a, 5) .  **   
12820 20 20 61 53 61 6d 70 6c 65 5b 31 5d 20 3d 20 28    aSample[1] = (
12830 61 2c 20 31 30 29 20 0a 20 20 2a 2a 20 20 20 20  a, 10) .  **    
12840 20 61 53 61 6d 70 6c 65 5b 32 5d 20 3d 20 28 62   aSample[2] = (b
12850 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20 20 20 61  , 5) .  **     a
12860 53 61 6d 70 6c 65 5b 33 5d 20 3d 20 28 63 2c 20  Sample[3] = (c, 
12870 31 30 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 61  100) .  **     a
12880 53 61 6d 70 6c 65 5b 34 5d 20 3d 20 28 63 2c 20  Sample[4] = (c, 
12890 31 30 35 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  105).  **.  ** T
128a0 68 65 6e 20 74 68 65 20 73 65 61 72 63 68 20 73  hen the search s
128b0 70 61 63 65 20 73 68 6f 75 6c 64 20 69 64 65 61  pace should idea
128c0 6c 6c 79 20 62 65 20 74 68 65 20 73 61 6d 70 6c  lly be the sampl
128d0 65 73 20 61 62 6f 76 65 20 61 6e 64 20 74 68 65  es above and the
128e0 20 0a 20 20 2a 2a 20 75 6e 69 71 75 65 20 70 72   .  ** unique pr
128f0 65 66 69 78 65 73 20 5b 61 5d 2c 20 5b 62 5d 20  efixes [a], [b] 
12900 61 6e 64 20 5b 63 5d 2e 20 42 75 74 20 73 69 6e  and [c]. But sin
12910 63 65 20 74 68 61 74 20 69 73 20 68 61 72 64 20  ce that is hard 
12920 74 6f 20 6f 72 67 61 6e 69 7a 65 2c 20 0a 20 20  to organize, .  
12930 2a 2a 20 74 68 65 20 63 6f 64 65 20 61 63 74 75  ** the code actu
12940 61 6c 6c 79 20 73 65 61 72 63 68 65 73 20 74 68  ally searches th
12950 69 73 20 73 65 74 3a 0a 20 20 2a 2a 0a 20 20 2a  is set:.  **.  *
12960 2a 20 20 20 20 20 30 3a 20 28 61 29 20 0a 20 20  *     0: (a) .  
12970 2a 2a 20 20 20 20 20 31 3a 20 28 61 2c 20 35 29  **     1: (a, 5)
12980 20 0a 20 20 2a 2a 20 20 20 20 20 32 3a 20 28 61   .  **     2: (a
12990 2c 20 31 30 29 20 0a 20 20 2a 2a 20 20 20 20 20  , 10) .  **     
129a0 33 3a 20 28 61 2c 20 31 30 29 20 0a 20 20 2a 2a  3: (a, 10) .  **
129b0 20 20 20 20 20 34 3a 20 28 62 29 20 0a 20 20 2a       4: (b) .  *
129c0 2a 20 20 20 20 20 35 3a 20 28 62 2c 20 35 29 20  *     5: (b, 5) 
129d0 0a 20 20 2a 2a 20 20 20 20 20 36 3a 20 28 63 29  .  **     6: (c)
129e0 20 0a 20 20 2a 2a 20 20 20 20 20 37 3a 20 28 63   .  **     7: (c
129f0 2c 20 31 30 30 29 20 0a 20 20 2a 2a 20 20 20 20  , 100) .  **    
12a00 20 38 3a 20 28 63 2c 20 31 30 35 29 0a 20 20 2a   8: (c, 105).  *
12a10 2a 20 20 20 20 20 39 3a 20 28 63 2c 20 31 30 35  *     9: (c, 105
12a20 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20  ).  **.  ** For 
12a30 65 61 63 68 20 73 61 6d 70 6c 65 20 69 6e 20 74  each sample in t
12a40 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72  he aSample[] arr
12a50 61 79 2c 20 4e 20 73 61 6d 70 6c 65 73 20 61 72  ay, N samples ar
12a60 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65  e present in the
12a70 0a 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65 20  .  ** effective 
12a80 73 61 6d 70 6c 65 20 61 72 72 61 79 2e 20 49 6e  sample array. In
12a90 20 74 68 65 20 61 62 6f 76 65 2c 20 73 61 6d 70   the above, samp
12aa0 6c 65 73 20 30 20 61 6e 64 20 31 20 61 72 65 20  les 0 and 1 are 
12ab0 62 61 73 65 64 20 6f 6e 20 0a 20 20 2a 2a 20 73  based on .  ** s
12ac0 61 6d 70 6c 65 20 61 53 61 6d 70 6c 65 5b 30 5d  ample aSample[0]
12ad0 2e 20 53 61 6d 70 6c 65 73 20 32 20 61 6e 64 20  . Samples 2 and 
12ae0 33 20 6f 6e 20 61 53 61 6d 70 6c 65 5b 31 5d 20  3 on aSample[1] 
12af0 65 74 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f  etc..  **.  ** O
12b00 66 74 65 6e 2c 20 73 61 6d 70 6c 65 20 69 20 6f  ften, sample i o
12b10 66 20 65 61 63 68 20 62 6c 6f 63 6b 20 6f 66 20  f each block of 
12b20 4e 20 65 66 66 65 63 74 69 76 65 20 73 61 6d 70  N effective samp
12b30 6c 65 73 20 68 61 73 20 28 69 2b 31 29 20 66 69  les has (i+1) fi
12b40 65 6c 64 73 2e 0a 20 20 2a 2a 20 45 78 63 65 70  elds..  ** Excep
12b50 74 2c 20 65 61 63 68 20 73 61 6d 70 6c 65 20 6d  t, each sample m
12b60 61 79 20 62 65 20 65 78 74 65 6e 64 65 64 20 74  ay be extended t
12b70 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 69 74  o ensure that it
12b80 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
12b90 20 6f 72 0a 20 20 2a 2a 20 65 71 75 61 6c 20 74   or.  ** equal t
12ba0 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73  o the previous s
12bb0 61 6d 70 6c 65 20 69 6e 20 74 68 65 20 61 72 72  ample in the arr
12bc0 61 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  ay. For example,
12bd0 20 69 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 0a   in the above, .
12be0 20 20 2a 2a 20 73 61 6d 70 6c 65 20 32 20 69 73    ** sample 2 is
12bf0 20 74 68 65 20 66 69 72 73 74 20 73 61 6d 70 6c   the first sampl
12c00 65 20 6f 66 20 61 20 62 6c 6f 63 6b 20 6f 66 20  e of a block of 
12c10 4e 20 73 61 6d 70 6c 65 73 2c 20 73 6f 20 61 74  N samples, so at
12c20 20 66 69 72 73 74 20 69 74 20 0a 20 20 2a 2a 20   first it .  ** 
12c30 61 70 70 65 61 72 73 20 74 68 61 74 20 69 74 20  appears that it 
12c40 73 68 6f 75 6c 64 20 62 65 20 31 20 66 69 65 6c  should be 1 fiel
12c50 64 20 69 6e 20 73 69 7a 65 2e 20 48 6f 77 65 76  d in size. Howev
12c60 65 72 2c 20 74 68 61 74 20 77 6f 75 6c 64 20 6d  er, that would m
12c70 61 6b 65 20 69 74 20 0a 20 20 2a 2a 20 73 6d 61  ake it .  ** sma
12c80 6c 6c 65 72 20 74 68 61 6e 20 73 61 6d 70 6c 65  ller than sample
12c90 20 31 2c 20 73 6f 20 74 68 65 20 62 69 6e 61 72   1, so the binar
12ca0 79 20 73 65 61 72 63 68 20 77 6f 75 6c 64 20 6e  y search would n
12cb0 6f 74 20 77 6f 72 6b 2e 20 41 73 20 61 20 72 65  ot work. As a re
12cc0 73 75 6c 74 2c 20 0a 20 20 2a 2a 20 69 74 20 69  sult, .  ** it i
12cd0 73 20 65 78 74 65 6e 64 65 64 20 74 6f 20 74 77  s extended to tw
12ce0 6f 20 66 69 65 6c 64 73 2e 20 54 68 65 20 64 75  o fields. The du
12cf0 70 6c 69 63 61 74 65 73 20 74 68 61 74 20 74 68  plicates that th
12d00 69 73 20 63 72 65 61 74 65 73 20 64 6f 20 6e 6f  is creates do no
12d10 74 20 0a 20 20 2a 2a 20 63 61 75 73 65 20 61 6e  t .  ** cause an
12d20 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f  y problems..  */
12d30 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70 52 65 63  .  nField = pRec
12d40 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 69 43 6f 6c  ->nField;.  iCol
12d50 20 3d 20 30 3b 0a 20 20 69 53 61 6d 70 6c 65 20   = 0;.  iSample 
12d60 3d 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20  = pIdx->nSample 
12d70 2a 20 6e 46 69 65 6c 64 3b 0a 20 20 64 6f 7b 0a  * nField;.  do{.
12d80 20 20 20 20 69 6e 74 20 69 53 61 6d 70 3b 20 20      int iSamp;  
12d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12da0 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 53    /* Index in aS
12db0 61 6d 70 6c 65 5b 5d 20 6f 66 20 74 65 73 74 20  ample[] of test 
12dc0 73 61 6d 70 6c 65 20 2a 2f 0a 20 20 20 20 69 6e  sample */.    in
12dd0 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
12de0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
12df0 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20  umber of fields 
12e00 69 6e 20 74 65 73 74 20 73 61 6d 70 6c 65 20 2a  in test sample *
12e10 2f 0a 0a 20 20 20 20 69 54 65 73 74 20 3d 20 28  /..    iTest = (
12e20 69 4d 69 6e 2b 69 53 61 6d 70 6c 65 29 2f 32 3b  iMin+iSample)/2;
12e30 0a 20 20 20 20 69 53 61 6d 70 20 3d 20 69 54 65  .    iSamp = iTe
12e40 73 74 20 2f 20 6e 46 69 65 6c 64 3b 0a 20 20 20  st / nField;.   
12e50 20 69 66 28 20 69 53 61 6d 70 3e 30 20 29 7b 0a   if( iSamp>0 ){.
12e60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 6f        /* The pro
12e70 70 6f 73 65 64 20 65 66 66 65 63 74 69 76 65 20  posed effective 
12e80 73 61 6d 70 6c 65 20 69 73 20 61 20 70 72 65 66  sample is a pref
12e90 69 78 20 6f 66 20 73 61 6d 70 6c 65 20 61 53 61  ix of sample aSa
12ea0 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 0a 20 20 20  mple[iSamp]..   
12eb0 20 20 20 2a 2a 20 53 70 65 63 69 66 69 63 61 6c     ** Specifical
12ec0 6c 79 2c 20 74 68 65 20 73 68 6f 72 74 65 73 74  ly, the shortest
12ed0 20 70 72 65 66 69 78 20 6f 66 20 61 74 20 6c 65   prefix of at le
12ee0 61 73 74 20 28 31 20 2b 20 69 54 65 73 74 25 6e  ast (1 + iTest%n
12ef0 46 69 65 6c 64 29 20 0a 20 20 20 20 20 20 2a 2a  Field) .      **
12f00 20 66 69 65 6c 64 73 20 74 68 61 74 20 69 73 20   fields that is 
12f10 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
12f20 20 70 72 65 76 69 6f 75 73 20 65 66 66 65 63 74   previous effect
12f30 69 76 65 20 73 61 6d 70 6c 65 2e 20 20 2a 2f 0a  ive sample.  */.
12f40 20 20 20 20 20 20 66 6f 72 28 6e 3d 28 69 54 65        for(n=(iTe
12f50 73 74 20 25 20 6e 46 69 65 6c 64 29 20 2b 20 31  st % nField) + 1
12f60 3b 20 6e 3c 6e 46 69 65 6c 64 3b 20 6e 2b 2b 29  ; n<nField; n++)
12f70 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 53  {.        if( aS
12f80 61 6d 70 6c 65 5b 69 53 61 6d 70 2d 31 5d 2e 61  ample[iSamp-1].a
12f90 6e 4c 74 5b 6e 2d 31 5d 21 3d 61 53 61 6d 70 6c  nLt[n-1]!=aSampl
12fa0 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d  e[iSamp].anLt[n-
12fb0 31 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  1] ) break;.    
12fc0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
12fd0 20 20 20 20 20 6e 20 3d 20 69 54 65 73 74 20 2b       n = iTest +
12fe0 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70   1;.    }..    p
12ff0 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 3b  Rec->nField = n;
13000 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74  .    res = sqlit
13010 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
13020 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 53 61 6d  are(aSample[iSam
13030 70 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 53  p].n, aSample[iS
13040 61 6d 70 5d 2e 70 2c 20 70 52 65 63 29 3b 0a 20  amp].p, pRec);. 
13050 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a     if( res<0 ){.
13060 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61        iLower = a
13070 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e  Sample[iSamp].an
13080 4c 74 5b 6e 2d 31 5d 20 2b 20 61 53 61 6d 70 6c  Lt[n-1] + aSampl
13090 65 5b 69 53 61 6d 70 5d 2e 61 6e 45 71 5b 6e 2d  e[iSamp].anEq[n-
130a0 31 5d 3b 0a 20 20 20 20 20 20 69 4d 69 6e 20 3d  1];.      iMin =
130b0 20 69 54 65 73 74 2b 31 3b 0a 20 20 20 20 7d 65   iTest+1;.    }e
130c0 6c 73 65 20 69 66 28 20 72 65 73 3d 3d 30 20 26  lse if( res==0 &
130d0 26 20 6e 3c 6e 46 69 65 6c 64 20 29 7b 0a 20 20  & n<nField ){.  
130e0 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 53 61      iLower = aSa
130f0 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74  mple[iSamp].anLt
13100 5b 6e 2d 31 5d 3b 0a 20 20 20 20 20 20 69 4d 69  [n-1];.      iMi
13110 6e 20 3d 20 69 54 65 73 74 2b 31 3b 0a 20 20 20  n = iTest+1;.   
13120 20 20 20 72 65 73 20 3d 20 2d 31 3b 0a 20 20 20     res = -1;.   
13130 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 53   }else{.      iS
13140 61 6d 70 6c 65 20 3d 20 69 54 65 73 74 3b 0a 20  ample = iTest;. 
13150 20 20 20 20 20 69 43 6f 6c 20 3d 20 6e 2d 31 3b       iCol = n-1;
13160 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
13170 20 72 65 73 20 26 26 20 69 4d 69 6e 3c 69 53 61   res && iMin<iSa
13180 6d 70 6c 65 20 29 3b 0a 20 20 69 20 3d 20 69 53  mple );.  i = iS
13190 61 6d 70 6c 65 20 2f 20 6e 46 69 65 6c 64 3b 0a  ample / nField;.
131a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
131b0 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 66 6f  EBUG.  /* The fo
131c0 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73  llowing assert s
131d0 74 61 74 65 6d 65 6e 74 73 20 63 68 65 63 6b 20  tatements check 
131e0 74 68 61 74 20 74 68 65 20 62 69 6e 61 72 79 20  that the binary 
131f0 73 65 61 72 63 68 20 63 6f 64 65 0a 20 20 2a 2a  search code.  **
13200 20 61 62 6f 76 65 20 66 6f 75 6e 64 20 74 68 65   above found the
13210 20 72 69 67 68 74 20 61 6e 73 77 65 72 2e 20 54   right answer. T
13220 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73  his block serves
13230 20 6e 6f 20 70 75 72 70 6f 73 65 20 6f 74 68 65   no purpose othe
13240 72 0a 20 20 2a 2a 20 74 68 61 6e 20 74 6f 20 69  r.  ** than to i
13250 6e 76 6f 6b 65 20 74 68 65 20 61 73 73 65 72 74  nvoke the assert
13260 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  s.  */.  if( pPa
13270 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
13280 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ailed==0 ){.    
13290 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20  if( res==0 ){.  
132a0 20 20 20 20 2f 2a 20 49 66 20 28 72 65 73 3d 3d      /* If (res==
132b0 30 29 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  0) is true, then
132c0 20 70 52 65 63 20 6d 75 73 74 20 62 65 20 65 71   pRec must be eq
132d0 75 61 6c 20 74 6f 20 73 61 6d 70 6c 65 20 69 2e  ual to sample i.
132e0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
132f0 28 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c  ( i<pIdx->nSampl
13300 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
13310 74 28 20 69 43 6f 6c 3d 3d 6e 46 69 65 6c 64 2d  t( iCol==nField-
13320 31 20 29 3b 0a 20 20 20 20 20 20 70 52 65 63 2d  1 );.      pRec-
13330 3e 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64  >nField = nField
13340 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
13350 30 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 52 65  0==sqlite3VdbeRe
13360 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d  cordCompare(aSam
13370 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c  ple[i].n, aSampl
13380 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29 20 0a 20  e[i].p, pRec) . 
13390 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
133a0 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
133b0 61 69 6c 65 64 20 0a 20 20 20 20 20 20 29 3b 0a  ailed .      );.
133c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
133d0 20 2f 2a 20 55 6e 6c 65 73 73 20 69 3d 3d 70 49   /* Unless i==pI
133e0 64 78 2d 3e 6e 53 61 6d 70 6c 65 2c 20 69 6e 64  dx->nSample, ind
133f0 69 63 61 74 69 6e 67 20 74 68 61 74 20 70 52 65  icating that pRe
13400 63 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  c is larger than
13410 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 73 61  .      ** all sa
13420 6d 70 6c 65 73 20 69 6e 20 74 68 65 20 61 53 61  mples in the aSa
13430 6d 70 6c 65 5b 5d 20 61 72 72 61 79 2c 20 70 52  mple[] array, pR
13440 65 63 20 6d 75 73 74 20 62 65 20 73 6d 61 6c 6c  ec must be small
13450 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20 20 20  er than the.    
13460 20 20 2a 2a 20 28 69 43 6f 6c 2b 31 29 20 66 69    ** (iCol+1) fi
13470 65 6c 64 20 70 72 65 66 69 78 20 6f 66 20 73 61  eld prefix of sa
13480 6d 70 6c 65 20 69 2e 20 20 2a 2f 0a 20 20 20 20  mple i.  */.    
13490 20 20 61 73 73 65 72 74 28 20 69 3c 3d 70 49 64    assert( i<=pId
134a0 78 2d 3e 6e 53 61 6d 70 6c 65 20 26 26 20 69 3e  x->nSample && i>
134b0 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 52 65 63  =0 );.      pRec
134c0 2d 3e 6e 46 69 65 6c 64 20 3d 20 69 43 6f 6c 2b  ->nField = iCol+
134d0 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  1;.      assert(
134e0 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c   i==pIdx->nSampl
134f0 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  e .           ||
13500 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
13510 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c  rdCompare(aSampl
13520 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b  e[i].n, aSample[
13530 69 5d 2e 70 2c 20 70 52 65 63 29 3e 30 0a 20 20  i].p, pRec)>0.  
13540 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72           || pPar
13550 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
13560 69 6c 65 64 20 29 3b 0a 0a 20 20 20 20 20 20 2f  iled );..      /
13570 2a 20 69 66 20 69 3d 3d 30 20 61 6e 64 20 69 43  * if i==0 and iC
13580 6f 6c 3d 3d 30 2c 20 74 68 65 6e 20 72 65 63 6f  ol==0, then reco
13590 72 64 20 70 52 65 63 20 69 73 20 73 6d 61 6c 6c  rd pRec is small
135a0 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 6d 70  er than all samp
135b0 6c 65 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20  les.      ** in 
135c0 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72  the aSample[] ar
135d0 72 61 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ray. Otherwise, 
135e0 69 66 20 28 69 43 6f 6c 3e 30 29 20 74 68 65 6e  if (iCol>0) then
135f0 20 70 52 65 63 20 6d 75 73 74 0a 20 20 20 20 20   pRec must.     
13600 20 2a 2a 20 62 65 20 67 72 65 61 74 65 72 20 74   ** be greater t
13610 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
13620 74 68 65 20 28 69 43 6f 6c 29 20 66 69 65 6c 64  the (iCol) field
13630 20 70 72 65 66 69 78 20 6f 66 20 73 61 6d 70 6c   prefix of sampl
13640 65 20 69 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66  e i..      ** If
13650 20 28 69 3e 30 29 2c 20 74 68 65 6e 20 70 52 65   (i>0), then pRe
13660 63 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 67  c must also be g
13670 72 65 61 74 65 72 20 74 68 61 6e 20 73 61 6d 70  reater than samp
13680 6c 65 20 28 69 2d 31 29 2e 20 20 2a 2f 0a 20 20  le (i-1).  */.  
13690 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 30 20 29      if( iCol>0 )
136a0 7b 0a 20 20 20 20 20 20 20 20 70 52 65 63 2d 3e  {.        pRec->
136b0 6e 46 69 65 6c 64 20 3d 20 69 43 6f 6c 3b 0a 20  nField = iCol;. 
136c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
136d0 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
136e0 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b  Compare(aSample[
136f0 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d  i].n, aSample[i]
13700 2e 70 2c 20 70 52 65 63 29 3c 3d 30 0a 20 20 20  .p, pRec)<=0.   
13710 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
13720 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
13730 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 7d  ailed );.      }
13740 0a 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29  .      if( i>0 )
13750 7b 0a 20 20 20 20 20 20 20 20 70 52 65 63 2d 3e  {.        pRec->
13760 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64 3b  nField = nField;
13770 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
13780 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
13790 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c  rdCompare(aSampl
137a0 65 5b 69 2d 31 5d 2e 6e 2c 20 61 53 61 6d 70 6c  e[i-1].n, aSampl
137b0 65 5b 69 2d 31 5d 2e 70 2c 20 70 52 65 63 29 3c  e[i-1].p, pRec)<
137c0 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  0.             |
137d0 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
137e0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
137f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
13800 23 65 6e 64 69 66 20 2f 2a 20 69 66 64 65 66 20  #endif /* ifdef 
13810 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a  SQLITE_DEBUG */.
13820 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b  .  if( res==0 ){
13830 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 70  .    /* Record p
13840 52 65 63 20 69 73 20 65 71 75 61 6c 20 74 6f 20  Rec is equal to 
13850 73 61 6d 70 6c 65 20 69 20 2a 2f 0a 20 20 20 20  sample i */.    
13860 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 6e 46  assert( iCol==nF
13870 69 65 6c 64 2d 31 20 29 3b 0a 20 20 20 20 61 53  ield-1 );.    aS
13880 74 61 74 5b 30 5d 20 3d 20 61 53 61 6d 70 6c 65  tat[0] = aSample
13890 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a  [i].anLt[iCol];.
138a0 20 20 20 20 61 53 74 61 74 5b 31 5d 20 3d 20 61      aStat[1] = a
138b0 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 45 71 5b 69  Sample[i].anEq[i
138c0 43 6f 6c 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Col];.  }else{. 
138d0 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
138e0 69 6e 74 2c 20 74 68 65 20 28 69 43 6f 6c 2b 31  int, the (iCol+1
138f0 29 20 66 69 65 6c 64 20 70 72 65 66 69 78 20 6f  ) field prefix o
13900 66 20 61 53 61 6d 70 6c 65 5b 69 5d 20 69 73 20  f aSample[i] is 
13910 74 68 65 20 66 69 72 73 74 20 0a 20 20 20 20 2a  the first .    *
13920 2a 20 73 61 6d 70 6c 65 20 74 68 61 74 20 69 73  * sample that is
13930 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 70 52   greater than pR
13940 65 63 2e 20 4f 72 2c 20 69 66 20 69 3d 3d 70 49  ec. Or, if i==pI
13950 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 74 68 65 6e  dx->nSample then
13960 20 70 52 65 63 0a 20 20 20 20 2a 2a 20 69 73 20   pRec.    ** is 
13970 6c 61 72 67 65 72 20 74 68 61 6e 20 61 6c 6c 20  larger than all 
13980 73 61 6d 70 6c 65 73 20 69 6e 20 74 68 65 20 61  samples in the a
13990 72 72 61 79 2e 20 2a 2f 0a 20 20 20 20 74 52 6f  rray. */.    tRo
139a0 77 63 6e 74 20 69 55 70 70 65 72 2c 20 69 47 61  wcnt iUpper, iGa
139b0 70 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d 70 49  p;.    if( i>=pI
139c0 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 7b 0a 20  dx->nSample ){. 
139d0 20 20 20 20 20 69 55 70 70 65 72 20 3d 20 73 71       iUpper = sq
139e0 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74  lite3LogEstToInt
139f0 28 70 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45  (pIdx->aiRowLogE
13a00 73 74 5b 30 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  st[0]);.    }els
13a10 65 7b 0a 20 20 20 20 20 20 69 55 70 70 65 72 20  e{.      iUpper 
13a20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c  = aSample[i].anL
13a30 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 0a  t[iCol];.    }..
13a40 20 20 20 20 69 66 28 20 69 4c 6f 77 65 72 3e 3d      if( iLower>=
13a50 69 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20 20  iUpper ){.      
13a60 69 47 61 70 20 3d 20 30 3b 0a 20 20 20 20 7d 65  iGap = 0;.    }e
13a70 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20  lse{.      iGap 
13a80 3d 20 69 55 70 70 65 72 20 2d 20 69 4c 6f 77 65  = iUpper - iLowe
13a90 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  r;.    }.    if(
13aa0 20 72 6f 75 6e 64 55 70 20 29 7b 0a 20 20 20 20   roundUp ){.    
13ab0 20 20 69 47 61 70 20 3d 20 28 69 47 61 70 2a 32    iGap = (iGap*2
13ac0 29 2f 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  )/3;.    }else{.
13ad0 20 20 20 20 20 20 69 47 61 70 20 3d 20 69 47 61        iGap = iGa
13ae0 70 2f 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  p/3;.    }.    a
13af0 53 74 61 74 5b 30 5d 20 3d 20 69 4c 6f 77 65 72  Stat[0] = iLower
13b00 20 2b 20 69 47 61 70 3b 0a 20 20 20 20 61 53 74   + iGap;.    aSt
13b10 61 74 5b 31 5d 20 3d 20 70 49 64 78 2d 3e 61 41  at[1] = pIdx->aA
13b20 76 67 45 71 5b 6e 46 69 65 6c 64 2d 31 5d 3b 0a  vgEq[nField-1];.
13b30 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 6f 72    }..  /* Restor
13b40 65 20 74 68 65 20 70 52 65 63 2d 3e 6e 46 69 65  e the pRec->nFie
13b50 6c 64 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20  ld value before 
13b60 72 65 74 75 72 6e 69 6e 67 2e 20 20 2a 2f 0a 20  returning.  */. 
13b70 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20   pRec->nField = 
13b80 6e 46 69 65 6c 64 3b 0a 20 20 72 65 74 75 72 6e  nField;.  return
13b90 20 69 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   i;.}.#endif /* 
13ba0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
13bb0 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a  AT3_OR_STAT4 */.
13bc0 0a 2f 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20  ./*.** If it is 
13bd0 6e 6f 74 20 4e 55 4c 4c 2c 20 70 54 65 72 6d 20  not NULL, pTerm 
13be0 69 73 20 61 20 74 65 72 6d 20 74 68 61 74 20 70  is a term that p
13bf0 72 6f 76 69 64 65 73 20 61 6e 20 75 70 70 65 72  rovides an upper
13c00 20 6f 72 20 6c 6f 77 65 72 0a 2a 2a 20 62 6f 75   or lower.** bou
13c10 6e 64 20 6f 6e 20 61 20 72 61 6e 67 65 20 73 63  nd on a range sc
13c20 61 6e 2e 20 57 69 74 68 6f 75 74 20 63 6f 6e 73  an. Without cons
13c30 69 64 65 72 69 6e 67 20 70 54 65 72 6d 2c 20 69  idering pTerm, i
13c40 74 20 69 73 20 65 73 74 69 6d 61 74 65 64 20 0a  t is estimated .
13c50 2a 2a 20 74 68 61 74 20 74 68 65 20 73 63 61 6e  ** that the scan
13c60 20 77 69 6c 6c 20 76 69 73 69 74 20 6e 4e 65 77   will visit nNew
13c70 20 72 6f 77 73 2e 20 54 68 69 73 20 66 75 6e 63   rows. This func
13c80 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65  tion returns the
13c90 20 6e 75 6d 62 65 72 0a 2a 2a 20 65 73 74 69 6d   number.** estim
13ca0 61 74 65 64 20 74 6f 20 62 65 20 76 69 73 69 74  ated to be visit
13cb0 65 64 20 61 66 74 65 72 20 74 61 6b 69 6e 67 20  ed after taking 
13cc0 70 54 65 72 6d 20 69 6e 74 6f 20 61 63 63 6f 75  pTerm into accou
13cd0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  nt..**.** If the
13ce0 20 75 73 65 72 20 65 78 70 6c 69 63 69 74 6c 79   user explicitly
13cf0 20 73 70 65 63 69 66 69 65 64 20 61 20 6c 69 6b   specified a lik
13d00 65 6c 69 68 6f 6f 64 28 29 20 76 61 6c 75 65 20  elihood() value 
13d10 66 6f 72 20 74 68 69 73 20 74 65 72 6d 2c 0a 2a  for this term,.*
13d20 2a 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72  * then the retur
13d30 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 6c  n value is the l
13d40 69 6b 65 6c 69 68 6f 6f 64 20 6d 75 6c 74 69 70  ikelihood multip
13d50 6c 69 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62  lied by the numb
13d60 65 72 20 6f 66 0a 2a 2a 20 69 6e 70 75 74 20 72  er of.** input r
13d70 6f 77 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ows. Otherwise, 
13d80 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  this function as
13d90 73 75 6d 65 73 20 74 68 61 74 20 61 6e 20 22 49  sumes that an "I
13da0 53 20 4e 4f 54 20 4e 55 4c 4c 22 20 74 65 72 6d  S NOT NULL" term
13db0 0a 2a 2a 20 68 61 73 20 61 20 6c 69 6b 65 6c 69  .** has a likeli
13dc0 68 6f 6f 64 20 6f 66 20 30 2e 35 30 2c 20 61 6e  hood of 0.50, an
13dd0 64 20 61 6e 79 20 6f 74 68 65 72 20 74 65 72 6d  d any other term
13de0 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6f 66   a likelihood of
13df0 20 30 2e 32 35 2e 0a 2a 2f 0a 73 74 61 74 69 63   0.25..*/.static
13e00 20 4c 6f 67 45 73 74 20 77 68 65 72 65 52 61 6e   LogEst whereRan
13e10 67 65 41 64 6a 75 73 74 28 57 68 65 72 65 54 65  geAdjust(WhereTe
13e20 72 6d 20 2a 70 54 65 72 6d 2c 20 4c 6f 67 45 73  rm *pTerm, LogEs
13e30 74 20 6e 4e 65 77 29 7b 0a 20 20 4c 6f 67 45 73  t nNew){.  LogEs
13e40 74 20 6e 52 65 74 20 3d 20 6e 4e 65 77 3b 0a 20  t nRet = nNew;. 
13e50 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20   if( pTerm ){.  
13e60 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 74 72 75    if( pTerm->tru
13e70 74 68 50 72 6f 62 3c 3d 30 20 29 7b 0a 20 20 20  thProb<=0 ){.   
13e80 20 20 20 6e 52 65 74 20 2b 3d 20 70 54 65 72 6d     nRet += pTerm
13e90 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20 20 20  ->truthProb;.   
13ea0 20 7d 65 6c 73 65 20 69 66 28 20 28 70 54 65 72   }else if( (pTer
13eb0 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
13ec0 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20  M_VNULL)==0 ){. 
13ed0 20 20 20 20 20 6e 52 65 74 20 2d 3d 20 32 30 3b       nRet -= 20;
13ee0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
13ef0 32 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  20==sqlite3LogEs
13f00 74 28 34 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20  t(4) );.    }.  
13f10 7d 0a 20 20 72 65 74 75 72 6e 20 6e 52 65 74 3b  }.  return nRet;
13f20 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
13f30 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
13f40 52 5f 53 54 41 54 34 0a 2f 2a 20 0a 2a 2a 20 54  R_STAT4./* .** T
13f50 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
13f60 63 61 6c 6c 65 64 20 74 6f 20 65 73 74 69 6d 61  called to estima
13f70 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
13f80 20 72 6f 77 73 20 76 69 73 69 74 65 64 20 62 79   rows visited by
13f90 20 61 0a 2a 2a 20 72 61 6e 67 65 2d 73 63 61 6e   a.** range-scan
13fa0 20 6f 6e 20 61 20 73 6b 69 70 2d 73 63 61 6e 20   on a skip-scan 
13fb0 69 6e 64 65 78 2e 20 46 6f 72 20 65 78 61 6d 70  index. For examp
13fc0 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41  le:.**.**   CREA
13fd0 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74  TE INDEX i1 ON t
13fe0 31 28 61 2c 20 62 2c 20 63 29 3b 0a 2a 2a 20 20  1(a, b, c);.**  
13ff0 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
14000 31 20 57 48 45 52 45 20 61 3d 3f 20 41 4e 44 20  1 WHERE a=? AND 
14010 63 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20  c BETWEEN ? AND 
14020 3f 3b 0a 2a 2a 0a 2a 2a 20 56 61 6c 75 65 20 70  ?;.**.** Value p
14030 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 69 73 20 63 75  Loop->nOut is cu
14040 72 72 65 6e 74 6c 79 20 73 65 74 20 74 6f 20 74  rrently set to t
14050 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d  he estimated num
14060 62 65 72 20 6f 66 20 72 6f 77 73 20 0a 2a 2a 20  ber of rows .** 
14070 76 69 73 69 74 65 64 20 66 6f 72 20 73 63 61 6e  visited for scan
14080 6e 69 6e 67 20 28 61 3d 3f 20 41 4e 44 20 62 3d  ning (a=? AND b=
14090 3f 29 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ?). This functio
140a0 6e 20 72 65 64 75 63 65 73 20 74 68 61 74 20 65  n reduces that e
140b0 73 74 69 6d 61 74 65 20 0a 2a 2a 20 62 79 20 73  stimate .** by s
140c0 6f 6d 65 20 66 61 63 74 6f 72 20 74 6f 20 61 63  ome factor to ac
140d0 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20 28 63  count for the (c
140e0 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f   BETWEEN ? AND ?
140f0 29 20 65 78 70 72 65 73 73 69 6f 6e 20 62 61 73  ) expression bas
14100 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 74 61  ed.** on the sta
14110 74 34 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  t4 data for the 
14120 69 6e 64 65 78 2e 20 74 68 69 73 20 73 63 61 6e  index. this scan
14130 20 77 69 6c 6c 20 62 65 20 70 65 66 6f 72 6d 65   will be peforme
14140 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74  d multiple .** t
14150 69 6d 65 73 20 28 6f 6e 63 65 20 66 6f 72 20 65  imes (once for e
14160 61 63 68 20 28 61 2c 62 29 20 63 6f 6d 62 69 6e  ach (a,b) combin
14170 61 74 69 6f 6e 20 74 68 61 74 20 6d 61 74 63 68  ation that match
14180 65 73 20 61 3d 3f 29 20 69 73 20 64 65 61 6c 74  es a=?) is dealt
14190 20 77 69 74 68 20 0a 2a 2a 20 62 79 20 74 68 65   with .** by the
141a0 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   caller..**.** I
141b0 74 20 64 6f 65 73 20 74 68 69 73 20 62 79 20 73  t does this by s
141c0 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20  canning through 
141d0 61 6c 6c 20 73 74 61 74 34 20 73 61 6d 70 6c 65  all stat4 sample
141e0 73 2c 20 63 6f 6d 70 61 72 69 6e 67 20 76 61 6c  s, comparing val
141f0 75 65 73 0a 2a 2a 20 65 78 74 72 61 63 74 65 64  ues.** extracted
14200 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20 61 6e 64   from pLower and
14210 20 70 55 70 70 65 72 20 77 69 74 68 20 74 68 65   pUpper with the
14220 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63   corresponding c
14230 6f 6c 75 6d 6e 20 69 6e 20 65 61 63 68 0a 2a 2a  olumn in each.**
14240 20 73 61 6d 70 6c 65 2e 20 49 66 20 4c 20 61 6e   sample. If L an
14250 64 20 55 20 61 72 65 20 74 68 65 20 6e 75 6d 62  d U are the numb
14260 65 72 20 6f 66 20 73 61 6d 70 6c 65 73 20 66 6f  er of samples fo
14270 75 6e 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74  und to be less t
14280 68 61 6e 20 6f 72 0a 2a 2a 20 65 71 75 61 6c 20  han or.** equal 
14290 74 6f 20 74 68 65 20 76 61 6c 75 65 73 20 65 78  to the values ex
142a0 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 4c 6f  tracted from pLo
142b0 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 20 72  wer and pUpper r
142c0 65 73 70 65 63 74 69 76 65 6c 79 2c 20 61 6e 64  espectively, and
142d0 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 74 6f 74  .** N is the tot
142e0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 6d  al number of sam
142f0 70 6c 65 73 2c 20 74 68 65 20 70 4c 6f 6f 70 2d  ples, the pLoop-
14300 3e 6e 4f 75 74 20 76 61 6c 75 65 20 69 73 20 61  >nOut value is a
14310 64 6a 75 73 74 65 64 0a 2a 2a 20 61 73 20 66 6f  djusted.** as fo
14320 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6e  llows:.**.**   n
14330 4f 75 74 20 3d 20 6e 4f 75 74 20 2a 20 28 20 6d  Out = nOut * ( m
14340 69 6e 28 55 20 2d 20 4c 2c 20 31 29 20 2f 20 4e  in(U - L, 1) / N
14350 20 29 0a 2a 2a 0a 2a 2a 20 49 66 20 70 4c 6f 77   ).**.** If pLow
14360 65 72 20 69 73 20 4e 55 4c 4c 2c 20 6f 72 20 61  er is NULL, or a
14370 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65   value cannot be
14380 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
14390 74 68 65 20 74 65 72 6d 2c 20 4c 20 69 73 0a 2a  the term, L is.*
143a0 2a 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 49  * set to zero. I
143b0 66 20 70 55 70 70 65 72 20 69 73 20 4e 55 4c 4c  f pUpper is NULL
143c0 2c 20 6f 72 20 61 20 76 61 6c 75 65 20 63 61 6e  , or a value can
143d0 6e 6f 74 20 62 65 20 65 78 74 72 61 63 74 65 64  not be extracted
143e0 20 66 72 6f 6d 20 69 74 2c 0a 2a 2a 20 55 20 69   from it,.** U i
143f0 73 20 73 65 74 20 74 6f 20 4e 2e 0a 2a 2a 0a 2a  s set to N..**.*
14400 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73  * Normally, this
14410 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 2a   function sets *
14420 70 62 44 6f 6e 65 20 74 6f 20 31 20 62 65 66 6f  pbDone to 1 befo
14430 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 48 6f  re returning. Ho
14440 77 65 76 65 72 2c 0a 2a 2a 20 69 66 20 6e 6f 20  wever,.** if no 
14450 76 61 6c 75 65 20 63 61 6e 20 62 65 20 65 78 74  value can be ext
14460 72 61 63 74 65 64 20 66 72 6f 6d 20 65 69 74 68  racted from eith
14470 65 72 20 70 4c 6f 77 65 72 20 6f 72 20 70 55 70  er pLower or pUp
14480 70 65 72 20 28 61 6e 64 20 73 6f 20 74 68 65 0a  per (and so the.
14490 2a 2a 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  ** estimate of t
144a0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
144b0 73 20 64 65 6c 69 76 65 72 65 64 20 72 65 6d 61  s delivered rema
144c0 69 6e 73 20 75 6e 63 68 61 6e 67 65 64 29 2c 20  ins unchanged), 
144d0 2a 70 62 44 6f 6e 65 0a 2a 2a 20 69 73 20 6c 65  *pbDone.** is le
144e0 66 74 20 61 73 20 69 73 2e 0a 2a 2a 0a 2a 2a 20  ft as is..**.** 
144f0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
14500 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  rs, an SQLite er
14510 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
14520 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
14530 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a   .** SQLITE_OK..
14540 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
14550 65 72 65 52 61 6e 67 65 53 6b 69 70 53 63 61 6e  ereRangeSkipScan
14560 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Est(.  Parse *pP
14570 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
14580 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65  arsing & code ge
14590 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
145a0 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
145b0 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20 4c 6f  *pLower,   /* Lo
145c0 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65  wer bound on the
145d0 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3e 31   range. ex: "x>1
145e0 32 33 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  23" Might be NUL
145f0 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  L */.  WhereTerm
14600 20 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a 20 55   *pUpper,   /* U
14610 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68  pper bound on th
14620 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3c  e range. ex: "x<
14630 34 35 35 22 20 4d 69 67 68 74 20 62 65 20 4e 55  455" Might be NU
14640 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  LL */.  WhereLoo
14650 70 20 2a 70 4c 6f 6f 70 2c 20 20 20 20 2f 2a 20  p *pLoop,    /* 
14660 55 70 64 61 74 65 20 74 68 65 20 2e 6e 4f 75 74  Update the .nOut
14670 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 6c   value of this l
14680 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62  oop */.  int *pb
14690 44 6f 6e 65 20 20 20 20 20 20 20 20 20 20 2f 2a  Done          /*
146a0 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20   Set to true if 
146b0 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 65 78 70  at least one exp
146c0 72 2e 20 76 61 6c 75 65 20 65 78 74 72 61 63 74  r. value extract
146d0 65 64 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78  ed */.){.  Index
146e0 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62   *p = pLoop->u.b
146f0 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69  tree.pIndex;.  i
14700 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e  nt nEq = pLoop->
14710 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 73  u.btree.nEq;.  s
14720 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
14730 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e  rse->db;.  int n
14740 4c 6f 77 65 72 20 3d 20 2d 31 3b 0a 20 20 69 6e  Lower = -1;.  in
14750 74 20 6e 55 70 70 65 72 20 3d 20 70 2d 3e 6e 53  t nUpper = p->nS
14760 61 6d 70 6c 65 2b 31 3b 0a 20 20 69 6e 74 20 72  ample+1;.  int r
14770 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
14780 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 61   int iCol = p->a
14790 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 0a 20 20  iColumn[nEq];.  
147a0 75 38 20 61 66 66 20 3d 20 69 43 6f 6c 3e 3d 30  u8 aff = iCol>=0
147b0 20 3f 20 70 2d 3e 70 54 61 62 6c 65 2d 3e 61 43   ? p->pTable->aC
147c0 6f 6c 5b 69 43 6f 6c 5d 2e 61 66 66 69 6e 69 74  ol[iCol].affinit
147d0 79 20 3a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  y : SQLITE_AFF_I
147e0 4e 54 45 47 45 52 3b 0a 20 20 43 6f 6c 6c 53 65  NTEGER;.  CollSe
147f0 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 0a 20 20 73  q *pColl;.  .  s
14800 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 31  qlite3_value *p1
14810 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
14820 2a 20 56 61 6c 75 65 20 65 78 74 72 61 63 74 65  * Value extracte
14830 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20 2a 2f  d from pLower */
14840 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
14850 20 2a 70 32 20 3d 20 30 3b 20 20 20 20 20 20 20   *p2 = 0;       
14860 20 20 20 2f 2a 20 56 61 6c 75 65 20 65 78 74 72     /* Value extr
14870 61 63 74 65 64 20 66 72 6f 6d 20 70 55 70 70 65  acted from pUppe
14880 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  r */.  sqlite3_v
14890 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 20  alue *pVal = 0; 
148a0 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
148b0 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 72  extracted from r
148c0 65 63 6f 72 64 20 2a 2f 0a 0a 20 20 70 43 6f 6c  ecord */..  pCol
148d0 6c 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  l = sqlite3Locat
148e0 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
148f0 20 70 2d 3e 61 7a 43 6f 6c 6c 5b 6e 45 71 5d 29   p->azColl[nEq])
14900 3b 0a 20 20 69 66 28 20 70 4c 6f 77 65 72 20 29  ;.  if( pLower )
14910 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
14920 65 33 53 74 61 74 34 56 61 6c 75 65 46 72 6f 6d  e3Stat4ValueFrom
14930 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 4c 6f  Expr(pParse, pLo
14940 77 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  wer->pExpr->pRig
14950 68 74 2c 20 61 66 66 2c 20 26 70 31 29 3b 0a 20  ht, aff, &p1);. 
14960 20 20 20 6e 4c 6f 77 65 72 20 3d 20 30 3b 0a 20     nLower = 0;. 
14970 20 7d 0a 20 20 69 66 28 20 70 55 70 70 65 72 20   }.  if( pUpper 
14980 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
14990 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
149a0 69 74 65 33 53 74 61 74 34 56 61 6c 75 65 46 72  ite3Stat4ValueFr
149b0 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c 20 70  omExpr(pParse, p
149c0 55 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52  Upper->pExpr->pR
149d0 69 67 68 74 2c 20 61 66 66 2c 20 26 70 32 29 3b  ight, aff, &p2);
149e0 0a 20 20 20 20 6e 55 70 70 65 72 20 3d 20 70 32  .    nUpper = p2
149f0 20 3f 20 30 20 3a 20 70 2d 3e 6e 53 61 6d 70 6c   ? 0 : p->nSampl
14a00 65 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 31  e;.  }..  if( p1
14a10 20 7c 7c 20 70 32 20 29 7b 0a 20 20 20 20 69 6e   || p2 ){.    in
14a20 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 44 69  t i;.    int nDi
14a30 66 66 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ff;.    for(i=0;
14a40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
14a50 26 20 69 3c 70 2d 3e 6e 53 61 6d 70 6c 65 3b 20  & i<p->nSample; 
14a60 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  i++){.      rc =
14a70 20 73 71 6c 69 74 65 33 53 74 61 74 34 43 6f 6c   sqlite3Stat4Col
14a80 75 6d 6e 28 64 62 2c 20 70 2d 3e 61 53 61 6d 70  umn(db, p->aSamp
14a90 6c 65 5b 69 5d 2e 70 2c 20 70 2d 3e 61 53 61 6d  le[i].p, p->aSam
14aa0 70 6c 65 5b 69 5d 2e 6e 2c 20 6e 45 71 2c 20 26  ple[i].n, nEq, &
14ab0 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  pVal);.      if(
14ac0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
14ad0 26 20 70 31 20 29 7b 0a 20 20 20 20 20 20 20 20  & p1 ){.        
14ae0 69 6e 74 20 72 65 73 20 3d 20 73 71 6c 69 74 65  int res = sqlite
14af0 33 4d 65 6d 43 6f 6d 70 61 72 65 28 70 31 2c 20  3MemCompare(p1, 
14b00 70 56 61 6c 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20  pVal, pColl);.  
14b10 20 20 20 20 20 20 69 66 28 20 72 65 73 3e 3d 30        if( res>=0
14b20 20 29 20 6e 4c 6f 77 65 72 2b 2b 3b 0a 20 20 20   ) nLower++;.   
14b30 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
14b40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
14b50 70 32 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  p2 ){.        in
14b60 74 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 4d  t res = sqlite3M
14b70 65 6d 43 6f 6d 70 61 72 65 28 70 32 2c 20 70 56  emCompare(p2, pV
14b80 61 6c 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20  al, pColl);.    
14b90 20 20 20 20 69 66 28 20 72 65 73 3e 3d 30 20 29      if( res>=0 )
14ba0 20 6e 55 70 70 65 72 2b 2b 3b 0a 20 20 20 20 20   nUpper++;.     
14bb0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e 44 69   }.    }.    nDi
14bc0 66 66 20 3d 20 28 6e 55 70 70 65 72 20 2d 20 6e  ff = (nUpper - n
14bd0 4c 6f 77 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Lower);.    if( 
14be0 6e 44 69 66 66 3c 3d 30 20 29 20 6e 44 69 66 66  nDiff<=0 ) nDiff
14bf0 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 49 66   = 1;..    /* If
14c00 20 74 68 65 72 65 20 69 73 20 62 6f 74 68 20 61   there is both a
14c10 6e 20 75 70 70 65 72 20 61 6e 64 20 6c 6f 77 65  n upper and lowe
14c20 72 20 62 6f 75 6e 64 20 73 70 65 63 69 66 69 65  r bound specifie
14c30 64 2c 20 61 6e 64 20 74 68 65 20 0a 20 20 20 20  d, and the .    
14c40 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 69  ** comparisons i
14c50 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
14c60 79 20 61 72 65 20 63 6c 6f 73 65 20 74 6f 67 65  y are close toge
14c70 74 68 65 72 2c 20 75 73 65 20 74 68 65 20 66 61  ther, use the fa
14c80 6c 6c 62 61 63 6b 0a 20 20 20 20 2a 2a 20 6d 65  llback.    ** me
14c90 74 68 6f 64 20 28 61 73 73 75 6d 65 20 74 68 61  thod (assume tha
14ca0 74 20 74 68 65 20 73 63 61 6e 20 76 69 73 69 74  t the scan visit
14cb0 73 20 31 2f 36 34 20 6f 66 20 74 68 65 20 72 6f  s 1/64 of the ro
14cc0 77 73 29 20 66 6f 72 20 65 73 74 69 6d 61 74 69  ws) for estimati
14cd0 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 6e 75  ng.    ** the nu
14ce0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 76 69 73  mber of rows vis
14cf0 69 74 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  ited. Otherwise,
14d00 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75   estimate the nu
14d10 6d 62 65 72 20 6f 66 20 72 6f 77 73 0a 20 20 20  mber of rows.   
14d20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 6d 65   ** using the me
14d30 74 68 6f 64 20 64 65 73 63 72 69 62 65 64 20 69  thod described i
14d40 6e 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d  n the header com
14d50 6d 65 6e 74 20 66 6f 72 20 74 68 69 73 20 66 75  ment for this fu
14d60 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69  nction. */.    i
14d70 66 28 20 6e 44 69 66 66 21 3d 31 20 7c 7c 20 70  f( nDiff!=1 || p
14d80 55 70 70 65 72 3d 3d 30 20 7c 7c 20 70 4c 6f 77  Upper==0 || pLow
14d90 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  er==0 ){.      i
14da0 6e 74 20 6e 41 64 6a 75 73 74 20 3d 20 28 73 71  nt nAdjust = (sq
14db0 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 2d 3e 6e  lite3LogEst(p->n
14dc0 53 61 6d 70 6c 65 29 20 2d 20 73 71 6c 69 74 65  Sample) - sqlite
14dd0 33 4c 6f 67 45 73 74 28 6e 44 69 66 66 29 29 3b  3LogEst(nDiff));
14de0 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f  .      pLoop->nO
14df0 75 74 20 2d 3d 20 6e 41 64 6a 75 73 74 3b 0a 20  ut -= nAdjust;. 
14e00 20 20 20 20 20 2a 70 62 44 6f 6e 65 20 3d 20 31       *pbDone = 1
14e10 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41  ;.      WHERETRA
14e20 43 45 28 30 78 31 30 2c 20 28 22 72 61 6e 67 65  CE(0x10, ("range
14e30 20 73 6b 69 70 2d 73 63 61 6e 20 72 65 67 69 6f   skip-scan regio
14e40 6e 73 3a 20 25 75 2e 2e 25 75 20 20 61 64 6a 75  ns: %u..%u  adju
14e50 73 74 3d 25 64 20 65 73 74 3d 25 64 5c 6e 22 2c  st=%d est=%d\n",
14e60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14e70 20 20 20 20 20 20 20 20 20 20 20 20 6e 4c 6f 77              nLow
14e80 65 72 2c 20 6e 55 70 70 65 72 2c 20 6e 41 64 6a  er, nUpper, nAdj
14e90 75 73 74 2a 2d 31 2c 20 70 4c 6f 6f 70 2d 3e 6e  ust*-1, pLoop->n
14ea0 4f 75 74 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Out));.    }..  
14eb0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
14ec0 74 28 20 2a 70 62 44 6f 6e 65 3d 3d 30 20 29 3b  t( *pbDone==0 );
14ed0 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56  .  }..  sqlite3V
14ee0 61 6c 75 65 46 72 65 65 28 70 31 29 3b 0a 20 20  alueFree(p1);.  
14ef0 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
14f00 28 70 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  (p2);.  sqlite3V
14f10 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a  alueFree(pVal);.
14f20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
14f30 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
14f40 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
14f50 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _STAT4 */../*.**
14f60 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
14f70 73 20 75 73 65 64 20 74 6f 20 65 73 74 69 6d 61  s used to estima
14f80 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
14f90 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20   rows that will 
14fa0 62 65 20 76 69 73 69 74 65 64 0a 2a 2a 20 62 79  be visited.** by
14fb0 20 73 63 61 6e 6e 69 6e 67 20 61 6e 20 69 6e 64   scanning an ind
14fc0 65 78 20 66 6f 72 20 61 20 72 61 6e 67 65 20 6f  ex for a range o
14fd0 66 20 76 61 6c 75 65 73 2e 20 54 68 65 20 72 61  f values. The ra
14fe0 6e 67 65 20 6d 61 79 20 68 61 76 65 20 61 6e 20  nge may have an 
14ff0 75 70 70 65 72 0a 2a 2a 20 62 6f 75 6e 64 2c 20  upper.** bound, 
15000 61 20 6c 6f 77 65 72 20 62 6f 75 6e 64 2c 20 6f  a lower bound, o
15010 72 20 62 6f 74 68 2e 20 54 68 65 20 57 48 45 52  r both. The WHER
15020 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74  E clause terms t
15030 68 61 74 20 73 65 74 20 74 68 65 20 75 70 70 65  hat set the uppe
15040 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77 65 72 20 62  r.** and lower b
15050 6f 75 6e 64 73 20 61 72 65 20 72 65 70 72 65 73  ounds are repres
15060 65 6e 74 65 64 20 62 79 20 70 4c 6f 77 65 72 20  ented by pLower 
15070 61 6e 64 20 70 55 70 70 65 72 20 72 65 73 70 65  and pUpper respe
15080 63 74 69 76 65 6c 79 2e 20 46 6f 72 0a 2a 2a 20  ctively. For.** 
15090 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e  example, assumin
150a0 67 20 74 68 61 74 20 69 6e 64 65 78 20 70 20 69  g that index p i
150b0 73 20 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a 0a 2a  s on t1(a):.**.*
150c0 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20  *   ... FROM t1 
150d0 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e 44 20  WHERE a > ? AND 
150e0 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20 20 20  a < ? ....**    
150f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15100 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f  |_____|   |_____
15110 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
15120 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
15130 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
15140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
15150 6f 77 65 72 20 20 20 20 70 55 70 70 65 72 0a 2a  ower    pUpper.*
15160 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 6f  *.** If either o
15170 66 20 74 68 65 20 75 70 70 65 72 20 6f 72 20 6c  f the upper or l
15180 6f 77 65 72 20 62 6f 75 6e 64 20 69 73 20 6e 6f  ower bound is no
15190 74 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20  t present, then 
151a0 4e 55 4c 4c 20 69 73 20 70 61 73 73 65 64 20 69  NULL is passed i
151b0 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f 66 20 74 68  n.** place of th
151c0 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
151d0 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a  WhereTerm..**.**
151e0 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20 28 70   The value in (p
151f0 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75  Builder->pNew->u
15200 2e 62 74 72 65 65 2e 6e 45 71 29 20 69 73 20 74  .btree.nEq) is t
15210 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  he number of the
15220 20 69 6e 64 65 78 0a 2a 2a 20 63 6f 6c 75 6d 6e   index.** column
15230 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20   subject to the 
15240 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
15250 2e 20 4f 72 2c 20 65 71 75 69 76 61 6c 65 6e 74  . Or, equivalent
15260 6c 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ly, the number o
15270 66 0a 2a 2a 20 65 71 75 61 6c 69 74 79 20 63 6f  f.** equality co
15280 6e 73 74 72 61 69 6e 74 73 20 6f 70 74 69 6d 69  nstraints optimi
15290 7a 65 64 20 62 79 20 74 68 65 20 70 72 6f 70 6f  zed by the propo
152a0 73 65 64 20 69 6e 64 65 78 20 73 63 61 6e 2e 20  sed index scan. 
152b0 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20  For example,.** 
152c0 61 73 73 75 6d 69 6e 67 20 69 6e 64 65 78 20 70  assuming index p
152d0 20 69 73 20 6f 6e 20 74 31 28 61 2c 20 62 29 2c   is on t1(a, b),
152e0 20 61 6e 64 20 74 68 65 20 53 51 4c 20 71 75 65   and the SQL que
152f0 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e  ry is:.**.**   .
15300 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  .. FROM t1 WHERE
15310 20 61 20 3d 20 3f 20 41 4e 44 20 62 20 3e 20 3f   a = ? AND b > ?
15320 20 41 4e 44 20 62 20 3c 20 3f 20 2e 2e 2e 0a 2a   AND b < ? ....*
15330 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 69 73  *.** then nEq is
15340 20 73 65 74 20 74 6f 20 31 20 28 61 73 20 74 68   set to 1 (as th
15350 65 20 72 61 6e 67 65 20 72 65 73 74 72 69 63 74  e range restrict
15360 65 64 20 63 6f 6c 75 6d 6e 2c 20 62 2c 20 69 73  ed column, b, is
15370 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20   the second .** 
15380 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  left-most column
15390 20 6f 66 20 74 68 65 20 69 6e 64 65 78 29 2e 20   of the index). 
153a0 4f 72 2c 20 69 66 20 74 68 65 20 71 75 65 72 79  Or, if the query
153b0 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e   is:.**.**   ...
153c0 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
153d0 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e   > ? AND a < ? .
153e0 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45  ...**.** then nE
153f0 71 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a  q is set to 0..*
15400 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66  *.** When this f
15410 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
15420 64 2c 20 2a 70 6e 4f 75 74 20 69 73 20 73 65 74  d, *pnOut is set
15430 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 4c   to the sqlite3L
15440 6f 67 45 73 74 28 29 20 6f 66 20 74 68 65 0a 2a  ogEst() of the.*
15450 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * number of rows
15460 20 74 68 61 74 20 74 68 65 20 69 6e 64 65 78 20   that the index 
15470 73 63 61 6e 20 69 73 20 65 78 70 65 63 74 65 64  scan is expected
15480 20 74 6f 20 76 69 73 69 74 20 77 69 74 68 6f 75   to visit withou
15490 74 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 69 6e  t .** considerin
154a0 67 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 73  g the range cons
154b0 74 72 61 69 6e 74 73 2e 20 49 66 20 6e 45 71 20  traints. If nEq 
154c0 69 73 20 30 2c 20 74 68 65 6e 20 2a 70 6e 4f 75  is 0, then *pnOu
154d0 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  t is the number 
154e0 6f 66 20 0a 2a 2a 20 72 6f 77 73 20 69 6e 20 74  of .** rows in t
154f0 68 65 20 69 6e 64 65 78 2e 20 41 73 73 75 6d 69  he index. Assumi
15500 6e 67 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  ng no error occu
15510 72 73 2c 20 2a 70 6e 4f 75 74 20 69 73 20 61 64  rs, *pnOut is ad
15520 6a 75 73 74 65 64 20 28 72 65 64 75 63 65 64 29  justed (reduced)
15530 0a 2a 2a 20 74 6f 20 61 63 63 6f 75 6e 74 20 66  .** to account f
15540 6f 72 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e  or the range con
15550 73 74 72 61 69 6e 74 73 20 70 4c 6f 77 65 72 20  straints pLower 
15560 61 6e 64 20 70 55 70 70 65 72 2e 0a 2a 2a 20 0a  and pUpper..** .
15570 2a 2a 20 49 6e 20 74 68 65 20 61 62 73 65 6e 63  ** In the absenc
15580 65 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74  e of sqlite_stat
15590 34 20 41 4e 41 4c 59 5a 45 20 64 61 74 61 2c 20  4 ANALYZE data, 
155a0 6f 72 20 69 66 20 73 75 63 68 20 64 61 74 61 20  or if such data 
155b0 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 75 73 65  cannot be.** use
155c0 64 2c 20 61 20 73 69 6e 67 6c 65 20 72 61 6e 67  d, a single rang
155d0 65 20 69 6e 65 71 75 61 6c 69 74 79 20 72 65 64  e inequality red
155e0 75 63 65 73 20 74 68 65 20 73 65 61 72 63 68 20  uces the search 
155f0 73 70 61 63 65 20 62 79 20 61 20 66 61 63 74 6f  space by a facto
15600 72 20 6f 66 20 34 2e 20 0a 2a 2a 20 61 6e 64 20  r of 4. .** and 
15610 61 20 70 61 69 72 20 6f 66 20 63 6f 6e 73 74 72  a pair of constr
15620 61 69 6e 74 73 20 28 78 3e 3f 20 41 4e 44 20 78  aints (x>? AND x
15630 3c 3f 29 20 72 65 64 75 63 65 73 20 74 68 65 20  <?) reduces the 
15640 65 78 70 65 63 74 65 64 20 6e 75 6d 62 65 72 20  expected number 
15650 6f 66 0a 2a 2a 20 72 6f 77 73 20 76 69 73 69 74  of.** rows visit
15660 65 64 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f  ed by a factor o
15670 66 20 36 34 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  f 64..*/.static 
15680 69 6e 74 20 77 68 65 72 65 52 61 6e 67 65 53 63  int whereRangeSc
15690 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a  anEst(.  Parse *
156a0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
156b0 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20   Parsing & code 
156c0 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
156d0 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  xt */.  WhereLoo
156e0 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
156f0 65 72 2c 0a 20 20 57 68 65 72 65 54 65 72 6d 20  er,.  WhereTerm 
15700 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20 4c 6f  *pLower,   /* Lo
15710 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65  wer bound on the
15720 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3e 31   range. ex: "x>1
15730 32 33 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  23" Might be NUL
15740 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  L */.  WhereTerm
15750 20 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a 20 55   *pUpper,   /* U
15760 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68  pper bound on th
15770 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3c  e range. ex: "x<
15780 34 35 35 22 20 4d 69 67 68 74 20 62 65 20 4e 55  455" Might be NU
15790 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  LL */.  WhereLoo
157a0 70 20 2a 70 4c 6f 6f 70 20 20 20 20 20 2f 2a 20  p *pLoop     /* 
157b0 4d 6f 64 69 66 79 20 74 68 65 20 2e 6e 4f 75 74  Modify the .nOut
157c0 20 61 6e 64 20 6d 61 79 62 65 20 2e 72 52 75 6e   and maybe .rRun
157d0 20 66 69 65 6c 64 73 20 2a 2f 0a 29 7b 0a 20 20   fields */.){.  
157e0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
157f0 4f 4b 3b 0a 20 20 69 6e 74 20 6e 4f 75 74 20 3d  OK;.  int nOut =
15800 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20   pLoop->nOut;.  
15810 4c 6f 67 45 73 74 20 6e 4e 65 77 3b 0a 0a 23 69  LogEst nNew;..#i
15820 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
15830 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
15840 34 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70  4.  Index *p = p
15850 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
15860 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20  ndex;.  int nEq 
15870 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
15880 2e 6e 45 71 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  .nEq;..  if( p->
15890 6e 53 61 6d 70 6c 65 3e 30 20 26 26 20 6e 45 71  nSample>0 && nEq
158a0 3c 70 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 20 29  <p->nSampleCol )
158b0 7b 0a 20 20 20 20 69 66 28 20 6e 45 71 3d 3d 70  {.    if( nEq==p
158c0 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
158d0 69 64 20 29 7b 0a 20 20 20 20 20 20 55 6e 70 61  id ){.      Unpa
158e0 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 52 65 63  ckedRecord *pRec
158f0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65   = pBuilder->pRe
15900 63 3b 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74  c;.      tRowcnt
15910 20 61 5b 32 5d 3b 0a 20 20 20 20 20 20 75 38 20   a[2];.      u8 
15920 61 66 66 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 56  aff;..      /* V
15930 61 72 69 61 62 6c 65 20 69 4c 6f 77 65 72 20 77  ariable iLower w
15940 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 74 68  ill be set to th
15950 65 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  e estimate of th
15960 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
15970 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 74 68   in .      ** th
15980 65 20 69 6e 64 65 78 20 74 68 61 74 20 61 72 65  e index that are
15990 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6c   less than the l
159a0 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68  ower bound of th
159b0 65 20 72 61 6e 67 65 20 71 75 65 72 79 2e 20 54  e range query. T
159c0 68 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 77 65  he.      ** lowe
159d0 72 20 62 6f 75 6e 64 20 62 65 69 6e 67 20 74 68  r bound being th
159e0 65 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 20  e concatenation 
159f0 6f 66 20 24 50 20 61 6e 64 20 24 4c 2c 20 77 68  of $P and $L, wh
15a00 65 72 65 20 24 50 20 69 73 20 74 68 65 0a 20 20  ere $P is the.  
15a10 20 20 20 20 2a 2a 20 6b 65 79 2d 70 72 65 66 69      ** key-prefi
15a20 78 20 66 6f 72 6d 65 64 20 62 79 20 74 68 65 20  x formed by the 
15a30 6e 45 71 20 76 61 6c 75 65 73 20 6d 61 74 63 68  nEq values match
15a40 65 64 20 61 67 61 69 6e 73 74 20 74 68 65 20 6e  ed against the n
15a50 45 71 20 6c 65 66 74 2d 6d 6f 73 74 0a 20 20 20  Eq left-most.   
15a60 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 6f 66     ** columns of
15a70 20 74 68 65 20 69 6e 64 65 78 2c 20 61 6e 64 20   the index, and 
15a80 24 4c 20 69 73 20 74 68 65 20 76 61 6c 75 65 20  $L is the value 
15a90 69 6e 20 70 4c 6f 77 65 72 2e 0a 20 20 20 20 20  in pLower..     
15aa0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 72 2c   **.      ** Or,
15ab0 20 69 66 20 70 4c 6f 77 65 72 20 69 73 20 4e 55   if pLower is NU
15ac0 4c 4c 20 6f 72 20 24 4c 20 63 61 6e 6e 6f 74 20  LL or $L cannot 
15ad0 62 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  be extracted fro
15ae0 6d 20 69 74 20 28 62 65 63 61 75 73 65 20 69 74  m it (because it
15af0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  .      ** is not
15b00 20 61 20 73 69 6d 70 6c 65 20 76 61 72 69 61 62   a simple variab
15b10 6c 65 20 6f 72 20 6c 69 74 65 72 61 6c 20 76 61  le or literal va
15b20 6c 75 65 29 2c 20 74 68 65 20 6c 6f 77 65 72 20  lue), the lower 
15b30 62 6f 75 6e 64 20 6f 66 20 74 68 65 0a 20 20 20  bound of the.   
15b40 20 20 20 2a 2a 20 72 61 6e 67 65 20 69 73 20 24     ** range is $
15b50 50 2e 20 44 75 65 20 74 6f 20 61 20 71 75 69 72  P. Due to a quir
15b60 6b 20 69 6e 20 74 68 65 20 77 61 79 20 77 68 65  k in the way whe
15b70 72 65 4b 65 79 53 74 61 74 73 28 29 20 77 6f 72  reKeyStats() wor
15b80 6b 73 2c 20 65 76 65 6e 0a 20 20 20 20 20 20 2a  ks, even.      *
15b90 2a 20 69 66 20 24 4c 20 69 73 20 61 76 61 69 6c  * if $L is avail
15ba0 61 62 6c 65 2c 20 77 68 65 72 65 4b 65 79 53 74  able, whereKeySt
15bb0 61 74 73 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ats() is called 
15bc0 66 6f 72 20 62 6f 74 68 20 28 24 50 29 20 61 6e  for both ($P) an
15bd0 64 20 0a 20 20 20 20 20 20 2a 2a 20 28 24 50 3a  d .      ** ($P:
15be0 24 4c 29 20 61 6e 64 20 74 68 65 20 6c 61 72 67  $L) and the larg
15bf0 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 72 65  er of the two re
15c00 74 75 72 6e 65 64 20 76 61 6c 75 65 73 20 69 73  turned values is
15c10 20 75 73 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a   used..      **.
15c20 20 20 20 20 20 20 2a 2a 20 53 69 6d 69 6c 61 72        ** Similar
15c30 6c 79 2c 20 69 55 70 70 65 72 20 69 73 20 74 6f  ly, iUpper is to
15c40 20 62 65 20 73 65 74 20 74 6f 20 74 68 65 20 65   be set to the e
15c50 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e  stimate of the n
15c60 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 0a 20 20  umber of rows.  
15c70 20 20 20 20 2a 2a 20 6c 65 73 73 20 74 68 61 6e      ** less than
15c80 20 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64   the upper bound
15c90 20 6f 66 20 74 68 65 20 72 61 6e 67 65 20 71 75   of the range qu
15ca0 65 72 79 2e 20 57 68 65 72 65 20 74 68 65 20 75  ery. Where the u
15cb0 70 70 65 72 20 62 6f 75 6e 64 0a 20 20 20 20 20  pper bound.     
15cc0 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20 28 24   ** is either ($
15cd0 50 29 20 6f 72 20 28 24 50 3a 24 55 29 2e 20 41  P) or ($P:$U). A
15ce0 67 61 69 6e 2c 20 65 76 65 6e 20 69 66 20 24 55  gain, even if $U
15cf0 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 62   is available, b
15d00 6f 74 68 20 76 61 6c 75 65 73 0a 20 20 20 20 20  oth values.     
15d10 20 2a 2a 20 6f 66 20 69 55 70 70 65 72 20 61 72   ** of iUpper ar
15d20 65 20 72 65 71 75 65 73 74 65 64 20 6f 66 20 77  e requested of w
15d30 68 65 72 65 4b 65 79 53 74 61 74 73 28 29 20 61  hereKeyStats() a
15d40 6e 64 20 74 68 65 20 73 6d 61 6c 6c 65 72 20 75  nd the smaller u
15d50 73 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  sed..      **.  
15d60 20 20 20 20 2a 2a 20 54 68 65 20 6e 75 6d 62 65      ** The numbe
15d70 72 20 6f 66 20 72 6f 77 73 20 62 65 74 77 65 65  r of rows betwee
15d80 6e 20 74 68 65 20 74 77 6f 20 62 6f 75 6e 64 73  n the two bounds
15d90 20 69 73 20 74 68 65 6e 20 6a 75 73 74 20 69 55   is then just iU
15da0 70 70 65 72 2d 69 4c 6f 77 65 72 2e 0a 20 20 20  pper-iLower..   
15db0 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 52 6f 77     */.      tRow
15dc0 63 6e 74 20 69 4c 6f 77 65 72 3b 20 20 20 20 20  cnt iLower;     
15dd0 2f 2a 20 52 6f 77 73 20 6c 65 73 73 20 74 68 61  /* Rows less tha
15de0 6e 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e  n the lower boun
15df0 64 20 2a 2f 0a 20 20 20 20 20 20 74 52 6f 77 63  d */.      tRowc
15e00 6e 74 20 69 55 70 70 65 72 3b 20 20 20 20 20 2f  nt iUpper;     /
15e10 2a 20 52 6f 77 73 20 6c 65 73 73 20 74 68 61 6e  * Rows less than
15e20 20 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e 64   the upper bound
15e30 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 4c   */.      int iL
15e40 77 72 49 64 78 20 3d 20 2d 32 3b 20 20 20 2f 2a  wrIdx = -2;   /*
15e50 20 61 53 61 6d 70 6c 65 5b 5d 20 66 6f 72 20 74   aSample[] for t
15e60 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 2a  he lower bound *
15e70 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 55 70 72  /.      int iUpr
15e80 49 64 78 20 3d 20 2d 31 3b 20 20 20 2f 2a 20 61  Idx = -1;   /* a
15e90 53 61 6d 70 6c 65 5b 5d 20 66 6f 72 20 74 68 65  Sample[] for the
15ea0 20 75 70 70 65 72 20 62 6f 75 6e 64 20 2a 2f 0a   upper bound */.
15eb0 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 63 20  .      if( pRec 
15ec0 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  ){.        testc
15ed0 61 73 65 28 20 70 52 65 63 2d 3e 6e 46 69 65 6c  ase( pRec->nFiel
15ee0 64 21 3d 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65  d!=pBuilder->nRe
15ef0 63 56 61 6c 69 64 20 29 3b 0a 20 20 20 20 20 20  cValid );.      
15f00 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d    pRec->nField =
15f10 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56   pBuilder->nRecV
15f20 61 6c 69 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  alid;.      }.  
15f30 20 20 20 20 69 66 28 20 6e 45 71 3d 3d 70 2d 3e      if( nEq==p->
15f40 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20  nKeyCol ){.     
15f50 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
15f60 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20  AFF_INTEGER;.   
15f70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15f80 20 20 61 66 66 20 3d 20 70 2d 3e 70 54 61 62 6c    aff = p->pTabl
15f90 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c  e->aCol[p->aiCol
15fa0 75 6d 6e 5b 6e 45 71 5d 5d 2e 61 66 66 69 6e 69  umn[nEq]].affini
15fb0 74 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ty;.      }.    
15fc0 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 69    /* Determine i
15fd0 4c 6f 77 65 72 20 61 6e 64 20 69 55 70 70 65 72  Lower and iUpper
15fe0 20 75 73 69 6e 67 20 28 24 50 29 20 6f 6e 6c 79   using ($P) only
15ff0 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e  . */.      if( n
16000 45 71 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Eq==0 ){.       
16010 20 69 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20   iLower = 0;.   
16020 20 20 20 20 20 69 55 70 70 65 72 20 3d 20 70 2d       iUpper = p-
16030 3e 6e 52 6f 77 45 73 74 30 3b 0a 20 20 20 20 20  >nRowEst0;.     
16040 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
16050 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61  /* Note: this ca
16060 6c 6c 20 63 6f 75 6c 64 20 62 65 20 6f 70 74 69  ll could be opti
16070 6d 69 7a 65 64 20 61 77 61 79 20 2d 20 73 69 6e  mized away - sin
16080 63 65 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75  ce the same valu
16090 65 73 20 6d 75 73 74 20 0a 20 20 20 20 20 20 20  es must .       
160a0 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 72 65   ** have been re
160b0 71 75 65 73 74 65 64 20 77 68 65 6e 20 74 65 73  quested when tes
160c0 74 69 6e 67 20 6b 65 79 20 24 50 20 69 6e 20 77  ting key $P in w
160d0 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74  hereEqualScanEst
160e0 28 29 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ().  */.        
160f0 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50  whereKeyStats(pP
16100 61 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30  arse, p, pRec, 0
16110 2c 20 61 29 3b 0a 20 20 20 20 20 20 20 20 69 4c  , a);.        iL
16120 6f 77 65 72 20 3d 20 61 5b 30 5d 3b 0a 20 20 20  ower = a[0];.   
16130 20 20 20 20 20 69 55 70 70 65 72 20 3d 20 61 5b       iUpper = a[
16140 30 5d 20 2b 20 61 5b 31 5d 3b 0a 20 20 20 20 20  0] + a[1];.     
16150 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74   }..      assert
16160 28 20 70 4c 6f 77 65 72 3d 3d 30 20 7c 7c 20 28  ( pLower==0 || (
16170 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f  pLower->eOperato
16180 72 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45  r & (WO_GT|WO_GE
16190 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  ))!=0 );.      a
161a0 73 73 65 72 74 28 20 70 55 70 70 65 72 3d 3d 30  ssert( pUpper==0
161b0 20 7c 7c 20 28 70 55 70 70 65 72 2d 3e 65 4f 70   || (pUpper->eOp
161c0 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c  erator & (WO_LT|
161d0 57 4f 5f 4c 45 29 29 21 3d 30 20 29 3b 0a 20 20  WO_LE))!=0 );.  
161e0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
161f0 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a  SortOrder!=0 );.
16200 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 53 6f        if( p->aSo
16210 72 74 4f 72 64 65 72 5b 6e 45 71 5d 20 29 7b 0a  rtOrder[nEq] ){.
16220 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
16230 6f 6c 65 73 20 6f 66 20 70 4c 6f 77 65 72 20 61  oles of pLower a
16240 6e 64 20 70 55 70 70 65 72 20 61 72 65 20 73 77  nd pUpper are sw
16250 61 70 70 65 64 20 66 6f 72 20 61 20 44 45 53 43  apped for a DESC
16260 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
16270 20 20 53 57 41 50 28 57 68 65 72 65 54 65 72 6d    SWAP(WhereTerm
16280 2a 2c 20 70 4c 6f 77 65 72 2c 20 70 55 70 70 65  *, pLower, pUppe
16290 72 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  r);.      }..   
162a0 20 20 20 2f 2a 20 49 66 20 70 6f 73 73 69 62 6c     /* If possibl
162b0 65 2c 20 69 6d 70 72 6f 76 65 20 6f 6e 20 74 68  e, improve on th
162c0 65 20 69 4c 6f 77 65 72 20 65 73 74 69 6d 61 74  e iLower estimat
162d0 65 20 75 73 69 6e 67 20 28 24 50 3a 24 4c 29 2e  e using ($P:$L).
162e0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4c   */.      if( pL
162f0 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  ower ){.        
16300 69 6e 74 20 62 4f 6b 3b 20 20 20 20 20 20 20 20  int bOk;        
16310 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
16320 72 75 65 20 69 66 20 76 61 6c 75 65 20 69 73 20  rue if value is 
16330 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70  extracted from p
16340 45 78 70 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  Expr */.        
16350 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c  Expr *pExpr = pL
16360 6f 77 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69  ower->pExpr->pRi
16370 67 68 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ght;.        rc 
16380 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72  = sqlite3Stat4Pr
16390 6f 62 65 53 65 74 56 61 6c 75 65 28 70 50 61 72  obeSetValue(pPar
163a0 73 65 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45  se, p, &pRec, pE
163b0 78 70 72 2c 20 61 66 66 2c 20 6e 45 71 2c 20 26  xpr, aff, nEq, &
163c0 62 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 66  bOk);.        if
163d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
163e0 26 26 20 62 4f 6b 20 29 7b 0a 20 20 20 20 20 20  && bOk ){.      
163f0 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4e 65 77      tRowcnt iNew
16400 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4c 77 72  ;.          iLwr
16410 49 64 78 20 3d 20 77 68 65 72 65 4b 65 79 53 74  Idx = whereKeySt
16420 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ats(pParse, p, p
16430 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20 20  Rec, 0, a);.    
16440 20 20 20 20 20 20 69 4e 65 77 20 3d 20 61 5b 30        iNew = a[0
16450 5d 20 2b 20 28 28 70 4c 6f 77 65 72 2d 3e 65 4f  ] + ((pLower->eO
16460 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 47 54  perator & (WO_GT
16470 7c 57 4f 5f 4c 45 29 29 20 3f 20 61 5b 31 5d 20  |WO_LE)) ? a[1] 
16480 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  : 0);.          
16490 69 66 28 20 69 4e 65 77 3e 69 4c 6f 77 65 72 20  if( iNew>iLower 
164a0 29 20 69 4c 6f 77 65 72 20 3d 20 69 4e 65 77 3b  ) iLower = iNew;
164b0 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 75 74 2d  .          nOut-
164c0 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4c 6f  -;.          pLo
164d0 77 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  wer = 0;.       
164e0 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
164f0 20 20 2f 2a 20 49 66 20 70 6f 73 73 69 62 6c 65    /* If possible
16500 2c 20 69 6d 70 72 6f 76 65 20 6f 6e 20 74 68 65  , improve on the
16510 20 69 55 70 70 65 72 20 65 73 74 69 6d 61 74 65   iUpper estimate
16520 20 75 73 69 6e 67 20 28 24 50 3a 24 55 29 2e 20   using ($P:$U). 
16530 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 55 70  */.      if( pUp
16540 70 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69  per ){.        i
16550 6e 74 20 62 4f 6b 3b 20 20 20 20 20 20 20 20 20  nt bOk;         
16560 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
16570 75 65 20 69 66 20 76 61 6c 75 65 20 69 73 20 65  ue if value is e
16580 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 45  xtracted from pE
16590 78 70 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 45  xpr */.        E
165a0 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 55 70  xpr *pExpr = pUp
165b0 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  per->pExpr->pRig
165c0 68 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ht;.        rc =
165d0 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f   sqlite3Stat4Pro
165e0 62 65 53 65 74 56 61 6c 75 65 28 70 50 61 72 73  beSetValue(pPars
165f0 65 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78  e, p, &pRec, pEx
16600 70 72 2c 20 61 66 66 2c 20 6e 45 71 2c 20 26 62  pr, aff, nEq, &b
16610 4f 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Ok);.        if(
16620 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
16630 26 20 62 4f 6b 20 29 7b 0a 20 20 20 20 20 20 20  & bOk ){.       
16640 20 20 20 74 52 6f 77 63 6e 74 20 69 4e 65 77 3b     tRowcnt iNew;
16650 0a 20 20 20 20 20 20 20 20 20 20 69 55 70 72 49  .          iUprI
16660 64 78 20 3d 20 77 68 65 72 65 4b 65 79 53 74 61  dx = whereKeySta
16670 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52  ts(pParse, p, pR
16680 65 63 2c 20 31 2c 20 61 29 3b 0a 20 20 20 20 20  ec, 1, a);.     
16690 20 20 20 20 20 69 4e 65 77 20 3d 20 61 5b 30 5d       iNew = a[0]
166a0 20 2b 20 28 28 70 55 70 70 65 72 2d 3e 65 4f 70   + ((pUpper->eOp
166b0 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 47 54 7c  erator & (WO_GT|
166c0 57 4f 5f 4c 45 29 29 20 3f 20 61 5b 31 5d 20 3a  WO_LE)) ? a[1] :
166d0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   0);.          i
166e0 66 28 20 69 4e 65 77 3c 69 55 70 70 65 72 20 29  f( iNew<iUpper )
166f0 20 69 55 70 70 65 72 20 3d 20 69 4e 65 77 3b 0a   iUpper = iNew;.
16700 20 20 20 20 20 20 20 20 20 20 6e 4f 75 74 2d 2d            nOut--
16710 3b 0a 20 20 20 20 20 20 20 20 20 20 70 55 70 70  ;.          pUpp
16720 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  er = 0;.        
16730 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
16740 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20   pBuilder->pRec 
16750 3d 20 70 52 65 63 3b 0a 20 20 20 20 20 20 69 66  = pRec;.      if
16760 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
16770 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
16780 55 70 70 65 72 3e 69 4c 6f 77 65 72 20 29 7b 0a  Upper>iLower ){.
16790 20 20 20 20 20 20 20 20 20 20 6e 4e 65 77 20 3d            nNew =
167a0 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 69   sqlite3LogEst(i
167b0 55 70 70 65 72 20 2d 20 69 4c 6f 77 65 72 29 3b  Upper - iLower);
167c0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 55  .          /* TU
167d0 4e 49 4e 47 3a 20 20 49 66 20 62 6f 74 68 20 69  NING:  If both i
167e0 55 70 70 65 72 20 61 6e 64 20 69 4c 6f 77 65 72  Upper and iLower
167f0 20 61 72 65 20 64 65 72 69 76 65 64 20 66 72 6f   are derived fro
16800 6d 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20  m the same.     
16810 20 20 20 20 20 2a 2a 20 73 61 6d 70 6c 65 2c 20       ** sample, 
16820 74 68 65 6e 20 61 73 73 75 6d 65 20 74 68 65 79  then assume they
16830 20 61 72 65 20 34 78 20 6d 6f 72 65 20 73 65 6c   are 4x more sel
16840 65 63 74 69 76 65 2e 20 20 54 68 69 73 20 62 72  ective.  This br
16850 69 6e 67 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ings.          *
16860 2a 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20  * the estimated 
16870 73 65 6c 65 63 74 69 76 69 74 79 20 6d 6f 72 65  selectivity more
16880 20 69 6e 20 6c 69 6e 65 20 77 69 74 68 20 77 68   in line with wh
16890 61 74 20 69 74 20 77 6f 75 6c 64 20 62 65 0a 20  at it would be. 
168a0 20 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 65           ** if e
168b0 73 74 69 6d 61 74 65 64 20 77 69 74 68 6f 75 74  stimated without
168c0 20 74 68 65 20 75 73 65 20 6f 66 20 53 54 41 54   the use of STAT
168d0 33 2f 34 20 74 61 62 6c 65 73 2e 20 2a 2f 0a 20  3/4 tables. */. 
168e0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4c 77           if( iLw
168f0 72 49 64 78 3d 3d 69 55 70 72 49 64 78 20 29 20  rIdx==iUprIdx ) 
16900 6e 4e 65 77 20 2d 3d 20 32 30 3b 20 20 61 73 73  nNew -= 20;  ass
16910 65 72 74 28 20 32 30 3d 3d 73 71 6c 69 74 65 33  ert( 20==sqlite3
16920 4c 6f 67 45 73 74 28 34 29 20 29 3b 0a 20 20 20  LogEst(4) );.   
16930 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
16940 20 20 20 20 20 20 6e 4e 65 77 20 3d 20 31 30 3b        nNew = 10;
16950 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
16960 31 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  10==sqlite3LogEs
16970 74 28 32 29 20 29 3b 0a 20 20 20 20 20 20 20 20  t(2) );.        
16980 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 4e  }.        if( nN
16990 65 77 3c 6e 4f 75 74 20 29 7b 0a 20 20 20 20 20  ew<nOut ){.     
169a0 20 20 20 20 20 6e 4f 75 74 20 3d 20 6e 4e 65 77       nOut = nNew
169b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
169c0 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
169d0 78 31 30 2c 20 28 22 53 54 41 54 34 20 72 61 6e  x10, ("STAT4 ran
169e0 67 65 20 73 63 61 6e 3a 20 25 75 2e 2e 25 75 20  ge scan: %u..%u 
169f0 20 65 73 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20   est=%d\n",.    
16a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a10 20 20 20 20 20 20 20 28 75 33 32 29 69 4c 6f 77         (u32)iLow
16a20 65 72 2c 20 28 75 33 32 29 69 55 70 70 65 72 2c  er, (u32)iUpper,
16a30 20 6e 4f 75 74 29 29 3b 0a 20 20 20 20 20 20 7d   nOut));.      }
16a40 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16a50 20 20 69 6e 74 20 62 44 6f 6e 65 20 3d 20 30 3b    int bDone = 0;
16a60 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72  .      rc = wher
16a70 65 52 61 6e 67 65 53 6b 69 70 53 63 61 6e 45 73  eRangeSkipScanEs
16a80 74 28 70 50 61 72 73 65 2c 20 70 4c 6f 77 65 72  t(pParse, pLower
16a90 2c 20 70 55 70 70 65 72 2c 20 70 4c 6f 6f 70 2c  , pUpper, pLoop,
16aa0 20 26 62 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20   &bDone);.      
16ab0 69 66 28 20 62 44 6f 6e 65 20 29 20 72 65 74 75  if( bDone ) retu
16ac0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
16ad0 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f  .#else.  UNUSED_
16ae0 50 41 52 41 4d 45 54 45 52 28 70 50 61 72 73 65  PARAMETER(pParse
16af0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
16b00 4d 45 54 45 52 28 70 42 75 69 6c 64 65 72 29 3b  METER(pBuilder);
16b10 0a 20 20 61 73 73 65 72 74 28 20 70 4c 6f 77 65  .  assert( pLowe
16b20 72 20 7c 7c 20 70 55 70 70 65 72 20 29 3b 0a 23  r || pUpper );.#
16b30 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
16b40 70 55 70 70 65 72 3d 3d 30 20 7c 7c 20 28 70 55  pUpper==0 || (pU
16b50 70 70 65 72 2d 3e 77 74 46 6c 61 67 73 20 26 20  pper->wtFlags & 
16b60 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29  TERM_VNULL)==0 )
16b70 3b 0a 20 20 6e 4e 65 77 20 3d 20 77 68 65 72 65  ;.  nNew = where
16b80 52 61 6e 67 65 41 64 6a 75 73 74 28 70 4c 6f 77  RangeAdjust(pLow
16b90 65 72 2c 20 6e 4f 75 74 29 3b 0a 20 20 6e 4e 65  er, nOut);.  nNe
16ba0 77 20 3d 20 77 68 65 72 65 52 61 6e 67 65 41 64  w = whereRangeAd
16bb0 6a 75 73 74 28 70 55 70 70 65 72 2c 20 6e 4e 65  just(pUpper, nNe
16bc0 77 29 3b 0a 0a 20 20 2f 2a 20 54 55 4e 49 4e 47  w);..  /* TUNING
16bd0 3a 20 49 66 20 74 68 65 72 65 20 69 73 20 62 6f  : If there is bo
16be0 74 68 20 61 6e 20 75 70 70 65 72 20 61 6e 64 20  th an upper and 
16bf0 6c 6f 77 65 72 20 6c 69 6d 69 74 20 61 6e 64 20  lower limit and 
16c00 6e 65 69 74 68 65 72 20 6c 69 6d 69 74 0a 20 20  neither limit.  
16c10 2a 2a 20 68 61 73 20 61 6e 20 61 70 70 6c 69 63  ** has an applic
16c20 61 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20 6c 69  ation-defined li
16c30 6b 65 6c 69 68 6f 6f 64 28 29 2c 20 61 73 73 75  kelihood(), assu
16c40 6d 65 20 74 68 65 20 72 61 6e 67 65 20 69 73 0a  me the range is.
16c50 20 20 2a 2a 20 72 65 64 75 63 65 64 20 62 79 20    ** reduced by 
16c60 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 37 35  an additional 75
16c70 25 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  %. This means th
16c80 61 74 2c 20 62 79 20 64 65 66 61 75 6c 74 2c 20  at, by default, 
16c90 61 6e 20 6f 70 65 6e 2d 65 6e 64 65 64 0a 20 20  an open-ended.  
16ca0 2a 2a 20 72 61 6e 67 65 20 71 75 65 72 79 20 28  ** range query (
16cb0 65 2e 67 2e 20 63 6f 6c 20 3e 20 3f 29 20 69 73  e.g. col > ?) is
16cc0 20 61 73 73 75 6d 65 64 20 74 6f 20 6d 61 74 63   assumed to matc
16cd0 68 20 31 2f 34 20 6f 66 20 74 68 65 20 72 6f 77  h 1/4 of the row
16ce0 73 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e  s in the.  ** in
16cf0 64 65 78 2e 20 57 68 69 6c 65 20 61 20 63 6c 6f  dex. While a clo
16d00 73 65 64 20 72 61 6e 67 65 20 28 65 2e 67 2e 20  sed range (e.g. 
16d10 63 6f 6c 20 42 45 54 57 45 45 4e 20 3f 20 41 4e  col BETWEEN ? AN
16d20 44 20 3f 29 20 69 73 20 65 73 74 69 6d 61 74 65  D ?) is estimate
16d30 64 20 74 6f 0a 20 20 2a 2a 20 6d 61 74 63 68 20  d to.  ** match 
16d40 31 2f 36 34 20 6f 66 20 74 68 65 20 69 6e 64 65  1/64 of the inde
16d50 78 2e 20 2a 2f 20 0a 20 20 69 66 28 20 70 4c 6f  x. */ .  if( pLo
16d60 77 65 72 20 26 26 20 70 4c 6f 77 65 72 2d 3e 74  wer && pLower->t
16d70 72 75 74 68 50 72 6f 62 3e 30 20 26 26 20 70 55  ruthProb>0 && pU
16d80 70 70 65 72 20 26 26 20 70 55 70 70 65 72 2d 3e  pper && pUpper->
16d90 74 72 75 74 68 50 72 6f 62 3e 30 20 29 7b 0a 20  truthProb>0 ){. 
16da0 20 20 20 6e 4e 65 77 20 2d 3d 20 32 30 3b 0a 20     nNew -= 20;. 
16db0 20 7d 0a 0a 20 20 6e 4f 75 74 20 2d 3d 20 28 70   }..  nOut -= (p
16dc0 4c 6f 77 65 72 21 3d 30 29 20 2b 20 28 70 55 70  Lower!=0) + (pUp
16dd0 70 65 72 21 3d 30 29 3b 0a 20 20 69 66 28 20 6e  per!=0);.  if( n
16de0 4e 65 77 3c 31 30 20 29 20 6e 4e 65 77 20 3d 20  New<10 ) nNew = 
16df0 31 30 3b 0a 20 20 69 66 28 20 6e 4e 65 77 3c 6e  10;.  if( nNew<n
16e00 4f 75 74 20 29 20 6e 4f 75 74 20 3d 20 6e 4e 65  Out ) nOut = nNe
16e10 77 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 57  w;.#if defined(W
16e20 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
16e30 44 29 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  D).  if( pLoop->
16e40 6e 4f 75 74 3e 6e 4f 75 74 20 29 7b 0a 20 20 20  nOut>nOut ){.   
16e50 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31 30   WHERETRACE(0x10
16e60 2c 28 22 52 61 6e 67 65 20 73 63 61 6e 20 6c 6f  ,("Range scan lo
16e70 77 65 72 73 20 6e 4f 75 74 20 66 72 6f 6d 20 25  wers nOut from %
16e80 64 20 74 6f 20 25 64 5c 6e 22 2c 0a 20 20 20 20  d to %d\n",.    
16e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ea0 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 2c 20 6e 4f 75  pLoop->nOut, nOu
16eb0 74 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  t));.  }.#endif.
16ec0 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20    pLoop->nOut = 
16ed0 28 4c 6f 67 45 73 74 29 6e 4f 75 74 3b 0a 20 20  (LogEst)nOut;.  
16ee0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
16ef0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
16f00 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
16f10 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65  4./*.** Estimate
16f20 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
16f30 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ows that will be
16f40 20 72 65 74 75 72 6e 65 64 20 62 61 73 65 64 20   returned based 
16f50 6f 6e 0a 2a 2a 20 61 6e 20 65 71 75 61 6c 69 74  on.** an equalit
16f60 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 78 3d 56  y constraint x=V
16f70 41 4c 55 45 20 61 6e 64 20 77 68 65 72 65 20 74  ALUE and where t
16f80 68 61 74 20 56 41 4c 55 45 20 6f 63 63 75 72 73  hat VALUE occurs
16f90 20 69 6e 0a 2a 2a 20 74 68 65 20 68 69 73 74 6f   in.** the histo
16fa0 67 72 61 6d 20 64 61 74 61 2e 20 20 54 68 69 73  gram data.  This
16fb0 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 77 68 65 6e   only works when
16fc0 20 78 20 69 73 20 74 68 65 20 6c 65 66 74 2d 6d   x is the left-m
16fd0 6f 73 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66  ost.** column of
16fe0 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 73 71   an index and sq
16ff0 6c 69 74 65 5f 73 74 61 74 33 20 68 69 73 74 6f  lite_stat3 histo
17000 67 72 61 6d 20 64 61 74 61 20 69 73 20 61 76 61  gram data is ava
17010 69 6c 61 62 6c 65 0a 2a 2a 20 66 6f 72 20 74 68  ilable.** for th
17020 61 74 20 69 6e 64 65 78 2e 20 20 57 68 65 6e 20  at index.  When 
17030 70 45 78 70 72 3d 3d 4e 55 4c 4c 20 74 68 61 74  pExpr==NULL that
17040 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6e 73 74   means the const
17050 72 61 69 6e 74 20 69 73 0a 2a 2a 20 22 78 20 49  raint is.** "x I
17060 53 20 4e 55 4c 4c 22 20 69 6e 73 74 65 61 64 20  S NULL" instead 
17070 6f 66 20 22 78 3d 56 41 4c 55 45 22 2e 0a 2a 2a  of "x=VALUE"..**
17080 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 65 73  .** Write the es
17090 74 69 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e  timated row coun
170a0 74 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e  t into *pnRow an
170b0 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
170c0 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c  OK. .** If unabl
170d0 65 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74  e to make an est
170e0 69 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e  imate, leave *pn
170f0 52 6f 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e  Row unchanged an
17100 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d  d return.** non-
17110 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  zero..**.** This
17120 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69   routine can fai
17130 6c 20 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c  l if it is unabl
17140 65 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c  e to load a coll
17150 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a  ating sequence.*
17160 2a 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73  * required for s
17170 74 72 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e  tring comparison
17180 2c 20 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74  , or if unable t
17190 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  o allocate memor
171a0 79 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63  y.** for a UTF c
171b0 6f 6e 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72  onversion requir
171c0 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f  ed for compariso
171d0 6e 2e 20 20 54 68 65 20 65 72 72 6f 72 20 69 73  n.  The error is
171e0 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68   stored.** in th
171f0 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75  e pParse structu
17200 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  re..*/.static in
17210 74 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e  t whereEqualScan
17220 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Est(.  Parse *pP
17230 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
17240 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65  arsing & code ge
17250 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
17260 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42   */.  WhereLoopB
17270 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
17280 2c 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  ,.  Expr *pExpr,
17290 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
172a0 65 73 73 69 6f 6e 20 66 6f 72 20 56 41 4c 55 45  ession for VALUE
172b0 20 69 6e 20 74 68 65 20 78 3d 56 41 4c 55 45 20   in the x=VALUE 
172c0 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20  constraint */.  
172d0 74 52 6f 77 63 6e 74 20 2a 70 6e 52 6f 77 20 20  tRowcnt *pnRow  
172e0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
172f0 65 20 72 65 76 69 73 65 64 20 72 6f 77 20 65 73  e revised row es
17300 74 69 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29  timate here */.)
17310 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70  {.  Index *p = p
17320 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75  Builder->pNew->u
17330 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
17340 20 69 6e 74 20 6e 45 71 20 3d 20 70 42 75 69 6c   int nEq = pBuil
17350 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72  der->pNew->u.btr
17360 65 65 2e 6e 45 71 3b 0a 20 20 55 6e 70 61 63 6b  ee.nEq;.  Unpack
17370 65 64 52 65 63 6f 72 64 20 2a 70 52 65 63 20 3d  edRecord *pRec =
17380 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b   pBuilder->pRec;
17390 0a 20 20 75 38 20 61 66 66 3b 20 20 20 20 20 20  .  u8 aff;      
173a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
173b0 43 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20  Column affinity 
173c0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
173d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
173e0 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65  * Subfunction re
173f0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74  turn code */.  t
17400 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 20 20 20 20  Rowcnt a[2];    
17410 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74           /* Stat
17420 69 73 74 69 63 73 20 2a 2f 0a 20 20 69 6e 74 20  istics */.  int 
17430 62 4f 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  bOk;..  assert( 
17440 6e 45 71 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65  nEq>=1 );.  asse
17450 72 74 28 20 6e 45 71 3c 3d 70 2d 3e 6e 43 6f 6c  rt( nEq<=p->nCol
17460 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  umn );.  assert(
17470 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29   p->aSample!=0 )
17480 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  ;.  assert( p->n
17490 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 61 73  Sample>0 );.  as
174a0 73 65 72 74 28 20 70 42 75 69 6c 64 65 72 2d 3e  sert( pBuilder->
174b0 6e 52 65 63 56 61 6c 69 64 3c 6e 45 71 20 29 3b  nRecValid<nEq );
174c0 0a 0a 20 20 2f 2a 20 49 66 20 76 61 6c 75 65 73  ..  /* If values
174d0 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62   are not availab
174e0 6c 65 20 66 6f 72 20 61 6c 6c 20 66 69 65 6c 64  le for all field
174f0 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74  s of the index t
17500 6f 20 74 68 65 20 6c 65 66 74 0a 20 20 2a 2a 20  o the left.  ** 
17510 6f 66 20 74 68 69 73 20 6f 6e 65 2c 20 6e 6f 20  of this one, no 
17520 65 73 74 69 6d 61 74 65 20 63 61 6e 20 62 65 20  estimate can be 
17530 6d 61 64 65 2e 20 52 65 74 75 72 6e 20 53 51 4c  made. Return SQL
17540 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 2e 20 2a 2f  ITE_NOTFOUND. */
17550 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65 72 2d  .  if( pBuilder-
17560 3e 6e 52 65 63 56 61 6c 69 64 3c 28 6e 45 71 2d  >nRecValid<(nEq-
17570 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  1) ){.    return
17580 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
17590 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73  ;.  }..  /* This
175a0 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
175b0 69 6f 6e 20 6f 6e 6c 79 2e 20 54 68 65 20 63 61  ion only. The ca
175c0 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 53 74 61  ll to sqlite3Sta
175d0 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28  t4ProbeSetValue(
175e0 29 0a 20 20 2a 2a 20 62 65 6c 6f 77 20 77 6f 75  ).  ** below wou
175f0 6c 64 20 72 65 74 75 72 6e 20 74 68 65 20 73 61  ld return the sa
17600 6d 65 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20  me value.  */.  
17610 69 66 28 20 6e 45 71 3e 3d 70 2d 3e 6e 43 6f 6c  if( nEq>=p->nCol
17620 75 6d 6e 20 29 7b 0a 20 20 20 20 2a 70 6e 52 6f  umn ){.    *pnRo
17630 77 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  w = 1;.    retur
17640 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
17650 0a 0a 20 20 61 66 66 20 3d 20 70 2d 3e 70 54 61  ..  aff = p->pTa
17660 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43  ble->aCol[p->aiC
17670 6f 6c 75 6d 6e 5b 6e 45 71 2d 31 5d 5d 2e 61 66  olumn[nEq-1]].af
17680 66 69 6e 69 74 79 3b 0a 20 20 72 63 20 3d 20 73  finity;.  rc = s
17690 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65  qlite3Stat4Probe
176a0 53 65 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c  SetValue(pParse,
176b0 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70 72   p, &pRec, pExpr
176c0 2c 20 61 66 66 2c 20 6e 45 71 2d 31 2c 20 26 62  , aff, nEq-1, &b
176d0 4f 6b 29 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d  Ok);.  pBuilder-
176e0 3e 70 52 65 63 20 3d 20 70 52 65 63 3b 0a 20 20  >pRec = pRec;.  
176f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
17700 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
17710 20 69 66 28 20 62 4f 6b 3d 3d 30 20 29 20 72 65   if( bOk==0 ) re
17720 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46  turn SQLITE_NOTF
17730 4f 55 4e 44 3b 0a 20 20 70 42 75 69 6c 64 65 72  OUND;.  pBuilder
17740 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e 45  ->nRecValid = nE
17750 71 3b 0a 0a 20 20 77 68 65 72 65 4b 65 79 53 74  q;..  whereKeySt
17760 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ats(pParse, p, p
17770 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 57 48  Rec, 0, a);.  WH
17780 45 52 45 54 52 41 43 45 28 30 78 31 30 2c 28 22  ERETRACE(0x10,("
17790 65 71 75 61 6c 69 74 79 20 73 63 61 6e 20 72 65  equality scan re
177a0 67 69 6f 6e 73 3a 20 25 64 5c 6e 22 2c 20 28 69  gions: %d\n", (i
177b0 6e 74 29 61 5b 31 5d 29 29 3b 0a 20 20 2a 70 6e  nt)a[1]));.  *pn
177c0 52 6f 77 20 3d 20 61 5b 31 5d 3b 0a 20 20 0a 20  Row = a[1];.  . 
177d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
177e0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
177f0 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
17800 54 41 54 34 20 2a 2f 0a 0a 23 69 66 64 65 66 20  TAT4 */..#ifdef 
17810 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
17820 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a  AT3_OR_STAT4./*.
17830 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  ** Estimate the 
17840 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
17850 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75  hat will be retu
17860 72 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a  rned based on.**
17870 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e   an IN constrain
17880 74 20 77 68 65 72 65 20 74 68 65 20 72 69 67 68  t where the righ
17890 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74  t-hand side of t
178a0 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a  he IN operator.*
178b0 2a 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 76  * is a list of v
178c0 61 6c 75 65 73 2e 20 20 45 78 61 6d 70 6c 65 3a  alues.  Example:
178d0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 57 48  .**.**        WH
178e0 45 52 45 20 78 20 49 4e 20 28 31 2c 32 2c 33 2c  ERE x IN (1,2,3,
178f0 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74  4).**.** Write t
17900 68 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f 77  he estimated row
17910 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52   count into *pnR
17920 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ow and return SQ
17930 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20  LITE_OK. .** If 
17940 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61  unable to make a
17950 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61 76  n estimate, leav
17960 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67  e *pnRow unchang
17970 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  ed and return.**
17980 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a   non-zero..**.**
17990 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   This routine ca
179a0 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69 73 20  n fail if it is 
179b0 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61  unable to load a
179c0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
179d0 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20  nce.** required 
179e0 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70 61  for string compa
179f0 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61  rison, or if una
17a00 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ble to allocate 
17a10 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20  memory.** for a 
17a20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72  UTF conversion r
17a30 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d 70  equired for comp
17a40 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72 72  arison.  The err
17a50 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20  or is stored.** 
17a60 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74  in the pParse st
17a70 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
17a80 69 63 20 69 6e 74 20 77 68 65 72 65 49 6e 53 63  ic int whereInSc
17a90 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a  anEst(.  Parse *
17aa0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
17ab0 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20   Parsing & code 
17ac0 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
17ad0 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  xt */.  WhereLoo
17ae0 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
17af0 65 72 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  er,.  ExprList *
17b00 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 54 68  pList,     /* Th
17b10 65 20 76 61 6c 75 65 20 6c 69 73 74 20 6f 6e 20  e value list on 
17b20 74 68 65 20 52 48 53 20 6f 66 20 22 78 20 49 4e  the RHS of "x IN
17b30 20 28 76 31 2c 76 32 2c 76 33 2c 2e 2e 2e 29 22   (v1,v2,v3,...)"
17b40 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70   */.  tRowcnt *p
17b50 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a 20 57 72  nRow       /* Wr
17b60 69 74 65 20 74 68 65 20 72 65 76 69 73 65 64 20  ite the revised 
17b70 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65 72  row estimate her
17b80 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20  e */.){.  Index 
17b90 2a 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  *p = pBuilder->p
17ba0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  New->u.btree.pIn
17bb0 64 65 78 3b 0a 20 20 69 36 34 20 6e 52 6f 77 30  dex;.  i64 nRow0
17bc0 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
17bd0 54 6f 49 6e 74 28 70 2d 3e 61 69 52 6f 77 4c 6f  ToInt(p->aiRowLo
17be0 67 45 73 74 5b 30 5d 29 3b 0a 20 20 69 6e 74 20  gEst[0]);.  int 
17bf0 6e 52 65 63 56 61 6c 69 64 20 3d 20 70 42 75 69  nRecValid = pBui
17c00 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b  lder->nRecValid;
17c10 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
17c20 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 53 75  TE_OK;     /* Su
17c30 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e  bfunction return
17c40 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f 77 63   code */.  tRowc
17c50 6e 74 20 6e 45 73 74 3b 20 20 20 20 20 20 20 20  nt nEst;        
17c60 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
17c70 72 6f 77 73 20 66 6f 72 20 61 20 73 69 6e 67 6c  rows for a singl
17c80 65 20 74 65 72 6d 20 2a 2f 0a 20 20 74 52 6f 77  e term */.  tRow
17c90 63 6e 74 20 6e 52 6f 77 45 73 74 20 3d 20 30 3b  cnt nRowEst = 0;
17ca0 20 20 20 20 2f 2a 20 4e 65 77 20 65 73 74 69 6d      /* New estim
17cb0 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ate of the numbe
17cc0 72 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 20 20 69  r of rows */.  i
17cd0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
17ce0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
17cf0 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73  ounter */..  ass
17d00 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21  ert( p->aSample!
17d10 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  =0 );.  for(i=0;
17d20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
17d30 26 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  & i<pList->nExpr
17d40 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 45 73 74  ; i++){.    nEst
17d50 20 3d 20 6e 52 6f 77 30 3b 0a 20 20 20 20 72 63   = nRow0;.    rc
17d60 20 3d 20 77 68 65 72 65 45 71 75 61 6c 53 63 61   = whereEqualSca
17d70 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42 75  nEst(pParse, pBu
17d80 69 6c 64 65 72 2c 20 70 4c 69 73 74 2d 3e 61 5b  ilder, pList->a[
17d90 69 5d 2e 70 45 78 70 72 2c 20 26 6e 45 73 74 29  i].pExpr, &nEst)
17da0 3b 0a 20 20 20 20 6e 52 6f 77 45 73 74 20 2b 3d  ;.    nRowEst +=
17db0 20 6e 45 73 74 3b 0a 20 20 20 20 70 42 75 69 6c   nEst;.    pBuil
17dc0 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d  der->nRecValid =
17dd0 20 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 7d 0a   nRecValid;.  }.
17de0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
17df0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
17e00 6e 52 6f 77 45 73 74 20 3e 20 6e 52 6f 77 30 20  nRowEst > nRow0 
17e10 29 20 6e 52 6f 77 45 73 74 20 3d 20 6e 52 6f 77  ) nRowEst = nRow
17e20 30 3b 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20  0;.    *pnRow = 
17e30 6e 52 6f 77 45 73 74 3b 0a 20 20 20 20 57 48 45  nRowEst;.    WHE
17e40 52 45 54 52 41 43 45 28 30 78 31 30 2c 28 22 49  RETRACE(0x10,("I
17e50 4e 20 72 6f 77 20 65 73 74 69 6d 61 74 65 3a 20  N row estimate: 
17e60 65 73 74 3d 25 64 5c 6e 22 2c 20 6e 52 6f 77 45  est=%d\n", nRowE
17e70 73 74 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  st));.  }.  asse
17e80 72 74 28 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52  rt( pBuilder->nR
17e90 65 63 56 61 6c 69 64 3d 3d 6e 52 65 63 56 61 6c  ecValid==nRecVal
17ea0 69 64 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  id );.  return r
17eb0 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
17ec0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
17ed0 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a  T3_OR_STAT4 */..
17ee0 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c 65 20 61 20  /*.** Disable a 
17ef0 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52  term in the WHER
17f00 45 20 63 6c 61 75 73 65 2e 20 20 45 78 63 65 70  E clause.  Excep
17f10 74 2c 20 64 6f 20 6e 6f 74 20 64 69 73 61 62 6c  t, do not disabl
17f20 65 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20 69 66  e the term.** if
17f30 20 69 74 20 63 6f 6e 74 72 6f 6c 73 20 61 20 4c   it controls a L
17f40 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 61  EFT OUTER JOIN a
17f50 6e 64 20 69 74 20 64 69 64 20 6e 6f 74 20 6f 72  nd it did not or
17f60 69 67 69 6e 61 74 65 20 69 6e 20 74 68 65 20 4f  iginate in the O
17f70 4e 0a 2a 2a 20 6f 72 20 55 53 49 4e 47 20 63 6c  N.** or USING cl
17f80 61 75 73 65 20 6f 66 20 74 68 61 74 20 6a 6f 69  ause of that joi
17f90 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 69 64 65  n..**.** Conside
17fa0 72 20 74 68 65 20 74 65 72 6d 20 74 32 2e 7a 3d  r the term t2.z=
17fb0 27 6f 6b 27 20 69 6e 20 74 68 65 20 66 6f 6c 6c  'ok' in the foll
17fc0 6f 77 69 6e 67 20 71 75 65 72 69 65 73 3a 0a 2a  owing queries:.*
17fd0 2a 0a 2a 2a 20 20 20 28 31 29 20 20 53 45 4c 45  *.**   (1)  SELE
17fe0 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46  CT * FROM t1 LEF
17ff0 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e  T JOIN t2 ON t1.
18000 61 3d 74 32 2e 78 20 57 48 45 52 45 20 74 32 2e  a=t2.x WHERE t2.
18010 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 32 29 20  z='ok'.**   (2) 
18020 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
18030 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f  1 LEFT JOIN t2 O
18040 4e 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20  N t1.a=t2.x AND 
18050 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28  t2.z='ok'.**   (
18060 33 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  3)  SELECT * FRO
18070 4d 20 74 31 2c 20 74 32 20 57 48 45 52 45 20 74  M t1, t2 WHERE t
18080 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e  1.a=t2.x AND t2.
18090 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54 68 65  z='ok'.**.** The
180a0 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 73 20 64 69   t2.z='ok' is di
180b0 73 61 62 6c 65 64 20 69 6e 20 74 68 65 20 69 6e  sabled in the in
180c0 20 28 32 29 20 62 65 63 61 75 73 65 20 69 74 20   (2) because it 
180d0 6f 72 69 67 69 6e 61 74 65 73 0a 2a 2a 20 69 6e  originates.** in
180e0 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 2e 20   the ON clause. 
180f0 20 54 68 65 20 74 65 72 6d 20 69 73 20 64 69 73   The term is dis
18100 61 62 6c 65 64 20 69 6e 20 28 33 29 20 62 65 63  abled in (3) bec
18110 61 75 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70  ause it is not p
18120 61 72 74 0a 2a 2a 20 6f 66 20 61 20 4c 45 46 54  art.** of a LEFT
18130 20 4f 55 54 45 52 20 4a 4f 49 4e 2e 20 20 49 6e   OUTER JOIN.  In
18140 20 28 31 29 2c 20 74 68 65 20 74 65 72 6d 20 69   (1), the term i
18150 73 20 6e 6f 74 20 64 69 73 61 62 6c 65 64 2e 0a  s not disabled..
18160 2a 2a 0a 2a 2a 20 44 69 73 61 62 6c 69 6e 67 20  **.** Disabling 
18170 61 20 74 65 72 6d 20 63 61 75 73 65 73 20 74 68  a term causes th
18180 61 74 20 74 65 72 6d 20 74 6f 20 6e 6f 74 20 62  at term to not b
18190 65 20 74 65 73 74 65 64 20 69 6e 20 74 68 65 20  e tested in the 
181a0 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66  inner loop.** of
181b0 20 74 68 65 20 6a 6f 69 6e 2e 20 20 44 69 73 61   the join.  Disa
181c0 62 6c 69 6e 67 20 69 73 20 61 6e 20 6f 70 74 69  bling is an opti
181d0 6d 69 7a 61 74 69 6f 6e 2e 20 20 57 68 65 6e 20  mization.  When 
181e0 74 65 72 6d 73 20 61 72 65 20 73 61 74 69 73 66  terms are satisf
181f0 69 65 64 0a 2a 2a 20 62 79 20 69 6e 64 69 63 65  ied.** by indice
18200 73 2c 20 77 65 20 64 69 73 61 62 6c 65 20 74 68  s, we disable th
18210 65 6d 20 74 6f 20 70 72 65 76 65 6e 74 20 72 65  em to prevent re
18220 64 75 6e 64 61 6e 74 20 74 65 73 74 73 20 69 6e  dundant tests in
18230 20 74 68 65 20 69 6e 6e 65 72 0a 2a 2a 20 6c 6f   the inner.** lo
18240 6f 70 2e 20 20 57 65 20 77 6f 75 6c 64 20 67 65  op.  We would ge
18250 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 72 65  t the correct re
18260 73 75 6c 74 73 20 69 66 20 6e 6f 74 68 69 6e 67  sults if nothing
18270 20 77 65 72 65 20 65 76 65 72 20 64 69 73 61 62   were ever disab
18280 6c 65 64 2c 0a 2a 2a 20 62 75 74 20 6a 6f 69 6e  led,.** but join
18290 73 20 6d 69 67 68 74 20 72 75 6e 20 61 20 6c 69  s might run a li
182a0 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20 54 68  ttle slower.  Th
182b0 65 20 74 72 69 63 6b 20 69 73 20 74 6f 20 64 69  e trick is to di
182c0 73 61 62 6c 65 20 61 73 20 6d 75 63 68 0a 2a 2a  sable as much.**
182d0 20 61 73 20 77 65 20 63 61 6e 20 77 69 74 68 6f   as we can witho
182e0 75 74 20 64 69 73 61 62 6c 69 6e 67 20 74 6f 6f  ut disabling too
182f0 20 6d 75 63 68 2e 20 20 49 66 20 77 65 20 64 69   much.  If we di
18300 73 61 62 6c 65 64 20 69 6e 20 28 31 29 2c 20 77  sabled in (1), w
18310 65 27 64 20 67 65 74 0a 2a 2a 20 74 68 65 20 77  e'd get.** the w
18320 72 6f 6e 67 20 61 6e 73 77 65 72 2e 20 20 53 65  rong answer.  Se
18330 65 20 74 69 63 6b 65 74 20 23 38 31 33 2e 0a 2a  e ticket #813..*
18340 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 74 68 65 20  *.** If all the 
18350 63 68 69 6c 64 72 65 6e 20 6f 66 20 61 20 74 65  children of a te
18360 72 6d 20 61 72 65 20 64 69 73 61 62 6c 65 64 2c  rm are disabled,
18370 20 74 68 65 6e 20 74 68 61 74 20 74 65 72 6d 20   then that term 
18380 69 73 20 61 6c 73 6f 0a 2a 2a 20 61 75 74 6f 6d  is also.** autom
18390 61 74 69 63 61 6c 6c 79 20 64 69 73 61 62 6c 65  atically disable
183a0 64 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c  d.  In this way,
183b0 20 74 65 72 6d 73 20 67 65 74 20 64 69 73 61 62   terms get disab
183c0 6c 65 64 20 69 66 20 64 65 72 69 76 65 64 0a 2a  led if derived.*
183d0 2a 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20  * virtual terms 
183e0 61 72 65 20 74 65 73 74 65 64 20 66 69 72 73 74  are tested first
183f0 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  .  For example:.
18400 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 47 4c 4f  **.**      x GLO
18410 42 20 27 61 62 63 2a 27 20 41 4e 44 20 78 3e 3d  B 'abc*' AND x>=
18420 27 61 62 63 27 20 41 4e 44 20 78 3c 27 61 63 64  'abc' AND x<'acd
18430 27 0a 2a 2a 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f  '.**      \_____
18440 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f  ______/     \___
18450 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 2f  ___/     \_____/
18460 0a 2a 2a 20 20 20 20 20 20 20 20 20 70 61 72 65  .**         pare
18470 6e 74 20 20 20 20 20 20 20 20 20 20 63 68 69 6c  nt          chil
18480 64 31 20 20 20 20 20 20 20 63 68 69 6c 64 32 0a  d1       child2.
18490 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 70  **.** Only the p
184a0 61 72 65 6e 74 20 74 65 72 6d 20 77 61 73 20 69  arent term was i
184b0 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 57  n the original W
184c0 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 54 68  HERE clause.  Th
184d0 65 20 63 68 69 6c 64 31 0a 2a 2a 20 61 6e 64 20  e child1.** and 
184e0 63 68 69 6c 64 32 20 74 65 72 6d 73 20 77 65 72  child2 terms wer
184f0 65 20 61 64 64 65 64 20 62 79 20 74 68 65 20 4c  e added by the L
18500 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  IKE optimization
18510 2e 20 20 49 66 20 62 6f 74 68 20 6f 66 0a 2a 2a  .  If both of.**
18520 20 74 68 65 20 76 69 72 74 75 61 6c 20 63 68 69   the virtual chi
18530 6c 64 20 74 65 72 6d 73 20 61 72 65 20 76 61 6c  ld terms are val
18540 69 64 2c 20 74 68 65 6e 20 74 65 73 74 69 6e 67  id, then testing
18550 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 63   of the parent c
18560 61 6e 20 62 65 20 0a 2a 2a 20 73 6b 69 70 70 65  an be .** skippe
18570 64 2e 0a 2a 2a 0a 2a 2a 20 55 73 75 61 6c 6c 79  d..**.** Usually
18580 20 74 68 65 20 70 61 72 65 6e 74 20 74 65 72 6d   the parent term
18590 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 54 45   is marked as TE
185a0 52 4d 5f 43 4f 44 45 44 2e 20 20 42 75 74 20 69  RM_CODED.  But i
185b0 66 20 74 68 65 20 70 61 72 65 6e 74 0a 2a 2a 20  f the parent.** 
185c0 74 65 72 6d 20 77 61 73 20 6f 72 69 67 69 6e 61  term was origina
185d0 6c 6c 79 20 54 45 52 4d 5f 4c 49 4b 45 2c 20 74  lly TERM_LIKE, t
185e0 68 65 6e 20 74 68 65 20 70 61 72 65 6e 74 20 67  hen the parent g
185f0 65 74 73 20 54 45 52 4d 5f 4c 49 4b 45 43 4f 4e  ets TERM_LIKECON
18600 44 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 20 54 68  D instead..** Th
18610 65 20 54 45 52 4d 5f 4c 49 4b 45 43 4f 4e 44 20  e TERM_LIKECOND 
18620 6d 61 72 6b 69 6e 67 20 69 6e 64 69 63 61 74 65  marking indicate
18630 73 20 74 68 61 74 20 74 68 65 20 74 65 72 6d 20  s that the term 
18640 73 68 6f 75 6c 64 20 62 65 20 63 6f 64 65 64 20  should be coded 
18650 69 6e 73 69 64 65 0a 2a 2a 20 61 20 63 6f 6e 64  inside.** a cond
18660 69 74 69 6f 6e 61 6c 20 73 75 63 68 20 74 68 61  itional such tha
18670 74 20 69 73 20 6f 6e 6c 79 20 65 76 61 6c 75 61  t is only evalua
18680 74 65 64 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e  ted on the secon
18690 64 20 70 61 73 73 20 6f 66 20 61 0a 2a 2a 20 4c  d pass of a.** L
186a0 49 4b 45 2d 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  IKE-optimization
186b0 20 6c 6f 6f 70 2c 20 77 68 65 6e 20 73 63 61 6e   loop, when scan
186c0 6e 69 6e 67 20 42 4c 4f 42 73 20 69 6e 73 74 65  ning BLOBs inste
186d0 61 64 20 6f 66 20 73 74 72 69 6e 67 73 2e 0a 2a  ad of strings..*
186e0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 69  /.static void di
186f0 73 61 62 6c 65 54 65 72 6d 28 57 68 65 72 65 4c  sableTerm(WhereL
18700 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 57 68  evel *pLevel, Wh
18710 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 29 7b  ereTerm *pTerm){
18720 0a 20 20 69 6e 74 20 6e 4c 6f 6f 70 20 3d 20 30  .  int nLoop = 0
18730 3b 0a 20 20 77 68 69 6c 65 28 20 70 54 65 72 6d  ;.  while( pTerm
18740 0a 20 20 20 20 20 20 26 26 20 28 70 54 65 72 6d  .      && (pTerm
18750 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
18760 5f 43 4f 44 45 44 29 3d 3d 30 0a 20 20 20 20 20  _CODED)==0.     
18770 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 69 4c 65   && (pLevel->iLe
18780 66 74 4a 6f 69 6e 3d 3d 30 20 7c 7c 20 45 78 70  ftJoin==0 || Exp
18790 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65  rHasProperty(pTe
187a0 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72  rm->pExpr, EP_Fr
187b0 6f 6d 4a 6f 69 6e 29 29 0a 20 20 20 20 20 20 26  omJoin)).      &
187c0 26 20 28 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65  & (pLevel->notRe
187d0 61 64 79 20 26 20 70 54 65 72 6d 2d 3e 70 72 65  ady & pTerm->pre
187e0 72 65 71 41 6c 6c 29 3d 3d 30 0a 20 20 29 7b 0a  reqAll)==0.  ){.
187f0 20 20 20 20 69 66 28 20 6e 4c 6f 6f 70 20 26 26      if( nLoop &&
18800 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
18810 20 26 20 54 45 52 4d 5f 4c 49 4b 45 29 21 3d 30   & TERM_LIKE)!=0
18820 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d   ){.      pTerm-
18830 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
18840 5f 4c 49 4b 45 43 4f 4e 44 3b 0a 20 20 20 20 7d  _LIKECOND;.    }
18850 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 65 72  else{.      pTer
18860 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  m->wtFlags |= TE
18870 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a  RM_CODED;.    }.
18880 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 69      if( pTerm->i
18890 50 61 72 65 6e 74 3c 30 20 29 20 62 72 65 61 6b  Parent<0 ) break
188a0 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70  ;.    pTerm = &p
188b0 54 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54 65  Term->pWC->a[pTe
188c0 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20  rm->iParent];.  
188d0 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 2d    pTerm->nChild-
188e0 2d 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  -;.    if( pTerm
188f0 2d 3e 6e 43 68 69 6c 64 21 3d 30 20 29 20 62 72  ->nChild!=0 ) br
18900 65 61 6b 3b 0a 20 20 20 20 6e 4c 6f 6f 70 2b 2b  eak;.    nLoop++
18910 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
18920 6f 64 65 20 61 6e 20 4f 50 5f 41 66 66 69 6e 69  ode an OP_Affini
18930 74 79 20 6f 70 63 6f 64 65 20 74 6f 20 61 70 70  ty opcode to app
18940 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66  ly the column af
18950 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 7a 41  finity string zA
18960 66 66 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 20 72  ff.** to the n r
18970 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e  egisters startin
18980 67 20 61 74 20 62 61 73 65 2e 20 0a 2a 2a 0a 2a  g at base. .**.*
18990 2a 20 41 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  * As an optimiza
189a0 74 69 6f 6e 2c 20 53 51 4c 49 54 45 5f 41 46 46  tion, SQLITE_AFF
189b0 5f 4e 4f 4e 45 20 65 6e 74 72 69 65 73 20 28 77  _NONE entries (w
189c0 68 69 63 68 20 61 72 65 20 6e 6f 2d 6f 70 73 29  hich are no-ops)
189d0 20 61 74 20 74 68 65 0a 2a 2a 20 62 65 67 69 6e   at the.** begin
189e0 6e 69 6e 67 20 61 6e 64 20 65 6e 64 20 6f 66 20  ning and end of 
189f0 7a 41 66 66 20 61 72 65 20 69 67 6e 6f 72 65 64  zAff are ignored
18a00 2e 20 20 49 66 20 61 6c 6c 20 65 6e 74 72 69 65  .  If all entrie
18a10 73 20 69 6e 20 7a 41 66 66 20 61 72 65 0a 2a 2a  s in zAff are.**
18a20 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
18a30 2c 20 74 68 65 6e 20 6e 6f 20 63 6f 64 65 20 67  , then no code g
18a40 65 74 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a  ets generated..*
18a50 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
18a60 65 20 6d 61 6b 65 73 20 69 74 73 20 6f 77 6e 20  e makes its own 
18a70 63 6f 70 79 20 6f 66 20 7a 41 66 66 20 73 6f 20  copy of zAff so 
18a80 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
18a90 69 73 20 66 72 65 65 0a 2a 2a 20 74 6f 20 6d 6f  is free.** to mo
18aa0 64 69 66 79 20 7a 41 66 66 20 61 66 74 65 72 20  dify zAff after 
18ab0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
18ac0 75 72 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  urns..*/.static 
18ad0 76 6f 69 64 20 63 6f 64 65 41 70 70 6c 79 41 66  void codeApplyAf
18ae0 66 69 6e 69 74 79 28 50 61 72 73 65 20 2a 70 50  finity(Parse *pP
18af0 61 72 73 65 2c 20 69 6e 74 20 62 61 73 65 2c 20  arse, int base, 
18b00 69 6e 74 20 6e 2c 20 63 68 61 72 20 2a 7a 41 66  int n, char *zAf
18b10 66 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  f){.  Vdbe *v = 
18b20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
18b30 20 69 66 28 20 7a 41 66 66 3d 3d 30 20 29 7b 0a   if( zAff==0 ){.
18b40 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
18b50 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
18b60 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75  iled );.    retu
18b70 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rn;.  }.  assert
18b80 28 20 76 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  ( v!=0 );..  /* 
18b90 41 64 6a 75 73 74 20 62 61 73 65 20 61 6e 64 20  Adjust base and 
18ba0 6e 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 53  n to skip over S
18bb0 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 65  QLITE_AFF_NONE e
18bc0 6e 74 72 69 65 73 20 61 74 20 74 68 65 20 62 65  ntries at the be
18bd0 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 61 6e 64  ginning.  ** and
18be0 20 65 6e 64 20 6f 66 20 74 68 65 20 61 66 66 69   end of the affi
18bf0 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a 20 20 2a  nity string..  *
18c00 2f 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26  /.  while( n>0 &
18c10 26 20 7a 41 66 66 5b 30 5d 3d 3d 53 51 4c 49 54  & zAff[0]==SQLIT
18c20 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20  E_AFF_NONE ){.  
18c30 20 20 6e 2d 2d 3b 0a 20 20 20 20 62 61 73 65 2b    n--;.    base+
18c40 2b 3b 0a 20 20 20 20 7a 41 66 66 2b 2b 3b 0a 20  +;.    zAff++;. 
18c50 20 7d 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31 20   }.  while( n>1 
18c60 26 26 20 7a 41 66 66 5b 6e 2d 31 5d 3d 3d 53 51  && zAff[n-1]==SQ
18c70 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b  LITE_AFF_NONE ){
18c80 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20  .    n--;.  }.. 
18c90 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 4f 50 5f   /* Code the OP_
18ca0 41 66 66 69 6e 69 74 79 20 6f 70 63 6f 64 65 20  Affinity opcode 
18cb0 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 74  if there is anyt
18cc0 68 69 6e 67 20 6c 65 66 74 20 74 6f 20 64 6f 2e  hing left to do.
18cd0 20 2a 2f 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b   */.  if( n>0 ){
18ce0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
18cf0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 66 66  AddOp2(v, OP_Aff
18d00 69 6e 69 74 79 2c 20 62 61 73 65 2c 20 6e 29 3b  inity, base, n);
18d10 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
18d20 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20  ChangeP4(v, -1, 
18d30 7a 41 66 66 2c 20 6e 29 3b 0a 20 20 20 20 73 71  zAff, n);.    sq
18d40 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
18d50 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
18d60 72 73 65 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20  rse, base, n);. 
18d70 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   }.}.../*.** Gen
18d80 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
18d90 20 73 69 6e 67 6c 65 20 65 71 75 61 6c 69 74 79   single equality
18da0 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45   term of the WHE
18db0 52 45 20 63 6c 61 75 73 65 2e 20 20 41 6e 20 65  RE clause.  An e
18dc0 71 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72 6d 20  quality.** term 
18dd0 63 61 6e 20 62 65 20 65 69 74 68 65 72 20 58 3d  can be either X=
18de0 65 78 70 72 20 6f 72 20 58 20 49 4e 20 28 2e 2e  expr or X IN (..
18df0 2e 29 2e 20 20 20 70 54 65 72 6d 20 69 73 20 74  .).   pTerm is t
18e00 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 0a 2a  he term to be .*
18e10 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  * coded..**.** T
18e20 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
18e30 20 66 6f 72 20 74 68 65 20 63 6f 6e 73 74 72 61   for the constra
18e40 69 6e 74 20 69 73 20 6c 65 66 74 20 69 6e 20 72  int is left in r
18e50 65 67 69 73 74 65 72 20 69 52 65 67 2e 0a 2a 2a  egister iReg..**
18e60 0a 2a 2a 20 46 6f 72 20 61 20 63 6f 6e 73 74 72  .** For a constr
18e70 61 69 6e 74 20 6f 66 20 74 68 65 20 66 6f 72 6d  aint of the form
18e80 20 58 3d 65 78 70 72 2c 20 74 68 65 20 65 78 70   X=expr, the exp
18e90 72 65 73 73 69 6f 6e 20 69 73 20 65 76 61 6c 75  ression is evalu
18ea0 61 74 65 64 20 61 6e 64 20 69 74 73 0a 2a 2a 20  ated and its.** 
18eb0 72 65 73 75 6c 74 20 69 73 20 6c 65 66 74 20 6f  result is left o
18ec0 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 46 6f  n the stack.  Fo
18ed0 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66  r constraints of
18ee0 20 74 68 65 20 66 6f 72 6d 20 58 20 49 4e 20 28   the form X IN (
18ef0 2e 2e 2e 29 0a 2a 2a 20 74 68 69 73 20 72 6f 75  ...).** this rou
18f00 74 69 6e 65 20 73 65 74 73 20 75 70 20 61 20 6c  tine sets up a l
18f10 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 69 74  oop that will it
18f20 65 72 61 74 65 20 6f 76 65 72 20 61 6c 6c 20 76  erate over all v
18f30 61 6c 75 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73  alues of X..*/.s
18f40 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 45 71  tatic int codeEq
18f50 75 61 6c 69 74 79 54 65 72 6d 28 0a 20 20 50 61  ualityTerm(.  Pa
18f60 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
18f70 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
18f80 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
18f90 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
18fa0 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 6f 66    /* The term of
18fb0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
18fc0 65 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  e to be coded */
18fd0 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
18fe0 4c 65 76 65 6c 2c 20 2f 2a 20 54 68 65 20 6c 65  Level, /* The le
18ff0 76 65 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  vel of the FROM 
19000 63 6c 61 75 73 65 20 77 65 20 61 72 65 20 77 6f  clause we are wo
19010 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 69 6e  rking on */.  in
19020 74 20 69 45 71 2c 20 20 20 20 20 20 20 20 20 20  t iEq,          
19030 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
19040 65 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20  e equality term 
19050 77 69 74 68 69 6e 20 74 68 69 73 20 6c 65 76 65  within this leve
19060 6c 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c  l */.  int bRev,
19070 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
19080 75 65 20 66 6f 72 20 72 65 76 65 72 73 65 2d 6f  ue for reverse-o
19090 72 64 65 72 20 49 4e 20 6f 70 65 72 61 74 69 6f  rder IN operatio
190a0 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 72  ns */.  int iTar
190b0 67 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20 41  get         /* A
190c0 74 74 65 6d 70 74 20 74 6f 20 6c 65 61 76 65 20  ttempt to leave 
190d0 72 65 73 75 6c 74 73 20 69 6e 20 74 68 69 73 20  results in this 
190e0 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20  register */.){. 
190f0 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72   Expr *pX = pTer
19100 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 56 64 62 65  m->pExpr;.  Vdbe
19110 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
19120 64 62 65 3b 0a 20 20 69 6e 74 20 69 52 65 67 3b  dbe;.  int iReg;
19130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19140 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
19150 6c 64 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f  lding results */
19160 0a 0a 20 20 61 73 73 65 72 74 28 20 69 54 61 72  ..  assert( iTar
19170 67 65 74 3e 30 20 29 3b 0a 20 20 69 66 28 20 70  get>0 );.  if( p
19180 58 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 7b 0a  X->op==TK_EQ ){.
19190 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74      iReg = sqlit
191a0 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
191b0 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69  (pParse, pX->pRi
191c0 67 68 74 2c 20 69 54 61 72 67 65 74 29 3b 0a 20  ght, iTarget);. 
191d0 20 7d 65 6c 73 65 20 69 66 28 20 70 58 2d 3e 6f   }else if( pX->o
191e0 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a  p==TK_ISNULL ){.
191f0 20 20 20 20 69 52 65 67 20 3d 20 69 54 61 72 67      iReg = iTarg
19200 65 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  et;.    sqlite3V
19210 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
19220 4e 75 6c 6c 2c 20 30 2c 20 69 52 65 67 29 3b 0a  Null, 0, iReg);.
19230 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
19240 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 7d  MIT_SUBQUERY.  }
19250 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 65 54  else{.    int eT
19260 79 70 65 3b 0a 20 20 20 20 69 6e 74 20 69 54 61  ype;.    int iTa
19270 62 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 6e  b;.    struct In
19280 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20 57  Loop *pIn;.    W
19290 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20  hereLoop *pLoop 
192a0 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
192b0 3b 0a 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f  ;..    if( (pLoo
192c0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
192d0 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
192e0 3d 3d 30 0a 20 20 20 20 20 20 26 26 20 70 4c 6f  ==0.      && pLo
192f0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
19300 65 78 21 3d 30 0a 20 20 20 20 20 20 26 26 20 70  ex!=0.      && p
19310 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
19320 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  ndex->aSortOrder
19330 5b 69 45 71 5d 0a 20 20 20 20 29 7b 0a 20 20 20  [iEq].    ){.   
19340 20 20 20 74 65 73 74 63 61 73 65 28 20 69 45 71     testcase( iEq
19350 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
19360 74 63 61 73 65 28 20 62 52 65 76 20 29 3b 0a 20  tcase( bRev );. 
19370 20 20 20 20 20 62 52 65 76 20 3d 20 21 62 52 65       bRev = !bRe
19380 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  v;.    }.    ass
19390 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  ert( pX->op==TK_
193a0 49 4e 20 29 3b 0a 20 20 20 20 69 52 65 67 20 3d  IN );.    iReg =
193b0 20 69 54 61 72 67 65 74 3b 0a 20 20 20 20 65 54   iTarget;.    eT
193c0 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  ype = sqlite3Fin
193d0 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c  dInIndex(pParse,
193e0 20 70 58 2c 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f   pX, IN_INDEX_LO
193f0 4f 50 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  OP, 0);.    if( 
19400 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
19410 49 4e 44 45 58 5f 44 45 53 43 20 29 7b 0a 20 20  INDEX_DESC ){.  
19420 20 20 20 20 74 65 73 74 63 61 73 65 28 20 62 52      testcase( bR
19430 65 76 20 29 3b 0a 20 20 20 20 20 20 62 52 65 76  ev );.      bRev
19440 20 3d 20 21 62 52 65 76 3b 0a 20 20 20 20 7d 0a   = !bRev;.    }.
19450 20 20 20 20 69 54 61 62 20 3d 20 70 58 2d 3e 69      iTab = pX->i
19460 54 61 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74  Table;.    sqlit
19470 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
19480 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a  bRev ? OP_Last :
19490 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62   OP_Rewind, iTab
194a0 2c 20 30 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  , 0);.    VdbeCo
194b0 76 65 72 61 67 65 49 66 28 76 2c 20 62 52 65 76  verageIf(v, bRev
194c0 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
194d0 61 67 65 49 66 28 76 2c 20 21 62 52 65 76 29 3b  ageIf(v, !bRev);
194e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c  .    assert( (pL
194f0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
19500 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 3d 3d  HERE_MULTI_OR)==
19510 30 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  0 );.    pLoop->
19520 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
19530 5f 49 4e 5f 41 42 4c 45 3b 0a 20 20 20 20 69 66  _IN_ABLE;.    if
19540 28 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e  ( pLevel->u.in.n
19550 49 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  In==0 ){.      p
19560 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 20 3d  Level->addrNxt =
19570 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
19580 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 7d 0a  Label(v);.    }.
19590 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e      pLevel->u.in
195a0 2e 6e 49 6e 2b 2b 3b 0a 20 20 20 20 70 4c 65 76  .nIn++;.    pLev
195b0 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70  el->u.in.aInLoop
195c0 20 3d 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65   =.       sqlite
195d0 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65  3DbReallocOrFree
195e0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 65  (pParse->db, pLe
195f0 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f  vel->u.in.aInLoo
19600 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
19610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19620 20 73 69 7a 65 6f 66 28 70 4c 65 76 65 6c 2d 3e   sizeof(pLevel->
19630 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 30 5d 29  u.in.aInLoop[0])
19640 2a 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49  *pLevel->u.in.nI
19650 6e 29 3b 0a 20 20 20 20 70 49 6e 20 3d 20 70 4c  n);.    pIn = pL
19660 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f  evel->u.in.aInLo
19670 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 20  op;.    if( pIn 
19680 29 7b 0a 20 20 20 20 20 20 70 49 6e 20 2b 3d 20  ){.      pIn += 
19690 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
196a0 20 2d 20 31 3b 0a 20 20 20 20 20 20 70 49 6e 2d   - 1;.      pIn-
196b0 3e 69 43 75 72 20 3d 20 69 54 61 62 3b 0a 20 20  >iCur = iTab;.  
196c0 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49      if( eType==I
196d0 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b  N_INDEX_ROWID ){
196e0 0a 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 61 64  .        pIn->ad
196f0 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65  drInTop = sqlite
19700 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
19710 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 2c 20 69  P_Rowid, iTab, i
19720 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Reg);.      }els
19730 65 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 2d 3e  e{.        pIn->
19740 61 64 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69  addrInTop = sqli
19750 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
19760 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62   OP_Column, iTab
19770 2c 20 30 2c 20 69 52 65 67 29 3b 0a 20 20 20 20  , 0, iReg);.    
19780 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 2d 3e 65    }.      pIn->e
19790 45 6e 64 4c 6f 6f 70 4f 70 20 3d 20 62 52 65 76  EndLoopOp = bRev
197a0 20 3f 20 4f 50 5f 50 72 65 76 49 66 4f 70 65 6e   ? OP_PrevIfOpen
197b0 20 3a 20 4f 50 5f 4e 65 78 74 49 66 4f 70 65 6e   : OP_NextIfOpen
197c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
197d0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
197e0 49 73 4e 75 6c 6c 2c 20 69 52 65 67 29 3b 20 56  IsNull, iReg); V
197f0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
19800 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19810 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49   pLevel->u.in.nI
19820 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 65 6e  n = 0;.    }.#en
19830 64 69 66 0a 20 20 7d 0a 20 20 64 69 73 61 62 6c  dif.  }.  disabl
19840 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54  eTerm(pLevel, pT
19850 65 72 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  erm);.  return i
19860 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  Reg;.}../*.** Ge
19870 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
19880 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 61   will evaluate a
19890 6c 6c 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e  ll == and IN con
198a0 73 74 72 61 69 6e 74 73 20 66 6f 72 20 61 6e 0a  straints for an.
198b0 2a 2a 20 69 6e 64 65 78 20 73 63 61 6e 2e 0a 2a  ** index scan..*
198c0 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65  *.** For example
198d0 2c 20 63 6f 6e 73 69 64 65 72 20 74 61 62 6c 65  , consider table
198e0 20 74 31 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29   t1(a,b,c,d,e,f)
198f0 20 77 69 74 68 20 69 6e 64 65 78 20 69 31 28 61   with index i1(a
19900 2c 62 2c 63 29 2e 0a 2a 2a 20 53 75 70 70 6f 73  ,b,c)..** Suppos
19910 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  e the WHERE clau
19920 73 65 20 69 73 20 74 68 69 73 3a 20 20 61 3d 3d  se is this:  a==
19930 35 20 41 4e 44 20 62 20 49 4e 20 28 31 2c 32 2c  5 AND b IN (1,2,
19940 33 29 20 41 4e 44 20 63 3e 35 20 41 4e 44 20 63  3) AND c>5 AND c
19950 3c 31 30 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78  <10.** The index
19960 20 68 61 73 20 61 73 20 6d 61 6e 79 20 61 73 20   has as many as 
19970 74 68 72 65 65 20 65 71 75 61 6c 69 74 79 20 63  three equality c
19980 6f 6e 73 74 72 61 69 6e 74 73 2c 20 62 75 74 20  onstraints, but 
19990 69 6e 20 74 68 69 73 0a 2a 2a 20 65 78 61 6d 70  in this.** examp
199a0 6c 65 2c 20 74 68 65 20 74 68 69 72 64 20 22 63  le, the third "c
199b0 22 20 76 61 6c 75 65 20 69 73 20 61 6e 20 69 6e  " value is an in
199c0 65 71 75 61 6c 69 74 79 2e 20 20 53 6f 20 6f 6e  equality.  So on
199d0 6c 79 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73 74  ly two .** const
199e0 72 61 69 6e 74 73 20 61 72 65 20 63 6f 64 65 64  raints are coded
199f0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
19a00 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 63 6f  will generate co
19a10 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a  de to evaluate.*
19a20 2a 20 61 3d 3d 35 20 61 6e 64 20 62 20 49 4e 20  * a==5 and b IN 
19a30 28 31 2c 32 2c 33 29 2e 20 20 54 68 65 20 63 75  (1,2,3).  The cu
19a40 72 72 65 6e 74 20 76 61 6c 75 65 73 20 66 6f 72  rrent values for
19a50 20 61 20 61 6e 64 20 62 20 77 69 6c 6c 20 62 65   a and b will be
19a60 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 63 6f   stored.** in co
19a70 6e 73 65 63 75 74 69 76 65 20 72 65 67 69 73 74  nsecutive regist
19a80 65 72 73 20 61 6e 64 20 74 68 65 20 69 6e 64 65  ers and the inde
19a90 78 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 72  x of the first r
19aa0 65 67 69 73 74 65 72 20 69 73 20 72 65 74 75 72  egister is retur
19ab0 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  ned..**.** In th
19ac0 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 20  e example above 
19ad0 6e 45 71 3d 3d 32 2e 20 20 42 75 74 20 74 68 69  nEq==2.  But thi
19ae0 73 20 73 75 62 72 6f 75 74 69 6e 65 20 77 6f 72  s subroutine wor
19af0 6b 73 20 66 6f 72 20 61 6e 79 20 76 61 6c 75 65  ks for any value
19b00 0a 2a 2a 20 6f 66 20 6e 45 71 20 69 6e 63 6c 75  .** of nEq inclu
19b10 64 69 6e 67 20 30 2e 20 20 49 66 20 6e 45 71 3d  ding 0.  If nEq=
19b20 3d 30 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  =0, this routine
19b30 20 69 73 20 6e 65 61 72 6c 79 20 61 20 6e 6f 2d   is nearly a no-
19b40 6f 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20  op..** The only 
19b50 74 68 69 6e 67 20 69 74 20 64 6f 65 73 20 69 73  thing it does is
19b60 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 70 4c   allocate the pL
19b70 65 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f 72  evel->iMem memor
19b80 79 20 63 65 6c 6c 20 61 6e 64 0a 2a 2a 20 63 6f  y cell and.** co
19b90 6d 70 75 74 65 20 74 68 65 20 61 66 66 69 6e 69  mpute the affini
19ba0 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a  ty string..**.**
19bb0 20 54 68 65 20 6e 45 78 74 72 61 52 65 67 20 70   The nExtraReg p
19bc0 61 72 61 6d 65 74 65 72 20 69 73 20 30 20 6f 72  arameter is 0 or
19bd0 20 31 2e 20 20 49 74 20 69 73 20 30 20 69 66 20   1.  It is 0 if 
19be0 61 6c 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65  all WHERE clause
19bf0 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20   constraints.** 
19c00 61 72 65 20 3d 3d 20 6f 72 20 49 4e 20 61 6e 64  are == or IN and
19c10 20 61 72 65 20 63 6f 76 65 72 65 64 20 62 79 20   are covered by 
19c20 74 68 65 20 6e 45 71 2e 20 20 6e 45 78 74 72 61  the nEq.  nExtra
19c30 52 65 67 20 69 73 20 31 20 69 66 20 74 68 65 72  Reg is 1 if ther
19c40 65 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 65 71 75  e is.** an inequ
19c50 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
19c60 20 28 73 75 63 68 20 61 73 20 74 68 65 20 22 63   (such as the "c
19c70 3e 3d 35 20 41 4e 44 20 63 3c 31 30 22 20 69 6e  >=5 AND c<10" in
19c80 20 74 68 65 20 65 78 61 6d 70 6c 65 29 20 74 68   the example) th
19c90 61 74 0a 2a 2a 20 6f 63 63 75 72 73 20 61 66 74  at.** occurs aft
19ca0 65 72 20 74 68 65 20 6e 45 71 20 71 75 61 6c 69  er the nEq quali
19cb0 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a  ty constraints..
19cc0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
19cd0 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 72  ne allocates a r
19ce0 61 6e 67 65 20 6f 66 20 6e 45 71 2b 6e 45 78 74  ange of nEq+nExt
19cf0 72 61 52 65 67 20 6d 65 6d 6f 72 79 20 63 65 6c  raReg memory cel
19d00 6c 73 20 61 6e 64 20 72 65 74 75 72 6e 73 0a 2a  ls and returns.*
19d10 2a 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  * the index of t
19d20 68 65 20 66 69 72 73 74 20 6d 65 6d 6f 72 79 20  he first memory 
19d30 63 65 6c 6c 20 69 6e 20 74 68 61 74 20 72 61 6e  cell in that ran
19d40 67 65 2e 20 54 68 65 20 63 6f 64 65 20 74 68 61  ge. The code tha
19d50 74 0a 2a 2a 20 63 61 6c 6c 73 20 74 68 69 73 20  t.** calls this 
19d60 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 75 73 65  routine will use
19d70 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 72 61 6e   that memory ran
19d80 67 65 20 74 6f 20 73 74 6f 72 65 20 6b 65 79 73  ge to store keys
19d90 20 66 6f 72 0a 2a 2a 20 73 74 61 72 74 20 61 6e   for.** start an
19da0 64 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f  d termination co
19db0 6e 64 69 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  nditions of the 
19dc0 6c 6f 6f 70 2e 0a 2a 2a 20 6b 65 79 20 76 61 6c  loop..** key val
19dd0 75 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20  ue of the loop. 
19de0 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   If one or more 
19df0 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 61 70 70  IN operators app
19e00 65 61 72 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69  ear, then.** thi
19e10 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61  s routine alloca
19e20 74 65 73 20 61 6e 20 61 64 64 69 74 69 6f 6e 61  tes an additiona
19e30 6c 20 6e 45 71 20 6d 65 6d 6f 72 79 20 63 65 6c  l nEq memory cel
19e40 6c 73 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 0a  ls for internal.
19e50 2a 2a 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65  ** use..**.** Be
19e60 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20  fore returning, 
19e70 2a 70 7a 41 66 66 20 69 73 20 73 65 74 20 74 6f  *pzAff is set to
19e80 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
19e90 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a  er containing a.
19ea0 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63  ** copy of the c
19eb0 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 73  olumn affinity s
19ec0 74 72 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 64  tring of the ind
19ed0 65 78 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69  ex allocated usi
19ee0 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 44 62 4d  ng.** sqlite3DbM
19ef0 61 6c 6c 6f 63 28 29 2e 20 45 78 63 65 70 74 2c  alloc(). Except,
19f00 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
19f10 63 6f 70 79 20 6f 66 20 74 68 65 20 73 74 72 69  copy of the stri
19f20 6e 67 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a  ng associated.**
19f30 20 77 69 74 68 20 65 71 75 61 6c 69 74 79 20 63   with equality c
19f40 6f 6e 73 74 72 61 69 6e 74 73 20 74 68 61 74 20  onstraints that 
19f50 75 73 65 20 4e 4f 4e 45 20 61 66 66 69 6e 69 74  use NONE affinit
19f60 79 20 61 72 65 20 73 65 74 20 74 6f 0a 2a 2a 20  y are set to.** 
19f70 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e  SQLITE_AFF_NONE.
19f80 20 54 68 69 73 20 69 73 20 74 6f 20 64 65 61 6c   This is to deal
19f90 20 77 69 74 68 20 53 51 4c 20 73 75 63 68 20 61   with SQL such a
19fa0 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
19fb0 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20  .**.**   CREATE 
19fc0 54 41 42 4c 45 20 74 31 28 61 20 54 45 58 54 20  TABLE t1(a TEXT 
19fd0 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b  PRIMARY KEY, b);
19fe0 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e  .**   SELECT ...
19ff0 20 46 52 4f 4d 20 74 31 20 41 53 20 74 32 2c 20   FROM t1 AS t2, 
1a000 74 31 20 57 48 45 52 45 20 74 31 2e 61 20 3d 20  t1 WHERE t1.a = 
1a010 74 32 2e 62 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  t2.b;.**.** In t
1a020 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65  he example above
1a030 2c 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 74  , the index on t
1a040 31 28 61 29 20 68 61 73 20 54 45 58 54 20 61 66  1(a) has TEXT af
1a050 66 69 6e 69 74 79 2e 20 42 75 74 20 73 69 6e 63  finity. But sinc
1a060 65 0a 2a 2a 20 74 68 65 20 72 69 67 68 74 20 68  e.** the right h
1a070 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20  and side of the 
1a080 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
1a090 69 6e 74 20 28 74 32 2e 62 29 20 68 61 73 20 4e  int (t2.b) has N
1a0a0 4f 4e 45 20 61 66 66 69 6e 69 74 79 2c 0a 2a 2a  ONE affinity,.**
1a0b0 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 20 73   no conversion s
1a0c0 68 6f 75 6c 64 20 62 65 20 61 74 74 65 6d 70 74  hould be attempt
1a0d0 65 64 20 62 65 66 6f 72 65 20 75 73 69 6e 67 20  ed before using 
1a0e0 61 20 74 32 2e 62 20 76 61 6c 75 65 20 61 73 20  a t2.b value as 
1a0f0 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 6b 65 79  part of.** a key
1a100 20 74 6f 20 73 65 61 72 63 68 20 74 68 65 20 69   to search the i
1a110 6e 64 65 78 2e 20 48 65 6e 63 65 20 74 68 65 20  ndex. Hence the 
1a120 66 69 72 73 74 20 62 79 74 65 20 69 6e 20 74 68  first byte in th
1a130 65 20 72 65 74 75 72 6e 65 64 20 61 66 66 69 6e  e returned affin
1a140 69 74 79 0a 2a 2a 20 73 74 72 69 6e 67 20 69 6e  ity.** string in
1a150 20 74 68 69 73 20 65 78 61 6d 70 6c 65 20 77 6f   this example wo
1a160 75 6c 64 20 62 65 20 73 65 74 20 74 6f 20 53 51  uld be set to SQ
1a170 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 0a 2a  LITE_AFF_NONE..*
1a180 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64  /.static int cod
1a190 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d  eAllEqualityTerm
1a1a0 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
1a1b0 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
1a1c0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
1a1d0 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
1a1e0 4c 65 76 65 6c 2c 20 20 20 2f 2a 20 57 68 69 63  Level,   /* Whic
1a1f0 68 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66  h nested loop of
1a200 20 74 68 65 20 46 52 4f 4d 20 77 65 20 61 72 65   the FROM we are
1a210 20 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74   coding */.  int
1a220 20 62 52 65 76 2c 20 20 20 20 20 20 20 20 20 20   bRev,          
1a230 20 20 20 2f 2a 20 52 65 76 65 72 73 65 20 74 68     /* Reverse th
1a240 65 20 6f 72 64 65 72 20 6f 66 20 49 4e 20 6f 70  e order of IN op
1a250 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e 74  erators */.  int
1a260 20 6e 45 78 74 72 61 52 65 67 2c 20 20 20 20 20   nExtraReg,     
1a270 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1a280 65 78 74 72 61 20 72 65 67 69 73 74 65 72 73 20  extra registers 
1a290 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20  to allocate */. 
1a2a0 20 63 68 61 72 20 2a 2a 70 7a 41 66 66 20 20 20   char **pzAff   
1a2b0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53         /* OUT: S
1a2c0 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61  et to point to a
1a2d0 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 2a  ffinity string *
1a2e0 2f 0a 29 7b 0a 20 20 75 31 36 20 6e 45 71 3b 20  /.){.  u16 nEq; 
1a2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a300 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62       /* The numb
1a310 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63  er of == or IN c
1a320 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 63 6f  onstraints to co
1a330 64 65 20 2a 2f 0a 20 20 75 31 36 20 6e 53 6b 69  de */.  u16 nSki
1a340 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
1a350 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1a360 6f 66 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c  of left-most col
1a370 75 6d 6e 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a  umns to skip */.
1a380 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
1a390 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20  se->pVdbe;      
1a3a0 2f 2a 20 54 68 65 20 76 6d 20 75 6e 64 65 72 20  /* The vm under 
1a3b0 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
1a3c0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
1a3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a3e0 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 62 65 69  /* The index bei
1a3f0 6e 67 20 75 73 65 64 20 66 6f 72 20 74 68 69 73  ng used for this
1a400 20 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65   loop */.  Where
1a410 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
1a420 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69           /* A si
1a430 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20  ngle constraint 
1a440 74 65 72 6d 20 2a 2f 0a 20 20 57 68 65 72 65 4c  term */.  WhereL
1a450 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20  oop *pLoop;     
1a460 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
1a470 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20  hereLoop object 
1a480 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20  */.  int j;     
1a490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4a0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
1a4b0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42  er */.  int regB
1a4c0 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
1a4d0 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65        /* Base re
1a4e0 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  gister */.  int 
1a4f0 6e 52 65 67 3b 20 20 20 20 20 20 20 20 20 20 20  nReg;           
1a500 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1a510 62 65 72 20 6f 66 20 72 65 67 69 73 74 65 72 73  ber of registers
1a520 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a   to allocate */.
1a530 20 20 63 68 61 72 20 2a 7a 41 66 66 3b 20 20 20    char *zAff;   
1a540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a550 2f 2a 20 41 66 66 69 6e 69 74 79 20 73 74 72 69  /* Affinity stri
1a560 6e 67 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ng to return */.
1a570 0a 20 20 2f 2a 20 54 68 69 73 20 6d 6f 64 75 6c  .  /* This modul
1a580 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  e is only called
1a590 20 6f 6e 20 71 75 65 72 79 20 70 6c 61 6e 73 20   on query plans 
1a5a0 74 68 61 74 20 75 73 65 20 61 6e 20 69 6e 64 65  that use an inde
1a5b0 78 2e 20 2a 2f 0a 20 20 70 4c 6f 6f 70 20 3d 20  x. */.  pLoop = 
1a5c0 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a  pLevel->pWLoop;.
1a5d0 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70    assert( (pLoop
1a5e0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
1a5f0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d  E_VIRTUALTABLE)=
1a600 3d 30 20 29 3b 0a 20 20 6e 45 71 20 3d 20 70 4c  =0 );.  nEq = pL
1a610 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
1a620 3b 0a 20 20 6e 53 6b 69 70 20 3d 20 70 4c 6f 6f  ;.  nSkip = pLoo
1a630 70 2d 3e 6e 53 6b 69 70 3b 0a 20 20 70 49 64 78  p->nSkip;.  pIdx
1a640 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
1a650 65 2e 70 49 6e 64 65 78 3b 0a 20 20 61 73 73 65  e.pIndex;.  asse
1a660 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a 0a  rt( pIdx!=0 );..
1a670 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
1a680 68 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f 72 79 20  how many memory 
1a690 63 65 6c 6c 73 20 77 65 20 77 69 6c 6c 20 6e 65  cells we will ne
1a6a0 65 64 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65  ed then allocate
1a6b0 20 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20 20 72 65   them..  */.  re
1a6c0 67 42 61 73 65 20 3d 20 70 50 61 72 73 65 2d 3e  gBase = pParse->
1a6d0 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 6e 52 65 67  nMem + 1;.  nReg
1a6e0 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
1a6f0 65 2e 6e 45 71 20 2b 20 6e 45 78 74 72 61 52 65  e.nEq + nExtraRe
1a700 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  g;.  pParse->nMe
1a710 6d 20 2b 3d 20 6e 52 65 67 3b 0a 0a 20 20 7a 41  m += nReg;..  zA
1a720 66 66 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  ff = sqlite3DbSt
1a730 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  rDup(pParse->db,
1a740 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66   sqlite3IndexAff
1a750 69 6e 69 74 79 53 74 72 28 76 2c 20 70 49 64 78  inityStr(v, pIdx
1a760 29 29 3b 0a 20 20 69 66 28 20 21 7a 41 66 66 20  ));.  if( !zAff 
1a770 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 64  ){.    pParse->d
1a780 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1a790 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  = 1;.  }..  if( 
1a7a0 6e 53 6b 69 70 20 29 7b 0a 20 20 20 20 69 6e 74  nSkip ){.    int
1a7b0 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65   iIdxCur = pLeve
1a7c0 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20  l->iIdxCur;.    
1a7d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a7e0 31 28 76 2c 20 28 62 52 65 76 3f 4f 50 5f 4c 61  1(v, (bRev?OP_La
1a7f0 73 74 3a 4f 50 5f 52 65 77 69 6e 64 29 2c 20 69  st:OP_Rewind), i
1a800 49 64 78 43 75 72 29 3b 0a 20 20 20 20 56 64 62  IdxCur);.    Vdb
1a810 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62  eCoverageIf(v, b
1a820 52 65 76 3d 3d 30 29 3b 0a 20 20 20 20 56 64 62  Rev==0);.    Vdb
1a830 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62  eCoverageIf(v, b
1a840 52 65 76 21 3d 30 29 3b 0a 20 20 20 20 56 64 62  Rev!=0);.    Vdb
1a850 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65  eComment((v, "be
1a860 67 69 6e 20 73 6b 69 70 2d 73 63 61 6e 20 6f 6e  gin skip-scan on
1a870 20 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d   %s", pIdx->zNam
1a880 65 29 29 3b 0a 20 20 20 20 6a 20 3d 20 73 71 6c  e));.    j = sql
1a890 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
1a8a0 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20  , OP_Goto);.    
1a8b0 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70  pLevel->addrSkip
1a8c0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1a8d0 64 4f 70 34 49 6e 74 28 76 2c 20 28 62 52 65 76  dOp4Int(v, (bRev
1a8e0 3f 4f 50 5f 53 65 65 6b 4c 54 3a 4f 50 5f 53 65  ?OP_SeekLT:OP_Se
1a8f0 65 6b 47 54 29 2c 0a 20 20 20 20 20 20 20 20 20  ekGT),.         
1a900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a910 20 20 20 69 49 64 78 43 75 72 2c 20 30 2c 20 72     iIdxCur, 0, r
1a920 65 67 42 61 73 65 2c 20 6e 53 6b 69 70 29 3b 0a  egBase, nSkip);.
1a930 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1a940 49 66 28 76 2c 20 62 52 65 76 3d 3d 30 29 3b 0a  If(v, bRev==0);.
1a950 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1a960 49 66 28 76 2c 20 62 52 65 76 21 3d 30 29 3b 0a  If(v, bRev!=0);.
1a970 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
1a980 75 6d 70 48 65 72 65 28 76 2c 20 6a 29 3b 0a 20  umpHere(v, j);. 
1a990 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53     for(j=0; j<nS
1a9a0 6b 69 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  kip; j++){.     
1a9b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a9c0 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
1a9d0 20 69 49 64 78 43 75 72 2c 20 6a 2c 20 72 65 67   iIdxCur, j, reg
1a9e0 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20 20 20 61  Base+j);.      a
1a9f0 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 69 43  ssert( pIdx->aiC
1aa00 6f 6c 75 6d 6e 5b 6a 5d 3e 3d 30 20 29 3b 0a 20  olumn[j]>=0 );. 
1aa10 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
1aa20 28 28 76 2c 20 22 25 73 22 2c 20 70 49 64 78 2d  ((v, "%s", pIdx-
1aa30 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 49  >pTable->aCol[pI
1aa40 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d  dx->aiColumn[j]]
1aa50 2e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a  .zName));.    }.
1aa60 20 20 7d 20 20 20 20 0a 0a 20 20 2f 2a 20 45 76    }    ..  /* Ev
1aa70 61 6c 75 61 74 65 20 74 68 65 20 65 71 75 61 6c  aluate the equal
1aa80 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  ity constraints.
1aa90 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a    */.  assert( z
1aaa0 41 66 66 3d 3d 30 20 7c 7c 20 28 69 6e 74 29 73  Aff==0 || (int)s
1aab0 74 72 6c 65 6e 28 7a 41 66 66 29 3e 3d 6e 45 71  trlen(zAff)>=nEq
1aac0 20 29 3b 0a 20 20 66 6f 72 28 6a 3d 6e 53 6b 69   );.  for(j=nSki
1aad0 70 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b 0a  p; j<nEq; j++){.
1aae0 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20      int r1;.    
1aaf0 70 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61  pTerm = pLoop->a
1ab00 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 61 73  LTerm[j];.    as
1ab10 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29  sert( pTerm!=0 )
1ab20 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c  ;.    /* The fol
1ab30 6c 6f 77 69 6e 67 20 74 65 73 74 63 61 73 65 20  lowing testcase 
1ab40 69 73 20 74 72 75 65 20 66 6f 72 20 69 6e 64 69  is true for indi
1ab50 63 65 73 20 77 69 74 68 20 72 65 64 75 6e 64 61  ces with redunda
1ab60 6e 74 20 63 6f 6c 75 6d 6e 73 2e 20 0a 20 20 20  nt columns. .   
1ab70 20 2a 2a 20 45 78 3a 20 43 52 45 41 54 45 20 49   ** Ex: CREATE I
1ab80 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61 2c  NDEX i1 ON t1(a,
1ab90 62 2c 61 29 3b 20 53 45 4c 45 43 54 20 2a 20 46  b,a); SELECT * F
1aba0 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 30  ROM t1 WHERE a=0
1abb0 20 41 4e 44 20 62 3d 30 3b 20 2a 2f 0a 20 20 20   AND b=0; */.   
1abc0 20 74 65 73 74 63 61 73 65 28 20 28 70 54 65 72   testcase( (pTer
1abd0 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
1abe0 4d 5f 43 4f 44 45 44 29 21 3d 30 20 29 3b 0a 20  M_CODED)!=0 );. 
1abf0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
1ac00 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
1ac10 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20  RM_VIRTUAL );.  
1ac20 20 20 72 31 20 3d 20 63 6f 64 65 45 71 75 61 6c    r1 = codeEqual
1ac30 69 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20  ityTerm(pParse, 
1ac40 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 6a  pTerm, pLevel, j
1ac50 2c 20 62 52 65 76 2c 20 72 65 67 42 61 73 65 2b  , bRev, regBase+
1ac60 6a 29 3b 0a 20 20 20 20 69 66 28 20 72 31 21 3d  j);.    if( r1!=
1ac70 72 65 67 42 61 73 65 2b 6a 20 29 7b 0a 20 20 20  regBase+j ){.   
1ac80 20 20 20 69 66 28 20 6e 52 65 67 3d 3d 31 20 29     if( nReg==1 )
1ac90 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1aca0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
1acb0 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 29  pParse, regBase)
1acc0 3b 0a 20 20 20 20 20 20 20 20 72 65 67 42 61 73  ;.        regBas
1acd0 65 20 3d 20 72 31 3b 0a 20 20 20 20 20 20 7d 65  e = r1;.      }e
1ace0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
1acf0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1ad00 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 31 2c 20  , OP_SCopy, r1, 
1ad10 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20  regBase+j);.    
1ad20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74 65    }.    }.    te
1ad30 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
1ad40 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53  Operator & WO_IS
1ad50 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73 74  NULL );.    test
1ad60 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
1ad70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29  erator & WO_IN )
1ad80 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  ;.    if( (pTerm
1ad90 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
1ada0 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 4e 29 29  O_ISNULL|WO_IN))
1adb0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70  ==0 ){.      Exp
1adc0 72 20 2a 70 52 69 67 68 74 20 3d 20 70 54 65 72  r *pRight = pTer
1add0 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  m->pExpr->pRight
1ade0 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
1adf0 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c  te3ExprCanBeNull
1ae00 28 70 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20  (pRight) ){.    
1ae10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1ae20 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp2(v, OP_IsNu
1ae30 6c 6c 2c 20 72 65 67 42 61 73 65 2b 6a 2c 20 70  ll, regBase+j, p
1ae40 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b  Level->addrBrk);
1ae50 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
1ae60 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
1ae70 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 41 66 66  }.      if( zAff
1ae80 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
1ae90 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
1aea0 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c 20 7a  finity(pRight, z
1aeb0 41 66 66 5b 6a 5d 29 3d 3d 53 51 4c 49 54 45 5f  Aff[j])==SQLITE_
1aec0 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  AFF_NONE ){.    
1aed0 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d 20        zAff[j] = 
1aee0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
1aef0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1af00 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
1af10 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74  prNeedsNoAffinit
1af20 79 43 68 61 6e 67 65 28 70 52 69 67 68 74 2c 20  yChange(pRight, 
1af30 7a 41 66 66 5b 6a 5d 29 20 29 7b 0a 20 20 20 20  zAff[j]) ){.    
1af40 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20 3d 20        zAff[j] = 
1af50 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
1af60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1af70 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a   }.    }.  }.  *
1af80 70 7a 41 66 66 20 3d 20 7a 41 66 66 3b 0a 20 20  pzAff = zAff;.  
1af90 72 65 74 75 72 6e 20 72 65 67 42 61 73 65 3b 0a  return regBase;.
1afa0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1afb0 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f  E_OMIT_EXPLAIN./
1afc0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1afd0 65 20 69 73 20 61 20 68 65 6c 70 65 72 20 66 6f  e is a helper fo
1afe0 72 20 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61  r explainIndexRa
1aff0 6e 67 65 28 29 20 62 65 6c 6f 77 0a 2a 2a 0a 2a  nge() below.**.*
1b000 2a 20 70 53 74 72 20 68 6f 6c 64 73 20 74 68 65  * pStr holds the
1b010 20 74 65 78 74 20 6f 66 20 61 6e 20 65 78 70 72   text of an expr
1b020 65 73 73 69 6f 6e 20 74 68 61 74 20 77 65 20 61  ession that we a
1b030 72 65 20 62 75 69 6c 64 69 6e 67 20 75 70 20 6f  re building up o
1b040 6e 65 20 74 65 72 6d 0a 2a 2a 20 61 74 20 61 20  ne term.** at a 
1b050 74 69 6d 65 2e 20 20 54 68 69 73 20 72 6f 75 74  time.  This rout
1b060 69 6e 65 20 61 64 64 73 20 61 20 6e 65 77 20 74  ine adds a new t
1b070 65 72 6d 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  erm to the end o
1b080 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
1b090 2e 0a 2a 2a 20 54 65 72 6d 73 20 61 72 65 20 73  ..** Terms are s
1b0a0 65 70 61 72 61 74 65 64 20 62 79 20 41 4e 44 20  eparated by AND 
1b0b0 73 6f 20 61 64 64 20 74 68 65 20 22 41 4e 44 22  so add the "AND"
1b0c0 20 74 65 78 74 20 66 6f 72 20 73 65 63 6f 6e 64   text for second
1b0d0 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 0a   and subsequent.
1b0e0 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c 79 2e 0a 2a  ** terms only..*
1b0f0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
1b100 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28  plainAppendTerm(
1b110 0a 20 20 53 74 72 41 63 63 75 6d 20 2a 70 53 74  .  StrAccum *pSt
1b120 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r,             /
1b130 2a 20 54 68 65 20 74 65 78 74 20 65 78 70 72 65  * The text expre
1b140 73 73 69 6f 6e 20 62 65 69 6e 67 20 62 75 69 6c  ssion being buil
1b150 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65 72 6d  t */.  int iTerm
1b160 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1b170 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
1b180 68 69 73 20 74 65 72 6d 2e 20 20 46 69 72 73 74  his term.  First
1b190 20 69 73 20 7a 65 72 6f 20 2a 2f 0a 20 20 63 6f   is zero */.  co
1b1a0 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d  nst char *zColum
1b1b0 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  n,        /* Nam
1b1c0 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  e of the column 
1b1d0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1b1e0 2a 7a 4f 70 20 20 20 20 20 20 20 20 20 20 20 20  *zOp            
1b1f0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
1b200 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20  operator */.){. 
1b210 20 69 66 28 20 69 54 65 72 6d 20 29 20 73 71 6c   if( iTerm ) sql
1b220 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
1b230 6e 64 28 70 53 74 72 2c 20 22 20 41 4e 44 20 22  nd(pStr, " AND "
1b240 2c 20 35 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  , 5);.  sqlite3S
1b250 74 72 41 63 63 75 6d 41 70 70 65 6e 64 41 6c 6c  trAccumAppendAll
1b260 28 70 53 74 72 2c 20 7a 43 6f 6c 75 6d 6e 29 3b  (pStr, zColumn);
1b270 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63  .  sqlite3StrAcc
1b280 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20 7a  umAppend(pStr, z
1b290 4f 70 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65  Op, 1);.  sqlite
1b2a0 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28  3StrAccumAppend(
1b2b0 70 53 74 72 2c 20 22 3f 22 2c 20 31 29 3b 0a 7d  pStr, "?", 1);.}
1b2c0 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ../*.** Argument
1b2d0 20 70 4c 65 76 65 6c 20 64 65 73 63 72 69 62 65   pLevel describe
1b2e0 73 20 61 20 73 74 72 61 74 65 67 79 20 66 6f 72  s a strategy for
1b2f0 20 73 63 61 6e 6e 69 6e 67 20 74 61 62 6c 65 20   scanning table 
1b300 70 54 61 62 2e 20 54 68 69 73 20 0a 2a 2a 20 66  pTab. This .** f
1b310 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20  unction appends 
1b320 74 65 78 74 20 74 6f 20 70 53 74 72 20 74 68 61  text to pStr tha
1b330 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
1b340 73 75 62 73 65 74 20 6f 66 20 74 61 62 6c 65 0a  subset of table.
1b350 2a 2a 20 72 6f 77 73 20 73 63 61 6e 6e 65 64 20  ** rows scanned 
1b360 62 79 20 74 68 65 20 73 74 72 61 74 65 67 79 20  by the strategy 
1b370 69 6e 20 74 68 65 20 66 6f 72 6d 20 6f 66 20 61  in the form of a
1b380 6e 20 53 51 4c 20 65 78 70 72 65 73 73 69 6f 6e  n SQL expression
1b390 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
1b3a0 70 6c 65 2c 20 69 66 20 74 68 65 20 71 75 65 72  ple, if the quer
1b3b0 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  y:.**.**   SELEC
1b3c0 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T * FROM t1 WHER
1b3d0 45 20 61 3d 31 20 41 4e 44 20 62 3e 32 3b 0a 2a  E a=1 AND b>2;.*
1b3e0 2a 0a 2a 2a 20 69 73 20 72 75 6e 20 61 6e 64 20  *.** is run and 
1b3f0 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e 64 65  there is an inde
1b400 78 20 6f 6e 20 28 61 2c 20 62 29 2c 20 74 68 65  x on (a, b), the
1b410 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
1b420 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20 73 74 72  returns a.** str
1b430 69 6e 67 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0a  ing similar to:.
1b440 2a 2a 0a 2a 2a 20 20 20 22 61 3d 3f 20 41 4e 44  **.**   "a=? AND
1b450 20 62 3e 3f 22 0a 2a 2f 0a 73 74 61 74 69 63 20   b>?".*/.static 
1b460 76 6f 69 64 20 65 78 70 6c 61 69 6e 49 6e 64 65  void explainInde
1b470 78 52 61 6e 67 65 28 53 74 72 41 63 63 75 6d 20  xRange(StrAccum 
1b480 2a 70 53 74 72 2c 20 57 68 65 72 65 4c 6f 6f 70  *pStr, WhereLoop
1b490 20 2a 70 4c 6f 6f 70 2c 20 54 61 62 6c 65 20 2a   *pLoop, Table *
1b4a0 70 54 61 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a  pTab){.  Index *
1b4b0 70 49 6e 64 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e  pIndex = pLoop->
1b4c0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
1b4d0 20 20 75 31 36 20 6e 45 71 20 3d 20 70 4c 6f 6f    u16 nEq = pLoo
1b4e0 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a  p->u.btree.nEq;.
1b4f0 20 20 75 31 36 20 6e 53 6b 69 70 20 3d 20 70 4c    u16 nSkip = pL
1b500 6f 6f 70 2d 3e 6e 53 6b 69 70 3b 0a 20 20 69 6e  oop->nSkip;.  in
1b510 74 20 69 2c 20 6a 3b 0a 20 20 43 6f 6c 75 6d 6e  t i, j;.  Column
1b520 20 2a 61 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61   *aCol = pTab->a
1b530 43 6f 6c 3b 0a 20 20 69 31 36 20 2a 61 69 43 6f  Col;.  i16 *aiCo
1b540 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61  lumn = pIndex->a
1b550 69 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 69 66 28 20  iColumn;..  if( 
1b560 6e 45 71 3d 3d 30 20 26 26 20 28 70 4c 6f 6f 70  nEq==0 && (pLoop
1b570 2d 3e 77 73 46 6c 61 67 73 26 28 57 48 45 52 45  ->wsFlags&(WHERE
1b580 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45  _BTM_LIMIT|WHERE
1b590 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 3d 3d 30 20  _TOP_LIMIT))==0 
1b5a0 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
1b5b0 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
1b5c0 64 28 70 53 74 72 2c 20 22 20 28 22 2c 20 32 29  d(pStr, " (", 2)
1b5d0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
1b5e0 45 71 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68  Eq; i++){.    ch
1b5f0 61 72 20 2a 7a 20 3d 20 61 69 43 6f 6c 75 6d 6e  ar *z = aiColumn
1b600 5b 69 5d 20 3c 20 30 20 3f 20 22 72 6f 77 69 64  [i] < 0 ? "rowid
1b610 22 20 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d  " : aCol[aiColum
1b620 6e 5b 69 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  n[i]].zName;.   
1b630 20 69 66 28 20 69 3e 3d 6e 53 6b 69 70 20 29 7b   if( i>=nSkip ){
1b640 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 41 70  .      explainAp
1b650 70 65 6e 64 54 65 72 6d 28 70 53 74 72 2c 20 69  pendTerm(pStr, i
1b660 2c 20 7a 2c 20 22 3d 22 29 3b 0a 20 20 20 20 7d  , z, "=");.    }
1b670 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
1b680 69 20 29 20 73 71 6c 69 74 65 33 53 74 72 41 63  i ) sqlite3StrAc
1b690 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20  cumAppend(pStr, 
1b6a0 22 20 41 4e 44 20 22 2c 20 35 29 3b 0a 20 20 20  " AND ", 5);.   
1b6b0 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74     sqlite3XPrint
1b6c0 66 28 70 53 74 72 2c 20 30 2c 20 22 41 4e 59 28  f(pStr, 0, "ANY(
1b6d0 25 73 29 22 2c 20 7a 29 3b 0a 20 20 20 20 7d 0a  %s)", z);.    }.
1b6e0 20 20 7d 0a 0a 20 20 6a 20 3d 20 69 3b 0a 20 20    }..  j = i;.  
1b6f0 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
1b700 67 73 26 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d  gs&WHERE_BTM_LIM
1b710 49 54 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  IT ){.    char *
1b720 7a 20 3d 20 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20  z = aiColumn[j] 
1b730 3c 20 30 20 3f 20 22 72 6f 77 69 64 22 20 3a 20  < 0 ? "rowid" : 
1b740 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  aCol[aiColumn[j]
1b750 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 65 78 70  ].zName;.    exp
1b760 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 70  lainAppendTerm(p
1b770 53 74 72 2c 20 69 2b 2b 2c 20 7a 2c 20 22 3e 22  Str, i++, z, ">"
1b780 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f  );.  }.  if( pLo
1b790 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52  op->wsFlags&WHER
1b7a0 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20  E_TOP_LIMIT ){. 
1b7b0 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 69 43     char *z = aiC
1b7c0 6f 6c 75 6d 6e 5b 6a 5d 20 3c 20 30 20 3f 20 22  olumn[j] < 0 ? "
1b7d0 72 6f 77 69 64 22 20 3a 20 61 43 6f 6c 5b 61 69  rowid" : aCol[ai
1b7e0 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65  Column[j]].zName
1b7f0 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 41 70 70  ;.    explainApp
1b800 65 6e 64 54 65 72 6d 28 70 53 74 72 2c 20 69 2c  endTerm(pStr, i,
1b810 20 7a 2c 20 22 3c 22 29 3b 0a 20 20 7d 0a 20 20   z, "<");.  }.  
1b820 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
1b830 70 70 65 6e 64 28 70 53 74 72 2c 20 22 29 22 2c  ppend(pStr, ")",
1b840 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   1);.}../*.** Th
1b850 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
1b860 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 63 75   no-op unless cu
1b870 72 72 65 6e 74 6c 79 20 70 72 6f 63 65 73 73 69  rrently processi
1b880 6e 67 20 61 6e 20 45 58 50 4c 41 49 4e 20 51 55  ng an EXPLAIN QU
1b890 45 52 59 20 50 4c 41 4e 0a 2a 2a 20 63 6f 6d 6d  ERY PLAN.** comm
1b8a0 61 6e 64 2c 20 6f 72 20 69 66 20 65 69 74 68 65  and, or if eithe
1b8b0 72 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 6f  r SQLITE_DEBUG o
1b8c0 72 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  r SQLITE_ENABLE_
1b8d0 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 20  STMT_SCANSTATUS 
1b8e0 77 61 73 0a 2a 2a 20 64 65 66 69 6e 65 64 20 61  was.** defined a
1b8f0 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20  t compile-time. 
1b900 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61 20 6e  If it is not a n
1b910 6f 2d 6f 70 2c 20 61 20 73 69 6e 67 6c 65 20 4f  o-op, a single O
1b920 50 5f 45 78 70 6c 61 69 6e 20 6f 70 63 6f 64 65  P_Explain opcode
1b930 20 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f   .** is added to
1b940 20 74 68 65 20 6f 75 74 70 75 74 20 74 6f 20 64   the output to d
1b950 65 73 63 72 69 62 65 20 74 68 65 20 74 61 62 6c  escribe the tabl
1b960 65 20 73 63 61 6e 20 73 74 72 61 74 65 67 79 20  e scan strategy 
1b970 69 6e 20 70 4c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a  in pLevel..**.**
1b980 20 49 66 20 61 6e 20 4f 50 5f 45 78 70 6c 61 69   If an OP_Explai
1b990 6e 20 6f 70 63 6f 64 65 20 69 73 20 61 64 64 65  n opcode is adde
1b9a0 64 20 74 6f 20 74 68 65 20 56 4d 2c 20 69 74 73  d to the VM, its
1b9b0 20 61 64 64 72 65 73 73 20 69 73 20 72 65 74 75   address is retu
1b9c0 72 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 77 69  rned..** Otherwi
1b9d0 73 65 2c 20 69 66 20 6e 6f 20 4f 50 5f 45 78 70  se, if no OP_Exp
1b9e0 6c 61 69 6e 20 69 73 20 63 6f 64 65 64 2c 20 7a  lain is coded, z
1b9f0 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ero is returned.
1ba00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
1ba10 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20  xplainOneScan(. 
1ba20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1ba30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba40 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
1ba50 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
1ba60 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20  pTabList,       
1ba70 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
1ba80 6c 69 73 74 20 74 68 69 73 20 6c 6f 6f 70 20 72  list this loop r
1ba90 65 66 65 72 73 20 74 6f 20 2a 2f 0a 20 20 57 68  efers to */.  Wh
1baa0 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
1bab0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1bac0 20 53 63 61 6e 20 74 6f 20 77 72 69 74 65 20 4f   Scan to write O
1bad0 50 5f 45 78 70 6c 61 69 6e 20 6f 70 63 6f 64 65  P_Explain opcode
1bae0 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c   for */.  int iL
1baf0 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20  evel,           
1bb00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
1bb10 75 65 20 66 6f 72 20 22 6c 65 76 65 6c 22 20 63  ue for "level" c
1bb20 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74 70 75 74 20  olumn of output 
1bb30 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20  */.  int iFrom, 
1bb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb50 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f       /* Value fo
1bb60 72 20 22 66 72 6f 6d 22 20 63 6f 6c 75 6d 6e 20  r "from" column 
1bb70 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 75  of output */.  u
1bb80 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20 20 20  16 wctrlFlags   
1bb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1bba0 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74  * Flags passed t
1bbb0 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
1bbc0 67 69 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e  gin() */.){.  in
1bbd0 74 20 72 65 74 20 3d 20 30 3b 0a 23 69 66 20 21  t ret = 0;.#if !
1bbe0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
1bbf0 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e 65  EBUG) && !define
1bc00 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
1bc10 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 29  STMT_SCANSTATUS)
1bc20 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
1bc30 78 70 6c 61 69 6e 3d 3d 32 20 29 0a 23 65 6e 64  xplain==2 ).#end
1bc40 69 66 0a 20 20 7b 0a 20 20 20 20 73 74 72 75 63  if.  {.    struc
1bc50 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1bc60 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  pItem = &pTabLis
1bc70 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
1bc80 6f 6d 5d 3b 0a 20 20 20 20 56 64 62 65 20 2a 76  om];.    Vdbe *v
1bc90 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
1bca0 3b 20 20 20 20 20 20 2f 2a 20 56 4d 20 62 65 69  ;      /* VM bei
1bcb0 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 2a  ng constructed *
1bcc0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  /.    sqlite3 *d
1bcd0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
1bce0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
1bcf0 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 69 6e  handle */.    in
1bd00 74 20 69 49 64 20 3d 20 70 50 61 72 73 65 2d 3e  t iId = pParse->
1bd10 69 53 65 6c 65 63 74 49 64 3b 20 20 2f 2a 20 53  iSelectId;  /* S
1bd20 65 6c 65 63 74 20 69 64 20 28 6c 65 66 74 2d 6d  elect id (left-m
1bd30 6f 73 74 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d  ost output colum
1bd40 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73  n) */.    int is
1bd50 53 65 61 72 63 68 3b 20 20 20 20 20 20 20 20 20  Search;         
1bd60 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1bd70 66 6f 72 20 61 20 53 45 41 52 43 48 2e 20 46 61  for a SEARCH. Fa
1bd80 6c 73 65 20 66 6f 72 20 53 43 41 4e 2e 20 2a 2f  lse for SCAN. */
1bd90 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  .    WhereLoop *
1bda0 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  pLoop;          
1bdb0 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 72 6f     /* The contro
1bdc0 6c 6c 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  lling WhereLoop 
1bdd0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 75 33  object */.    u3
1bde0 32 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20  2 flags;        
1bdf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1be00 6c 61 67 73 20 74 68 61 74 20 64 65 73 63 72 69  lags that descri
1be10 62 65 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a  be this loop */.
1be20 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 20      char *zMsg; 
1be30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be40 20 20 2f 2a 20 54 65 78 74 20 74 6f 20 61 64 64    /* Text to add
1be50 20 74 6f 20 45 51 50 20 6f 75 74 70 75 74 20 2a   to EQP output *
1be60 2f 0a 20 20 20 20 53 74 72 41 63 63 75 6d 20 73  /.    StrAccum s
1be70 74 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  tr;             
1be80 20 20 20 20 2f 2a 20 45 51 50 20 6f 75 74 70 75      /* EQP outpu
1be90 74 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20  t string */.    
1bea0 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 20  char zBuf[100]; 
1beb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bec0 20 49 6e 69 74 69 61 6c 20 73 70 61 63 65 20 66   Initial space f
1bed0 6f 72 20 45 51 50 20 6f 75 74 70 75 74 20 73 74  or EQP output st
1bee0 72 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 70 4c 6f  ring */..    pLo
1bef0 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c  op = pLevel->pWL
1bf00 6f 6f 70 3b 0a 20 20 20 20 66 6c 61 67 73 20 3d  oop;.    flags =
1bf10 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b   pLoop->wsFlags;
1bf20 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 26  .    if( (flags&
1bf30 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 20  WHERE_MULTI_OR) 
1bf40 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73 26 57  || (wctrlFlags&W
1bf50 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ONETABLE_ON
1bf60 4c 59 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  LY) ) return 0;.
1bf70 0a 20 20 20 20 69 73 53 65 61 72 63 68 20 3d 20  .    isSearch = 
1bf80 28 66 6c 61 67 73 26 28 57 48 45 52 45 5f 42 54  (flags&(WHERE_BT
1bf90 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f  M_LIMIT|WHERE_TO
1bfa0 50 5f 4c 49 4d 49 54 29 29 21 3d 30 0a 20 20 20  P_LIMIT))!=0.   
1bfb0 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 66 6c           || ((fl
1bfc0 61 67 73 26 57 48 45 52 45 5f 56 49 52 54 55 41  ags&WHERE_VIRTUA
1bfd0 4c 54 41 42 4c 45 29 3d 3d 30 20 26 26 20 28 70  LTABLE)==0 && (p
1bfe0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
1bff0 71 3e 30 29 29 0a 20 20 20 20 20 20 20 20 20 20  q>0)).          
1c000 20 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73    || (wctrlFlags
1c010 26 28 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  &(WHERE_ORDERBY_
1c020 4d 49 4e 7c 57 48 45 52 45 5f 4f 52 44 45 52 42  MIN|WHERE_ORDERB
1c030 59 5f 4d 41 58 29 29 3b 0a 0a 20 20 20 20 73 71  Y_MAX));..    sq
1c040 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69  lite3StrAccumIni
1c050 74 28 26 73 74 72 2c 20 7a 42 75 66 2c 20 73 69  t(&str, zBuf, si
1c060 7a 65 6f 66 28 7a 42 75 66 29 2c 20 53 51 4c 49  zeof(zBuf), SQLI
1c070 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 29 3b 0a  TE_MAX_LENGTH);.
1c080 20 20 20 20 73 74 72 2e 64 62 20 3d 20 64 62 3b      str.db = db;
1c090 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41  .    sqlite3StrA
1c0a0 63 63 75 6d 41 70 70 65 6e 64 41 6c 6c 28 26 73  ccumAppendAll(&s
1c0b0 74 72 2c 20 69 73 53 65 61 72 63 68 20 3f 20 22  tr, isSearch ? "
1c0c0 53 45 41 52 43 48 22 20 3a 20 22 53 43 41 4e 22  SEARCH" : "SCAN"
1c0d0 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d  );.    if( pItem
1c0e0 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
1c0f0 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74     sqlite3XPrint
1c100 66 28 26 73 74 72 2c 20 30 2c 20 22 20 53 55 42  f(&str, 0, " SUB
1c110 51 55 45 52 59 20 25 64 22 2c 20 70 49 74 65 6d  QUERY %d", pItem
1c120 2d 3e 69 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  ->iSelectId);.  
1c130 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
1c140 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 73  qlite3XPrintf(&s
1c150 74 72 2c 20 30 2c 20 22 20 54 41 42 4c 45 20 25  tr, 0, " TABLE %
1c160 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  s", pItem->zName
1c170 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
1c180 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  ( pItem->zAlias 
1c190 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1c1a0 58 50 72 69 6e 74 66 28 26 73 74 72 2c 20 30 2c  XPrintf(&str, 0,
1c1b0 20 22 20 41 53 20 25 73 22 2c 20 70 49 74 65 6d   " AS %s", pItem
1c1c0 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 7d  ->zAlias);.    }
1c1d0 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20  .    if( (flags 
1c1e0 26 20 28 57 48 45 52 45 5f 49 50 4b 7c 57 48 45  & (WHERE_IPK|WHE
1c1f0 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
1c200 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f  )==0 ){.      co
1c210 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 20 3d  nst char *zFmt =
1c220 20 30 3b 0a 20 20 20 20 20 20 49 6e 64 65 78 20   0;.      Index 
1c230 2a 70 49 64 78 3b 0a 0a 20 20 20 20 20 20 61 73  *pIdx;..      as
1c240 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62  sert( pLoop->u.b
1c250 74 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 20 29  tree.pIndex!=0 )
1c260 3b 0a 20 20 20 20 20 20 70 49 64 78 20 3d 20 70  ;.      pIdx = p
1c270 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
1c280 6e 64 65 78 3b 0a 20 20 20 20 20 20 61 73 73 65  ndex;.      asse
1c290 72 74 28 20 21 28 66 6c 61 67 73 26 57 48 45 52  rt( !(flags&WHER
1c2a0 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 20 7c 7c  E_AUTO_INDEX) ||
1c2b0 20 28 66 6c 61 67 73 26 57 48 45 52 45 5f 49 44   (flags&WHERE_ID
1c2c0 58 5f 4f 4e 4c 59 29 20 29 3b 0a 20 20 20 20 20  X_ONLY) );.     
1c2d0 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70   if( !HasRowid(p
1c2e0 49 74 65 6d 2d 3e 70 54 61 62 29 20 26 26 20 49  Item->pTab) && I
1c2f0 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  sPrimaryKeyIndex
1c300 28 70 49 64 78 29 20 29 7b 0a 20 20 20 20 20 20  (pIdx) ){.      
1c310 20 20 69 66 28 20 69 73 53 65 61 72 63 68 20 29    if( isSearch )
1c320 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 46 6d 74  {.          zFmt
1c330 20 3d 20 22 50 52 49 4d 41 52 59 20 4b 45 59 22   = "PRIMARY KEY"
1c340 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1c350 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
1c360 73 20 26 20 57 48 45 52 45 5f 50 41 52 54 49 41  s & WHERE_PARTIA
1c370 4c 49 44 58 20 29 7b 0a 20 20 20 20 20 20 20 20  LIDX ){.        
1c380 7a 46 6d 74 20 3d 20 22 41 55 54 4f 4d 41 54 49  zFmt = "AUTOMATI
1c390 43 20 50 41 52 54 49 41 4c 20 43 4f 56 45 52 49  C PARTIAL COVERI
1c3a0 4e 47 20 49 4e 44 45 58 22 3b 0a 20 20 20 20 20  NG INDEX";.     
1c3b0 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73   }else if( flags
1c3c0 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e   & WHERE_AUTO_IN
1c3d0 44 45 58 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  DEX ){.        z
1c3e0 46 6d 74 20 3d 20 22 41 55 54 4f 4d 41 54 49 43  Fmt = "AUTOMATIC
1c3f0 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 22   COVERING INDEX"
1c400 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1c410 28 20 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ( flags & WHERE_
1c420 49 44 58 5f 4f 4e 4c 59 20 29 7b 0a 20 20 20 20  IDX_ONLY ){.    
1c430 20 20 20 20 7a 46 6d 74 20 3d 20 22 43 4f 56 45      zFmt = "COVE
1c440 52 49 4e 47 20 49 4e 44 45 58 20 25 73 22 3b 0a  RING INDEX %s";.
1c450 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1c460 20 20 20 20 20 7a 46 6d 74 20 3d 20 22 49 4e 44       zFmt = "IND
1c470 45 58 20 25 73 22 3b 0a 20 20 20 20 20 20 7d 0a  EX %s";.      }.
1c480 20 20 20 20 20 20 69 66 28 20 7a 46 6d 74 20 29        if( zFmt )
1c490 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1c4a0 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28  3StrAccumAppend(
1c4b0 26 73 74 72 2c 20 22 20 55 53 49 4e 47 20 22 2c  &str, " USING ",
1c4c0 20 37 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   7);.        sql
1c4d0 69 74 65 33 58 50 72 69 6e 74 66 28 26 73 74 72  ite3XPrintf(&str
1c4e0 2c 20 30 2c 20 7a 46 6d 74 2c 20 70 49 64 78 2d  , 0, zFmt, pIdx-
1c4f0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  >zName);.       
1c500 20 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e   explainIndexRan
1c510 67 65 28 26 73 74 72 2c 20 70 4c 6f 6f 70 2c 20  ge(&str, pLoop, 
1c520 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20  pItem->pTab);.  
1c530 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
1c540 69 66 28 20 28 66 6c 61 67 73 20 26 20 57 48 45  if( (flags & WHE
1c550 52 45 5f 49 50 4b 29 21 3d 30 20 26 26 20 28 66  RE_IPK)!=0 && (f
1c560 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4e  lags & WHERE_CON
1c570 53 54 52 41 49 4e 54 29 21 3d 30 20 29 7b 0a 20  STRAINT)!=0 ){. 
1c580 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1c590 2a 7a 52 61 6e 67 65 3b 0a 20 20 20 20 20 20 69  *zRange;.      i
1c5a0 66 28 20 66 6c 61 67 73 26 28 57 48 45 52 45 5f  f( flags&(WHERE_
1c5b0 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f  COLUMN_EQ|WHERE_
1c5c0 43 4f 4c 55 4d 4e 5f 49 4e 29 20 29 7b 0a 20 20  COLUMN_IN) ){.  
1c5d0 20 20 20 20 20 20 7a 52 61 6e 67 65 20 3d 20 22        zRange = "
1c5e0 28 72 6f 77 69 64 3d 3f 29 22 3b 0a 20 20 20 20  (rowid=?)";.    
1c5f0 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c 61    }else if( (fla
1c600 67 73 26 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49  gs&WHERE_BOTH_LI
1c610 4d 49 54 29 3d 3d 57 48 45 52 45 5f 42 4f 54 48  MIT)==WHERE_BOTH
1c620 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20  _LIMIT ){.      
1c630 20 20 7a 52 61 6e 67 65 20 3d 20 22 28 72 6f 77    zRange = "(row
1c640 69 64 3e 3f 20 41 4e 44 20 72 6f 77 69 64 3c 3f  id>? AND rowid<?
1c650 29 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  )";.      }else 
1c660 69 66 28 20 66 6c 61 67 73 26 57 48 45 52 45 5f  if( flags&WHERE_
1c670 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  BTM_LIMIT ){.   
1c680 20 20 20 20 20 7a 52 61 6e 67 65 20 3d 20 22 28       zRange = "(
1c690 72 6f 77 69 64 3e 3f 29 22 3b 0a 20 20 20 20 20  rowid>?)";.     
1c6a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1c6b0 61 73 73 65 72 74 28 20 66 6c 61 67 73 26 57 48  assert( flags&WH
1c6c0 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3b 0a  ERE_TOP_LIMIT);.
1c6d0 20 20 20 20 20 20 20 20 7a 52 61 6e 67 65 20 3d          zRange =
1c6e0 20 22 28 72 6f 77 69 64 3c 3f 29 22 3b 0a 20 20   "(rowid<?)";.  
1c6f0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
1c700 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
1c710 64 41 6c 6c 28 26 73 74 72 2c 20 22 20 55 53 49  dAll(&str, " USI
1c720 4e 47 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  NG INTEGER PRIMA
1c730 52 59 20 4b 45 59 20 22 29 3b 0a 20 20 20 20 20  RY KEY ");.     
1c740 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
1c750 41 70 70 65 6e 64 41 6c 6c 28 26 73 74 72 2c 20  AppendAll(&str, 
1c760 7a 52 61 6e 67 65 29 3b 0a 20 20 20 20 7d 0a 23  zRange);.    }.#
1c770 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1c780 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
1c790 20 20 20 20 65 6c 73 65 20 69 66 28 20 28 66 6c      else if( (fl
1c7a0 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
1c7b0 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a  UALTABLE)!=0 ){.
1c7c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72        sqlite3XPr
1c7d0 69 6e 74 66 28 26 73 74 72 2c 20 30 2c 20 22 20  intf(&str, 0, " 
1c7e0 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 49 4e  VIRTUAL TABLE IN
1c7f0 44 45 58 20 25 64 3a 25 73 22 2c 0a 20 20 20 20  DEX %d:%s",.    
1c800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
1c810 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e  oop->u.vtab.idxN
1c820 75 6d 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61  um, pLoop->u.vta
1c830 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 7d  b.idxStr);.    }
1c840 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
1c850 51 4c 49 54 45 5f 45 58 50 4c 41 49 4e 5f 45 53  QLITE_EXPLAIN_ES
1c860 54 49 4d 41 54 45 44 5f 52 4f 57 53 0a 20 20 20  TIMATED_ROWS.   
1c870 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74   if( pLoop->nOut
1c880 3e 3d 31 30 20 29 7b 0a 20 20 20 20 20 20 73 71  >=10 ){.      sq
1c890 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 73 74  lite3XPrintf(&st
1c8a0 72 2c 20 30 2c 20 22 20 28 7e 25 6c 6c 75 20 72  r, 0, " (~%llu r
1c8b0 6f 77 73 29 22 2c 20 73 71 6c 69 74 65 33 4c 6f  ows)", sqlite3Lo
1c8c0 67 45 73 74 54 6f 49 6e 74 28 70 4c 6f 6f 70 2d  gEstToInt(pLoop-
1c8d0 3e 6e 4f 75 74 29 29 3b 0a 20 20 20 20 7d 65 6c  >nOut));.    }el
1c8e0 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
1c8f0 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28  3StrAccumAppend(
1c900 26 73 74 72 2c 20 22 20 28 7e 31 20 72 6f 77 29  &str, " (~1 row)
1c910 22 2c 20 39 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  ", 9);.    }.#en
1c920 64 69 66 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73  dif.    zMsg = s
1c930 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46 69  qlite3StrAccumFi
1c940 6e 69 73 68 28 26 73 74 72 29 3b 0a 20 20 20 20  nish(&str);.    
1c950 72 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ret = sqlite3Vdb
1c960 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78  eAddOp4(v, OP_Ex
1c970 70 6c 61 69 6e 2c 20 69 49 64 2c 20 69 4c 65 76  plain, iId, iLev
1c980 65 6c 2c 20 69 46 72 6f 6d 2c 20 7a 4d 73 67 2c  el, iFrom, zMsg,
1c990 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d  P4_DYNAMIC);.  }
1c9a0 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d  .  return ret;.}
1c9b0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
1c9c0 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 75  explainOneScan(u
1c9d0 2c 76 2c 77 2c 78 2c 79 2c 7a 29 20 30 0a 23 65  ,v,w,x,y,z) 0.#e
1c9e0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
1c9f0 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a  MIT_EXPLAIN */..
1ca00 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1ca10 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54  ABLE_STMT_SCANST
1ca20 41 54 55 53 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69  ATUS./*.** Confi
1ca30 67 75 72 65 20 74 68 65 20 56 4d 20 70 61 73 73  gure the VM pass
1ca40 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
1ca50 61 72 67 75 6d 65 6e 74 20 77 69 74 68 20 61 6e  argument with an
1ca60 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  .** sqlite3_stmt
1ca70 5f 73 63 61 6e 73 74 61 74 75 73 28 29 20 65 6e  _scanstatus() en
1ca80 74 72 79 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  try correspondin
1ca90 67 20 74 6f 20 74 68 65 20 73 63 61 6e 20 75 73  g to the scan us
1caa0 65 64 20 74 6f 20 0a 2a 2a 20 69 6d 70 6c 65 6d  ed to .** implem
1cab0 65 6e 74 20 6c 65 76 65 6c 20 70 4c 76 6c 2e 20  ent level pLvl. 
1cac0 41 72 67 75 6d 65 6e 74 20 70 53 72 63 6c 69 73  Argument pSrclis
1cad0 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  t is a pointer t
1cae0 6f 20 74 68 65 20 46 52 4f 4d 20 0a 2a 2a 20 63  o the FROM .** c
1caf0 6c 61 75 73 65 20 74 68 61 74 20 74 68 65 20 73  lause that the s
1cb00 63 61 6e 20 72 65 61 64 73 20 64 61 74 61 20 66  can reads data f
1cb10 72 6f 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72  rom..**.** If ar
1cb20 67 75 6d 65 6e 74 20 61 64 64 72 45 78 70 6c 61  gument addrExpla
1cb30 69 6e 20 69 73 20 6e 6f 74 20 30 2c 20 69 74 20  in is not 0, it 
1cb40 6d 75 73 74 20 62 65 20 74 68 65 20 61 64 64 72  must be the addr
1cb50 65 73 73 20 6f 66 20 61 6e 20 0a 2a 2a 20 4f 50  ess of an .** OP
1cb60 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63  _Explain instruc
1cb70 74 69 6f 6e 20 74 68 61 74 20 64 65 73 63 72 69  tion that descri
1cb80 62 65 73 20 74 68 65 20 73 61 6d 65 20 6c 6f 6f  bes the same loo
1cb90 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
1cba0 64 20 61 64 64 53 63 61 6e 53 74 61 74 75 73 28  d addScanStatus(
1cbb0 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
1cbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cbd0 20 20 20 2f 2a 20 56 64 62 65 20 74 6f 20 61 64     /* Vdbe to ad
1cbe0 64 20 73 63 61 6e 73 74 61 74 75 73 20 65 6e 74  d scanstatus ent
1cbf0 72 79 20 74 6f 20 2a 2f 0a 20 20 53 72 63 4c 69  ry to */.  SrcLi
1cc00 73 74 20 2a 70 53 72 63 6c 69 73 74 2c 20 20 20  st *pSrclist,   
1cc10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 52             /* FR
1cc20 4f 4d 20 63 6c 61 75 73 65 20 70 4c 76 6c 20 72  OM clause pLvl r
1cc30 65 61 64 73 20 64 61 74 61 20 66 72 6f 6d 20 2a  eads data from *
1cc40 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
1cc50 70 4c 76 6c 2c 20 20 20 20 20 20 20 20 20 20 20  pLvl,           
1cc60 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 74 6f 20      /* Level to 
1cc70 61 64 64 20 73 63 61 6e 73 74 61 74 75 73 28 29  add scanstatus()
1cc80 20 65 6e 74 72 79 20 66 6f 72 20 2a 2f 0a 20 20   entry for */.  
1cc90 69 6e 74 20 61 64 64 72 45 78 70 6c 61 69 6e 20  int addrExplain 
1cca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ccb0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50  /* Address of OP
1ccc0 5f 45 78 70 6c 61 69 6e 20 28 6f 72 20 30 29 20  _Explain (or 0) 
1ccd0 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
1cce0 61 72 20 2a 7a 4f 62 6a 20 3d 20 30 3b 0a 20 20  ar *zObj = 0;.  
1ccf0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
1cd00 20 3d 20 70 4c 76 6c 2d 3e 70 57 4c 6f 6f 70 3b   = pLvl->pWLoop;
1cd10 0a 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77  .  if( (pLoop->w
1cd20 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
1cd30 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20  IRTUALTABLE)==0 
1cd40 20 26 26 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74   &&  pLoop->u.bt
1cd50 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 20 29 7b  ree.pIndex!=0 ){
1cd60 0a 20 20 20 20 7a 4f 62 6a 20 3d 20 70 4c 6f 6f  .    zObj = pLoo
1cd70 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
1cd80 78 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 7d 65 6c 73  x->zName;.  }els
1cd90 65 7b 0a 20 20 20 20 7a 4f 62 6a 20 3d 20 70 53  e{.    zObj = pS
1cda0 72 63 6c 69 73 74 2d 3e 61 5b 70 4c 76 6c 2d 3e  rclist->a[pLvl->
1cdb0 69 46 72 6f 6d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  iFrom].zName;.  
1cdc0 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53  }.  sqlite3VdbeS
1cdd0 63 61 6e 53 74 61 74 75 73 28 0a 20 20 20 20 20  canStatus(.     
1cde0 20 76 2c 20 61 64 64 72 45 78 70 6c 61 69 6e 2c   v, addrExplain,
1cdf0 20 70 4c 76 6c 2d 3e 61 64 64 72 42 6f 64 79 2c   pLvl->addrBody,
1ce00 20 70 4c 76 6c 2d 3e 61 64 64 72 56 69 73 69 74   pLvl->addrVisit
1ce10 2c 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 2c 20 7a  , pLoop->nOut, z
1ce20 4f 62 6a 0a 20 20 29 3b 0a 7d 0a 23 65 6c 73 65  Obj.  );.}.#else
1ce30 0a 23 20 64 65 66 69 6e 65 20 61 64 64 53 63 61  .# define addSca
1ce40 6e 53 74 61 74 75 73 28 61 2c 20 62 2c 20 63 2c  nStatus(a, b, c,
1ce50 20 64 29 20 28 28 76 6f 69 64 29 64 29 0a 23 65   d) ((void)d).#e
1ce60 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ndif../*.** If t
1ce70 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
1ce80 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69   coded instructi
1ce90 6f 6e 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  on is a constant
1cea0 20 72 61 6e 67 65 20 63 6f 6e 74 72 61 69 6e 74   range contraint
1ceb0 0a 2a 2a 20 74 68 61 74 20 6f 72 69 67 69 6e 61  .** that origina
1cec0 74 65 64 20 66 72 6f 6d 20 74 68 65 20 4c 49 4b  ted from the LIK
1ced0 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20  E optimization, 
1cee0 74 68 65 6e 20 63 68 61 6e 67 65 20 74 68 65 20  then change the 
1cef0 50 33 20 74 6f 20 62 65 0a 2a 2a 20 70 4c 6f 6f  P3 to be.** pLoo
1cf00 70 2d 3e 69 4c 69 6b 65 52 65 70 43 6e 74 72 20  p->iLikeRepCntr 
1cf10 61 6e 64 20 73 65 74 20 50 35 2e 0a 2a 2a 0a 2a  and set P5..**.*
1cf20 2a 20 54 68 65 20 4c 49 4b 45 20 6f 70 74 69 6d  * The LIKE optim
1cf30 69 7a 61 74 69 6f 6e 20 74 72 79 73 20 74 6f 20  ization trys to 
1cf40 65 76 61 6c 75 61 74 65 20 22 78 20 4c 49 4b 45  evaluate "x LIKE
1cf50 20 27 61 62 63 25 27 22 20 61 73 20 61 20 72 61   'abc%'" as a ra
1cf60 6e 67 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  nge.** expressio
1cf70 6e 3a 20 22 78 3e 3d 27 41 42 43 27 20 41 4e 44  n: "x>='ABC' AND
1cf80 20 78 3c 27 61 62 64 27 22 2e 20 20 42 75 74 20   x<'abd'".  But 
1cf90 74 68 69 73 20 72 65 71 75 69 72 65 73 20 74 68  this requires th
1cfa0 61 74 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20  at the range.** 
1cfb0 73 63 61 6e 20 6c 6f 6f 70 20 72 75 6e 20 74 77  scan loop run tw
1cfc0 69 63 65 2c 20 6f 6e 63 65 20 66 6f 72 20 73 74  ice, once for st
1cfd0 72 69 6e 67 73 20 61 6e 64 20 61 20 73 65 63 6f  rings and a seco
1cfe0 6e 64 20 74 69 6d 65 20 66 6f 72 20 42 4c 4f 42  nd time for BLOB
1cff0 73 2e 0a 2a 2a 20 54 68 65 20 4f 50 5f 53 74 72  s..** The OP_Str
1d000 69 6e 67 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74  ing opcodes on t
1d010 68 65 20 73 65 63 6f 6e 64 20 70 61 73 73 20 63  he second pass c
1d020 6f 6e 76 65 72 74 20 74 68 65 20 75 70 70 65 72  onvert the upper
1d030 20 61 6e 64 20 6c 6f 77 65 72 0a 2a 2a 20 62 6f   and lower.** bo
1d040 75 6e 64 20 73 74 72 69 6e 67 20 63 6f 6e 74 61  und string conta
1d050 6e 74 73 20 74 6f 20 62 6c 6f 62 73 2e 20 20 54  nts to blobs.  T
1d060 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65  his routine make
1d070 73 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  s the necessary 
1d080 63 68 61 6e 67 65 73 0a 2a 2a 20 74 6f 20 74 68  changes.** to th
1d090 65 20 4f 50 5f 53 74 72 69 6e 67 20 6f 70 63 6f  e OP_String opco
1d0a0 64 65 73 20 66 6f 72 20 74 68 61 74 20 74 6f 20  des for that to 
1d0b0 68 61 70 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69  happen..*/.stati
1d0c0 63 20 76 6f 69 64 20 77 68 65 72 65 4c 69 6b 65  c void whereLike
1d0d0 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 53 74 72 69  OptimizationStri
1d0e0 6e 67 46 69 78 75 70 28 0a 20 20 56 64 62 65 20  ngFixup(.  Vdbe 
1d0f0 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *v,             
1d100 20 20 20 2f 2a 20 70 72 65 70 61 72 65 64 20 73     /* prepared s
1d110 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63  tatement under c
1d120 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
1d130 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
1d140 76 65 6c 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  vel,     /* The 
1d150 6c 6f 6f 70 20 74 68 61 74 20 63 6f 6e 74 61 69  loop that contai
1d160 6e 73 20 74 68 65 20 4c 49 4b 45 20 6f 70 65 72  ns the LIKE oper
1d170 61 74 6f 72 20 2a 2f 0a 20 20 57 68 65 72 65 54  ator */.  WhereT
1d180 65 72 6d 20 2a 70 54 65 72 6d 20 20 20 20 20 20  erm *pTerm      
1d190 20 20 2f 2a 20 54 68 65 20 75 70 70 65 72 20 6f    /* The upper o
1d1a0 72 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6a 75  r lower bound ju
1d1b0 73 74 20 63 6f 64 65 64 20 2a 2f 0a 29 7b 0a 20  st coded */.){. 
1d1c0 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c   if( pTerm->wtFl
1d1d0 61 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f  ags & TERM_LIKEO
1d1e0 50 54 20 29 7b 0a 20 20 20 20 56 64 62 65 4f 70  PT ){.    VdbeOp
1d1f0 20 2a 70 4f 70 3b 0a 20 20 20 20 61 73 73 65 72   *pOp;.    asser
1d200 74 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65  t( pLevel->iLike
1d210 52 65 70 43 6e 74 72 3e 30 20 29 3b 0a 20 20 20  RepCntr>0 );.   
1d220 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64   pOp = sqlite3Vd
1d230 62 65 47 65 74 4f 70 28 76 2c 20 2d 31 29 3b 0a  beGetOp(v, -1);.
1d240 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 21      assert( pOp!
1d250 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
1d260 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
1d270 50 5f 53 74 72 69 6e 67 38 20 0a 20 20 20 20 20  P_String8 .     
1d280 20 20 20 20 20 20 20 7c 7c 20 70 54 65 72 6d 2d         || pTerm-
1d290 3e 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50  >pWC->pWInfo->pP
1d2a0 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
1d2b0 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 4f  Failed );.    pO
1d2c0 70 2d 3e 70 33 20 3d 20 70 4c 65 76 65 6c 2d 3e  p->p3 = pLevel->
1d2d0 69 4c 69 6b 65 52 65 70 43 6e 74 72 3b 0a 20 20  iLikeRepCntr;.  
1d2e0 20 20 70 4f 70 2d 3e 70 35 20 3d 20 31 3b 0a 20    pOp->p5 = 1;. 
1d2f0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
1d300 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
1d310 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 69  e start of the i
1d320 4c 65 76 65 6c 2d 74 68 20 6c 6f 6f 70 20 69 6e  Level-th loop in
1d330 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
1d340 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  e.** implementat
1d350 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 62 79  ion described by
1d360 20 70 57 49 6e 66 6f 2e 0a 2a 2f 0a 73 74 61 74   pWInfo..*/.stat
1d370 69 63 20 42 69 74 6d 61 73 6b 20 63 6f 64 65 4f  ic Bitmask codeO
1d380 6e 65 4c 6f 6f 70 53 74 61 72 74 28 0a 20 20 57  neLoopStart(.  W
1d390 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
1d3a0 2c 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20  ,   /* Complete 
1d3b0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
1d3c0 74 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  t the WHERE clau
1d3d0 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76  se */.  int iLev
1d3e0 65 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  el,          /* 
1d3f0 57 68 69 63 68 20 6c 65 76 65 6c 20 6f 66 20 70  Which level of p
1d400 57 49 6e 66 6f 2d 3e 61 5b 5d 20 73 68 6f 75 6c  WInfo->a[] shoul
1d410 64 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  d be coded */.  
1d420 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
1d430 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 74 61       /* Which ta
1d440 62 6c 65 73 20 61 72 65 20 63 75 72 72 65 6e 74  bles are current
1d450 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a  ly available */.
1d460 29 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b 3b 20 20  ){.  int j, k;  
1d470 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
1d480 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
1d490 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20  int iCur;       
1d4a0 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
1d4b0 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
1d4c0 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61  table */.  int a
1d4d0 64 64 72 4e 78 74 3b 20 20 20 20 20 20 20 20 20  ddrNxt;         
1d4e0 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a 75 6d 70  /* Where to jump
1d4f0 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74   to continue wit
1d500 68 20 74 68 65 20 6e 65 78 74 20 49 4e 20 63 61  h the next IN ca
1d510 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6d 69 74  se */.  int omit
1d520 54 61 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20  Table;       /* 
1d530 54 72 75 65 20 69 66 20 77 65 20 75 73 65 20 74  True if we use t
1d540 68 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f  he index only */
1d550 0a 20 20 69 6e 74 20 62 52 65 76 3b 20 20 20 20  .  int bRev;    
1d560 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1d570 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 73 63  if we need to sc
1d580 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72  an in reverse or
1d590 64 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65  der */.  WhereLe
1d5a0 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 2f 2a  vel *pLevel;  /*
1d5b0 20 54 68 65 20 77 68 65 72 65 20 6c 65 76 65 6c   The where level
1d5c0 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
1d5d0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
1d5e0 6f 70 3b 20 20 20 20 2f 2a 20 54 68 65 20 57 68  op;    /* The Wh
1d5f0 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 62  ereLoop object b
1d600 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20  eing coded */.  
1d610 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
1d620 3b 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73  ;    /* Decompos
1d630 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 6e 74  ition of the ent
1d640 69 72 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ire WHERE clause
1d650 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
1d660 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  *pTerm;         
1d670 20 20 20 20 20 20 2f 2a 20 41 20 57 48 45 52 45        /* A WHERE
1d680 20 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a   clause term */.
1d690 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
1d6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6b0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
1d6c0 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  text */.  sqlite
1d6d0 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
1d6e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
1d6f0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1d700 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
1d710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d720 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65        /* The pre
1d730 70 61 72 65 64 20 73 74 6d 74 20 75 6e 64 65 72  pared stmt under
1d740 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a   constructions *
1d750 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
1d760 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65  st_item *pTabIte
1d770 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75  m;  /* FROM clau
1d780 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20 63 6f  se term being co
1d790 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ded */.  int add
1d7a0 72 42 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20  rBrk;           
1d7b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
1d7c0 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20 6f   here to break o
1d7d0 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a  ut of the loop *
1d7e0 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74  /.  int addrCont
1d7f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d800 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
1d810 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74   to continue wit
1d820 68 20 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a  h next cycle */.
1d830 20 20 69 6e 74 20 69 52 6f 77 69 64 52 65 67 20    int iRowidReg 
1d840 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 52  = 0;        /* R
1d850 6f 77 69 64 20 69 73 20 73 74 6f 72 65 64 20 69  owid is stored i
1d860 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72 2c  n this register,
1d870 20 69 66 20 6e 6f 74 20 7a 65 72 6f 20 2a 2f 0a   if not zero */.
1d880 20 20 69 6e 74 20 69 52 65 6c 65 61 73 65 52 65    int iReleaseRe
1d890 67 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 54  g = 0;      /* T
1d8a0 65 6d 70 20 72 65 67 69 73 74 65 72 20 74 6f 20  emp register to 
1d8b0 66 72 65 65 20 62 65 66 6f 72 65 20 72 65 74 75  free before retu
1d8c0 72 6e 69 6e 67 20 2a 2f 0a 0a 20 20 70 50 61 72  rning */..  pPar
1d8d0 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  se = pWInfo->pPa
1d8e0 72 73 65 3b 0a 20 20 76 20 3d 20 70 50 61 72 73  rse;.  v = pPars
1d8f0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 70 57 43 20  e->pVdbe;.  pWC 
1d900 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a  = &pWInfo->sWC;.
1d910 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
1d920 62 3b 0a 20 20 70 4c 65 76 65 6c 20 3d 20 26 70  b;.  pLevel = &p
1d930 57 49 6e 66 6f 2d 3e 61 5b 69 4c 65 76 65 6c 5d  WInfo->a[iLevel]
1d940 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76  ;.  pLoop = pLev
1d950 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 70 54  el->pWLoop;.  pT
1d960 61 62 49 74 65 6d 20 3d 20 26 70 57 49 6e 66 6f  abItem = &pWInfo
1d970 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c  ->pTabList->a[pL
1d980 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
1d990 69 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d  iCur = pTabItem-
1d9a0 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 4c 65 76  >iCursor;.  pLev
1d9b0 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 20 3d 20 6e  el->notReady = n
1d9c0 6f 74 52 65 61 64 79 20 26 20 7e 67 65 74 4d 61  otReady & ~getMa
1d9d0 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  sk(&pWInfo->sMas
1d9e0 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a 20 20 62  kSet, iCur);.  b
1d9f0 52 65 76 20 3d 20 28 70 57 49 6e 66 6f 2d 3e 72  Rev = (pWInfo->r
1da00 65 76 4d 61 73 6b 3e 3e 69 4c 65 76 65 6c 29 26  evMask>>iLevel)&
1da10 31 3b 0a 20 20 6f 6d 69 74 54 61 62 6c 65 20 3d  1;.  omitTable =
1da20 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
1da30 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
1da40 59 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20  Y)!=0 .         
1da50 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63    && (pWInfo->wc
1da60 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
1da70 5f 46 4f 52 43 45 5f 54 41 42 4c 45 29 3d 3d 30  _FORCE_TABLE)==0
1da80 3b 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f  ;.  VdbeModuleCo
1da90 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e  mment((v, "Begin
1daa0 20 57 48 45 52 45 2d 6c 6f 6f 70 25 64 3a 20 25   WHERE-loop%d: %
1dab0 73 22 2c 69 4c 65 76 65 6c 2c 70 54 61 62 49 74  s",iLevel,pTabIt
1dac0 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
1dad0 29 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20  );..  /* Create 
1dae0 6c 61 62 65 6c 73 20 66 6f 72 20 74 68 65 20 22  labels for the "
1daf0 62 72 65 61 6b 22 20 61 6e 64 20 22 63 6f 6e 74  break" and "cont
1db00 69 6e 75 65 22 20 69 6e 73 74 72 75 63 74 69 6f  inue" instructio
1db10 6e 73 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  ns.  ** for the 
1db20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 2e 20 20 4a  current loop.  J
1db30 75 6d 70 20 74 6f 20 61 64 64 72 42 72 6b 20 74  ump to addrBrk t
1db40 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 61  o break out of a
1db50 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 4a 75 6d 70   loop..  ** Jump
1db60 20 74 6f 20 63 6f 6e 74 20 74 6f 20 67 6f 20 69   to cont to go i
1db70 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 74 68  mmediately to th
1db80 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e  e next iteration
1db90 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 6f   of the.  ** loo
1dba0 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65  p..  **.  ** Whe
1dbb0 6e 20 74 68 65 72 65 20 69 73 20 61 6e 20 49 4e  n there is an IN
1dbc0 20 6f 70 65 72 61 74 6f 72 2c 20 77 65 20 61 6c   operator, we al
1dbd0 73 6f 20 68 61 76 65 20 61 20 22 61 64 64 72 4e  so have a "addrN
1dbe0 78 74 22 20 6c 61 62 65 6c 20 74 68 61 74 0a 20  xt" label that. 
1dbf0 20 2a 2a 20 6d 65 61 6e 73 20 74 6f 20 63 6f 6e   ** means to con
1dc00 74 69 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e  tinue with the n
1dc10 65 78 74 20 49 4e 20 76 61 6c 75 65 20 63 6f 6d  ext IN value com
1dc20 62 69 6e 61 74 69 6f 6e 2e 20 20 57 68 65 6e 0a  bination.  When.
1dc30 20 20 2a 2a 20 74 68 65 72 65 20 61 72 65 20 6e    ** there are n
1dc40 6f 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 69  o IN operators i
1dc50 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  n the constraint
1dc60 73 2c 20 74 68 65 20 22 61 64 64 72 4e 78 74 22  s, the "addrNxt"
1dc70 20 6c 61 62 65 6c 0a 20 20 2a 2a 20 69 73 20 74   label.  ** is t
1dc80 68 65 20 73 61 6d 65 20 61 73 20 22 61 64 64 72  he same as "addr
1dc90 42 72 6b 22 2e 0a 20 20 2a 2f 0a 20 20 61 64 64  Brk"..  */.  add
1dca0 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61  rBrk = pLevel->a
1dcb0 64 64 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d  ddrBrk = pLevel-
1dcc0 3e 61 64 64 72 4e 78 74 20 3d 20 73 71 6c 69 74  >addrNxt = sqlit
1dcd0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1dce0 76 29 3b 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d  v);.  addrCont =
1dcf0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e   pLevel->addrCon
1dd00 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
1dd10 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20  akeLabel(v);..  
1dd20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
1dd30 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66  e right table of
1dd40 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f   a LEFT OUTER JO
1dd50 49 4e 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64  IN, allocate and
1dd60 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65  .  ** initialize
1dd70 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74   a memory cell t
1dd80 68 61 74 20 72 65 63 6f 72 64 73 20 69 66 20 74  hat records if t
1dd90 68 69 73 20 74 61 62 6c 65 20 6d 61 74 63 68 65  his table matche
1dda0 73 20 61 6e 79 0a 20 20 2a 2a 20 72 6f 77 20 6f  s any.  ** row o
1ddb0 66 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65  f the left table
1ddc0 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20   of the join..  
1ddd0 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  */.  if( pLevel-
1dde0 3e 69 46 72 6f 6d 3e 30 20 26 26 20 28 70 54 61  >iFrom>0 && (pTa
1ddf0 62 49 74 65 6d 5b 30 5d 2e 6a 6f 69 6e 74 79 70  bItem[0].jointyp
1de00 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20  e & JT_LEFT)!=0 
1de10 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69  ){.    pLevel->i
1de20 4c 65 66 74 4a 6f 69 6e 20 3d 20 2b 2b 70 50 61  LeftJoin = ++pPa
1de30 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73  rse->nMem;.    s
1de40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1de50 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
1de60 30 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  0, pLevel->iLeft
1de70 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62 65 43  Join);.    VdbeC
1de80 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 69 74  omment((v, "init
1de90 20 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f 2d 6d 61   LEFT JOIN no-ma
1dea0 74 63 68 20 66 6c 61 67 22 29 29 3b 0a 20 20 7d  tch flag"));.  }
1deb0 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63  ..  /* Special c
1dec0 61 73 65 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c  ase of a FROM cl
1ded0 61 75 73 65 20 73 75 62 71 75 65 72 79 20 69 6d  ause subquery im
1dee0 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 63  plemented as a c
1def0 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  o-routine */.  i
1df00 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 76 69 61  f( pTabItem->via
1df10 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20  Coroutine ){.   
1df20 20 69 6e 74 20 72 65 67 59 69 65 6c 64 20 3d 20   int regYield = 
1df30 70 54 61 62 49 74 65 6d 2d 3e 72 65 67 52 65 74  pTabItem->regRet
1df40 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  urn;.    sqlite3
1df50 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
1df60 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20  _InitCoroutine, 
1df70 72 65 67 59 69 65 6c 64 2c 20 30 2c 20 70 54 61  regYield, 0, pTa
1df80 62 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  bItem->addrFillS
1df90 75 62 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  ub);.    pLevel-
1dfa0 3e 70 32 20 3d 20 20 73 71 6c 69 74 65 33 56 64  >p2 =  sqlite3Vd
1dfb0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
1dfc0 69 65 6c 64 2c 20 72 65 67 59 69 65 6c 64 2c 20  ield, regYield, 
1dfd0 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 56 64  addrBrk);.    Vd
1dfe0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1dff0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
1e000 76 2c 20 22 6e 65 78 74 20 72 6f 77 20 6f 66 20  v, "next row of 
1e010 5c 22 25 73 5c 22 22 2c 20 70 54 61 62 49 74 65  \"%s\"", pTabIte
1e020 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29  m->pTab->zName))
1e030 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70  ;.    pLevel->op
1e040 20 3d 20 4f 50 5f 47 6f 74 6f 3b 0a 20 20 7d 65   = OP_Goto;.  }e
1e050 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  lse..#ifndef SQL
1e060 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
1e070 54 41 42 4c 45 0a 20 20 69 66 28 20 20 28 70 4c  TABLE.  if(  (pL
1e080 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
1e090 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
1e0a0 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  E)!=0 ){.    /* 
1e0b0 43 61 73 65 20 31 3a 20 20 54 68 65 20 74 61 62  Case 1:  The tab
1e0c0 6c 65 20 69 73 20 61 20 76 69 72 74 75 61 6c 2d  le is a virtual-
1e0d0 74 61 62 6c 65 2e 20 20 55 73 65 20 74 68 65 20  table.  Use the 
1e0e0 56 46 69 6c 74 65 72 20 61 6e 64 20 56 4e 65 78  VFilter and VNex
1e0f0 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  t.    **        
1e100 20 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20    to access the 
1e110 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  data..    */.   
1e120 20 69 6e 74 20 69 52 65 67 3b 20 20 20 2f 2a 20   int iReg;   /* 
1e130 50 33 20 56 61 6c 75 65 20 66 6f 72 20 4f 50 5f  P3 Value for OP_
1e140 56 46 69 6c 74 65 72 20 2a 2f 0a 20 20 20 20 69  VFilter */.    i
1e150 6e 74 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64 3b  nt addrNotFound;
1e160 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72  .    int nConstr
1e170 61 69 6e 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c  aint = pLoop->nL
1e180 54 65 72 6d 3b 0a 0a 20 20 20 20 73 71 6c 69 74  Term;..    sqlit
1e190 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
1e1a0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 52 65  pParse);.    iRe
1e1b0 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  g = sqlite3GetTe
1e1c0 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
1e1d0 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a  nConstraint+2);.
1e1e0 20 20 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64      addrNotFound
1e1f0 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42   = pLevel->addrB
1e200 72 6b 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  rk;.    for(j=0;
1e210 20 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20   j<nConstraint; 
1e220 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  j++){.      int 
1e230 69 54 61 72 67 65 74 20 3d 20 69 52 65 67 2b 6a  iTarget = iReg+j
1e240 2b 32 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20  +2;.      pTerm 
1e250 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  = pLoop->aLTerm[
1e260 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  j];.      if( pT
1e270 65 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  erm==0 ) continu
1e280 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  e;.      if( pTe
1e290 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
1e2a0 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 20  WO_IN ){.       
1e2b0 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72   codeEqualityTer
1e2c0 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c  m(pParse, pTerm,
1e2d0 20 70 4c 65 76 65 6c 2c 20 6a 2c 20 62 52 65 76   pLevel, j, bRev
1e2e0 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20 20 20  , iTarget);.    
1e2f0 20 20 20 20 61 64 64 72 4e 6f 74 46 6f 75 6e 64      addrNotFound
1e300 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e   = pLevel->addrN
1e310 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  xt;.      }else{
1e320 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1e330 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
1e340 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70   pTerm->pExpr->p
1e350 52 69 67 68 74 2c 20 69 54 61 72 67 65 74 29 3b  Right, iTarget);
1e360 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1e370 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1e380 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
1e390 65 72 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61  er, pLoop->u.vta
1e3a0 62 2e 69 64 78 4e 75 6d 2c 20 69 52 65 67 29 3b  b.idxNum, iReg);
1e3b0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1e3c0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
1e3d0 65 67 65 72 2c 20 6e 43 6f 6e 73 74 72 61 69 6e  eger, nConstrain
1e3e0 74 2c 20 69 52 65 67 2b 31 29 3b 0a 20 20 20 20  t, iReg+1);.    
1e3f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1e400 34 28 76 2c 20 4f 50 5f 56 46 69 6c 74 65 72 2c  4(v, OP_VFilter,
1e410 20 69 43 75 72 2c 20 61 64 64 72 4e 6f 74 46 6f   iCur, addrNotFo
1e420 75 6e 64 2c 20 69 52 65 67 2c 0a 20 20 20 20 20  und, iReg,.     
1e430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e440 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e 69   pLoop->u.vtab.i
1e450 64 78 53 74 72 2c 0a 20 20 20 20 20 20 20 20 20  dxStr,.         
1e460 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f               pLo
1e470 6f 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46  op->u.vtab.needF
1e480 72 65 65 20 3f 20 50 34 5f 4d 50 52 49 4e 54 46  ree ? P4_MPRINTF
1e490 20 3a 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20   : P4_STATIC);. 
1e4a0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
1e4b0 76 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75  v);.    pLoop->u
1e4c0 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d  .vtab.needFree =
1e4d0 20 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b   0;.    for(j=0;
1e4e0 20 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 20 26   j<nConstraint &
1e4f0 26 20 6a 3c 31 36 3b 20 6a 2b 2b 29 7b 0a 20 20  & j<16; j++){.  
1e500 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e      if( (pLoop->
1e510 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 3e  u.vtab.omitMask>
1e520 3e 6a 29 26 31 20 29 7b 0a 20 20 20 20 20 20 20  >j)&1 ){.       
1e530 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
1e540 76 65 6c 2c 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  vel, pLoop->aLTe
1e550 72 6d 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  rm[j]);.      }.
1e560 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c      }.    pLevel
1e570 2d 3e 6f 70 20 3d 20 4f 50 5f 56 4e 65 78 74 3b  ->op = OP_VNext;
1e580 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20  .    pLevel->p1 
1e590 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76  = iCur;.    pLev
1e5a0 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33  el->p2 = sqlite3
1e5b0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
1e5c0 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  v);.    sqlite3R
1e5d0 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
1e5e0 70 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 43  pParse, iReg, nC
1e5f0 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20  onstraint+2);.  
1e600 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1e610 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  hePop(pParse);. 
1e620 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a   }else.#endif /*
1e630 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
1e640 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20 20  TUALTABLE */..  
1e650 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  if( (pLoop->wsFl
1e660 61 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b 29  ags & WHERE_IPK)
1e670 21 3d 30 0a 20 20 20 26 26 20 28 70 4c 6f 6f 70  !=0.   && (pLoop
1e680 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45  ->wsFlags & (WHE
1e690 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45  RE_COLUMN_IN|WHE
1e6a0 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 29 21 3d  RE_COLUMN_EQ))!=
1e6b0 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61  0.  ){.    /* Ca
1e6c0 73 65 20 32 3a 20 20 57 65 20 63 61 6e 20 64 69  se 2:  We can di
1e6d0 72 65 63 74 6c 79 20 72 65 66 65 72 65 6e 63 65  rectly reference
1e6e0 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 75 73   a single row us
1e6f0 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 20 20  ing an.    **   
1e700 20 20 20 20 20 20 20 65 71 75 61 6c 69 74 79 20         equality 
1e710 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e  comparison again
1e720 73 74 20 74 68 65 20 52 4f 57 49 44 20 66 69 65  st the ROWID fie
1e730 6c 64 2e 20 20 4f 72 0a 20 20 20 20 2a 2a 20 20  ld.  Or.    **  
1e740 20 20 20 20 20 20 20 20 77 65 20 72 65 66 65 72          we refer
1e750 65 6e 63 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f  ence multiple ro
1e760 77 73 20 75 73 69 6e 67 20 61 20 22 72 6f 77 69  ws using a "rowi
1e770 64 20 49 4e 20 28 2e 2e 2e 29 22 0a 20 20 20 20  d IN (...)".    
1e780 2a 2a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  **          cons
1e790 74 72 75 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  truct..    */.  
1e7a0 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d    assert( pLoop-
1e7b0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3d 3d 31 20  >u.btree.nEq==1 
1e7c0 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70  );.    pTerm = p
1e7d0 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 3b  Loop->aLTerm[0];
1e7e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
1e7f0 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  rm!=0 );.    ass
1e800 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70  ert( pTerm->pExp
1e810 72 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  r!=0 );.    asse
1e820 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30  rt( omitTable==0
1e830 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
1e840 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
1e850 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
1e860 29 3b 0a 20 20 20 20 69 52 65 6c 65 61 73 65 52  );.    iReleaseR
1e870 65 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  eg = ++pParse->n
1e880 4d 65 6d 3b 0a 20 20 20 20 69 52 6f 77 69 64 52  Mem;.    iRowidR
1e890 65 67 20 3d 20 63 6f 64 65 45 71 75 61 6c 69 74  eg = codeEqualit
1e8a0 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54  yTerm(pParse, pT
1e8b0 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 30 2c 20  erm, pLevel, 0, 
1e8c0 62 52 65 76 2c 20 69 52 65 6c 65 61 73 65 52 65  bRev, iReleaseRe
1e8d0 67 29 3b 0a 20 20 20 20 69 66 28 20 69 52 6f 77  g);.    if( iRow
1e8e0 69 64 52 65 67 21 3d 69 52 65 6c 65 61 73 65 52  idReg!=iReleaseR
1e8f0 65 67 20 29 20 73 71 6c 69 74 65 33 52 65 6c 65  eg ) sqlite3Rele
1e900 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
1e910 65 2c 20 69 52 65 6c 65 61 73 65 52 65 67 29 3b  e, iReleaseReg);
1e920 0a 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70  .    addrNxt = p
1e930 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a  Level->addrNxt;.
1e940 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1e950 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74  ddOp2(v, OP_Must
1e960 42 65 49 6e 74 2c 20 69 52 6f 77 69 64 52 65 67  BeInt, iRowidReg
1e970 2c 20 61 64 64 72 4e 78 74 29 3b 20 56 64 62 65  , addrNxt); Vdbe
1e980 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1e990 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1e9a0 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73  p3(v, OP_NotExis
1e9b0 74 73 2c 20 69 43 75 72 2c 20 61 64 64 72 4e 78  ts, iCur, addrNx
1e9c0 74 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20  t, iRowidReg);. 
1e9d0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
1e9e0 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  v);.    sqlite3E
1e9f0 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
1ea00 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69  Change(pParse, i
1ea10 52 6f 77 69 64 52 65 67 2c 20 31 29 3b 0a 20 20  RowidReg, 1);.  
1ea20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1ea30 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20  heStore(pParse, 
1ea40 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64  iCur, -1, iRowid
1ea50 52 65 67 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  Reg);.    VdbeCo
1ea60 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29  mment((v, "pk"))
1ea70 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70  ;.    pLevel->op
1ea80 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 7d 65   = OP_Noop;.  }e
1ea90 6c 73 65 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e  lse if( (pLoop->
1eaa0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1eab0 49 50 4b 29 21 3d 30 0a 20 20 20 20 20 20 20 20  IPK)!=0.        
1eac0 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c   && (pLoop->wsFl
1ead0 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
1eae0 4d 4e 5f 52 41 4e 47 45 29 21 3d 30 0a 20 20 29  MN_RANGE)!=0.  )
1eaf0 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 33 3a  {.    /* Case 3:
1eb00 20 20 57 65 20 68 61 76 65 20 61 6e 20 69 6e 65    We have an ine
1eb10 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73  quality comparis
1eb20 6f 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20 52  on against the R
1eb30 4f 57 49 44 20 66 69 65 6c 64 2e 0a 20 20 20 20  OWID field..    
1eb40 2a 2f 0a 20 20 20 20 69 6e 74 20 74 65 73 74 4f  */.    int testO
1eb50 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20  p = OP_Noop;.   
1eb60 20 69 6e 74 20 73 74 61 72 74 3b 0a 20 20 20 20   int start;.    
1eb70 69 6e 74 20 6d 65 6d 45 6e 64 56 61 6c 75 65 20  int memEndValue 
1eb80 3d 20 30 3b 0a 20 20 20 20 57 68 65 72 65 54 65  = 0;.    WhereTe
1eb90 72 6d 20 2a 70 53 74 61 72 74 2c 20 2a 70 45 6e  rm *pStart, *pEn
1eba0 64 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  d;..    assert( 
1ebb0 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a  omitTable==0 );.
1ebc0 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 70      j = 0;.    p
1ebd0 53 74 61 72 74 20 3d 20 70 45 6e 64 20 3d 20 30  Start = pEnd = 0
1ebe0 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d  ;.    if( pLoop-
1ebf0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
1ec00 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 20 70 53 74  _BTM_LIMIT ) pSt
1ec10 61 72 74 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54  art = pLoop->aLT
1ec20 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 69 66  erm[j++];.    if
1ec30 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
1ec40 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d   & WHERE_TOP_LIM
1ec50 49 54 20 29 20 70 45 6e 64 20 3d 20 70 4c 6f 6f  IT ) pEnd = pLoo
1ec60 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a  p->aLTerm[j++];.
1ec70 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74 61      assert( pSta
1ec80 72 74 21 3d 30 20 7c 7c 20 70 45 6e 64 21 3d 30  rt!=0 || pEnd!=0
1ec90 20 29 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76   );.    if( bRev
1eca0 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 20   ){.      pTerm 
1ecb0 3d 20 70 53 74 61 72 74 3b 0a 20 20 20 20 20 20  = pStart;.      
1ecc0 70 53 74 61 72 74 20 3d 20 70 45 6e 64 3b 0a 20  pStart = pEnd;. 
1ecd0 20 20 20 20 20 70 45 6e 64 20 3d 20 70 54 65 72       pEnd = pTer
1ece0 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  m;.    }.    if(
1ecf0 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20   pStart ){.     
1ed00 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20   Expr *pX;      
1ed10 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78         /* The ex
1ed20 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 64 65  pression that de
1ed30 66 69 6e 65 73 20 74 68 65 20 73 74 61 72 74 20  fines the start 
1ed40 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69  bound */.      i
1ed50 6e 74 20 72 31 2c 20 72 54 65 6d 70 3b 20 20 20  nt r1, rTemp;   
1ed60 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
1ed70 73 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20 74 68  s for holding th
1ed80 65 20 73 74 61 72 74 20 62 6f 75 6e 64 61 72 79  e start boundary
1ed90 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68   */..      /* Th
1eda0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73  e following cons
1edb0 74 61 6e 74 20 6d 61 70 73 20 54 4b 5f 78 78 20  tant maps TK_xx 
1edc0 63 6f 64 65 73 20 69 6e 74 6f 20 63 6f 72 72 65  codes into corre
1edd0 73 70 6f 6e 64 69 6e 67 20 0a 20 20 20 20 20 20  sponding .      
1ede0 2a 2a 20 73 65 65 6b 20 6f 70 63 6f 64 65 73 2e  ** seek opcodes.
1edf0 20 20 49 74 20 64 65 70 65 6e 64 73 20 6f 6e 20    It depends on 
1ee00 61 20 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64  a particular ord
1ee10 65 72 69 6e 67 20 6f 66 20 54 4b 5f 78 78 0a 20  ering of TK_xx. 
1ee20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f       */.      co
1ee30 6e 73 74 20 75 38 20 61 4d 6f 76 65 4f 70 5b 5d  nst u8 aMoveOp[]
1ee40 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20   = {.           
1ee50 2f 2a 20 54 4b 5f 47 54 20 2a 2f 20 20 4f 50 5f  /* TK_GT */  OP_
1ee60 53 65 65 6b 47 54 2c 0a 20 20 20 20 20 20 20 20  SeekGT,.        
1ee70 20 20 20 2f 2a 20 54 4b 5f 4c 45 20 2a 2f 20 20     /* TK_LE */  
1ee80 4f 50 5f 53 65 65 6b 4c 45 2c 0a 20 20 20 20 20  OP_SeekLE,.     
1ee90 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 54 20 2a        /* TK_LT *
1eea0 2f 20 20 4f 50 5f 53 65 65 6b 4c 54 2c 0a 20 20  /  OP_SeekLT,.  
1eeb0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47           /* TK_G
1eec0 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 45 0a  E */  OP_SeekGE.
1eed0 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 61        };.      a
1eee0 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 54 4b  ssert( TK_LE==TK
1eef0 5f 47 54 2b 31 20 29 3b 20 20 20 20 20 20 2f 2a  _GT+1 );      /*
1ef00 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6f   Make sure the o
1ef10 72 64 65 72 69 6e 67 2e 2e 20 2a 2f 0a 20 20 20  rdering.. */.   
1ef20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54     assert( TK_LT
1ef30 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 20 20 20 20  ==TK_GT+2 );    
1ef40 20 20 2f 2a 20 20 2e 2e 2e 20 6f 66 20 74 68 65    /*  ... of the
1ef50 20 54 4b 5f 78 78 20 76 61 6c 75 65 73 2e 2e 2e   TK_xx values...
1ef60 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
1ef70 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 47 54 2b 33  ( TK_GE==TK_GT+3
1ef80 20 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e   );      /*  ...
1ef90 20 69 73 20 63 6f 72 72 65 63 63 74 2e 20 2a 2f   is correcct. */
1efa0 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
1efb0 28 70 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73  (pStart->wtFlags
1efc0 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d   & TERM_VNULL)==
1efd0 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
1efe0 61 73 65 28 20 70 53 74 61 72 74 2d 3e 77 74 46  ase( pStart->wtF
1eff0 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
1f000 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 70 58 20  UAL );.      pX 
1f010 3d 20 70 53 74 61 72 74 2d 3e 70 45 78 70 72 3b  = pStart->pExpr;
1f020 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1f030 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  X!=0 );.      te
1f040 73 74 63 61 73 65 28 20 70 53 74 61 72 74 2d 3e  stcase( pStart->
1f050 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72  leftCursor!=iCur
1f060 20 29 3b 20 2f 2a 20 74 72 61 6e 73 69 74 69 76   ); /* transitiv
1f070 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  e constraints */
1f080 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
1f090 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1f0a0 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67  pParse, pX->pRig
1f0b0 68 74 2c 20 26 72 54 65 6d 70 29 3b 0a 20 20 20  ht, &rTemp);.   
1f0c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1f0d0 64 4f 70 33 28 76 2c 20 61 4d 6f 76 65 4f 70 5b  dOp3(v, aMoveOp[
1f0e0 70 58 2d 3e 6f 70 2d 54 4b 5f 47 54 5d 2c 20 69  pX->op-TK_GT], i
1f0f0 43 75 72 2c 20 61 64 64 72 42 72 6b 2c 20 72 31  Cur, addrBrk, r1
1f100 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
1f110 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b  ment((v, "pk"));
1f120 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
1f130 61 67 65 49 66 28 76 2c 20 70 58 2d 3e 6f 70 3d  ageIf(v, pX->op=
1f140 3d 54 4b 5f 47 54 29 3b 0a 20 20 20 20 20 20 56  =TK_GT);.      V
1f150 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1f160 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 29 3b   pX->op==TK_LE);
1f170 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
1f180 61 67 65 49 66 28 76 2c 20 70 58 2d 3e 6f 70 3d  ageIf(v, pX->op=
1f190 3d 54 4b 5f 4c 54 29 3b 0a 20 20 20 20 20 20 56  =TK_LT);.      V
1f1a0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1f1b0 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 29 3b   pX->op==TK_GE);
1f1c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1f1d0 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
1f1e0 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31  hange(pParse, r1
1f1f0 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
1f200 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
1f210 67 28 70 50 61 72 73 65 2c 20 72 54 65 6d 70 29  g(pParse, rTemp)
1f220 3b 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65 54  ;.      disableT
1f230 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 53 74 61  erm(pLevel, pSta
1f240 72 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  rt);.    }else{.
1f250 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1f260 65 41 64 64 4f 70 32 28 76 2c 20 62 52 65 76 20  eAddOp2(v, bRev 
1f270 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f 52  ? OP_Last : OP_R
1f280 65 77 69 6e 64 2c 20 69 43 75 72 2c 20 61 64 64  ewind, iCur, add
1f290 72 42 72 6b 29 3b 0a 20 20 20 20 20 20 56 64 62  rBrk);.      Vdb
1f2a0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 62  eCoverageIf(v, b
1f2b0 52 65 76 3d 3d 30 29 3b 0a 20 20 20 20 20 20 56  Rev==0);.      V
1f2c0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1f2d0 20 62 52 65 76 21 3d 30 29 3b 0a 20 20 20 20 7d   bRev!=0);.    }
1f2e0 0a 20 20 20 20 69 66 28 20 70 45 6e 64 20 29 7b  .    if( pEnd ){
1f2f0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b  .      Expr *pX;
1f300 0a 20 20 20 20 20 20 70 58 20 3d 20 70 45 6e 64  .      pX = pEnd
1f310 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61  ->pExpr;.      a
1f320 73 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a  ssert( pX!=0 );.
1f330 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
1f340 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  End->wtFlags & T
1f350 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b  ERM_VNULL)==0 );
1f360 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1f370 20 70 45 6e 64 2d 3e 6c 65 66 74 43 75 72 73 6f   pEnd->leftCurso
1f380 72 21 3d 69 43 75 72 20 29 3b 20 2f 2a 20 54 72  r!=iCur ); /* Tr
1f390 61 6e 73 69 74 69 76 65 20 63 6f 6e 73 74 72 61  ansitive constra
1f3a0 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 74 65  ints */.      te
1f3b0 73 74 63 61 73 65 28 20 70 45 6e 64 2d 3e 77 74  stcase( pEnd->wt
1f3c0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
1f3d0 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 6d 65  TUAL );.      me
1f3e0 6d 45 6e 64 56 61 6c 75 65 20 3d 20 2b 2b 70 50  mEndValue = ++pP
1f3f0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
1f400 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1f410 65 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52  e(pParse, pX->pR
1f420 69 67 68 74 2c 20 6d 65 6d 45 6e 64 56 61 6c 75  ight, memEndValu
1f430 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58  e);.      if( pX
1f440 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70  ->op==TK_LT || p
1f450 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a  X->op==TK_GT ){.
1f460 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d          testOp =
1f470 20 62 52 65 76 20 3f 20 4f 50 5f 4c 65 20 3a 20   bRev ? OP_Le : 
1f480 4f 50 5f 47 65 3b 0a 20 20 20 20 20 20 7d 65 6c  OP_Ge;.      }el
1f490 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74  se{.        test
1f4a0 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c  Op = bRev ? OP_L
1f4b0 74 20 3a 20 4f 50 5f 47 74 3b 0a 20 20 20 20 20  t : OP_Gt;.     
1f4c0 20 7d 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65   }.      disable
1f4d0 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 45 6e  Term(pLevel, pEn
1f4e0 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74  d);.    }.    st
1f4f0 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  art = sqlite3Vdb
1f500 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
1f510 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20  .    pLevel->op 
1f520 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76  = bRev ? OP_Prev
1f530 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20   : OP_Next;.    
1f540 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75  pLevel->p1 = iCu
1f550 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  r;.    pLevel->p
1f560 32 20 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 61  2 = start;.    a
1f570 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70  ssert( pLevel->p
1f580 35 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  5==0 );.    if( 
1f590 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20  testOp!=OP_Noop 
1f5a0 29 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52  ){.      iRowidR
1f5b0 65 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  eg = ++pParse->n
1f5c0 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Mem;.      sqlit
1f5d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1f5e0 4f 50 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c 20  OP_Rowid, iCur, 
1f5f0 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20  iRowidReg);.    
1f600 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1f610 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20  heStore(pParse, 
1f620 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64  iCur, -1, iRowid
1f630 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Reg);.      sqli
1f640 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1f650 20 74 65 73 74 4f 70 2c 20 6d 65 6d 45 6e 64 56   testOp, memEndV
1f660 61 6c 75 65 2c 20 61 64 64 72 42 72 6b 2c 20 69  alue, addrBrk, i
1f670 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20  RowidReg);.     
1f680 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1f690 76 2c 20 74 65 73 74 4f 70 3d 3d 4f 50 5f 4c 65  v, testOp==OP_Le
1f6a0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
1f6b0 65 72 61 67 65 49 66 28 76 2c 20 74 65 73 74 4f  erageIf(v, testO
1f6c0 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20  p==OP_Lt);.     
1f6d0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1f6e0 76 2c 20 74 65 73 74 4f 70 3d 3d 4f 50 5f 47 65  v, testOp==OP_Ge
1f6f0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
1f700 65 72 61 67 65 49 66 28 76 2c 20 74 65 73 74 4f  erageIf(v, testO
1f710 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20  p==OP_Gt);.     
1f720 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1f730 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 41  geP5(v, SQLITE_A
1f740 46 46 5f 4e 55 4d 45 52 49 43 20 7c 20 53 51 4c  FF_NUMERIC | SQL
1f750 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
1f760 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
1f770 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
1f780 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
1f790 44 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65  D ){.    /* Case
1f7a0 20 34 3a 20 41 20 73 63 61 6e 20 75 73 69 6e 67   4: A scan using
1f7b0 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a   an index..    *
1f7c0 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
1f7d0 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
1f7e0 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 7a 65  e may contain ze
1f7f0 72 6f 20 6f 72 20 6d 6f 72 65 20 65 71 75 61 6c  ro or more equal
1f800 69 74 79 20 0a 20 20 20 20 2a 2a 20 20 20 20 20  ity .    **     
1f810 20 20 20 20 74 65 72 6d 73 20 28 22 3d 3d 22 20      terms ("==" 
1f820 6f 72 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72  or "IN" operator
1f830 73 29 20 74 68 61 74 20 72 65 66 65 72 20 74 6f  s) that refer to
1f840 20 74 68 65 20 4e 0a 20 20 20 20 2a 2a 20 20 20   the N.    **   
1f850 20 20 20 20 20 20 6c 65 66 74 2d 6d 6f 73 74 20        left-most 
1f860 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69  columns of the i
1f870 6e 64 65 78 2e 20 49 74 20 6d 61 79 20 61 6c 73  ndex. It may als
1f880 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a 2a  o contain.    **
1f890 20 20 20 20 20 20 20 20 20 69 6e 65 71 75 61 6c           inequal
1f8a0 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ity constraints 
1f8b0 28 3e 2c 20 3c 2c 20 3e 3d 20 6f 72 20 3c 3d 29  (>, <, >= or <=)
1f8c0 20 6f 6e 20 74 68 65 20 69 6e 64 65 78 65 64 0a   on the indexed.
1f8d0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63      **         c
1f8e0 6f 6c 75 6d 6e 20 74 68 61 74 20 69 6d 6d 65 64  olumn that immed
1f8f0 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 20 74  iately follows t
1f900 68 65 20 4e 20 65 71 75 61 6c 69 74 69 65 73 2e  he N equalities.
1f910 20 4f 6e 6c 79 20 0a 20 20 20 20 2a 2a 20 20 20   Only .    **   
1f920 20 20 20 20 20 20 74 68 65 20 72 69 67 68 74 2d        the right-
1f930 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 63 61 6e 20  most column can 
1f940 62 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79  be an inequality
1f950 20 2d 20 74 68 65 20 72 65 73 74 20 6d 75 73 74   - the rest must
1f960 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1f970 75 73 65 20 74 68 65 20 22 3d 3d 22 20 61 6e 64  use the "==" and
1f980 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 2e   "IN" operators.
1f990 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
1f9a0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 20 20 20   the .    **    
1f9b0 20 20 20 20 20 69 6e 64 65 78 20 69 73 20 6f 6e       index is on
1f9c0 20 28 78 2c 79 2c 7a 29 2c 20 74 68 65 6e 20 74   (x,y,z), then t
1f9d0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6c 61  he following cla
1f9e0 75 73 65 73 20 61 72 65 20 61 6c 6c 20 0a 20 20  uses are all .  
1f9f0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6f 70 74    **         opt
1fa00 69 6d 69 7a 65 64 3a 0a 20 20 20 20 2a 2a 0a 20  imized:.    **. 
1fa10 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
1fa20 20 78 3d 35 0a 20 20 20 20 2a 2a 20 20 20 20 20   x=5.    **     
1fa30 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79         x=5 AND y
1fa40 3d 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  =10.    **      
1fa50 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3c        x=5 AND y<
1fa60 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  10.    **       
1fa70 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3e 35       x=5 AND y>5
1fa80 20 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a   AND y<10.    **
1fa90 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20              x=5 
1faa0 41 4e 44 20 79 3d 35 20 41 4e 44 20 7a 3c 3d 31  AND y=5 AND z<=1
1fab0 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  0.    **.    ** 
1fac0 20 20 20 20 20 20 20 20 54 68 65 20 7a 3c 31 30          The z<10
1fad0 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 6c   term of the fol
1fae0 6c 6f 77 69 6e 67 20 63 61 6e 6e 6f 74 20 62 65  lowing cannot be
1faf0 20 75 73 65 64 2c 20 6f 6e 6c 79 0a 20 20 20 20   used, only.    
1fb00 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 78  **         the x
1fb10 3d 35 20 74 65 72 6d 3a 0a 20 20 20 20 2a 2a 0a  =5 term:.    **.
1fb20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1fb30 20 20 78 3d 35 20 41 4e 44 20 7a 3c 31 30 0a 20    x=5 AND z<10. 
1fb40 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1fb50 20 20 20 20 20 4e 20 6d 61 79 20 62 65 20 7a 65       N may be ze
1fb60 72 6f 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ro if there are 
1fb70 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
1fb80 72 61 69 6e 74 73 2e 0a 20 20 20 20 2a 2a 20 20  raints..    **  
1fb90 20 20 20 20 20 20 20 49 66 20 74 68 65 72 65 20         If there 
1fba0 61 72 65 20 6e 6f 20 69 6e 65 71 75 61 6c 69 74  are no inequalit
1fbb0 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74  y constraints, t
1fbc0 68 65 6e 20 4e 20 69 73 20 61 74 0a 20 20 20 20  hen N is at.    
1fbd0 2a 2a 20 20 20 20 20 20 20 20 20 6c 65 61 73 74  **         least
1fbe0 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20   one..    **.   
1fbf0 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 69 73   **         This
1fc00 20 63 61 73 65 20 69 73 20 61 6c 73 6f 20 75 73   case is also us
1fc10 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 61 72  ed when there ar
1fc20 65 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  e no WHERE claus
1fc30 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  e.    **        
1fc40 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 75 74   constraints but
1fc50 20 61 6e 20 69 6e 64 65 78 20 69 73 20 73 65 6c   an index is sel
1fc60 65 63 74 65 64 20 61 6e 79 77 61 79 2c 20 69 6e  ected anyway, in
1fc70 20 6f 72 64 65 72 0a 20 20 20 20 2a 2a 20 20 20   order.    **   
1fc80 20 20 20 20 20 20 74 6f 20 66 6f 72 63 65 20 74        to force t
1fc90 68 65 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20  he output order 
1fca0 74 6f 20 63 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e  to conform to an
1fcb0 20 4f 52 44 45 52 20 42 59 2e 0a 20 20 20 20 2a   ORDER BY..    *
1fcc0 2f 20 20 0a 20 20 20 20 73 74 61 74 69 63 20 63  /  .    static c
1fcd0 6f 6e 73 74 20 75 38 20 61 53 74 61 72 74 4f 70  onst u8 aStartOp
1fce0 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 30 2c 0a  [] = {.      0,.
1fcf0 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 4f        0,.      O
1fd00 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 20 20  P_Rewind,       
1fd10 20 20 20 20 2f 2a 20 32 3a 20 28 21 73 74 61 72      /* 2: (!star
1fd20 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26  t_constraints &&
1fd30 20 73 74 61 72 74 45 71 20 26 26 20 20 21 62 52   startEq &&  !bR
1fd40 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  ev) */.      OP_
1fd50 4c 61 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  Last,           
1fd60 20 20 2f 2a 20 33 3a 20 28 21 73 74 61 72 74 5f    /* 3: (!start_
1fd70 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73  constraints && s
1fd80 74 61 72 74 45 71 20 26 26 20 20 20 62 52 65 76  tartEq &&   bRev
1fd90 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65  ) */.      OP_Se
1fda0 65 6b 47 54 2c 20 20 20 20 20 20 20 20 20 20 20  ekGT,           
1fdb0 2f 2a 20 34 3a 20 28 73 74 61 72 74 5f 63 6f 6e  /* 4: (start_con
1fdc0 73 74 72 61 69 6e 74 73 20 20 26 26 20 21 73 74  straints  && !st
1fdd0 61 72 74 45 71 20 26 26 20 21 62 52 65 76 29 20  artEq && !bRev) 
1fde0 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b  */.      OP_Seek
1fdf0 4c 54 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  LT,           /*
1fe00 20 35 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74   5: (start_const
1fe10 72 61 69 6e 74 73 20 20 26 26 20 21 73 74 61 72  raints  && !star
1fe20 74 45 71 20 26 26 20 20 62 52 65 76 29 20 2a 2f  tEq &&  bRev) */
1fe30 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 45  .      OP_SeekGE
1fe40 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 36  ,           /* 6
1fe50 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61  : (start_constra
1fe60 69 6e 74 73 20 20 26 26 20 20 73 74 61 72 74 45  ints  &&  startE
1fe70 71 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20  q && !bRev) */. 
1fe80 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c 45 20 20       OP_SeekLE  
1fe90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 37 3a 20            /* 7: 
1fea0 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  (start_constrain
1feb0 74 73 20 20 26 26 20 20 73 74 61 72 74 45 71 20  ts  &&  startEq 
1fec0 26 26 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20  &&  bRev) */.   
1fed0 20 7d 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63   };.    static c
1fee0 6f 6e 73 74 20 75 38 20 61 45 6e 64 4f 70 5b 5d  onst u8 aEndOp[]
1fef0 20 3d 20 7b 0a 20 20 20 20 20 20 4f 50 5f 49 64   = {.      OP_Id
1ff00 78 47 45 2c 20 20 20 20 20 20 20 20 20 20 20 20  xGE,            
1ff10 2f 2a 20 30 3a 20 28 65 6e 64 5f 63 6f 6e 73 74  /* 0: (end_const
1ff20 72 61 69 6e 74 73 20 26 26 20 21 62 52 65 76 20  raints && !bRev 
1ff30 26 26 20 21 65 6e 64 45 71 29 20 2a 2f 0a 20 20  && !endEq) */.  
1ff40 20 20 20 20 4f 50 5f 49 64 78 47 54 2c 20 20 20      OP_IdxGT,   
1ff50 20 20 20 20 20 20 20 20 20 2f 2a 20 31 3a 20 28           /* 1: (
1ff60 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  end_constraints 
1ff70 26 26 20 21 62 52 65 76 20 26 26 20 20 65 6e 64  && !bRev &&  end
1ff80 45 71 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  Eq) */.      OP_
1ff90 49 64 78 4c 45 2c 20 20 20 20 20 20 20 20 20 20  IdxLE,          
1ffa0 20 20 2f 2a 20 32 3a 20 28 65 6e 64 5f 63 6f 6e    /* 2: (end_con
1ffb0 73 74 72 61 69 6e 74 73 20 26 26 20 20 62 52 65  straints &&  bRe
1ffc0 76 20 26 26 20 21 65 6e 64 45 71 29 20 2a 2f 0a  v && !endEq) */.
1ffd0 20 20 20 20 20 20 4f 50 5f 49 64 78 4c 54 2c 20        OP_IdxLT, 
1ffe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 33 3a             /* 3:
1fff0 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74   (end_constraint
20000 73 20 26 26 20 20 62 52 65 76 20 26 26 20 20 65  s &&  bRev &&  e
20010 6e 64 45 71 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a  ndEq) */.    };.
20020 20 20 20 20 75 31 36 20 6e 45 71 20 3d 20 70 4c      u16 nEq = pL
20030 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
20040 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
20050 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 74 65 72 6d  of == or IN term
20060 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67  s */.    int reg
20070 42 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  Base;           
20080 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65        /* Base re
20090 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 63  gister holding c
200a0 6f 6e 73 74 72 61 69 6e 74 20 76 61 6c 75 65 73  onstraint values
200b0 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72   */.    WhereTer
200c0 6d 20 2a 70 52 61 6e 67 65 53 74 61 72 74 20 3d  m *pRangeStart =
200d0 20 30 3b 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69   0;  /* Inequali
200e0 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74  ty constraint at
200f0 20 72 61 6e 67 65 20 73 74 61 72 74 20 2a 2f 0a   range start */.
20100 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
20110 52 61 6e 67 65 45 6e 64 20 3d 20 30 3b 20 20 20  RangeEnd = 0;   
20120 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63   /* Inequality c
20130 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e  onstraint at ran
20140 67 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20 69 6e  ge end */.    in
20150 74 20 73 74 61 72 74 45 71 3b 20 20 20 20 20 20  t startEq;      
20160 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
20170 75 65 20 69 66 20 72 61 6e 67 65 20 73 74 61 72  ue if range star
20180 74 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72  t uses ==, >= or
20190 20 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65   <= */.    int e
201a0 6e 64 45 71 3b 20 20 20 20 20 20 20 20 20 20 20  ndEq;           
201b0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
201c0 69 66 20 72 61 6e 67 65 20 65 6e 64 20 75 73 65  if range end use
201d0 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a  s ==, >= or <= *
201e0 2f 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 5f  /.    int start_
201f0 63 6f 6e 73 74 72 61 69 6e 74 73 3b 20 20 20 20  constraints;    
20200 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 72     /* Start of r
20210 61 6e 67 65 20 69 73 20 63 6f 6e 73 74 72 61 69  ange is constrai
20220 6e 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ned */.    int n
20230 43 6f 6e 73 74 72 61 69 6e 74 3b 20 20 20 20 20  Constraint;     
20240 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
20250 72 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 20  r of constraint 
20260 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 49 6e 64  terms */.    Ind
20270 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
20280 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
20290 20 69 6e 64 65 78 20 77 65 20 77 69 6c 6c 20 62   index we will b
202a0 65 20 75 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69  e using */.    i
202b0 6e 74 20 69 49 64 78 43 75 72 3b 20 20 20 20 20  nt iIdxCur;     
202c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
202d0 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66  he VDBE cursor f
202e0 6f 72 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  or the index */.
202f0 20 20 20 20 69 6e 74 20 6e 45 78 74 72 61 52 65      int nExtraRe
20300 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
20310 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78   /* Number of ex
20320 74 72 61 20 72 65 67 69 73 74 65 72 73 20 6e 65  tra registers ne
20330 65 64 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  eded */.    int 
20340 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
20350 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 74           /* Inst
20360 72 75 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20 2a  ruction opcode *
20370 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74 61  /.    char *zSta
20380 72 74 41 66 66 3b 20 20 20 20 20 20 20 20 20 20  rtAff;          
20390 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 66     /* Affinity f
203a0 6f 72 20 73 74 61 72 74 20 6f 66 20 72 61 6e 67  or start of rang
203b0 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  e constraint */.
203c0 20 20 20 20 63 68 61 72 20 63 45 6e 64 41 66 66      char cEndAff
203d0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
203e0 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 66 6f 72   /* Affinity for
203f0 20 65 6e 64 20 6f 66 20 72 61 6e 67 65 20 63 6f   end of range co
20400 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20  nstraint */.    
20410 75 38 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c  u8 bSeekPastNull
20420 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
20430 54 72 75 65 20 74 6f 20 73 65 65 6b 20 70 61 73  True to seek pas
20440 74 20 69 6e 69 74 69 61 6c 20 6e 75 6c 6c 73 20  t initial nulls 
20450 2a 2f 0a 20 20 20 20 75 38 20 62 53 74 6f 70 41  */.    u8 bStopA
20460 74 4e 75 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20  tNull = 0;      
20470 20 20 20 20 2f 2a 20 41 64 64 20 63 6f 6e 64 69      /* Add condi
20480 74 69 6f 6e 20 74 6f 20 74 65 72 6d 69 6e 61 74  tion to terminat
20490 65 20 61 74 20 4e 55 4c 4c 73 20 2a 2f 0a 0a 20  e at NULLs */.. 
204a0 20 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d     pIdx = pLoop-
204b0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
204c0 0a 20 20 20 20 69 49 64 78 43 75 72 20 3d 20 70  .    iIdxCur = p
204d0 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a  Level->iIdxCur;.
204e0 20 20 20 20 61 73 73 65 72 74 28 20 6e 45 71 3e      assert( nEq>
204f0 3d 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 20 29 3b  =pLoop->nSkip );
20500 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
20510 20 6c 6f 6f 70 20 73 61 74 69 73 66 69 65 73 20   loop satisfies 
20520 61 20 73 6f 72 74 20 6f 72 64 65 72 20 28 70 4f  a sort order (pO
20530 72 64 65 72 42 79 29 20 72 65 71 75 65 73 74 20  rderBy) request 
20540 74 68 61 74 20 0a 20 20 20 20 2a 2a 20 77 61 73  that .    ** was
20550 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
20560 66 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6d 70 6c  function to impl
20570 65 6d 65 6e 74 20 61 20 22 53 45 4c 45 43 54 20  ement a "SELECT 
20580 6d 69 6e 28 78 29 20 2e 2e 2e 22 20 0a 20 20 20  min(x) ..." .   
20590 20 2a 2a 20 71 75 65 72 79 2c 20 74 68 65 6e 20   ** query, then 
205a0 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  the caller will 
205b0 6f 6e 6c 79 20 61 6c 6c 6f 77 20 74 68 65 20 6c  only allow the l
205c0 6f 6f 70 20 74 6f 20 72 75 6e 20 66 6f 72 0a 20  oop to run for. 
205d0 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 69     ** a single i
205e0 74 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 6d  teration. This m
205f0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 66 69  eans that the fi
20600 72 73 74 20 72 6f 77 20 72 65 74 75 72 6e 65 64  rst row returned
20610 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 6e  .    ** should n
20620 6f 74 20 68 61 76 65 20 61 20 4e 55 4c 4c 20 76  ot have a NULL v
20630 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 27  alue stored in '
20640 78 27 2e 20 49 66 20 63 6f 6c 75 6d 6e 20 27 78  x'. If column 'x
20650 27 20 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20  ' is.    ** the 
20660 66 69 72 73 74 20 6f 6e 65 20 61 66 74 65 72 20  first one after 
20670 74 68 65 20 6e 45 71 20 65 71 75 61 6c 69 74 79  the nEq equality
20680 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20   constraints in 
20690 74 68 65 20 69 6e 64 65 78 2c 0a 20 20 20 20 2a  the index,.    *
206a0 2a 20 74 68 69 73 20 72 65 71 75 69 72 65 73 20  * this requires 
206b0 73 6f 6d 65 20 73 70 65 63 69 61 6c 20 68 61 6e  some special han
206c0 64 6c 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20  dling..    */.  
206d0 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f    assert( pWInfo
206e0 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 0a 20 20  ->pOrderBy==0.  
206f0 20 20 20 20 20 20 20 7c 7c 20 70 57 49 6e 66 6f         || pWInfo
20700 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
20710 72 3d 3d 31 0a 20 20 20 20 20 20 20 20 20 7c 7c  r==1.         ||
20720 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
20730 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52  lags&WHERE_ORDER
20740 42 59 5f 4d 49 4e 29 3d 3d 30 20 29 3b 0a 20 20  BY_MIN)==0 );.  
20750 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77    if( (pWInfo->w
20760 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f  ctrlFlags&WHERE_
20770 4f 52 44 45 52 42 59 5f 4d 49 4e 29 21 3d 30 0a  ORDERBY_MIN)!=0.
20780 20 20 20 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e       && pWInfo->
20790 6e 4f 42 53 61 74 3e 30 0a 20 20 20 20 20 26 26  nOBSat>0.     &&
207a0 20 28 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e   (pIdx->nKeyCol>
207b0 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  nEq).    ){.    
207c0 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d    assert( pLoop-
207d0 3e 6e 53 6b 69 70 3d 3d 30 20 29 3b 0a 20 20 20  >nSkip==0 );.   
207e0 20 20 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c     bSeekPastNull
207f0 20 3d 20 31 3b 0a 20 20 20 20 20 20 6e 45 78 74   = 1;.      nExt
20800 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d  raReg = 1;.    }
20810 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 61 6e  ..    /* Find an
20820 79 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  y inequality con
20830 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20 66 6f  straint terms fo
20840 72 20 74 68 65 20 73 74 61 72 74 20 61 6e 64 20  r the start and 
20850 65 6e 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74  end .    ** of t
20860 68 65 20 72 61 6e 67 65 2e 20 0a 20 20 20 20 2a  he range. .    *
20870 2f 0a 20 20 20 20 6a 20 3d 20 6e 45 71 3b 0a 20  /.    j = nEq;. 
20880 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73     if( pLoop->ws
20890 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54  Flags & WHERE_BT
208a0 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20  M_LIMIT ){.     
208b0 20 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20 70   pRangeStart = p
208c0 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b  Loop->aLTerm[j++
208d0 5d 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52  ];.      nExtraR
208e0 65 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a  eg = 1;.      /*
208f0 20 4c 69 6b 65 20 6f 70 74 69 6d 69 7a 61 74 69   Like optimizati
20900 6f 6e 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  on range constra
20910 69 6e 74 73 20 61 6c 77 61 79 73 20 6f 63 63 75  ints always occu
20920 72 20 69 6e 20 70 61 69 72 73 20 2a 2f 0a 20 20  r in pairs */.  
20930 20 20 20 20 61 73 73 65 72 74 28 20 28 70 52 61      assert( (pRa
20940 6e 67 65 53 74 61 72 74 2d 3e 77 74 46 6c 61 67  ngeStart->wtFlag
20950 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54  s & TERM_LIKEOPT
20960 29 3d 3d 30 20 7c 7c 20 0a 20 20 20 20 20 20 20  )==0 || .       
20970 20 20 20 20 20 20 20 28 70 4c 6f 6f 70 2d 3e 77         (pLoop->w
20980 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54  sFlags & WHERE_T
20990 4f 50 5f 4c 49 4d 49 54 29 21 3d 30 20 29 3b 0a  OP_LIMIT)!=0 );.
209a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c      }.    if( pL
209b0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
209c0 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29  HERE_TOP_LIMIT )
209d0 7b 0a 20 20 20 20 20 20 70 52 61 6e 67 65 45 6e  {.      pRangeEn
209e0 64 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  d = pLoop->aLTer
209f0 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 20 20 6e 45  m[j++];.      nE
20a00 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20  xtraReg = 1;.   
20a10 20 20 20 69 66 28 20 28 70 52 61 6e 67 65 45 6e     if( (pRangeEn
20a20 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  d->wtFlags & TER
20a30 4d 5f 4c 49 4b 45 4f 50 54 29 21 3d 30 20 29 7b  M_LIKEOPT)!=0 ){
20a40 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
20a50 20 70 52 61 6e 67 65 53 74 61 72 74 21 3d 30 20   pRangeStart!=0 
20a60 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
20a70 20 20 20 20 20 20 20 2f 2a 20 4c 49 4b 45 20 6f         /* LIKE o
20a80 70 74 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  pt constraints *
20a90 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
20aa0 28 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 77  ( pRangeStart->w
20ab0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c 49  tFlags & TERM_LI
20ac0 4b 45 4f 50 54 20 29 3b 20 20 20 2f 2a 20 6f 63  KEOPT );   /* oc
20ad0 63 75 72 20 69 6e 20 70 61 69 72 73 20 2a 2f 0a  cur in pairs */.
20ae0 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e          pLevel->
20af0 69 4c 69 6b 65 52 65 70 43 6e 74 72 20 3d 20 2b  iLikeRepCntr = +
20b00 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
20b10 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
20b20 20 62 52 65 76 20 29 3b 0a 20 20 20 20 20 20 20   bRev );.       
20b30 20 74 65 73 74 63 61 73 65 28 20 70 49 64 78 2d   testcase( pIdx-
20b40 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d  >aSortOrder[nEq]
20b50 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43  ==SQLITE_SO_DESC
20b60 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
20b70 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
20b80 20 4f 50 5f 49 6e 74 65 67 65 72 2c 0a 20 20 20   OP_Integer,.   
20b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ba0 20 20 20 20 20 20 20 62 52 65 76 20 5e 20 28 70         bRev ^ (p
20bb0 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Idx->aSortOrder[
20bc0 6e 45 71 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f  nEq]==SQLITE_SO_
20bd0 44 45 53 43 29 2c 0a 20 20 20 20 20 20 20 20 20  DESC),.         
20be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20bf0 20 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65   pLevel->iLikeRe
20c00 70 43 6e 74 72 29 3b 0a 20 20 20 20 20 20 20 20  pCntr);.        
20c10 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
20c20 22 4c 49 4b 45 20 6c 6f 6f 70 20 63 6f 75 6e 74  "LIKE loop count
20c30 65 72 22 29 29 3b 0a 20 20 20 20 20 20 20 20 70  er"));.        p
20c40 4c 65 76 65 6c 2d 3e 61 64 64 72 4c 69 6b 65 52  Level->addrLikeR
20c50 65 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ep = sqlite3Vdbe
20c60 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
20c70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
20c80 28 20 70 52 61 6e 67 65 53 74 61 72 74 3d 3d 30  ( pRangeStart==0
20c90 0a 20 20 20 20 20 20 20 26 26 20 28 6a 20 3d 20  .       && (j = 
20ca0 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  pIdx->aiColumn[n
20cb0 45 71 5d 29 3e 3d 30 20 0a 20 20 20 20 20 20 20  Eq])>=0 .       
20cc0 26 26 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d  && pIdx->pTable-
20cd0 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c  >aCol[j].notNull
20ce0 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  ==0.      ){.   
20cf0 20 20 20 20 20 62 53 65 65 6b 50 61 73 74 4e 75       bSeekPastNu
20d00 6c 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ll = 1;.      }.
20d10 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
20d20 28 20 70 52 61 6e 67 65 45 6e 64 3d 3d 30 20 7c  ( pRangeEnd==0 |
20d30 7c 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74  | (pRangeEnd->wt
20d40 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
20d50 4c 4c 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f  LL)==0 );..    /
20d60 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
20d70 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20  to evaluate all 
20d80 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73  constraint terms
20d90 20 75 73 69 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a   using == or IN.
20da0 20 20 20 20 2a 2a 20 61 6e 64 20 73 74 6f 72 65      ** and store
20db0 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 74   the values of t
20dc0 68 6f 73 65 20 74 65 72 6d 73 20 69 6e 20 61 6e  hose terms in an
20dd0 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74   array of regist
20de0 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74  ers.    ** start
20df0 69 6e 67 20 61 74 20 72 65 67 42 61 73 65 2e 0a  ing at regBase..
20e00 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 67 42 61      */.    regBa
20e10 73 65 20 3d 20 63 6f 64 65 41 6c 6c 45 71 75 61  se = codeAllEqua
20e20 6c 69 74 79 54 65 72 6d 73 28 70 50 61 72 73 65  lityTerms(pParse
20e30 2c 70 4c 65 76 65 6c 2c 62 52 65 76 2c 6e 45 78  ,pLevel,bRev,nEx
20e40 74 72 61 52 65 67 2c 26 7a 53 74 61 72 74 41 66  traReg,&zStartAf
20e50 66 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  f);.    assert( 
20e60 7a 53 74 61 72 74 41 66 66 3d 3d 30 20 7c 7c 20  zStartAff==0 || 
20e70 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
20e80 7a 53 74 61 72 74 41 66 66 29 3e 3d 6e 45 71 20  zStartAff)>=nEq 
20e90 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 74 61 72  );.    if( zStar
20ea0 74 41 66 66 20 29 20 63 45 6e 64 41 66 66 20 3d  tAff ) cEndAff =
20eb0 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 3b   zStartAff[nEq];
20ec0 0a 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70  .    addrNxt = p
20ed0 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a  Level->addrNxt;.
20ee0 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72  .    /* If we ar
20ef0 65 20 64 6f 69 6e 67 20 61 20 72 65 76 65 72 73  e doing a revers
20f00 65 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e 20  e order scan on 
20f10 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64  an ascending ind
20f20 65 78 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20  ex, or.    ** a 
20f30 66 6f 72 77 61 72 64 20 6f 72 64 65 72 20 73 63  forward order sc
20f40 61 6e 20 6f 6e 20 61 20 64 65 73 63 65 6e 64 69  an on a descendi
20f50 6e 67 20 69 6e 64 65 78 2c 20 69 6e 74 65 72 63  ng index, interc
20f60 68 61 6e 67 65 20 74 68 65 20 0a 20 20 20 20 2a  hange the .    *
20f70 2a 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20  * start and end 
20f80 74 65 72 6d 73 20 28 70 52 61 6e 67 65 53 74 61  terms (pRangeSta
20f90 72 74 20 61 6e 64 20 70 52 61 6e 67 65 45 6e 64  rt and pRangeEnd
20fa0 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  )..    */.    if
20fb0 28 20 28 6e 45 71 3c 70 49 64 78 2d 3e 6e 4b 65  ( (nEq<pIdx->nKe
20fc0 79 43 6f 6c 20 26 26 20 62 52 65 76 3d 3d 28 70  yCol && bRev==(p
20fd0 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Idx->aSortOrder[
20fe0 6e 45 71 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f  nEq]==SQLITE_SO_
20ff0 41 53 43 29 29 0a 20 20 20 20 20 7c 7c 20 28 62  ASC)).     || (b
21000 52 65 76 20 26 26 20 70 49 64 78 2d 3e 6e 4b 65  Rev && pIdx->nKe
21010 79 43 6f 6c 3d 3d 6e 45 71 29 0a 20 20 20 20 29  yCol==nEq).    )
21020 7b 0a 20 20 20 20 20 20 53 57 41 50 28 57 68 65  {.      SWAP(Whe
21030 72 65 54 65 72 6d 20 2a 2c 20 70 52 61 6e 67 65  reTerm *, pRange
21040 45 6e 64 2c 20 70 52 61 6e 67 65 53 74 61 72 74  End, pRangeStart
21050 29 3b 0a 20 20 20 20 20 20 53 57 41 50 28 75 38  );.      SWAP(u8
21060 2c 20 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 2c  , bSeekPastNull,
21070 20 62 53 74 6f 70 41 74 4e 75 6c 6c 29 3b 0a 20   bStopAtNull);. 
21080 20 20 20 7d 0a 0a 20 20 20 20 74 65 73 74 63 61     }..    testca
21090 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 20  se( pRangeStart 
210a0 26 26 20 28 70 52 61 6e 67 65 53 74 61 72 74 2d  && (pRangeStart-
210b0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
210c0 4c 45 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65  LE)!=0 );.    te
210d0 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 53 74  stcase( pRangeSt
210e0 61 72 74 20 26 26 20 28 70 52 61 6e 67 65 53 74  art && (pRangeSt
210f0 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  art->eOperator &
21100 20 57 4f 5f 47 45 29 21 3d 30 20 29 3b 0a 20 20   WO_GE)!=0 );.  
21110 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e    testcase( pRan
21120 67 65 45 6e 64 20 26 26 20 28 70 52 61 6e 67 65  geEnd && (pRange
21130 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  End->eOperator &
21140 20 57 4f 5f 4c 45 29 21 3d 30 20 29 3b 0a 20 20   WO_LE)!=0 );.  
21150 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e    testcase( pRan
21160 67 65 45 6e 64 20 26 26 20 28 70 52 61 6e 67 65  geEnd && (pRange
21170 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  End->eOperator &
21180 20 57 4f 5f 47 45 29 21 3d 30 20 29 3b 0a 20 20   WO_GE)!=0 );.  
21190 20 20 73 74 61 72 74 45 71 20 3d 20 21 70 52 61    startEq = !pRa
211a0 6e 67 65 53 74 61 72 74 20 7c 7c 20 70 52 61 6e  ngeStart || pRan
211b0 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74  geStart->eOperat
211c0 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47  or & (WO_LE|WO_G
211d0 45 29 3b 0a 20 20 20 20 65 6e 64 45 71 20 3d 20  E);.    endEq = 
211e0 20 20 21 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20    !pRangeEnd || 
211f0 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72  pRangeEnd->eOper
21200 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f  ator & (WO_LE|WO
21210 5f 47 45 29 3b 0a 20 20 20 20 73 74 61 72 74 5f  _GE);.    start_
21220 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20 70 52  constraints = pR
21230 61 6e 67 65 53 74 61 72 74 20 7c 7c 20 6e 45 71  angeStart || nEq
21240 3e 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b  >0;..    /* Seek
21250 20 74 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f   the index curso
21260 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
21270 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a  f the range. */.
21280 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20      nConstraint 
21290 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70  = nEq;.    if( p
212a0 52 61 6e 67 65 53 74 61 72 74 20 29 7b 0a 20 20  RangeStart ){.  
212b0 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
212c0 20 3d 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e   = pRangeStart->
212d0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
212e0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
212f0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 69  Code(pParse, pRi
21300 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  ght, regBase+nEq
21310 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 69  );.      whereLi
21320 6b 65 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 53 74  keOptimizationSt
21330 72 69 6e 67 46 69 78 75 70 28 76 2c 20 70 4c 65  ringFixup(v, pLe
21340 76 65 6c 2c 20 70 52 61 6e 67 65 53 74 61 72 74  vel, pRangeStart
21350 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 52  );.      if( (pR
21360 61 6e 67 65 53 74 61 72 74 2d 3e 77 74 46 6c 61  angeStart->wtFla
21370 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29  gs & TERM_VNULL)
21380 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 73 71  ==0.       && sq
21390 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75  lite3ExprCanBeNu
213a0 6c 6c 28 70 52 69 67 68 74 29 0a 20 20 20 20 20  ll(pRight).     
213b0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
213c0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
213d0 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 42   OP_IsNull, regB
213e0 61 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74  ase+nEq, addrNxt
213f0 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
21400 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
21410 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 53    }.      if( zS
21420 74 61 72 74 41 66 66 20 29 7b 0a 20 20 20 20 20  tartAff ){.     
21430 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f     if( sqlite3Co
21440 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 52  mpareAffinity(pR
21450 69 67 68 74 2c 20 7a 53 74 61 72 74 41 66 66 5b  ight, zStartAff[
21460 6e 45 71 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46  nEq])==SQLITE_AF
21470 46 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20 20 20 20  F_NONE){.       
21480 20 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20     /* Since the 
21490 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 6f  comparison is to
214a0 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 77 69   be performed wi
214b0 74 68 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e  th no conversion
214c0 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  s.          ** a
214d0 70 70 6c 69 65 64 20 74 6f 20 74 68 65 20 6f 70  pplied to the op
214e0 65 72 61 6e 64 73 2c 20 73 65 74 20 74 68 65 20  erands, set the 
214f0 61 66 66 69 6e 69 74 79 20 74 6f 20 61 70 70 6c  affinity to appl
21500 79 20 74 6f 20 70 52 69 67 68 74 20 74 6f 20 0a  y to pRight to .
21510 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c            ** SQL
21520 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a  ITE_AFF_NONE.  *
21530 2f 0a 20 20 20 20 20 20 20 20 20 20 7a 53 74 61  /.          zSta
21540 72 74 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c  rtAff[nEq] = SQL
21550 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
21560 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
21570 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e  if( sqlite3ExprN
21580 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68  eedsNoAffinityCh
21590 61 6e 67 65 28 70 52 69 67 68 74 2c 20 7a 53 74  ange(pRight, zSt
215a0 61 72 74 41 66 66 5b 6e 45 71 5d 29 20 29 7b 0a  artAff[nEq]) ){.
215b0 20 20 20 20 20 20 20 20 20 20 7a 53 74 61 72 74            zStart
215c0 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54  Aff[nEq] = SQLIT
215d0 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
215e0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 20 0a      }.      }  .
215f0 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e        nConstrain
21600 74 2b 2b 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t++;.      testc
21610 61 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74  ase( pRangeStart
21620 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
21630 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20  _VIRTUAL );.    
21640 7d 65 6c 73 65 20 69 66 28 20 62 53 65 65 6b 50  }else if( bSeekP
21650 61 73 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  astNull ){.     
21660 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21670 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
21680 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a  , regBase+nEq);.
21690 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e        nConstrain
216a0 74 2b 2b 3b 0a 20 20 20 20 20 20 73 74 61 72 74  t++;.      start
216b0 45 71 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74  Eq = 0;.      st
216c0 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
216d0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  = 1;.    }.    c
216e0 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79  odeApplyAffinity
216f0 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
21700 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 2d 20  , nConstraint - 
21710 62 53 65 65 6b 50 61 73 74 4e 75 6c 6c 2c 20 7a  bSeekPastNull, z
21720 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20 6f  StartAff);.    o
21730 70 20 3d 20 61 53 74 61 72 74 4f 70 5b 28 73 74  p = aStartOp[(st
21740 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3c  art_constraints<
21750 3c 32 29 20 2b 20 28 73 74 61 72 74 45 71 3c 3c  <2) + (startEq<<
21760 31 29 20 2b 20 62 52 65 76 5d 3b 0a 20 20 20 20  1) + bRev];.    
21770 61 73 73 65 72 74 28 20 6f 70 21 3d 30 20 29 3b  assert( op!=0 );
21780 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
21790 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c  AddOp4Int(v, op,
217a0 20 69 49 64 78 43 75 72 2c 20 61 64 64 72 4e 78   iIdxCur, addrNx
217b0 74 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e  t, regBase, nCon
217c0 73 74 72 61 69 6e 74 29 3b 0a 20 20 20 20 56 64  straint);.    Vd
217d0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
217e0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
217f0 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 52 65 77 69  f(v, op==OP_Rewi
21800 6e 64 29 3b 20 20 74 65 73 74 63 61 73 65 28 20  nd);  testcase( 
21810 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 20 29 3b  op==OP_Rewind );
21820 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
21830 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4c 61  eIf(v, op==OP_La
21840 73 74 29 3b 20 20 20 20 74 65 73 74 63 61 73 65  st);    testcase
21850 28 20 6f 70 3d 3d 4f 50 5f 4c 61 73 74 20 29 3b  ( op==OP_Last );
21860 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
21870 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65  eIf(v, op==OP_Se
21880 65 6b 47 54 29 3b 20 20 74 65 73 74 63 61 73 65  ekGT);  testcase
21890 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 54 20  ( op==OP_SeekGT 
218a0 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
218b0 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
218c0 53 65 65 6b 47 45 29 3b 20 20 74 65 73 74 63 61  SeekGE);  testca
218d0 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47  se( op==OP_SeekG
218e0 45 20 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  E );.    VdbeCov
218f0 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
21900 50 5f 53 65 65 6b 4c 45 29 3b 20 20 74 65 73 74  P_SeekLE);  test
21910 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65  case( op==OP_See
21920 6b 4c 45 20 29 3b 0a 20 20 20 20 56 64 62 65 43  kLE );.    VdbeC
21930 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
21940 3d 4f 50 5f 53 65 65 6b 4c 54 29 3b 20 20 74 65  =OP_SeekLT);  te
21950 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53  stcase( op==OP_S
21960 65 65 6b 4c 54 20 29 3b 0a 0a 20 20 20 20 2f 2a  eekLT );..    /*
21970 20 4c 6f 61 64 20 74 68 65 20 76 61 6c 75 65 20   Load the value 
21980 66 6f 72 20 74 68 65 20 69 6e 65 71 75 61 6c 69  for the inequali
21990 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74  ty constraint at
219a0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
219b0 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 28 69 66      ** range (if
219c0 20 61 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20   any)..    */.  
219d0 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20    nConstraint = 
219e0 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70 52 61  nEq;.    if( pRa
219f0 6e 67 65 45 6e 64 20 29 7b 0a 20 20 20 20 20 20  ngeEnd ){.      
21a00 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70  Expr *pRight = p
21a10 52 61 6e 67 65 45 6e 64 2d 3e 70 45 78 70 72 2d  RangeEnd->pExpr-
21a20 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 73  >pRight;.      s
21a30 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52  qlite3ExprCacheR
21a40 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65  emove(pParse, re
21a50 67 42 61 73 65 2b 6e 45 71 2c 20 31 29 3b 0a 20  gBase+nEq, 1);. 
21a60 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
21a70 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 69  Code(pParse, pRi
21a80 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  ght, regBase+nEq
21a90 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 69  );.      whereLi
21aa0 6b 65 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 53 74  keOptimizationSt
21ab0 72 69 6e 67 46 69 78 75 70 28 76 2c 20 70 4c 65  ringFixup(v, pLe
21ac0 76 65 6c 2c 20 70 52 61 6e 67 65 45 6e 64 29 3b  vel, pRangeEnd);
21ad0 0a 20 20 20 20 20 20 69 66 28 20 28 70 52 61 6e  .      if( (pRan
21ae0 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26  geEnd->wtFlags &
21af0 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 0a   TERM_VNULL)==0.
21b00 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
21b10 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70  3ExprCanBeNull(p
21b20 52 69 67 68 74 29 0a 20 20 20 20 20 20 29 7b 0a  Right).      ){.
21b30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
21b40 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
21b50 49 73 4e 75 6c 6c 2c 20 72 65 67 42 61 73 65 2b  IsNull, regBase+
21b60 6e 45 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20  nEq, addrNxt);. 
21b70 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
21b80 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a  age(v);.      }.
21b90 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
21ba0 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
21bb0 28 70 52 69 67 68 74 2c 20 63 45 6e 64 41 66 66  (pRight, cEndAff
21bc0 29 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  )!=SQLITE_AFF_NO
21bd0 4e 45 0a 20 20 20 20 20 20 20 26 26 20 21 73 71  NE.       && !sq
21be0 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f  lite3ExprNeedsNo
21bf0 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
21c00 52 69 67 68 74 2c 20 63 45 6e 64 41 66 66 29 0a  Right, cEndAff).
21c10 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
21c20 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69   codeApplyAffini
21c30 74 79 28 70 50 61 72 73 65 2c 20 72 65 67 42 61  ty(pParse, regBa
21c40 73 65 2b 6e 45 71 2c 20 31 2c 20 26 63 45 6e 64  se+nEq, 1, &cEnd
21c50 41 66 66 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Aff);.      }.  
21c60 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b      nConstraint+
21c70 2b 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  +;.      testcas
21c80 65 28 20 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74  e( pRangeEnd->wt
21c90 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
21ca0 54 55 41 4c 20 29 3b 0a 20 20 20 20 7d 65 6c 73  TUAL );.    }els
21cb0 65 20 69 66 28 20 62 53 74 6f 70 41 74 4e 75 6c  e if( bStopAtNul
21cc0 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
21cd0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
21ce0 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 42  OP_Null, 0, regB
21cf0 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20  ase+nEq);.      
21d00 65 6e 64 45 71 20 3d 20 30 3b 0a 20 20 20 20 20  endEq = 0;.     
21d10 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a   nConstraint++;.
21d20 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
21d30 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74 61  3DbFree(db, zSta
21d40 72 74 41 66 66 29 3b 0a 0a 20 20 20 20 2f 2a 20  rtAff);..    /* 
21d50 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  Top of the loop 
21d60 62 6f 64 79 20 2a 2f 0a 20 20 20 20 70 4c 65 76  body */.    pLev
21d70 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33  el->p2 = sqlite3
21d80 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
21d90 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  v);..    /* Chec
21da0 6b 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 63  k if the index c
21db0 75 72 73 6f 72 20 69 73 20 70 61 73 74 20 74 68  ursor is past th
21dc0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72 61 6e  e end of the ran
21dd0 67 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e  ge. */.    if( n
21de0 43 6f 6e 73 74 72 61 69 6e 74 20 29 7b 0a 20 20  Constraint ){.  
21df0 20 20 20 20 6f 70 20 3d 20 61 45 6e 64 4f 70 5b      op = aEndOp[
21e00 62 52 65 76 2a 32 20 2b 20 65 6e 64 45 71 5d 3b  bRev*2 + endEq];
21e10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
21e20 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f  beAddOp4Int(v, o
21e30 70 2c 20 69 49 64 78 43 75 72 2c 20 61 64 64 72  p, iIdxCur, addr
21e40 4e 78 74 2c 20 72 65 67 42 61 73 65 2c 20 6e 43  Nxt, regBase, nC
21e50 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 20 20  onstraint);.    
21e60 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
21e70 4f 50 5f 49 64 78 47 54 20 29 3b 20 20 56 64 62  OP_IdxGT );  Vdb
21e80 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
21e90 70 3d 3d 4f 50 5f 49 64 78 47 54 20 29 3b 0a 20  p==OP_IdxGT );. 
21ea0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
21eb0 70 3d 3d 4f 50 5f 49 64 78 47 45 20 29 3b 20 20  p==OP_IdxGE );  
21ec0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
21ed0 2c 20 6f 70 3d 3d 4f 50 5f 49 64 78 47 45 20 29  , op==OP_IdxGE )
21ee0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
21ef0 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54 20 29  ( op==OP_IdxLT )
21f00 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ;  VdbeCoverageI
21f10 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c  f(v, op==OP_IdxL
21f20 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
21f30 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c  ase( op==OP_IdxL
21f40 45 20 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61  E );  VdbeCovera
21f50 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 49  geIf(v, op==OP_I
21f60 64 78 4c 45 20 29 3b 0a 20 20 20 20 7d 0a 0a 20  dxLE );.    }.. 
21f70 20 20 20 2f 2a 20 53 65 65 6b 20 74 68 65 20 74     /* Seek the t
21f80 61 62 6c 65 20 63 75 72 73 6f 72 2c 20 69 66 20  able cursor, if 
21f90 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20  required */.    
21fa0 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
21fb0 65 6c 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29  el, pRangeStart)
21fc0 3b 0a 20 20 20 20 64 69 73 61 62 6c 65 54 65 72  ;.    disableTer
21fd0 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65  m(pLevel, pRange
21fe0 45 6e 64 29 3b 0a 20 20 20 20 69 66 28 20 6f 6d  End);.    if( om
21ff0 69 74 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  itTable ){.     
22000 20 2f 2a 20 70 49 64 78 20 69 73 20 61 20 63 6f   /* pIdx is a co
22010 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 4e  vering index.  N
22020 6f 20 6e 65 65 64 20 74 6f 20 61 63 63 65 73 73  o need to access
22030 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e   the main table.
22040 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   */.    }else if
22050 28 20 48 61 73 52 6f 77 69 64 28 70 49 64 78 2d  ( HasRowid(pIdx-
22060 3e 70 54 61 62 6c 65 29 20 29 7b 0a 20 20 20 20  >pTable) ){.    
22070 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20 2b 2b    iRowidReg = ++
22080 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
22090 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
220a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 52  ddOp2(v, OP_IdxR
220b0 6f 77 69 64 2c 20 69 49 64 78 43 75 72 2c 20 69  owid, iIdxCur, i
220c0 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20  RowidReg);.     
220d0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
220e0 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69  eStore(pParse, i
220f0 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52  Cur, -1, iRowidR
22100 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  eg);.      sqlit
22110 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
22120 4f 50 5f 53 65 65 6b 2c 20 69 43 75 72 2c 20 69  OP_Seek, iCur, i
22130 52 6f 77 69 64 52 65 67 29 3b 20 20 2f 2a 20 44  RowidReg);  /* D
22140 65 66 65 72 72 65 64 20 73 65 65 6b 20 2a 2f 0a  eferred seek */.
22150 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 43      }else if( iC
22160 75 72 21 3d 69 49 64 78 43 75 72 20 29 7b 0a 20  ur!=iIdxCur ){. 
22170 20 20 20 20 20 49 6e 64 65 78 20 2a 70 50 6b 20       Index *pPk 
22180 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  = sqlite3Primary
22190 4b 65 79 49 6e 64 65 78 28 70 49 64 78 2d 3e 70  KeyIndex(pIdx->p
221a0 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 69 52  Table);.      iR
221b0 6f 77 69 64 52 65 67 20 3d 20 73 71 6c 69 74 65  owidReg = sqlite
221c0 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
221d0 61 72 73 65 2c 20 70 50 6b 2d 3e 6e 4b 65 79 43  arse, pPk->nKeyC
221e0 6f 6c 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  ol);.      for(j
221f0 3d 30 3b 20 6a 3c 70 50 6b 2d 3e 6e 4b 65 79 43  =0; j<pPk->nKeyC
22200 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
22210 20 20 6b 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c    k = sqlite3Col
22220 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49 64 78 2c  umnOfIndex(pIdx,
22230 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a   pPk->aiColumn[j
22240 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ]);.        sqli
22250 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
22260 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78   OP_Column, iIdx
22270 43 75 72 2c 20 6b 2c 20 69 52 6f 77 69 64 52 65  Cur, k, iRowidRe
22280 67 2b 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  g+j);.      }.  
22290 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
222a0 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e  ddOp4Int(v, OP_N
222b0 6f 74 46 6f 75 6e 64 2c 20 69 43 75 72 2c 20 61  otFound, iCur, a
222c0 64 64 72 43 6f 6e 74 2c 0a 20 20 20 20 20 20 20  ddrCont,.       
222d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222e0 20 20 20 20 69 52 6f 77 69 64 52 65 67 2c 20 70      iRowidReg, p
222f0 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56 64  Pk->nKeyCol); Vd
22300 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
22310 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 63     }..    /* Rec
22320 6f 72 64 20 74 68 65 20 69 6e 73 74 72 75 63 74  ord the instruct
22330 69 6f 6e 20 75 73 65 64 20 74 6f 20 74 65 72 6d  ion used to term
22340 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20  inate the loop. 
22350 44 69 73 61 62 6c 65 20 0a 20 20 20 20 2a 2a 20  Disable .    ** 
22360 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
22370 6d 73 20 6d 61 64 65 20 72 65 64 75 6e 64 61 6e  ms made redundan
22380 74 20 62 79 20 74 68 65 20 69 6e 64 65 78 20 72  t by the index r
22390 61 6e 67 65 20 73 63 61 6e 2e 0a 20 20 20 20 2a  ange scan..    *
223a0 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d  /.    if( pLoop-
223b0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
223c0 5f 4f 4e 45 52 4f 57 20 29 7b 0a 20 20 20 20 20  _ONEROW ){.     
223d0 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
223e0 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c 73 65  _Noop;.    }else
223f0 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20   if( bRev ){.   
22400 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
22410 4f 50 5f 50 72 65 76 3b 0a 20 20 20 20 7d 65 6c  OP_Prev;.    }el
22420 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  se{.      pLevel
22430 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a  ->op = OP_Next;.
22440 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c      }.    pLevel
22450 2d 3e 70 31 20 3d 20 69 49 64 78 43 75 72 3b 0a  ->p1 = iIdxCur;.
22460 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 33 20 3d      pLevel->p3 =
22470 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
22480 26 57 48 45 52 45 5f 55 4e 51 5f 57 41 4e 54 45  &WHERE_UNQ_WANTE
22490 44 29 21 3d 30 20 3f 20 31 3a 30 3b 0a 20 20 20  D)!=0 ? 1:0;.   
224a0 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46   if( (pLoop->wsF
224b0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4e  lags & WHERE_CON
224c0 53 54 52 41 49 4e 54 29 3d 3d 30 20 29 7b 0a 20  STRAINT)==0 ){. 
224d0 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20       pLevel->p5 
224e0 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  = SQLITE_STMTSTA
224f0 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45  TUS_FULLSCAN_STE
22500 50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  P;.    }else{.  
22510 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 76      assert( pLev
22520 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 20  el->p5==0 );.   
22530 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e   }.  }else..#ifn
22540 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
22550 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a  OR_OPTIMIZATION.
22560 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
22570 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c  lags & WHERE_MUL
22580 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20 2f 2a 20  TI_OR ){.    /* 
22590 43 61 73 65 20 35 3a 20 20 54 77 6f 20 6f 72 20  Case 5:  Two or 
225a0 6d 6f 72 65 20 73 65 70 61 72 61 74 65 6c 79 20  more separately 
225b0 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63 6f  indexed terms co
225c0 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 0a 20 20  nnected by OR.  
225d0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d    **.    ** Exam
225e0 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ple:.    **.    
225f0 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
22600 45 20 74 31 28 61 2c 62 2c 63 2c 64 29 3b 0a 20  E t1(a,b,c,d);. 
22610 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49     **   CREATE I
22620 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61 29  NDEX i1 ON t1(a)
22630 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54  ;.    **   CREAT
22640 45 20 49 4e 44 45 58 20 69 32 20 4f 4e 20 74 31  E INDEX i2 ON t1
22650 28 62 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52  (b);.    **   CR
22660 45 41 54 45 20 49 4e 44 45 58 20 69 33 20 4f 4e  EATE INDEX i3 ON
22670 20 74 31 28 63 29 3b 0a 20 20 20 20 2a 2a 0a 20   t1(c);.    **. 
22680 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a     **   SELECT *
22690 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
226a0 3d 35 20 4f 52 20 62 3d 37 20 4f 52 20 28 63 3d  =5 OR b=7 OR (c=
226b0 31 31 20 41 4e 44 20 64 3d 31 33 29 0a 20 20 20  11 AND d=13).   
226c0 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68   **.    ** In th
226d0 65 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 72 65  e example, there
226e0 20 61 72 65 20 74 68 72 65 65 20 69 6e 64 65 78   are three index
226f0 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74  ed terms connect
22700 65 64 20 62 79 20 4f 52 2e 0a 20 20 20 20 2a 2a  ed by OR..    **
22710 20 54 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   The top of the 
22720 6c 6f 6f 70 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20  loop looks like 
22730 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  this:.    **.   
22740 20 2a 2a 20 20 20 20 20 20 20 20 20 20 4e 75 6c   **          Nul
22750 6c 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20  l       1       
22760 20 20 20 20 20 20 20 20 20 23 20 5a 65 72 6f 20           # Zero 
22770 74 68 65 20 72 6f 77 73 65 74 20 69 6e 20 72 65  the rowset in re
22780 67 20 31 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  g 1.    **.    *
22790 2a 20 54 68 65 6e 2c 20 66 6f 72 20 65 61 63 68  * Then, for each
227a0 20 69 6e 64 65 78 65 64 20 74 65 72 6d 2c 20 74   indexed term, t
227b0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 2e 20 54 68  he following. Th
227c0 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a 20  e arguments to. 
227d0 20 20 20 2a 2a 20 52 6f 77 53 65 74 54 65 73 74     ** RowSetTest
227e0 20 61 72 65 20 73 75 63 68 20 74 68 61 74 20 74   are such that t
227f0 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20  he rowid of the 
22800 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20 69  current row is i
22810 6e 73 65 72 74 65 64 0a 20 20 20 20 2a 2a 20 69  nserted.    ** i
22820 6e 74 6f 20 74 68 65 20 52 6f 77 53 65 74 2e 20  nto the RowSet. 
22830 49 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  If it is already
22840 20 70 72 65 73 65 6e 74 2c 20 63 6f 6e 74 72 6f   present, contro
22850 6c 20 73 6b 69 70 73 20 74 68 65 0a 20 20 20 20  l skips the.    
22860 2a 2a 20 47 6f 73 75 62 20 6f 70 63 6f 64 65 20  ** Gosub opcode 
22870 61 6e 64 20 6a 75 6d 70 73 20 73 74 72 61 69 67  and jumps straig
22880 68 74 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67  ht to the code g
22890 65 6e 65 72 61 74 65 64 20 62 79 20 57 68 65 72  enerated by Wher
228a0 65 45 6e 64 28 29 2e 0a 20 20 20 20 2a 2a 0a 20  eEnd()..    **. 
228b0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c     **        sql
228c0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 3c  ite3WhereBegin(<
228d0 74 65 72 6d 3e 29 0a 20 20 20 20 2a 2a 20 20 20  term>).    **   
228e0 20 20 20 20 20 20 20 52 6f 77 53 65 74 54 65 73         RowSetTes
228f0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
22900 20 20 20 23 20 49 6e 73 65 72 74 20 72 6f 77 69     # Insert rowi
22910 64 20 69 6e 74 6f 20 72 6f 77 73 65 74 0a 20 20  d into rowset.  
22920 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47 6f    **          Go
22930 73 75 62 20 20 20 20 20 20 32 20 41 0a 20 20 20  sub      2 A.   
22940 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c 69 74   **        sqlit
22950 65 33 57 68 65 72 65 45 6e 64 28 29 0a 20 20 20  e3WhereEnd().   
22960 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 6c 6c 6f   **.    ** Follo
22970 77 69 6e 67 20 74 68 65 20 61 62 6f 76 65 2c 20  wing the above, 
22980 63 6f 64 65 20 74 6f 20 74 65 72 6d 69 6e 61 74  code to terminat
22990 65 20 74 68 65 20 6c 6f 6f 70 2e 20 4c 61 62 65  e the loop. Labe
229a0 6c 20 41 2c 20 74 68 65 20 74 61 72 67 65 74 0a  l A, the target.
229b0 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 47 6f      ** of the Go
229c0 73 75 62 20 61 62 6f 76 65 2c 20 6a 75 6d 70 73  sub above, jumps
229d0 20 74 6f 20 74 68 65 20 69 6e 73 74 72 75 63 74   to the instruct
229e0 69 6f 6e 20 72 69 67 68 74 20 61 66 74 65 72 20  ion right after 
229f0 74 68 65 20 47 6f 74 6f 2e 0a 20 20 20 20 2a 2a  the Goto..    **
22a00 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
22a10 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20 20 20   Null       1   
22a20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 5a               # Z
22a30 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74 20 69  ero the rowset i
22a40 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a 20 20  n reg 1.    **  
22a50 20 20 20 20 20 20 20 20 47 6f 74 6f 20 20 20 20          Goto    
22a60 20 20 20 42 20 20 20 20 20 20 20 20 20 20 20 20     B            
22a70 20 20 20 20 23 20 54 68 65 20 6c 6f 6f 70 20 69      # The loop i
22a80 73 20 66 69 6e 69 73 68 65 64 2e 0a 20 20 20 20  s finished..    
22a90 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
22aa0 41 3a 20 3c 6c 6f 6f 70 20 62 6f 64 79 3e 20 20  A: <loop body>  
22ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
22ac0 20 52 65 74 75 72 6e 20 64 61 74 61 2c 20 77 68   Return data, wh
22ad0 61 74 65 76 65 72 2e 0a 20 20 20 20 2a 2a 0a 20  atever..    **. 
22ae0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 52     **          R
22af0 65 74 75 72 6e 20 20 20 20 20 32 20 20 20 20 20  eturn     2     
22b00 20 20 20 20 20 20 20 20 20 20 20 23 20 4a 75 6d             # Jum
22b10 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20 47 6f  p back to the Go
22b20 73 75 62 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  sub.    **.    *
22b30 2a 20 20 20 20 20 20 20 42 3a 20 3c 61 66 74 65  *       B: <afte
22b40 72 20 74 68 65 20 6c 6f 6f 70 3e 0a 20 20 20 20  r the loop>.    
22b50 2a 2a 0a 20 20 20 20 2a 2a 20 41 64 64 65 64 20  **.    ** Added 
22b60 32 30 31 34 2d 30 35 2d 32 36 3a 20 49 66 20 74  2014-05-26: If t
22b70 68 65 20 74 61 62 6c 65 20 69 73 20 61 20 57 49  he table is a WI
22b80 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
22b90 65 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 75  e, then.    ** u
22ba0 73 65 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  se an ephemeral 
22bb0 69 6e 64 65 78 20 69 6e 73 74 65 61 64 20 6f 66  index instead of
22bc0 20 61 20 52 6f 77 53 65 74 20 74 6f 20 72 65 63   a RowSet to rec
22bd0 6f 72 64 20 74 68 65 20 70 72 69 6d 61 72 79 0a  ord the primary.
22be0 20 20 20 20 2a 2a 20 6b 65 79 73 20 6f 66 20 74      ** keys of t
22bf0 68 65 20 72 6f 77 73 20 77 65 20 68 61 76 65 20  he rows we have 
22c00 61 6c 72 65 61 64 79 20 73 65 65 6e 2e 0a 20 20  already seen..  
22c10 20 20 2a 2a 0a 20 20 20 20 2a 2f 0a 20 20 20 20    **.    */.    
22c20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72  WhereClause *pOr
22c30 57 63 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52  Wc;    /* The OR
22c40 2d 63 6c 61 75 73 65 20 62 72 6f 6b 65 6e 20 6f  -clause broken o
22c50 75 74 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73  ut into subterms
22c60 20 2a 2f 0a 20 20 20 20 53 72 63 4c 69 73 74 20   */.    SrcList 
22c70 2a 70 4f 72 54 61 62 3b 20 20 20 20 20 20 20 2f  *pOrTab;       /
22c80 2a 20 53 68 6f 72 74 65 6e 65 64 20 74 61 62 6c  * Shortened tabl
22c90 65 20 6c 69 73 74 20 6f 72 20 4f 52 2d 63 6c 61  e list or OR-cla
22ca0 75 73 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a  use generation *
22cb0 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 43 6f  /.    Index *pCo
22cc0 76 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  v = 0;          
22cd0 20 20 20 2f 2a 20 50 6f 74 65 6e 74 69 61 6c 20     /* Potential 
22ce0 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 28  covering index (
22cf0 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 20 20  or NULL) */.    
22d00 69 6e 74 20 69 43 6f 76 43 75 72 20 3d 20 70 50  int iCovCur = pP
22d10 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 2f  arse->nTab++;  /
22d20 2a 20 43 75 72 73 6f 72 20 75 73 65 64 20 66 6f  * Cursor used fo
22d30 72 20 69 6e 64 65 78 20 73 63 61 6e 73 20 28 69  r index scans (i
22d40 66 20 61 6e 79 29 20 2a 2f 0a 0a 20 20 20 20 69  f any) */..    i
22d50 6e 74 20 72 65 67 52 65 74 75 72 6e 20 3d 20 2b  nt regReturn = +
22d60 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20  +pParse->nMem;  
22d70 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
22d80 73 74 65 72 20 75 73 65 64 20 77 69 74 68 20 4f  ster used with O
22d90 50 5f 47 6f 73 75 62 20 2a 2f 0a 20 20 20 20 69  P_Gosub */.    i
22da0 6e 74 20 72 65 67 52 6f 77 73 65 74 20 3d 20 30  nt regRowset = 0
22db0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22dc0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
22dd0 73 74 65 72 20 66 6f 72 20 52 6f 77 53 65 74 20  ster for RowSet 
22de0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 69 6e  object */.    in
22df0 74 20 72 65 67 52 6f 77 69 64 20 3d 20 30 3b 20  t regRowid = 0; 
22e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e10 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
22e20 74 65 72 20 68 6f 6c 64 69 6e 67 20 72 6f 77 69  ter holding rowi
22e30 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4c 6f  d */.    int iLo
22e40 6f 70 42 6f 64 79 20 3d 20 73 71 6c 69 74 65 33  opBody = sqlite3
22e50 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
22e60 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6c  ;  /* Start of l
22e70 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20  oop body */.    
22e80 69 6e 74 20 69 52 65 74 49 6e 69 74 3b 20 20 20  int iRetInit;   
22e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ea0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
22eb0 72 65 73 73 20 6f 66 20 72 65 67 52 65 74 75 72  ress of regRetur
22ec0 6e 20 69 6e 69 74 20 2a 2f 0a 20 20 20 20 69 6e  n init */.    in
22ed0 74 20 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20  t untestedTerms 
22ee0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
22ef0 20 2f 2a 20 53 6f 6d 65 20 74 65 72 6d 73 20 6e   /* Some terms n
22f00 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 74 65  ot completely te
22f10 73 74 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  sted */.    int 
22f20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
22f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22f40 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
22f50 2f 0a 20 20 20 20 75 31 36 20 77 63 74 72 6c 46  /.    u16 wctrlF
22f60 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
22f70 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
22f80 73 20 66 6f 72 20 73 75 62 2d 57 48 45 52 45 20  s for sub-WHERE 
22f90 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 45 78  clause */.    Ex
22fa0 70 72 20 2a 70 41 6e 64 45 78 70 72 20 3d 20 30  pr *pAndExpr = 0
22fb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22fc0 20 2f 2a 20 41 6e 20 22 2e 2e 20 41 4e 44 20 28   /* An ".. AND (
22fd0 2e 2e 2e 29 22 20 65 78 70 72 65 73 73 69 6f 6e  ...)" expression
22fe0 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   */.    Table *p
22ff0 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Tab = pTabItem->
23000 70 54 61 62 3b 0a 20 20 20 0a 20 20 20 20 70 54  pTab;.   .    pT
23010 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54  erm = pLoop->aLT
23020 65 72 6d 5b 30 5d 3b 0a 20 20 20 20 61 73 73 65  erm[0];.    asse
23030 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a  rt( pTerm!=0 );.
23040 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
23050 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
23060 4f 5f 4f 52 20 29 3b 0a 20 20 20 20 61 73 73 65  O_OR );.    asse
23070 72 74 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c  rt( (pTerm->wtFl
23080 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46  ags & TERM_ORINF
23090 4f 29 21 3d 30 20 29 3b 0a 20 20 20 20 70 4f 72  O)!=0 );.    pOr
230a0 57 63 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70  Wc = &pTerm->u.p
230b0 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20  OrInfo->wc;.    
230c0 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
230d0 52 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c 65 76  Return;.    pLev
230e0 65 6c 2d 3e 70 31 20 3d 20 72 65 67 52 65 74 75  el->p1 = regRetu
230f0 72 6e 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20  rn;..    /* Set 
23100 75 70 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74  up a new SrcList
23110 20 69 6e 20 70 4f 72 54 61 62 20 63 6f 6e 74 61   in pOrTab conta
23120 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20  ining the table 
23130 62 65 69 6e 67 20 73 63 61 6e 6e 65 64 0a 20 20  being scanned.  
23140 20 20 2a 2a 20 62 79 20 74 68 69 73 20 6c 6f 6f    ** by this loo
23150 70 20 69 6e 20 74 68 65 20 61 5b 30 5d 20 73 6c  p in the a[0] sl
23160 6f 74 20 61 6e 64 20 61 6c 6c 20 6e 6f 74 52 65  ot and all notRe
23170 61 64 79 20 74 61 62 6c 65 73 20 69 6e 20 61 5b  ady tables in a[
23180 31 2e 2e 5d 20 73 6c 6f 74 73 2e 0a 20 20 20 20  1..] slots..    
23190 2a 2a 20 54 68 69 73 20 62 65 63 6f 6d 65 73 20  ** This becomes 
231a0 74 68 65 20 53 72 63 4c 69 73 74 20 69 6e 20 74  the SrcList in t
231b0 68 65 20 72 65 63 75 72 73 69 76 65 20 63 61 6c  he recursive cal
231c0 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  l to sqlite3Wher
231d0 65 42 65 67 69 6e 28 29 2e 0a 20 20 20 20 2a 2f  eBegin()..    */
231e0 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  .    if( pWInfo-
231f0 3e 6e 4c 65 76 65 6c 3e 31 20 29 7b 0a 20 20 20  >nLevel>1 ){.   
23200 20 20 20 69 6e 74 20 6e 4e 6f 74 52 65 61 64 79     int nNotReady
23210 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23220 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
23230 6f 66 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c  of notReady tabl
23240 65 73 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75  es */.      stru
23250 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
23260 2a 6f 72 69 67 53 72 63 3b 20 20 20 20 20 2f 2a  *origSrc;     /*
23270 20 4f 72 69 67 69 6e 61 6c 20 6c 69 73 74 20 6f   Original list o
23280 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20  f tables */.    
23290 20 20 6e 4e 6f 74 52 65 61 64 79 20 3d 20 70 57    nNotReady = pW
232a0 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 2d 20 69  Info->nLevel - i
232b0 4c 65 76 65 6c 20 2d 20 31 3b 0a 20 20 20 20 20  Level - 1;.     
232c0 20 70 4f 72 54 61 62 20 3d 20 73 71 6c 69 74 65   pOrTab = sqlite
232d0 33 53 74 61 63 6b 41 6c 6c 6f 63 52 61 77 28 64  3StackAllocRaw(d
232e0 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
232f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
23300 69 7a 65 6f 66 28 2a 70 4f 72 54 61 62 29 2b 20  izeof(*pOrTab)+ 
23310 6e 4e 6f 74 52 65 61 64 79 2a 73 69 7a 65 6f 66  nNotReady*sizeof
23320 28 70 4f 72 54 61 62 2d 3e 61 5b 30 5d 29 29 3b  (pOrTab->a[0]));
23330 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 61  .      if( pOrTa
23340 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 6e 6f  b==0 ) return no
23350 74 52 65 61 64 79 3b 0a 20 20 20 20 20 20 70 4f  tReady;.      pO
23360 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 28  rTab->nAlloc = (
23370 75 38 29 28 6e 4e 6f 74 52 65 61 64 79 20 2b 20  u8)(nNotReady + 
23380 31 29 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62  1);.      pOrTab
23390 2d 3e 6e 53 72 63 20 3d 20 70 4f 72 54 61 62 2d  ->nSrc = pOrTab-
233a0 3e 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 6d  >nAlloc;.      m
233b0 65 6d 63 70 79 28 70 4f 72 54 61 62 2d 3e 61 2c  emcpy(pOrTab->a,
233c0 20 70 54 61 62 49 74 65 6d 2c 20 73 69 7a 65 6f   pTabItem, sizeo
233d0 66 28 2a 70 54 61 62 49 74 65 6d 29 29 3b 0a 20  f(*pTabItem));. 
233e0 20 20 20 20 20 6f 72 69 67 53 72 63 20 3d 20 70       origSrc = p
233f0 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
23400 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d  >a;.      for(k=
23410 31 3b 20 6b 3c 3d 6e 4e 6f 74 52 65 61 64 79 3b  1; k<=nNotReady;
23420 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d   k++){.        m
23430 65 6d 63 70 79 28 26 70 4f 72 54 61 62 2d 3e 61  emcpy(&pOrTab->a
23440 5b 6b 5d 2c 20 26 6f 72 69 67 53 72 63 5b 70 4c  [k], &origSrc[pL
23450 65 76 65 6c 5b 6b 5d 2e 69 46 72 6f 6d 5d 2c 20  evel[k].iFrom], 
23460 73 69 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e 61  sizeof(pOrTab->a
23470 5b 6b 5d 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  [k]));.      }. 
23480 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23490 70 4f 72 54 61 62 20 3d 20 70 57 49 6e 66 6f 2d  pOrTab = pWInfo-
234a0 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 7d  >pTabList;.    }
234b0 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  ..    /* Initial
234c0 69 7a 65 20 74 68 65 20 72 6f 77 73 65 74 20 72  ize the rowset r
234d0 65 67 69 73 74 65 72 20 74 6f 20 63 6f 6e 74 61  egister to conta
234e0 69 6e 20 4e 55 4c 4c 2e 20 41 6e 20 53 51 4c 20  in NULL. An SQL 
234f0 4e 55 4c 4c 20 69 73 20 0a 20 20 20 20 2a 2a 20  NULL is .    ** 
23500 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 61 6e  equivalent to an
23510 20 65 6d 70 74 79 20 72 6f 77 73 65 74 2e 20 20   empty rowset.  
23520 4f 72 2c 20 63 72 65 61 74 65 20 61 6e 20 65 70  Or, create an ep
23530 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 0a 20 20  hemeral index.  
23540 20 20 2a 2a 20 63 61 70 61 62 6c 65 20 6f 66 20    ** capable of 
23550 68 6f 6c 64 69 6e 67 20 70 72 69 6d 61 72 79 20  holding primary 
23560 6b 65 79 73 20 69 6e 20 74 68 65 20 63 61 73 65  keys in the case
23570 20 6f 66 20 61 20 57 49 54 48 4f 55 54 20 52 4f   of a WITHOUT RO
23580 57 49 44 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  WID..    **.    
23590 2a 2a 20 41 6c 73 6f 20 69 6e 69 74 69 61 6c 69  ** Also initiali
235a0 7a 65 20 72 65 67 52 65 74 75 72 6e 20 74 6f 20  ze regReturn to 
235b0 63 6f 6e 74 61 69 6e 20 74 68 65 20 61 64 64 72  contain the addr
235c0 65 73 73 20 6f 66 20 74 68 65 20 69 6e 73 74 72  ess of the instr
235d0 75 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 69  uction .    ** i
235e0 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
235f0 77 69 6e 67 20 74 68 65 20 4f 50 5f 52 65 74 75  wing the OP_Retu
23600 72 6e 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d  rn at the bottom
23610 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 54 68   of the loop. Th
23620 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 72 65 71  is.    ** is req
23630 75 69 72 65 64 20 69 6e 20 61 20 66 65 77 20 6f  uired in a few o
23640 62 73 63 75 72 65 20 4c 45 46 54 20 4a 4f 49 4e  bscure LEFT JOIN
23650 20 63 61 73 65 73 20 77 68 65 72 65 20 63 6f 6e   cases where con
23660 74 72 6f 6c 20 6a 75 6d 70 73 0a 20 20 20 20 2a  trol jumps.    *
23670 2a 20 6f 76 65 72 20 74 68 65 20 74 6f 70 20 6f  * over the top o
23680 66 20 74 68 65 20 6c 6f 6f 70 20 69 6e 74 6f 20  f the loop into 
23690 74 68 65 20 62 6f 64 79 20 6f 66 20 69 74 2e 20  the body of it. 
236a0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
236b0 20 0a 20 20 20 20 2a 2a 20 63 6f 72 72 65 63 74   .    ** correct
236c0 20 72 65 73 70 6f 6e 73 65 20 66 6f 72 20 74 68   response for th
236d0 65 20 65 6e 64 2d 6f 66 2d 6c 6f 6f 70 20 63 6f  e end-of-loop co
236e0 64 65 20 28 74 68 65 20 4f 50 5f 52 65 74 75 72  de (the OP_Retur
236f0 6e 29 20 69 73 20 74 6f 20 0a 20 20 20 20 2a 2a  n) is to .    **
23700 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f   fall through to
23710 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
23720 63 74 69 6f 6e 2c 20 6a 75 73 74 20 61 73 20 61  ction, just as a
23730 6e 20 4f 50 5f 4e 65 78 74 20 64 6f 65 73 20 69  n OP_Next does i
23740 66 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 20  f.    ** called 
23750 6f 6e 20 61 6e 20 75 6e 69 6e 69 74 69 61 6c 69  on an uninitiali
23760 7a 65 64 20 63 75 72 73 6f 72 2e 0a 20 20 20 20  zed cursor..    
23770 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 57 49 6e  */.    if( (pWIn
23780 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
23790 20 57 48 45 52 45 5f 44 55 50 4c 49 43 41 54 45   WHERE_DUPLICATE
237a0 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  S_OK)==0 ){.    
237b0 20 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70    if( HasRowid(p
237c0 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Tab) ){.        
237d0 72 65 67 52 6f 77 73 65 74 20 3d 20 2b 2b 70 50  regRowset = ++pP
237e0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
237f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
23800 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
23810 2c 20 30 2c 20 72 65 67 52 6f 77 73 65 74 29 3b  , 0, regRowset);
23820 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
23830 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 50 6b        Index *pPk
23840 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72   = sqlite3Primar
23850 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b  yKeyIndex(pTab);
23860 0a 20 20 20 20 20 20 20 20 72 65 67 52 6f 77 73  .        regRows
23870 65 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  et = pParse->nTa
23880 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  b++;.        sql
23890 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
238a0 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
238b0 61 6c 2c 20 72 65 67 52 6f 77 73 65 74 2c 20 70  al, regRowset, p
238c0 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20  Pk->nKeyCol);.  
238d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
238e0 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50  eSetP4KeyInfo(pP
238f0 61 72 73 65 2c 20 70 50 6b 29 3b 0a 20 20 20 20  arse, pPk);.    
23900 20 20 7d 0a 20 20 20 20 20 20 72 65 67 52 6f 77    }.      regRow
23910 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  id = ++pParse->n
23920 4d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  Mem;.    }.    i
23930 52 65 74 49 6e 69 74 20 3d 20 73 71 6c 69 74 65  RetInit = sqlite
23940 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
23950 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
23960 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 20 20 2f  gReturn);..    /
23970 2a 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61  * If the origina
23980 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  l WHERE clause i
23990 73 20 7a 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  s z of the form:
239a0 20 20 28 78 31 20 4f 52 20 78 32 20 4f 52 20 2e    (x1 OR x2 OR .
239b0 2e 2e 29 20 41 4e 44 20 79 0a 20 20 20 20 2a 2a  ..) AND y.    **
239c0 20 54 68 65 6e 20 66 6f 72 20 65 76 65 72 79 20   Then for every 
239d0 74 65 72 6d 20 78 4e 2c 20 65 76 61 6c 75 61 74  term xN, evaluat
239e0 65 20 61 73 20 74 68 65 20 73 75 62 65 78 70 72  e as the subexpr
239f0 65 73 73 69 6f 6e 3a 20 78 4e 20 41 4e 44 20 7a  ession: xN AND z
23a00 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 77 61 79  .    ** That way
23a10 2c 20 74 65 72 6d 73 20 69 6e 20 79 20 74 68 61  , terms in y tha
23a20 74 20 61 72 65 20 66 61 63 74 6f 72 65 64 20 69  t are factored i
23a30 6e 74 6f 20 74 68 65 20 64 69 73 6a 75 6e 63 74  nto the disjunct
23a40 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  ion will.    ** 
23a50 62 65 20 70 69 63 6b 65 64 20 75 70 20 62 79 20  be picked up by 
23a60 74 68 65 20 72 65 63 75 72 73 69 76 65 20 63 61  the recursive ca
23a70 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 57 68  lls to sqlite3Wh
23a80 65 72 65 42 65 67 69 6e 28 29 20 62 65 6c 6f 77  ereBegin() below
23a90 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
23aa0 41 63 74 75 61 6c 6c 79 2c 20 65 61 63 68 20 73  Actually, each s
23ab0 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  ubexpression is 
23ac0 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 22 78 4e  converted to "xN
23ad0 20 41 4e 44 20 77 22 20 77 68 65 72 65 20 77 20   AND w" where w 
23ae0 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 22 69  is.    ** the "i
23af0 6e 74 65 72 65 73 74 69 6e 67 22 20 74 65 72 6d  nteresting" term
23b00 73 20 6f 66 20 7a 20 2d 20 74 65 72 6d 73 20 74  s of z - terms t
23b10 68 61 74 20 64 69 64 20 6e 6f 74 20 6f 72 69 67  hat did not orig
23b20 69 6e 61 74 65 20 69 6e 20 74 68 65 0a 20 20 20  inate in the.   
23b30 20 2a 2a 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20   ** ON or USING 
23b40 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54  clause of a LEFT
23b50 20 4a 4f 49 4e 2c 20 61 6e 64 20 74 65 72 6d 73   JOIN, and terms
23b60 20 74 68 61 74 20 61 72 65 20 75 73 61 62 6c 65   that are usable
23b70 20 61 73 20 0a 20 20 20 20 2a 2a 20 69 6e 64 69   as .    ** indi
23b80 63 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ces..    **.    
23b90 2a 2a 20 54 68 69 73 20 6f 70 74 69 6d 69 7a 61  ** This optimiza
23ba0 74 69 6f 6e 20 61 6c 73 6f 20 6f 6e 6c 79 20 61  tion also only a
23bb0 70 70 6c 69 65 73 20 69 66 20 74 68 65 20 28 78  pplies if the (x
23bc0 31 20 4f 52 20 78 32 20 4f 52 20 2e 2e 2e 29 20  1 OR x2 OR ...) 
23bd0 74 65 72 6d 0a 20 20 20 20 2a 2a 20 69 73 20 6e  term.    ** is n
23be0 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  ot contained in 
23bf0 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66  the ON clause of
23c00 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 20 20   a LEFT JOIN..  
23c10 20 20 2a 2a 20 53 65 65 20 74 69 63 6b 65 74 20    ** See ticket 
23c20 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74  http://www.sqlit
23c30 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 66  e.org/src/info/f
23c40 32 33 36 39 33 30 34 65 34 0a 20 20 20 20 2a 2f  2369304e4.    */
23c50 0a 20 20 20 20 69 66 28 20 70 57 43 2d 3e 6e 54  .    if( pWC->nT
23c60 65 72 6d 3e 31 20 29 7b 0a 20 20 20 20 20 20 69  erm>1 ){.      i
23c70 6e 74 20 69 54 65 72 6d 3b 0a 20 20 20 20 20 20  nt iTerm;.      
23c80 66 6f 72 28 69 54 65 72 6d 3d 30 3b 20 69 54 65  for(iTerm=0; iTe
23c90 72 6d 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69  rm<pWC->nTerm; i
23ca0 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
23cb0 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
23cc0 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 70 45 78  WC->a[iTerm].pEx
23cd0 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  pr;.        if( 
23ce0 26 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 20 3d  &pWC->a[iTerm] =
23cf0 3d 20 70 54 65 72 6d 20 29 20 63 6f 6e 74 69 6e  = pTerm ) contin
23d00 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
23d10 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
23d20 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
23d30 69 6e 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  in) ) continue;.
23d40 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57 43          if( (pWC
23d50 2d 3e 61 5b 69 54 65 72 6d 5d 2e 77 74 46 6c 61  ->a[iTerm].wtFla
23d60 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
23d70 4c 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  L)!=0 ) continue
23d80 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  ;.        if( (p
23d90 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 65 4f 70  WC->a[iTerm].eOp
23da0 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 29  erator & WO_ALL)
23db0 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
23dc0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
23dd0 28 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e  ( pWC->a[iTerm].
23de0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f  wtFlags & TERM_O
23df0 52 49 4e 46 4f 20 29 3b 0a 20 20 20 20 20 20 20  RINFO );.       
23e00 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
23e10 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70  ExprDup(db, pExp
23e20 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  r, 0);.        p
23e30 41 6e 64 45 78 70 72 20 3d 20 73 71 6c 69 74 65  AndExpr = sqlite
23e40 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 41 6e  3ExprAnd(db, pAn
23e50 64 45 78 70 72 2c 20 70 45 78 70 72 29 3b 0a 20  dExpr, pExpr);. 
23e60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
23e70 20 70 41 6e 64 45 78 70 72 20 29 7b 0a 20 20 20   pAndExpr ){.   
23e80 20 20 20 20 20 70 41 6e 64 45 78 70 72 20 3d 20       pAndExpr = 
23e90 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
23ea0 72 73 65 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c 20  rse, TK_AND, 0, 
23eb0 70 41 6e 64 45 78 70 72 2c 20 30 29 3b 0a 20 20  pAndExpr, 0);.  
23ec0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
23ed0 20 2f 2a 20 52 75 6e 20 61 20 73 65 70 61 72 61   /* Run a separa
23ee0 74 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  te WHERE clause 
23ef0 66 6f 72 20 65 61 63 68 20 74 65 72 6d 20 6f 66  for each term of
23f00 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 2e 20   the OR clause. 
23f10 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 65 6c   After.    ** el
23f20 69 6d 69 6e 61 74 69 6e 67 20 64 75 70 6c 69 63  iminating duplic
23f30 61 74 65 73 20 66 72 6f 6d 20 6f 74 68 65 72 20  ates from other 
23f40 57 48 45 52 45 20 63 6c 61 75 73 65 73 2c 20 74  WHERE clauses, t
23f50 68 65 20 61 63 74 69 6f 6e 20 66 6f 72 20 65 61  he action for ea
23f60 63 68 0a 20 20 20 20 2a 2a 20 73 75 62 2d 57 48  ch.    ** sub-WH
23f70 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 74 6f  ERE clause is to
23f80 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 6d   to invoke the m
23f90 61 69 6e 20 6c 6f 6f 70 20 62 6f 64 79 20 61 73  ain loop body as
23fa0 20 61 20 73 75 62 72 6f 75 74 69 6e 65 2e 0a 20   a subroutine.. 
23fb0 20 20 20 2a 2f 0a 20 20 20 20 77 63 74 72 6c 46     */.    wctrlF
23fc0 6c 61 67 73 20 3d 20 20 57 48 45 52 45 5f 4f 4d  lags =  WHERE_OM
23fd0 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 0a 20 20  IT_OPEN_CLOSE.  
23fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
23ff0 57 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c  WHERE_FORCE_TABL
24000 45 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E.              
24010 20 20 7c 20 57 48 45 52 45 5f 4f 4e 45 54 41 42    | WHERE_ONETAB
24020 4c 45 5f 4f 4e 4c 59 0a 20 20 20 20 20 20 20 20  LE_ONLY.        
24030 20 20 20 20 20 20 20 20 7c 20 57 48 45 52 45 5f          | WHERE_
24040 4e 4f 5f 41 55 54 4f 49 4e 44 45 58 3b 0a 20 20  NO_AUTOINDEX;.  
24050 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
24060 4f 72 57 63 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b  OrWc->nTerm; ii+
24070 2b 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54  +){.      WhereT
24080 65 72 6d 20 2a 70 4f 72 54 65 72 6d 20 3d 20 26  erm *pOrTerm = &
24090 70 4f 72 57 63 2d 3e 61 5b 69 69 5d 3b 0a 20 20  pOrWc->a[ii];.  
240a0 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d      if( pOrTerm-
240b0 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
240c0 72 20 7c 7c 20 28 70 4f 72 54 65 72 6d 2d 3e 65  r || (pOrTerm->e
240d0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4e  Operator & WO_AN
240e0 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  D)!=0 ){.       
240f0 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 53 75 62   WhereInfo *pSub
24100 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  WInfo;          
24110 20 2f 2a 20 49 6e 66 6f 20 66 6f 72 20 73 69 6e   /* Info for sin
24120 67 6c 65 20 4f 52 2d 74 65 72 6d 20 73 63 61 6e  gle OR-term scan
24130 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72   */.        Expr
24140 20 2a 70 4f 72 45 78 70 72 20 3d 20 70 4f 72 54   *pOrExpr = pOrT
24150 65 72 6d 2d 3e 70 45 78 70 72 3b 20 2f 2a 20 43  erm->pExpr; /* C
24160 75 72 72 65 6e 74 20 4f 52 20 63 6c 61 75 73 65  urrent OR clause
24170 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 20 20 20   term */.       
24180 20 69 6e 74 20 6a 31 20 3d 20 30 3b 20 20 20 20   int j1 = 0;    
24190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241a0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6a   /* Address of j
241b0 75 6d 70 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  ump operation */
241c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 41 6e  .        if( pAn
241d0 64 45 78 70 72 20 26 26 20 21 45 78 70 72 48 61  dExpr && !ExprHa
241e0 73 50 72 6f 70 65 72 74 79 28 70 4f 72 45 78 70  sProperty(pOrExp
241f0 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  r, EP_FromJoin) 
24200 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 41 6e  ){.          pAn
24210 64 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70  dExpr->pLeft = p
24220 4f 72 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  OrExpr;.        
24230 20 20 70 4f 72 45 78 70 72 20 3d 20 70 41 6e 64    pOrExpr = pAnd
24240 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Expr;.        }.
24250 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
24260 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20 65 6e  through table en
24270 74 72 69 65 73 20 74 68 61 74 20 6d 61 74 63 68  tries that match
24280 20 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a   term pOrTerm. *
24290 2f 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 54  /.        WHERET
242a0 52 41 43 45 28 30 78 66 66 66 66 2c 20 28 22 53  RACE(0xffff, ("S
242b0 75 62 70 6c 61 6e 20 66 6f 72 20 4f 52 2d 63 6c  ubplan for OR-cl
242c0 61 75 73 65 3a 5c 6e 22 29 29 3b 0a 20 20 20 20  ause:\n"));.    
242d0 20 20 20 20 70 53 75 62 57 49 6e 66 6f 20 3d 20      pSubWInfo = 
242e0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
242f0 6e 28 70 50 61 72 73 65 2c 20 70 4f 72 54 61 62  n(pParse, pOrTab
24300 2c 20 70 4f 72 45 78 70 72 2c 20 30 2c 20 30 2c  , pOrExpr, 0, 0,
24310 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24330 20 20 20 20 20 20 20 77 63 74 72 6c 46 6c 61 67         wctrlFlag
24340 73 2c 20 69 43 6f 76 43 75 72 29 3b 0a 20 20 20  s, iCovCur);.   
24350 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75       assert( pSu
24360 62 57 49 6e 66 6f 20 7c 7c 20 70 50 61 72 73 65  bWInfo || pParse
24370 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
24380 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
24390 20 20 20 20 20 20 69 66 28 20 70 53 75 62 57 49        if( pSubWI
243a0 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nfo ){.         
243b0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 53 75 62   WhereLoop *pSub
243c0 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20  Loop;.          
243d0 69 6e 74 20 61 64 64 72 45 78 70 6c 61 69 6e 20  int addrExplain 
243e0 3d 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e  = explainOneScan
243f0 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
24400 70 50 61 72 73 65 2c 20 70 4f 72 54 61 62 2c 20  pParse, pOrTab, 
24410 26 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d  &pSubWInfo->a[0]
24420 2c 20 69 4c 65 76 65 6c 2c 20 70 4c 65 76 65 6c  , iLevel, pLevel
24430 2d 3e 69 46 72 6f 6d 2c 20 30 0a 20 20 20 20 20  ->iFrom, 0.     
24440 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
24450 20 20 61 64 64 53 63 61 6e 53 74 61 74 75 73 28    addScanStatus(
24460 76 2c 20 70 4f 72 54 61 62 2c 20 26 70 53 75 62  v, pOrTab, &pSub
24470 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20 61 64 64  WInfo->a[0], add
24480 72 45 78 70 6c 61 69 6e 29 3b 0a 0a 20 20 20 20  rExplain);..    
24490 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73        /* This is
244a0 20 74 68 65 20 73 75 62 2d 57 48 45 52 45 20 63   the sub-WHERE c
244b0 6c 61 75 73 65 20 62 6f 64 79 2e 20 20 46 69 72  lause body.  Fir
244c0 73 74 20 73 6b 69 70 20 6f 76 65 72 0a 20 20 20  st skip over.   
244d0 20 20 20 20 20 20 20 2a 2a 20 64 75 70 6c 69 63         ** duplic
244e0 61 74 65 20 72 6f 77 73 20 66 72 6f 6d 20 70 72  ate rows from pr
244f0 69 6f 72 20 73 75 62 2d 57 48 45 52 45 20 63 6c  ior sub-WHERE cl
24500 61 75 73 65 73 2c 20 61 6e 64 20 72 65 63 6f 72  auses, and recor
24510 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  d the.          
24520 2a 2a 20 72 6f 77 69 64 20 28 6f 72 20 50 52 49  ** rowid (or PRI
24530 4d 41 52 59 20 4b 45 59 29 20 66 6f 72 20 74 68  MARY KEY) for th
24540 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 73 6f  e current row so
24550 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 0a 20   that the same. 
24560 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 20           ** row 
24570 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 20  will be skipped 
24580 69 6e 20 73 75 62 73 65 71 75 65 6e 74 20 73 75  in subsequent su
24590 62 2d 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e  b-WHERE clauses.
245a0 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
245b0 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57 49          if( (pWI
245c0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
245d0 26 20 57 48 45 52 45 5f 44 55 50 4c 49 43 41 54  & WHERE_DUPLICAT
245e0 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20  ES_OK)==0 ){.   
245f0 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 3b 0a           int r;.
24600 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
24610 69 53 65 74 20 3d 20 28 28 69 69 3d 3d 70 4f 72  iSet = ((ii==pOr
24620 57 63 2d 3e 6e 54 65 72 6d 2d 31 29 3f 2d 31 3a  Wc->nTerm-1)?-1:
24630 69 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ii);.           
24640 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54   if( HasRowid(pT
24650 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ab) ){.         
24660 20 20 20 20 20 72 20 3d 20 73 71 6c 69 74 65 33       r = sqlite3
24670 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
24680 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  n(pParse, pTab, 
24690 2d 31 2c 20 69 43 75 72 2c 20 72 65 67 52 6f 77  -1, iCur, regRow
246a0 69 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  id, 0);.        
246b0 20 20 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74        j1 = sqlit
246c0 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
246d0 76 2c 20 4f 50 5f 52 6f 77 53 65 74 54 65 73 74  v, OP_RowSetTest
246e0 2c 20 72 65 67 52 6f 77 73 65 74 2c 20 30 2c 20  , regRowset, 0, 
246f0 72 2c 69 53 65 74 29 3b 0a 20 20 20 20 20 20 20  r,iSet);.       
24700 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
24710 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
24720 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
24730 20 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a           Index *
24740 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69  pPk = sqlite3Pri
24750 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61  maryKeyIndex(pTa
24760 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  b);.            
24770 20 20 69 6e 74 20 6e 50 6b 20 3d 20 70 50 6b 2d    int nPk = pPk-
24780 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20  >nKeyCol;.      
24790 20 20 20 20 20 20 20 20 69 6e 74 20 69 50 6b 3b          int iPk;
247a0 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
247b0 2f 2a 20 52 65 61 64 20 74 68 65 20 50 4b 20 69  /* Read the PK i
247c0 6e 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20  nto an array of 
247d0 74 65 6d 70 20 72 65 67 69 73 74 65 72 73 2e 20  temp registers. 
247e0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
247f0 20 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54   r = sqlite3GetT
24800 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
24810 20 6e 50 6b 29 3b 0a 20 20 20 20 20 20 20 20 20   nPk);.         
24820 20 20 20 20 20 66 6f 72 28 69 50 6b 3d 30 3b 20       for(iPk=0; 
24830 69 50 6b 3c 6e 50 6b 3b 20 69 50 6b 2b 2b 29 7b  iPk<nPk; iPk++){
24840 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24850 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 50 6b 2d   int iCol = pPk-
24860 3e 61 69 43 6f 6c 75 6d 6e 5b 69 50 6b 5d 3b 0a  >aiColumn[iPk];.
24870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24880 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
24890 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c  etColumn(pParse,
248a0 20 70 54 61 62 2c 20 69 43 6f 6c 2c 20 69 43 75   pTab, iCol, iCu
248b0 72 2c 20 72 2b 69 50 6b 2c 20 30 29 3b 0a 20 20  r, r+iPk, 0);.  
248c0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20              }.. 
248d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
248e0 43 68 65 63 6b 20 69 66 20 74 68 65 20 74 65 6d  Check if the tem
248f0 70 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20  p table already 
24900 63 6f 6e 74 61 69 6e 73 20 74 68 69 73 20 6b 65  contains this ke
24910 79 2e 20 49 66 20 73 6f 2c 0a 20 20 20 20 20 20  y. If so,.      
24920 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72          ** the r
24930 6f 77 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ow has already b
24940 65 65 6e 20 69 6e 63 6c 75 64 65 64 20 69 6e 20  een included in 
24950 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61  the result set a
24960 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  nd.             
24970 20 2a 2a 20 63 61 6e 20 62 65 20 69 67 6e 6f 72   ** can be ignor
24980 65 64 20 28 62 79 20 6a 75 6d 70 69 6e 67 20 70  ed (by jumping p
24990 61 73 74 20 74 68 65 20 47 6f 73 75 62 20 62 65  ast the Gosub be
249a0 6c 6f 77 29 2e 20 4f 74 68 65 72 77 69 73 65 2c  low). Otherwise,
249b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
249c0 2a 20 69 6e 73 65 72 74 20 74 68 65 20 6b 65 79  * insert the key
249d0 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74   into the temp t
249e0 61 62 6c 65 20 61 6e 64 20 70 72 6f 63 65 65 64  able and proceed
249f0 20 77 69 74 68 20 70 72 6f 63 65 73 73 69 6e 67   with processing
24a00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
24a10 2a 20 74 68 65 20 72 6f 77 2e 0a 20 20 20 20 20  * the row..     
24a20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20           **.    
24a30 20 20 20 20 20 20 20 20 20 20 2a 2a 20 55 73 65            ** Use
24a40 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 73 61 6d   some of the sam
24a50 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  e optimizations 
24a60 61 73 20 4f 50 5f 52 6f 77 53 65 74 54 65 73 74  as OP_RowSetTest
24a70 3a 20 49 66 20 69 53 65 74 0a 20 20 20 20 20 20  : If iSet.      
24a80 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 7a 65          ** is ze
24a90 72 6f 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  ro, assume that 
24aa0 74 68 65 20 6b 65 79 20 63 61 6e 6e 6f 74 20 61  the key cannot a
24ab0 6c 72 65 61 64 79 20 62 65 20 70 72 65 73 65 6e  lready be presen
24ac0 74 20 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20  t in.           
24ad0 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 20 74     ** the temp t
24ae0 61 62 6c 65 2e 20 41 6e 64 20 69 66 20 69 53 65  able. And if iSe
24af0 74 20 69 73 20 2d 31 2c 20 61 73 73 75 6d 65 20  t is -1, assume 
24b00 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f  that there is no
24b10 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
24b20 2a 2a 20 6e 65 65 64 20 74 6f 20 69 6e 73 65 72  ** need to inser
24b30 74 20 74 68 65 20 6b 65 79 20 69 6e 74 6f 20 74  t the key into t
24b40 68 65 20 74 65 6d 70 20 74 61 62 6c 65 2c 20 61  he temp table, a
24b50 73 20 69 74 20 77 69 6c 6c 20 6e 65 76 65 72 20  s it will never 
24b60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
24b70 2a 20 62 65 20 74 65 73 74 65 64 20 66 6f 72 2e  * be tested for.
24b80 20 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20    */ .          
24b90 20 20 20 20 69 66 28 20 69 53 65 74 20 29 7b 0a      if( iSet ){.
24ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24bb0 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j1 = sqlite3Vdbe
24bc0 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
24bd0 46 6f 75 6e 64 2c 20 72 65 67 52 6f 77 73 65 74  Found, regRowset
24be0 2c 20 30 2c 20 72 2c 20 6e 50 6b 29 3b 0a 20 20  , 0, r, nPk);.  
24bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 64                Vd
24c00 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
24c10 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
24c20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
24c30 20 69 53 65 74 3e 3d 30 20 29 7b 0a 20 20 20 20   iSet>=0 ){.    
24c40 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
24c50 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
24c60 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
24c70 72 2c 20 6e 50 6b 2c 20 72 65 67 52 6f 77 69 64  r, nPk, regRowid
24c80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
24c90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
24ca0 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp3(v, OP_IdxIn
24cb0 73 65 72 74 2c 20 72 65 67 52 6f 77 73 65 74 2c  sert, regRowset,
24cc0 20 72 65 67 52 6f 77 69 64 2c 20 30 29 3b 0a 20   regRowid, 0);. 
24cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
24ce0 66 28 20 69 53 65 74 20 29 20 73 71 6c 69 74 65  f( iSet ) sqlite
24cf0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
24d00 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52   OPFLAG_USESEEKR
24d10 45 53 55 4c 54 29 3b 0a 20 20 20 20 20 20 20 20  ESULT);.        
24d20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
24d30 20 20 20 20 20 20 20 2f 2a 20 52 65 6c 65 61 73         /* Releas
24d40 65 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 74  e the array of t
24d50 65 6d 70 20 72 65 67 69 73 74 65 72 73 20 2a 2f  emp registers */
24d60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
24d70 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
24d80 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
24d90 2c 20 6e 50 6b 29 3b 0a 20 20 20 20 20 20 20 20  , nPk);.        
24da0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
24db0 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  }..          /* 
24dc0 49 6e 76 6f 6b 65 20 74 68 65 20 6d 61 69 6e 20  Invoke the main 
24dd0 6c 6f 6f 70 20 62 6f 64 79 20 61 73 20 61 20 73  loop body as a s
24de0 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20  ubroutine */.   
24df0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
24e00 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
24e10 6f 73 75 62 2c 20 72 65 67 52 65 74 75 72 6e 2c  osub, regReturn,
24e20 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20 20   iLoopBody);..  
24e30 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
24e40 68 65 72 65 20 28 73 6b 69 70 70 69 6e 67 20 74  here (skipping t
24e50 68 65 20 6d 61 69 6e 20 6c 6f 6f 70 20 62 6f 64  he main loop bod
24e60 79 20 73 75 62 72 6f 75 74 69 6e 65 29 20 69 66  y subroutine) if
24e70 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
24e80 2a 20 63 75 72 72 65 6e 74 20 73 75 62 2d 57 48  * current sub-WH
24e90 45 52 45 20 72 6f 77 20 69 73 20 61 20 64 75 70  ERE row is a dup
24ea0 6c 69 63 61 74 65 20 66 72 6f 6d 20 70 72 69 6f  licate from prio
24eb0 72 20 73 75 62 2d 57 48 45 52 45 73 2e 20 2a 2f  r sub-WHEREs. */
24ec0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a  .          if( j
24ed0 31 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a  1 ) sqlite3VdbeJ
24ee0 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a  umpHere(v, j1);.
24ef0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
24f00 65 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e 74  e pSubWInfo->unt
24f10 65 73 74 65 64 54 65 72 6d 73 20 66 6c 61 67 20  estedTerms flag 
24f20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 20  means that this 
24f30 4f 52 20 74 65 72 6d 0a 20 20 20 20 20 20 20 20  OR term.        
24f40 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 6f    ** contained o
24f50 6e 65 20 6f 72 20 6d 6f 72 65 20 41 4e 44 20 74  ne or more AND t
24f60 65 72 6d 20 66 72 6f 6d 20 61 20 6e 6f 74 52 65  erm from a notRe
24f70 61 64 79 20 74 61 62 6c 65 2e 20 20 54 68 65 0a  ady table.  The.
24f80 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65 72            ** ter
24f90 6d 73 20 66 72 6f 6d 20 74 68 65 20 6e 6f 74 52  ms from the notR
24fa0 65 61 64 79 20 74 61 62 6c 65 20 63 6f 75 6c 64  eady table could
24fb0 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64 20 61   not be tested a
24fc0 6e 64 20 77 69 6c 6c 0a 20 20 20 20 20 20 20 20  nd will.        
24fd0 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20    ** need to be 
24fe0 74 65 73 74 65 64 20 6c 61 74 65 72 2e 0a 20 20  tested later..  
24ff0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
25000 20 20 20 20 20 69 66 28 20 70 53 75 62 57 49 6e       if( pSubWIn
25010 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d  fo->untestedTerm
25020 73 20 29 20 75 6e 74 65 73 74 65 64 54 65 72 6d  s ) untestedTerm
25030 73 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20  s = 1;..        
25040 20 20 2f 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74    /* If all of t
25050 68 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20  he OR-connected 
25060 74 65 72 6d 73 20 61 72 65 20 6f 70 74 69 6d 69  terms are optimi
25070 7a 65 64 20 75 73 69 6e 67 20 74 68 65 20 73 61  zed using the sa
25080 6d 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  me.          ** 
25090 69 6e 64 65 78 2c 20 61 6e 64 20 74 68 65 20 69  index, and the i
250a0 6e 64 65 78 20 69 73 20 6f 70 65 6e 65 64 20 75  ndex is opened u
250b0 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63 75  sing the same cu
250c0 72 73 6f 72 20 6e 75 6d 62 65 72 0a 20 20 20 20  rsor number.    
250d0 20 20 20 20 20 20 2a 2a 20 62 79 20 65 61 63 68        ** by each
250e0 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
250f0 57 68 65 72 65 42 65 67 69 6e 28 29 20 6d 61 64  WhereBegin() mad
25100 65 20 62 79 20 74 68 69 73 20 6c 6f 6f 70 2c 20  e by this loop, 
25110 69 74 20 6d 61 79 0a 20 20 20 20 20 20 20 20 20  it may.         
25120 20 2a 2a 20 62 65 20 70 6f 73 73 69 62 6c 65 20   ** be possible 
25130 74 6f 20 75 73 65 20 74 68 61 74 20 69 6e 64 65  to use that inde
25140 78 20 61 73 20 61 20 63 6f 76 65 72 69 6e 67 20  x as a covering 
25150 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20  index..         
25160 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   **.          **
25170 20 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20   If the call to 
25180 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
25190 6e 28 29 20 61 62 6f 76 65 20 72 65 73 75 6c 74  n() above result
251a0 65 64 20 69 6e 20 61 20 73 63 61 6e 20 74 68 61  ed in a scan tha
251b0 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75  t.          ** u
251c0 73 65 73 20 61 6e 20 69 6e 64 65 78 2c 20 61 6e  ses an index, an
251d0 64 20 74 68 69 73 20 69 73 20 65 69 74 68 65 72  d this is either
251e0 20 74 68 65 20 66 69 72 73 74 20 4f 52 2d 63 6f   the first OR-co
251f0 6e 6e 65 63 74 65 64 20 74 65 72 6d 0a 20 20 20  nnected term.   
25200 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
25210 73 65 64 20 6f 72 20 74 68 65 20 69 6e 64 65 78  sed or the index
25220 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
25230 74 68 61 74 20 75 73 65 64 20 62 79 20 61 6c 6c  that used by all
25240 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20   previous.      
25250 20 20 20 20 2a 2a 20 74 65 72 6d 73 2c 20 73 65      ** terms, se
25260 74 20 70 43 6f 76 20 74 6f 20 74 68 65 20 63 61  t pCov to the ca
25270 6e 64 69 64 61 74 65 20 63 6f 76 65 72 69 6e 67  ndidate covering
25280 20 69 6e 64 65 78 2e 20 4f 74 68 65 72 77 69 73   index. Otherwis
25290 65 2c 20 73 65 74 20 0a 20 20 20 20 20 20 20 20  e, set .        
252a0 20 20 2a 2a 20 70 43 6f 76 20 74 6f 20 4e 55 4c    ** pCov to NUL
252b0 4c 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  L to indicate th
252c0 61 74 20 6e 6f 20 63 61 6e 64 69 64 61 74 65 20  at no candidate 
252d0 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 77  covering index w
252e0 69 6c 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ill .          *
252f0 2a 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a  * be available..
25300 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
25310 20 20 20 20 20 20 20 70 53 75 62 4c 6f 6f 70 20         pSubLoop 
25320 3d 20 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30  = pSubWInfo->a[0
25330 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20  ].pWLoop;.      
25340 20 20 20 20 61 73 73 65 72 74 28 20 28 70 53 75      assert( (pSu
25350 62 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  bLoop->wsFlags &
25360 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
25370 58 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  X)==0 );.       
25380 20 20 20 69 66 28 20 28 70 53 75 62 4c 6f 6f 70     if( (pSubLoop
25390 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
253a0 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20  E_INDEXED)!=0.  
253b0 20 20 20 20 20 20 20 20 20 26 26 20 28 69 69 3d           && (ii=
253c0 3d 30 20 7c 7c 20 70 53 75 62 4c 6f 6f 70 2d 3e  =0 || pSubLoop->
253d0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3d 3d  u.btree.pIndex==
253e0 70 43 6f 76 29 0a 20 20 20 20 20 20 20 20 20 20  pCov).          
253f0 20 26 26 20 28 48 61 73 52 6f 77 69 64 28 70 54   && (HasRowid(pT
25400 61 62 29 20 7c 7c 20 21 49 73 50 72 69 6d 61 72  ab) || !IsPrimar
25410 79 4b 65 79 49 6e 64 65 78 28 70 53 75 62 4c 6f  yKeyIndex(pSubLo
25420 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
25430 65 78 29 29 0a 20 20 20 20 20 20 20 20 20 20 29  ex)).          )
25440 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
25450 73 65 72 74 28 20 70 53 75 62 57 49 6e 66 6f 2d  sert( pSubWInfo-
25460 3e 61 5b 30 5d 2e 69 49 64 78 43 75 72 3d 3d 69  >a[0].iIdxCur==i
25470 43 6f 76 43 75 72 20 29 3b 0a 20 20 20 20 20 20  CovCur );.      
25480 20 20 20 20 20 20 70 43 6f 76 20 3d 20 70 53 75        pCov = pSu
25490 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  bLoop->u.btree.p
254a0 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 20 20 20  Index;.         
254b0 20 20 20 77 63 74 72 6c 46 6c 61 67 73 20 7c 3d     wctrlFlags |=
254c0 20 57 48 45 52 45 5f 52 45 4f 50 45 4e 5f 49 44   WHERE_REOPEN_ID
254d0 58 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  X;.          }el
254e0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
254f0 70 43 6f 76 20 3d 20 30 3b 0a 20 20 20 20 20 20  pCov = 0;.      
25500 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
25510 20 2f 2a 20 46 69 6e 69 73 68 20 74 68 65 20 6c   /* Finish the l
25520 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 61 62 6c  oop through tabl
25530 65 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 6d  e entries that m
25540 61 74 63 68 20 74 65 72 6d 20 70 4f 72 54 65 72  atch term pOrTer
25550 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  m. */.          
25560 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
25570 70 53 75 62 57 49 6e 66 6f 29 3b 0a 20 20 20 20  pSubWInfo);.    
25580 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
25590 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e    }.    pLevel->
255a0 75 2e 70 43 6f 76 69 64 78 20 3d 20 70 43 6f 76  u.pCovidx = pCov
255b0 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 76 20 29  ;.    if( pCov )
255c0 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
255d0 20 3d 20 69 43 6f 76 43 75 72 3b 0a 20 20 20 20   = iCovCur;.    
255e0 69 66 28 20 70 41 6e 64 45 78 70 72 20 29 7b 0a  if( pAndExpr ){.
255f0 20 20 20 20 20 20 70 41 6e 64 45 78 70 72 2d 3e        pAndExpr->
25600 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 20  pLeft = 0;.     
25610 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
25620 74 65 28 64 62 2c 20 70 41 6e 64 45 78 70 72 29  te(db, pAndExpr)
25630 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
25640 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28  te3VdbeChangeP1(
25650 76 2c 20 69 52 65 74 49 6e 69 74 2c 20 73 71 6c  v, iRetInit, sql
25660 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
25670 64 64 72 28 76 29 29 3b 0a 20 20 20 20 73 71 6c  ddr(v));.    sql
25680 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
25690 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c  , OP_Goto, 0, pL
256a0 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a  evel->addrBrk);.
256b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
256c0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
256d0 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20 20  LoopBody);..    
256e0 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  if( pWInfo->nLev
256f0 65 6c 3e 31 20 29 20 73 71 6c 69 74 65 33 53 74  el>1 ) sqlite3St
25700 61 63 6b 46 72 65 65 28 64 62 2c 20 70 4f 72 54  ackFree(db, pOrT
25710 61 62 29 3b 0a 20 20 20 20 69 66 28 20 21 75 6e  ab);.    if( !un
25720 74 65 73 74 65 64 54 65 72 6d 73 20 29 20 64 69  testedTerms ) di
25730 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
25740 2c 20 70 54 65 72 6d 29 3b 0a 20 20 7d 65 6c 73  , pTerm);.  }els
25750 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  e.#endif /* SQLI
25760 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
25770 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 20 20 7b 0a  IZATION */..  {.
25780 20 20 20 20 2f 2a 20 43 61 73 65 20 36 3a 20 20      /* Case 6:  
25790 54 68 65 72 65 20 69 73 20 6e 6f 20 75 73 61 62  There is no usab
257a0 6c 65 20 69 6e 64 65 78 2e 20 20 57 65 20 6d 75  le index.  We mu
257b0 73 74 20 64 6f 20 61 20 63 6f 6d 70 6c 65 74 65  st do a complete
257c0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
257d0 20 73 63 61 6e 20 6f 66 20 74 68 65 20 65 6e 74   scan of the ent
257e0 69 72 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  ire table..    *
257f0 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  /.    static con
25800 73 74 20 75 38 20 61 53 74 65 70 5b 5d 20 3d 20  st u8 aStep[] = 
25810 7b 20 4f 50 5f 4e 65 78 74 2c 20 4f 50 5f 50 72  { OP_Next, OP_Pr
25820 65 76 20 7d 3b 0a 20 20 20 20 73 74 61 74 69 63  ev };.    static
25830 20 63 6f 6e 73 74 20 75 38 20 61 53 74 61 72 74   const u8 aStart
25840 5b 5d 20 3d 20 7b 20 4f 50 5f 52 65 77 69 6e 64  [] = { OP_Rewind
25850 2c 20 4f 50 5f 4c 61 73 74 20 7d 3b 0a 20 20 20  , OP_Last };.   
25860 20 61 73 73 65 72 74 28 20 62 52 65 76 3d 3d 30   assert( bRev==0
25870 20 7c 7c 20 62 52 65 76 3d 3d 31 20 29 3b 0a 20   || bRev==1 );. 
25880 20 20 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d     if( pTabItem-
25890 3e 69 73 52 65 63 75 72 73 69 76 65 20 29 7b 0a  >isRecursive ){.
258a0 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20        /* Tables 
258b0 6d 61 72 6b 65 64 20 69 73 52 65 63 75 72 73 69  marked isRecursi
258c0 76 65 20 68 61 76 65 20 6f 6e 6c 79 20 61 20 73  ve have only a s
258d0 69 6e 67 6c 65 20 72 6f 77 20 74 68 61 74 20 69  ingle row that i
258e0 73 20 73 74 6f 72 65 64 20 69 6e 0a 20 20 20 20  s stored in.    
258f0 20 20 2a 2a 20 61 20 70 73 65 75 64 6f 2d 63 75    ** a pseudo-cu
25900 72 73 6f 72 2e 20 20 4e 6f 20 6e 65 65 64 20 74  rsor.  No need t
25910 6f 20 52 65 77 69 6e 64 20 6f 72 20 4e 65 78 74  o Rewind or Next
25920 20 73 75 63 68 20 63 75 72 73 6f 72 73 2e 20 2a   such cursors. *
25930 2f 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  /.      pLevel->
25940 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  op = OP_Noop;.  
25950 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
25960 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 61 53 74 65  Level->op = aSte
25970 70 5b 62 52 65 76 5d 3b 0a 20 20 20 20 20 20 70  p[bRev];.      p
25980 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72  Level->p1 = iCur
25990 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ;.      pLevel->
259a0 70 32 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33  p2 = 1 + sqlite3
259b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 61 53  VdbeAddOp2(v, aS
259c0 74 61 72 74 5b 62 52 65 76 5d 2c 20 69 43 75 72  tart[bRev], iCur
259d0 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20  , addrBrk);.    
259e0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
259f0 28 76 2c 20 62 52 65 76 3d 3d 30 29 3b 0a 20 20  (v, bRev==0);.  
25a00 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
25a10 49 66 28 76 2c 20 62 52 65 76 21 3d 30 29 3b 0a  If(v, bRev!=0);.
25a20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35        pLevel->p5
25a30 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54   = SQLITE_STMTST
25a40 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54  ATUS_FULLSCAN_ST
25a50 45 50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23  EP;.    }.  }..#
25a60 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
25a70 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41  BLE_STMT_SCANSTA
25a80 54 55 53 0a 20 20 70 4c 65 76 65 6c 2d 3e 61 64  TUS.  pLevel->ad
25a90 64 72 56 69 73 69 74 20 3d 20 73 71 6c 69 74 65  drVisit = sqlite
25aa0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
25ab0 28 76 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  (v);.#endif..  /
25ac0 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20 74 6f  * Insert code to
25ad0 20 74 65 73 74 20 65 76 65 72 79 20 73 75 62 65   test every sube
25ae0 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63  xpression that c
25af0 61 6e 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79  an be completely
25b00 0a 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20 75  .  ** computed u
25b10 73 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  sing the current
25b20 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 2e 0a   set of tables..
25b30 20 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65 72 6d    */.  for(pTerm
25b40 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e  =pWC->a, j=pWC->
25b50 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c  nTerm; j>0; j--,
25b60 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45   pTerm++){.    E
25b70 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 69 6e 74  xpr *pE;.    int
25b80 20 73 6b 69 70 4c 69 6b 65 41 64 64 72 20 3d 20   skipLikeAddr = 
25b90 30 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  0;.    testcase(
25ba0 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
25bb0 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
25bc0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
25bd0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
25be0 20 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20   TERM_CODED );. 
25bf0 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
25c00 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49  Flags & (TERM_VI
25c10 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44  RTUAL|TERM_CODED
25c20 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
25c30 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
25c40 65 72 65 71 41 6c 6c 20 26 20 70 4c 65 76 65 6c  ereqAll & pLevel
25c50 2d 3e 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29  ->notReady)!=0 )
25c60 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
25c70 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74  ( pWInfo->untest
25c80 65 64 54 65 72 6d 73 3d 3d 30 0a 20 20 20 20 20  edTerms==0.     
25c90 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57            && (pW
25ca0 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
25cb0 20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c   & WHERE_ONETABL
25cc0 45 5f 4f 4e 4c 59 29 21 3d 30 20 29 3b 0a 20 20  E_ONLY)!=0 );.  
25cd0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65      pWInfo->unte
25ce0 73 74 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a 20  stedTerms = 1;. 
25cf0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
25d00 20 20 20 7d 0a 20 20 20 20 70 45 20 3d 20 70 54     }.    pE = pT
25d10 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
25d20 61 73 73 65 72 74 28 20 70 45 21 3d 30 20 29 3b  assert( pE!=0 );
25d30 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
25d40 3e 69 4c 65 66 74 4a 6f 69 6e 20 26 26 20 21 45  >iLeftJoin && !E
25d50 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
25d60 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  E, EP_FromJoin) 
25d70 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  ){.      continu
25d80 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
25d90 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
25da0 26 20 54 45 52 4d 5f 4c 49 4b 45 43 4f 4e 44 20  & TERM_LIKECOND 
25db0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
25dc0 20 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65   pLevel->iLikeRe
25dd0 70 43 6e 74 72 3e 30 20 29 3b 0a 20 20 20 20 20  pCntr>0 );.     
25de0 20 73 6b 69 70 4c 69 6b 65 41 64 64 72 20 3d 20   skipLikeAddr = 
25df0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
25e00 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 70  1(v, OP_IfNot, p
25e10 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65 70 43  Level->iLikeRepC
25e20 6e 74 72 29 3b 0a 20 20 20 20 20 20 56 64 62 65  ntr);.      Vdbe
25e30 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
25e40 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78   }.    sqlite3Ex
25e50 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
25e60 2c 20 70 45 2c 20 61 64 64 72 43 6f 6e 74 2c 20  , pE, addrCont, 
25e70 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
25e80 4c 29 3b 0a 20 20 20 20 69 66 28 20 73 6b 69 70  L);.    if( skip
25e90 4c 69 6b 65 41 64 64 72 20 29 20 73 71 6c 69 74  LikeAddr ) sqlit
25ea0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
25eb0 2c 20 73 6b 69 70 4c 69 6b 65 41 64 64 72 29 3b  , skipLikeAddr);
25ec0 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c  .    pTerm->wtFl
25ed0 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45  ags |= TERM_CODE
25ee0 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 73  D;.  }..  /* Ins
25ef0 65 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74  ert code to test
25f00 20 66 6f 72 20 69 6d 70 6c 69 65 64 20 63 6f 6e   for implied con
25f10 73 74 72 61 69 6e 74 73 20 62 61 73 65 64 20 6f  straints based o
25f20 6e 20 74 72 61 6e 73 69 74 69 76 69 74 79 0a 20  n transitivity. 
25f30 20 2a 2a 20 6f 66 20 74 68 65 20 22 3d 3d 22 20   ** of the "==" 
25f40 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20  operator..  **. 
25f50 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 49 66 20   ** Example: If 
25f60 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
25f70 20 63 6f 6e 74 61 69 6e 73 20 22 74 31 2e 61 3d   contains "t1.a=
25f80 74 32 2e 62 22 20 61 6e 64 20 22 74 32 2e 62 3d  t2.b" and "t2.b=
25f90 31 32 33 22 0a 20 20 2a 2a 20 61 6e 64 20 77 65  123".  ** and we
25fa0 20 61 72 65 20 63 6f 64 69 6e 67 20 74 68 65 20   are coding the 
25fb0 74 31 20 6c 6f 6f 70 20 61 6e 64 20 74 68 65 20  t1 loop and the 
25fc0 74 32 20 6c 6f 6f 70 20 68 61 73 20 6e 6f 74 20  t2 loop has not 
25fd0 79 65 74 20 63 6f 64 65 64 2c 0a 20 20 2a 2a 20  yet coded,.  ** 
25fe0 74 68 65 6e 20 77 65 20 63 61 6e 6e 6f 74 20 75  then we cannot u
25ff0 73 65 20 74 68 65 20 22 74 31 2e 61 3d 74 32 2e  se the "t1.a=t2.
26000 62 22 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 62  b" constraint, b
26010 75 74 20 77 65 20 63 61 6e 20 63 6f 64 65 0a 20  ut we can code. 
26020 20 2a 2a 20 74 68 65 20 69 6d 70 6c 69 65 64 20   ** the implied 
26030 22 74 31 2e 61 3d 31 32 33 22 20 63 6f 6e 73 74  "t1.a=123" const
26040 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f  raint..  */.  fo
26050 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20  r(pTerm=pWC->a, 
26060 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e  j=pWC->nTerm; j>
26070 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29  0; j--, pTerm++)
26080 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 2c 20  {.    Expr *pE, 
26090 2a 70 45 41 6c 74 3b 0a 20 20 20 20 57 68 65 72  *pEAlt;.    Wher
260a0 65 54 65 72 6d 20 2a 70 41 6c 74 3b 0a 20 20 20  eTerm *pAlt;.   
260b0 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c   if( pTerm->wtFl
260c0 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54  ags & (TERM_VIRT
260d0 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20  UAL|TERM_CODED) 
260e0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
260f0 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
26100 61 74 6f 72 21 3d 28 57 4f 5f 45 51 55 49 56 7c  ator!=(WO_EQUIV|
26110 57 4f 5f 45 51 29 20 29 20 63 6f 6e 74 69 6e 75  WO_EQ) ) continu
26120 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  e;.    if( pTerm
26130 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69 43  ->leftCursor!=iC
26140 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ur ) continue;. 
26150 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69     if( pLevel->i
26160 4c 65 66 74 4a 6f 69 6e 20 29 20 63 6f 6e 74 69  LeftJoin ) conti
26170 6e 75 65 3b 0a 20 20 20 20 70 45 20 3d 20 70 54  nue;.    pE = pT
26180 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
26190 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
261a0 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f  Property(pE, EP_
261b0 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b 0a 20 20 20  FromJoin) );.   
261c0 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d   assert( (pTerm-
261d0 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70  >prereqRight & p
261e0 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 29  Level->notReady)
261f0 21 3d 30 20 29 3b 0a 20 20 20 20 70 41 6c 74 20  !=0 );.    pAlt 
26200 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  = findTerm(pWC, 
26210 69 43 75 72 2c 20 70 54 65 72 6d 2d 3e 75 2e 6c  iCur, pTerm->u.l
26220 65 66 74 43 6f 6c 75 6d 6e 2c 20 6e 6f 74 52 65  eftColumn, notRe
26230 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e  ady, WO_EQ|WO_IN
26240 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 41  , 0);.    if( pA
26250 6c 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  lt==0 ) continue
26260 3b 0a 20 20 20 20 69 66 28 20 70 41 6c 74 2d 3e  ;.    if( pAlt->
26270 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f  wtFlags & (TERM_
26280 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75  CODED) ) continu
26290 65 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  e;.    testcase(
262a0 20 70 41 6c 74 2d 3e 65 4f 70 65 72 61 74 6f 72   pAlt->eOperator
262b0 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20   & WO_EQ );.    
262c0 74 65 73 74 63 61 73 65 28 20 70 41 6c 74 2d 3e  testcase( pAlt->
262d0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
262e0 4e 20 29 3b 0a 20 20 20 20 56 64 62 65 4d 6f 64  N );.    VdbeMod
262f0 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  uleComment((v, "
26300 62 65 67 69 6e 20 74 72 61 6e 73 69 74 69 76 65  begin transitive
26310 20 63 6f 6e 73 74 72 61 69 6e 74 22 29 29 3b 0a   constraint"));.
26320 20 20 20 20 70 45 41 6c 74 20 3d 20 73 71 6c 69      pEAlt = sqli
26330 74 65 33 53 74 61 63 6b 41 6c 6c 6f 63 52 61 77  te3StackAllocRaw
26340 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 45 41  (db, sizeof(*pEA
26350 6c 74 29 29 3b 0a 20 20 20 20 69 66 28 20 70 45  lt));.    if( pE
26360 41 6c 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 45  Alt ){.      *pE
26370 41 6c 74 20 3d 20 2a 70 41 6c 74 2d 3e 70 45 78  Alt = *pAlt->pEx
26380 70 72 3b 0a 20 20 20 20 20 20 70 45 41 6c 74 2d  pr;.      pEAlt-
26390 3e 70 4c 65 66 74 20 3d 20 70 45 2d 3e 70 4c 65  >pLeft = pE->pLe
263a0 66 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ft;.      sqlite
263b0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
263c0 72 73 65 2c 20 70 45 41 6c 74 2c 20 61 64 64 72  rse, pEAlt, addr
263d0 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  Cont, SQLITE_JUM
263e0 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
263f0 73 71 6c 69 74 65 33 53 74 61 63 6b 46 72 65 65  sqlite3StackFree
26400 28 64 62 2c 20 70 45 41 6c 74 29 3b 0a 20 20 20  (db, pEAlt);.   
26410 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72   }.  }..  /* For
26420 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f   a LEFT OUTER JO
26430 49 4e 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64  IN, generate cod
26440 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 63 6f  e that will reco
26450 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74  rd the fact that
26460 0a 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f  .  ** at least o
26470 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 69  ne row of the ri
26480 67 68 74 20 74 61 62 6c 65 20 68 61 73 20 6d 61  ght table has ma
26490 74 63 68 65 64 20 74 68 65 20 6c 65 66 74 20 74  tched the left t
264a0 61 62 6c 65 2e 20 20 0a 20 20 2a 2f 0a 20 20 69  able.  .  */.  i
264b0 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  f( pLevel->iLeft
264c0 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 70 4c 65 76  Join ){.    pLev
264d0 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 20 3d 20  el->addrFirst = 
264e0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
264f0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73  ntAddr(v);.    s
26500 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
26510 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
26520 31 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  1, pLevel->iLeft
26530 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62 65 43  Join);.    VdbeC
26540 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 63 6f  omment((v, "reco
26550 72 64 20 4c 45 46 54 20 4a 4f 49 4e 20 68 69 74  rd LEFT JOIN hit
26560 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "));.    sqlite3
26570 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
26580 50 61 72 73 65 29 3b 0a 20 20 20 20 66 6f 72 28  Parse);.    for(
26590 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d  pTerm=pWC->a, j=
265a0 30 3b 20 6a 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b  0; j<pWC->nTerm;
265b0 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   j++, pTerm++){.
265c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
265d0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
265e0 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
265f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
26600 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
26610 26 20 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a  & TERM_CODED );.
26620 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
26630 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d  >wtFlags & (TERM
26640 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f  _VIRTUAL|TERM_CO
26650 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  DED) ) continue;
26660 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72  .      if( (pTer
26670 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 70  m->prereqAll & p
26680 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 29  Level->notReady)
26690 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  !=0 ){.        a
266a0 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 75  ssert( pWInfo->u
266b0 6e 74 65 73 74 65 64 54 65 72 6d 73 20 29 3b 0a  ntestedTerms );.
266c0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
266d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
266e0 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 70  assert( pTerm->p
266f0 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 73 71  Expr );.      sq
26700 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
26710 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e  (pParse, pTerm->
26720 70 45 78 70 72 2c 20 61 64 64 72 43 6f 6e 74 2c  pExpr, addrCont,
26730 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
26740 4c 4c 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  LL);.      pTerm
26750 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
26760 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20  M_CODED;.    }. 
26770 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 4c 65   }..  return pLe
26780 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 3b 0a 7d  vel->notReady;.}
26790 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  ..#ifdef WHERETR
267a0 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a  ACE_ENABLED./*.*
267b0 2a 20 50 72 69 6e 74 20 74 68 65 20 63 6f 6e 74  * Print the cont
267c0 65 6e 74 20 6f 66 20 61 20 57 68 65 72 65 54 65  ent of a WhereTe
267d0 72 6d 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61  rm object.*/.sta
267e0 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 54 65  tic void whereTe
267f0 72 6d 50 72 69 6e 74 28 57 68 65 72 65 54 65 72  rmPrint(WhereTer
26800 6d 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 69 54  m *pTerm, int iT
26810 65 72 6d 29 7b 0a 20 20 69 66 28 20 70 54 65 72  erm){.  if( pTer
26820 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  m==0 ){.    sqli
26830 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
26840 54 45 52 4d 2d 25 2d 33 64 20 4e 55 4c 4c 5c 6e  TERM-%-3d NULL\n
26850 22 2c 20 69 54 65 72 6d 29 3b 0a 20 20 7d 65 6c  ", iTerm);.  }el
26860 73 65 7b 0a 20 20 20 20 63 68 61 72 20 7a 54 79  se{.    char zTy
26870 70 65 5b 34 5d 3b 0a 20 20 20 20 6d 65 6d 63 70  pe[4];.    memcp
26880 79 28 7a 54 79 70 65 2c 20 22 2e 2e 2e 22 2c 20  y(zType, "...", 
26890 34 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  4);.    if( pTer
268a0 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
268b0 4d 5f 56 49 52 54 55 41 4c 20 29 20 7a 54 79 70  M_VIRTUAL ) zTyp
268c0 65 5b 30 5d 20 3d 20 27 56 27 3b 0a 20 20 20 20  e[0] = 'V';.    
268d0 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
268e0 61 74 6f 72 20 26 20 57 4f 5f 45 51 55 49 56 20  ator & WO_EQUIV 
268f0 20 29 20 7a 54 79 70 65 5b 31 5d 20 3d 20 27 45   ) zType[1] = 'E
26900 27 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48  ';.    if( ExprH
26910 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d  asProperty(pTerm
26920 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  ->pExpr, EP_From
26930 4a 6f 69 6e 29 20 29 20 7a 54 79 70 65 5b 32 5d  Join) ) zType[2]
26940 20 3d 20 27 4c 27 3b 0a 20 20 20 20 73 71 6c 69   = 'L';.    sqli
26950 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
26960 54 45 52 4d 2d 25 2d 33 64 20 25 70 20 25 73 20  TERM-%-3d %p %s 
26970 63 75 72 73 6f 72 3d 25 2d 33 64 20 70 72 6f 62  cursor=%-3d prob
26980 3d 25 2d 33 64 20 6f 70 3d 30 78 25 30 33 78 5c  =%-3d op=0x%03x\
26990 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
269a0 20 20 20 20 20 20 20 20 20 20 20 69 54 65 72 6d             iTerm
269b0 2c 20 70 54 65 72 6d 2c 20 7a 54 79 70 65 2c 20  , pTerm, zType, 
269c0 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
269d0 72 2c 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50  r, pTerm->truthP
269e0 72 6f 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rob,.           
269f0 20 20 20 20 20 20 20 20 20 20 20 20 70 54 65 72              pTer
26a00 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 29 3b 0a 20  m->eOperator);. 
26a10 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
26a20 65 77 45 78 70 72 28 30 2c 20 70 54 65 72 6d 2d  ewExpr(0, pTerm-
26a30 3e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d 0a  >pExpr, 0);.  }.
26a40 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
26a50 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
26a60 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  LED./*.** Print 
26a70 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  a WhereLoop obje
26a80 63 74 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67  ct for debugging
26a90 20 70 75 72 70 6f 73 65 73 0a 2a 2f 0a 73 74 61   purposes.*/.sta
26aa0 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f  tic void whereLo
26ab0 6f 70 50 72 69 6e 74 28 57 68 65 72 65 4c 6f 6f  opPrint(WhereLoo
26ac0 70 20 2a 70 2c 20 57 68 65 72 65 43 6c 61 75 73  p *p, WhereClaus
26ad0 65 20 2a 70 57 43 29 7b 0a 20 20 57 68 65 72 65  e *pWC){.  Where
26ae0 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70  Info *pWInfo = p
26af0 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69 6e  WC->pWInfo;.  in
26b00 74 20 6e 62 20 3d 20 31 2b 28 70 57 49 6e 66 6f  t nb = 1+(pWInfo
26b10 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ->pTabList->nSrc
26b20 2b 37 29 2f 38 3b 0a 20 20 73 74 72 75 63 74 20  +7)/8;.  struct 
26b30 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
26b40 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  tem = pWInfo->pT
26b50 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 2d 3e 69  abList->a + p->i
26b60 54 61 62 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  Tab;.  Table *pT
26b70 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62  ab = pItem->pTab
26b80 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
26b90 50 72 69 6e 74 66 28 22 25 63 25 32 64 2e 25 30  Printf("%c%2d.%0
26ba0 2a 6c 6c 78 2e 25 30 2a 6c 6c 78 22 2c 20 70 2d  *llx.%0*llx", p-
26bb0 3e 63 49 64 2c 0a 20 20 20 20 20 20 20 20 20 20  >cId,.          
26bc0 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 54             p->iT
26bd0 61 62 2c 20 6e 62 2c 20 70 2d 3e 6d 61 73 6b 53  ab, nb, p->maskS
26be0 65 6c 66 2c 20 6e 62 2c 20 70 2d 3e 70 72 65 72  elf, nb, p->prer
26bf0 65 71 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  eq);.  sqlite3De
26c00 62 75 67 50 72 69 6e 74 66 28 22 20 25 31 32 73  bugPrintf(" %12s
26c10 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
26c20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 7a          pItem->z
26c30 41 6c 69 61 73 20 3f 20 70 49 74 65 6d 2d 3e 7a  Alias ? pItem->z
26c40 41 6c 69 61 73 20 3a 20 70 54 61 62 2d 3e 7a 4e  Alias : pTab->zN
26c50 61 6d 65 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e  ame);.  if( (p->
26c60 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
26c70 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30  VIRTUALTABLE)==0
26c80 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
26c90 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69  ar *zName;.    i
26ca0 66 28 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  f( p->u.btree.pI
26cb0 6e 64 65 78 20 26 26 20 28 7a 4e 61 6d 65 20 3d  ndex && (zName =
26cc0 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
26cd0 65 78 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  ex->zName)!=0 ){
26ce0 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63  .      if( strnc
26cf0 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  mp(zName, "sqlit
26d00 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c 20 31  e_autoindex_", 1
26d10 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  7)==0 ){.       
26d20 20 69 6e 74 20 69 20 3d 20 73 71 6c 69 74 65 33   int i = sqlite3
26d30 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 20  Strlen30(zName) 
26d40 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 77 68 69  - 1;.        whi
26d50 6c 65 28 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27 5f  le( zName[i]!='_
26d60 27 20 29 20 69 2d 2d 3b 0a 20 20 20 20 20 20 20  ' ) i--;.       
26d70 20 7a 4e 61 6d 65 20 2b 3d 20 69 3b 0a 20 20 20   zName += i;.   
26d80 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
26d90 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2e  e3DebugPrintf(".
26da0 25 2d 31 36 73 20 25 32 64 22 2c 20 7a 4e 61 6d  %-16s %2d", zNam
26db0 65 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  e, p->u.btree.nE
26dc0 71 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  q);.    }else{. 
26dd0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
26de0 67 50 72 69 6e 74 66 28 22 25 32 30 73 22 2c 22  gPrintf("%20s","
26df0 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ");.    }.  }els
26e00 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a  e{.    char *z;.
26e10 20 20 20 20 69 66 28 20 70 2d 3e 75 2e 76 74 61      if( p->u.vta
26e20 62 2e 69 64 78 53 74 72 20 29 7b 0a 20 20 20 20  b.idxStr ){.    
26e30 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
26e40 72 69 6e 74 66 28 22 28 25 64 2c 5c 22 25 73 5c  rintf("(%d,\"%s\
26e50 22 2c 25 78 29 22 2c 0a 20 20 20 20 20 20 20 20  ",%x)",.        
26e60 20 20 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61          p->u.vta
26e70 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76  b.idxNum, p->u.v
26e80 74 61 62 2e 69 64 78 53 74 72 2c 20 70 2d 3e 75  tab.idxStr, p->u
26e90 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b  .vtab.omitMask);
26ea0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
26eb0 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
26ec0 72 69 6e 74 66 28 22 28 25 64 2c 25 78 29 22 2c  rintf("(%d,%x)",
26ed0 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75   p->u.vtab.idxNu
26ee0 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69  m, p->u.vtab.omi
26ef0 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20  tMask);.    }.  
26f00 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
26f10 69 6e 74 66 28 22 20 25 2d 31 39 73 22 2c 20 7a  intf(" %-19s", z
26f20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
26f30 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 20 20 69 66  ree(z);.  }.  if
26f40 28 20 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  ( p->wsFlags & W
26f50 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 20 29 7b  HERE_SKIPSCAN ){
26f60 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
26f70 67 50 72 69 6e 74 66 28 22 20 66 20 25 30 35 78  gPrintf(" f %05x
26f80 20 25 64 2d 25 64 22 2c 20 70 2d 3e 77 73 46 6c   %d-%d", p->wsFl
26f90 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d 2c 70  ags, p->nLTerm,p
26fa0 2d 3e 6e 53 6b 69 70 29 3b 0a 20 20 7d 65 6c 73  ->nSkip);.  }els
26fb0 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  e{.    sqlite3De
26fc0 62 75 67 50 72 69 6e 74 66 28 22 20 66 20 25 30  bugPrintf(" f %0
26fd0 35 78 20 4e 20 25 64 22 2c 20 70 2d 3e 77 73 46  5x N %d", p->wsF
26fe0 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d 29  lags, p->nLTerm)
26ff0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
27000 65 62 75 67 50 72 69 6e 74 66 28 22 20 63 6f 73  ebugPrintf(" cos
27010 74 20 25 64 2c 25 64 2c 25 64 5c 6e 22 2c 20 70  t %d,%d,%d\n", p
27020 2d 3e 72 53 65 74 75 70 2c 20 70 2d 3e 72 52 75  ->rSetup, p->rRu
27030 6e 2c 20 70 2d 3e 6e 4f 75 74 29 3b 0a 20 20 69  n, p->nOut);.  i
27040 66 28 20 70 2d 3e 6e 4c 54 65 72 6d 20 26 26 20  f( p->nLTerm && 
27050 28 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61  (sqlite3WhereTra
27060 63 65 20 26 20 30 78 31 30 30 29 21 3d 30 20 29  ce & 0x100)!=0 )
27070 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
27080 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
27090 4c 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  LTerm; i++){.   
270a0 20 20 20 77 68 65 72 65 54 65 72 6d 50 72 69 6e     whereTermPrin
270b0 74 28 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2c 20  t(p->aLTerm[i], 
270c0 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  i);.    }.  }.}.
270d0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f  #endif../*.** Co
270e0 6e 76 65 72 74 20 62 75 6c 6b 20 6d 65 6d 6f 72  nvert bulk memor
270f0 79 20 69 6e 74 6f 20 61 20 76 61 6c 69 64 20 57  y into a valid W
27100 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 63 61  hereLoop that ca
27110 6e 20 62 65 20 70 61 73 73 65 64 0a 2a 2a 20 74  n be passed.** t
27120 6f 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72  o whereLoopClear
27130 20 68 61 72 6d 6c 65 73 73 6c 79 2e 0a 2a 2f 0a   harmlessly..*/.
27140 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
27150 65 4c 6f 6f 70 49 6e 69 74 28 57 68 65 72 65 4c  eLoopInit(WhereL
27160 6f 6f 70 20 2a 70 29 7b 0a 20 20 70 2d 3e 61 4c  oop *p){.  p->aL
27170 54 65 72 6d 20 3d 20 70 2d 3e 61 4c 54 65 72 6d  Term = p->aLTerm
27180 53 70 61 63 65 3b 0a 20 20 70 2d 3e 6e 4c 54 65  Space;.  p->nLTe
27190 72 6d 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 4c 53  rm = 0;.  p->nLS
271a0 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65 28  lot = ArraySize(
271b0 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 29 3b  p->aLTermSpace);
271c0 0a 20 20 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20  .  p->wsFlags = 
271d0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  0;.}../*.** Clea
271e0 72 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e  r the WhereLoop.
271f0 75 20 75 6e 69 6f 6e 2e 20 20 4c 65 61 76 65 20  u union.  Leave 
27200 57 68 65 72 65 4c 6f 6f 70 2e 70 4c 54 65 72 6d  WhereLoop.pLTerm
27210 20 69 6e 74 61 63 74 2e 0a 2a 2f 0a 73 74 61 74   intact..*/.stat
27220 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f  ic void whereLoo
27230 70 43 6c 65 61 72 55 6e 69 6f 6e 28 73 71 6c 69  pClearUnion(sqli
27240 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f  te3 *db, WhereLo
27250 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  op *p){.  if( p-
27260 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  >wsFlags & (WHER
27270 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 7c 57  E_VIRTUALTABLE|W
27280 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
27290 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e   ){.    if( (p->
272a0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
272b0 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30  VIRTUALTABLE)!=0
272c0 20 26 26 20 70 2d 3e 75 2e 76 74 61 62 2e 6e 65   && p->u.vtab.ne
272d0 65 64 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20  edFree ){.      
272e0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
272f0 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a  u.vtab.idxStr);.
27300 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e        p->u.vtab.
27310 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20  needFree = 0;.  
27320 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64      p->u.vtab.id
27330 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 7d 65  xStr = 0;.    }e
27340 6c 73 65 20 69 66 28 20 28 70 2d 3e 77 73 46 6c  lse if( (p->wsFl
27350 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f  ags & WHERE_AUTO
27360 5f 49 4e 44 45 58 29 21 3d 30 20 26 26 20 70 2d  _INDEX)!=0 && p-
27370 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 21  >u.btree.pIndex!
27380 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
27390 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
273a0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d  >u.btree.pIndex-
273b0 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 20 20 20  >zColAff);.     
273c0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
273d0 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  b, p->u.btree.pI
273e0 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ndex);.      p->
273f0 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d  u.btree.pIndex =
27400 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
27410 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74  ./*.** Deallocat
27420 65 20 69 6e 74 65 72 6e 61 6c 20 6d 65 6d 6f 72  e internal memor
27430 79 20 75 73 65 64 20 62 79 20 61 20 57 68 65 72  y used by a Wher
27440 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a  eLoop object.*/.
27450 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
27460 65 4c 6f 6f 70 43 6c 65 61 72 28 73 71 6c 69 74  eLoopClear(sqlit
27470 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f  e3 *db, WhereLoo
27480 70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  p *p){.  if( p->
27490 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72  aLTerm!=p->aLTer
274a0 6d 53 70 61 63 65 20 29 20 73 71 6c 69 74 65 33  mSpace ) sqlite3
274b0 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c  DbFree(db, p->aL
274c0 54 65 72 6d 29 3b 0a 20 20 77 68 65 72 65 4c 6f  Term);.  whereLo
274d0 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c  opClearUnion(db,
274e0 20 70 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70   p);.  whereLoop
274f0 49 6e 69 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Init(p);.}../*.*
27500 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 6d  * Increase the m
27510 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
27520 20 66 6f 72 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65   for pLoop->aLTe
27530 72 6d 5b 5d 20 74 6f 20 62 65 20 61 74 20 6c 65  rm[] to be at le
27540 61 73 74 20 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ast n..*/.static
27550 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 52 65   int whereLoopRe
27560 73 69 7a 65 28 73 71 6c 69 74 65 33 20 2a 64 62  size(sqlite3 *db
27570 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20  , WhereLoop *p, 
27580 69 6e 74 20 6e 29 7b 0a 20 20 57 68 65 72 65 54  int n){.  WhereT
27590 65 72 6d 20 2a 2a 70 61 4e 65 77 3b 0a 20 20 69  erm **paNew;.  i
275a0 66 28 20 70 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 20  f( p->nLSlot>=n 
275b0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
275c0 4f 4b 3b 0a 20 20 6e 20 3d 20 28 6e 2b 37 29 26  OK;.  n = (n+7)&
275d0 7e 37 3b 0a 20 20 70 61 4e 65 77 20 3d 20 73 71  ~7;.  paNew = sq
275e0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
275f0 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61  (db, sizeof(p->a
27600 4c 54 65 72 6d 5b 30 5d 29 2a 6e 29 3b 0a 20 20  LTerm[0])*n);.  
27610 69 66 28 20 70 61 4e 65 77 3d 3d 30 20 29 20 72  if( paNew==0 ) r
27620 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
27630 45 4d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 61 4e  EM;.  memcpy(paN
27640 65 77 2c 20 70 2d 3e 61 4c 54 65 72 6d 2c 20 73  ew, p->aLTerm, s
27650 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b  izeof(p->aLTerm[
27660 30 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f 74 29 3b 0a  0])*p->nLSlot);.
27670 20 20 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21    if( p->aLTerm!
27680 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 20  =p->aLTermSpace 
27690 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  ) sqlite3DbFree(
276a0 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a  db, p->aLTerm);.
276b0 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70 61    p->aLTerm = pa
276c0 4e 65 77 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74  New;.  p->nLSlot
276d0 20 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e 20 53   = n;.  return S
276e0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
276f0 2a 2a 20 54 72 61 6e 73 66 65 72 20 63 6f 6e 74  ** Transfer cont
27700 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 73 65 63  ent from the sec
27710 6f 6e 64 20 70 4c 6f 6f 70 20 69 6e 74 6f 20 74  ond pLoop into t
27720 68 65 20 66 69 72 73 74 2e 0a 2a 2f 0a 73 74 61  he first..*/.sta
27730 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
27740 70 58 66 65 72 28 73 71 6c 69 74 65 33 20 2a 64  pXfer(sqlite3 *d
27750 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54  b, WhereLoop *pT
27760 6f 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 46  o, WhereLoop *pF
27770 72 6f 6d 29 7b 0a 20 20 77 68 65 72 65 4c 6f 6f  rom){.  whereLoo
27780 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c 20  pClearUnion(db, 
27790 70 54 6f 29 3b 0a 20 20 69 66 28 20 77 68 65 72  pTo);.  if( wher
277a0 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20  eLoopResize(db, 
277b0 70 54 6f 2c 20 70 46 72 6f 6d 2d 3e 6e 4c 54 65  pTo, pFrom->nLTe
277c0 72 6d 29 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  rm) ){.    memse
277d0 74 28 26 70 54 6f 2d 3e 75 2c 20 30 2c 20 73 69  t(&pTo->u, 0, si
277e0 7a 65 6f 66 28 70 54 6f 2d 3e 75 29 29 3b 0a 20  zeof(pTo->u));. 
277f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
27800 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65  _NOMEM;.  }.  me
27810 6d 63 70 79 28 70 54 6f 2c 20 70 46 72 6f 6d 2c  mcpy(pTo, pFrom,
27820 20 57 48 45 52 45 5f 4c 4f 4f 50 5f 58 46 45 52   WHERE_LOOP_XFER
27830 5f 53 5a 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70  _SZ);.  memcpy(p
27840 54 6f 2d 3e 61 4c 54 65 72 6d 2c 20 70 46 72 6f  To->aLTerm, pFro
27850 6d 2d 3e 61 4c 54 65 72 6d 2c 20 70 54 6f 2d 3e  m->aLTerm, pTo->
27860 6e 4c 54 65 72 6d 2a 73 69 7a 65 6f 66 28 70 54  nLTerm*sizeof(pT
27870 6f 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29 29 3b 0a  o->aLTerm[0]));.
27880 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 77 73 46    if( pFrom->wsF
27890 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
278a0 54 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20  TUALTABLE ){.   
278b0 20 70 46 72 6f 6d 2d 3e 75 2e 76 74 61 62 2e 6e   pFrom->u.vtab.n
278c0 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d  eedFree = 0;.  }
278d0 65 6c 73 65 20 69 66 28 20 28 70 46 72 6f 6d 2d  else if( (pFrom-
278e0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
278f0 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20  _AUTO_INDEX)!=0 
27900 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75 2e  ){.    pFrom->u.
27910 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30  btree.pIndex = 0
27920 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
27930 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
27940 2a 2a 20 44 65 6c 65 74 65 20 61 20 57 68 65 72  ** Delete a Wher
27950 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a  eLoop object.*/.
27960 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
27970 65 4c 6f 6f 70 44 65 6c 65 74 65 28 73 71 6c 69  eLoopDelete(sqli
27980 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f  te3 *db, WhereLo
27990 6f 70 20 2a 70 29 7b 0a 20 20 77 68 65 72 65 4c  op *p){.  whereL
279a0 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70 29 3b  oopClear(db, p);
279b0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
279c0 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (db, p);.}../*.*
279d0 2a 20 46 72 65 65 20 61 20 57 68 65 72 65 49 6e  * Free a WhereIn
279e0 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a  fo structure.*/.
279f0 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
27a00 65 49 6e 66 6f 46 72 65 65 28 73 71 6c 69 74 65  eInfoFree(sqlite
27a10 33 20 2a 64 62 2c 20 57 68 65 72 65 49 6e 66 6f  3 *db, WhereInfo
27a20 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 69 66 28   *pWInfo){.  if(
27a30 20 41 4c 57 41 59 53 28 70 57 49 6e 66 6f 29 20   ALWAYS(pWInfo) 
27a40 29 7b 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75  ){.    whereClau
27a50 73 65 43 6c 65 61 72 28 26 70 57 49 6e 66 6f 2d  seClear(&pWInfo-
27a60 3e 73 57 43 29 3b 0a 20 20 20 20 77 68 69 6c 65  >sWC);.    while
27a70 28 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73  ( pWInfo->pLoops
27a80 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 4c   ){.      WhereL
27a90 6f 6f 70 20 2a 70 20 3d 20 70 57 49 6e 66 6f 2d  oop *p = pWInfo-
27aa0 3e 70 4c 6f 6f 70 73 3b 0a 20 20 20 20 20 20 70  >pLoops;.      p
27ab0 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 3d 20  WInfo->pLoops = 
27ac0 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20  p->pNextLoop;.  
27ad0 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c      whereLoopDel
27ae0 65 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20  ete(db, p);.    
27af0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
27b00 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b  ree(db, pWInfo);
27b10 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
27b20 74 75 72 6e 20 54 52 55 45 20 69 66 20 61 6c 6c  turn TRUE if all
27b30 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
27b40 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
27b50 2a 20 20 20 28 31 29 20 20 58 20 68 61 73 20 74  *   (1)  X has t
27b60 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65 72  he same or lower
27b70 20 63 6f 73 74 20 74 68 61 74 20 59 0a 2a 2a 20   cost that Y.** 
27b80 20 20 28 32 29 20 20 58 20 69 73 20 61 20 70 72    (2)  X is a pr
27b90 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20 59  oper subset of Y
27ba0 0a 2a 2a 20 20 20 28 33 29 20 20 58 20 73 6b 69  .**   (3)  X ski
27bb0 70 73 20 61 74 20 6c 65 61 73 74 20 61 73 20 6d  ps at least as m
27bc0 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 61 73 20 59  any columns as Y
27bd0 0a 2a 2a 0a 2a 2a 20 42 79 20 22 70 72 6f 70 65  .**.** By "prope
27be0 72 20 73 75 62 73 65 74 22 20 77 65 20 6d 65 61  r subset" we mea
27bf0 6e 20 74 68 61 74 20 58 20 75 73 65 73 20 66 65  n that X uses fe
27c00 77 65 72 20 57 48 45 52 45 20 63 6c 61 75 73 65  wer WHERE clause
27c10 20 74 65 72 6d 73 0a 2a 2a 20 74 68 61 6e 20 59   terms.** than Y
27c20 20 61 6e 64 20 74 68 61 74 20 65 76 65 72 79 20   and that every 
27c30 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
27c40 6d 20 75 73 65 64 20 62 79 20 58 20 69 73 20 61  m used by X is a
27c50 6c 73 6f 20 75 73 65 64 0a 2a 2a 20 62 79 20 59  lso used.** by Y
27c60 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20 69 73 20  ..**.** If X is 
27c70 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 20  a proper subset 
27c80 6f 66 20 59 20 74 68 65 6e 20 59 20 69 73 20 61  of Y then Y is a
27c90 20 62 65 74 74 65 72 20 63 68 6f 69 63 65 20 61   better choice a
27ca0 6e 64 20 6f 75 67 68 74 0a 2a 2a 20 74 6f 20 68  nd ought.** to h
27cb0 61 76 65 20 61 20 6c 6f 77 65 72 20 63 6f 73 74  ave a lower cost
27cc0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
27cd0 72 65 74 75 72 6e 73 20 54 52 55 45 20 77 68 65  returns TRUE whe
27ce0 6e 20 74 68 61 74 20 63 6f 73 74 20 0a 2a 2a 20  n that cost .** 
27cf0 72 65 6c 61 74 69 6f 6e 73 68 69 70 20 69 73 20  relationship is 
27d00 69 6e 76 65 72 74 65 64 20 61 6e 64 20 6e 65 65  inverted and nee
27d10 64 73 20 74 6f 20 62 65 20 61 64 6a 75 73 74 65  ds to be adjuste
27d20 64 2e 20 20 54 68 65 20 74 68 69 72 64 20 72 75  d.  The third ru
27d30 6c 65 0a 2a 2a 20 77 61 73 20 61 64 64 65 64 20  le.** was added 
27d40 62 65 63 61 75 73 65 20 69 66 20 58 20 75 73 65  because if X use
27d50 73 20 73 6b 69 70 2d 73 63 61 6e 20 6c 65 73 73  s skip-scan less
27d60 20 74 68 61 6e 20 59 20 69 74 20 73 74 69 6c 6c   than Y it still
27d70 20 6d 69 67 68 74 0a 2a 2a 20 64 65 73 65 72 76   might.** deserv
27d80 65 20 61 20 6c 6f 77 65 72 20 63 6f 73 74 20 65  e a lower cost e
27d90 76 65 6e 20 69 66 20 69 74 20 69 73 20 61 20 70  ven if it is a p
27da0 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20  roper subset of 
27db0 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  Y..*/.static int
27dc0 20 77 68 65 72 65 4c 6f 6f 70 43 68 65 61 70 65   whereLoopCheape
27dd0 72 50 72 6f 70 65 72 53 75 62 73 65 74 28 0a 20  rProperSubset(. 
27de0 20 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70   const WhereLoop
27df0 20 2a 70 58 2c 20 20 20 20 20 20 20 2f 2a 20 46   *pX,       /* F
27e00 69 72 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 74  irst WhereLoop t
27e10 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 63  o compare */.  c
27e20 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a  onst WhereLoop *
27e30 70 59 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d  pY        /* Com
27e40 70 61 72 65 20 61 67 61 69 6e 73 74 20 74 68 69  pare against thi
27e50 73 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 29  s WhereLoop */.)
27e60 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  {.  int i, j;.  
27e70 69 66 28 20 70 58 2d 3e 6e 4c 54 65 72 6d 2d 70  if( pX->nLTerm-p
27e80 58 2d 3e 6e 53 6b 69 70 20 3e 3d 20 70 59 2d 3e  X->nSkip >= pY->
27e90 6e 4c 54 65 72 6d 2d 70 59 2d 3e 6e 53 6b 69 70  nLTerm-pY->nSkip
27ea0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
27eb0 3b 20 2f 2a 20 58 20 69 73 20 6e 6f 74 20 61 20  ; /* X is not a 
27ec0 73 75 62 73 65 74 20 6f 66 20 59 20 2a 2f 0a 20  subset of Y */. 
27ed0 20 7d 0a 20 20 69 66 28 20 70 59 2d 3e 6e 53 6b   }.  if( pY->nSk
27ee0 69 70 20 3e 20 70 58 2d 3e 6e 53 6b 69 70 20 29  ip > pX->nSkip )
27ef0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
27f00 20 70 58 2d 3e 72 52 75 6e 20 3e 3d 20 70 59 2d   pX->rRun >= pY-
27f10 3e 72 52 75 6e 20 29 7b 0a 20 20 20 20 69 66 28  >rRun ){.    if(
27f20 20 70 58 2d 3e 72 52 75 6e 20 3e 20 70 59 2d 3e   pX->rRun > pY->
27f30 72 52 75 6e 20 29 20 72 65 74 75 72 6e 20 30 3b  rRun ) return 0;
27f40 20 20 20 20 2f 2a 20 58 20 63 6f 73 74 73 20 6d      /* X costs m
27f50 6f 72 65 20 74 68 61 6e 20 59 20 2a 2f 0a 20 20  ore than Y */.  
27f60 20 20 69 66 28 20 70 58 2d 3e 6e 4f 75 74 20 3e    if( pX->nOut >
27f70 20 70 59 2d 3e 6e 4f 75 74 20 29 20 72 65 74 75   pY->nOut ) retu
27f80 72 6e 20 30 3b 20 20 20 20 2f 2a 20 58 20 63 6f  rn 0;    /* X co
27f90 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 59 20  sts more than Y 
27fa0 2a 2f 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 70  */.  }.  for(i=p
27fb0 58 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 69 3e 3d  X->nLTerm-1; i>=
27fc0 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28  0; i--){.    if(
27fd0 20 70 58 2d 3e 61 4c 54 65 72 6d 5b 69 5d 3d 3d   pX->aLTerm[i]==
27fe0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
27ff0 20 20 66 6f 72 28 6a 3d 70 59 2d 3e 6e 4c 54 65    for(j=pY->nLTe
28000 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29  rm-1; j>=0; j--)
28010 7b 0a 20 20 20 20 20 20 69 66 28 20 70 59 2d 3e  {.      if( pY->
28020 61 4c 54 65 72 6d 5b 6a 5d 3d 3d 70 58 2d 3e 61  aLTerm[j]==pX->a
28030 4c 54 65 72 6d 5b 69 5d 20 29 20 62 72 65 61 6b  LTerm[i] ) break
28040 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
28050 6a 3c 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  j<0 ) return 0; 
28060 20 2f 2a 20 58 20 6e 6f 74 20 61 20 73 75 62 73   /* X not a subs
28070 65 74 20 6f 66 20 59 20 73 69 6e 63 65 20 74 65  et of Y since te
28080 72 6d 20 58 5b 69 5d 20 6e 6f 74 20 75 73 65 64  rm X[i] not used
28090 20 62 79 20 59 20 2a 2f 0a 20 20 7d 0a 20 20 72   by Y */.  }.  r
280a0 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 41 6c 6c  eturn 1;  /* All
280b0 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 65 65 74   conditions meet
280c0 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79   */.}../*.** Try
280d0 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 63   to adjust the c
280e0 6f 73 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70  ost of WhereLoop
280f0 20 70 54 65 6d 70 6c 61 74 65 20 75 70 77 61 72   pTemplate upwar
28100 64 73 20 6f 72 20 64 6f 77 6e 77 61 72 64 73 20  ds or downwards 
28110 73 6f 0a 2a 2a 20 74 68 61 74 3a 0a 2a 2a 0a 2a  so.** that:.**.*
28120 2a 20 20 20 28 31 29 20 70 54 65 6d 70 6c 61 74  *   (1) pTemplat
28130 65 20 63 6f 73 74 73 20 6c 65 73 73 20 74 68 61  e costs less tha
28140 6e 20 61 6e 79 20 6f 74 68 65 72 20 57 68 65 72  n any other Wher
28150 65 4c 6f 6f 70 73 20 74 68 61 74 20 61 72 65 20  eLoops that are 
28160 61 20 70 72 6f 70 65 72 0a 2a 2a 20 20 20 20 20  a proper.**     
28170 20 20 73 75 62 73 65 74 20 6f 66 20 70 54 65 6d    subset of pTem
28180 70 6c 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 28 32  plate.**.**   (2
28190 29 20 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74  ) pTemplate cost
281a0 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e 79 20  s more than any 
281b0 6f 74 68 65 72 20 57 68 65 72 65 4c 6f 6f 70 73  other WhereLoops
281c0 20 66 6f 72 20 77 68 69 63 68 20 70 54 65 6d 70   for which pTemp
281d0 6c 61 74 65 0a 2a 2a 20 20 20 20 20 20 20 69 73  late.**       is
281e0 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74   a proper subset
281f0 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 73 61 79 20 22  ..**.** To say "
28200 57 68 65 72 65 4c 6f 6f 70 20 58 20 69 73 20 61  WhereLoop X is a
28210 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f   proper subset o
28220 66 20 59 22 20 6d 65 61 6e 73 20 74 68 61 74 20  f Y" means that 
28230 58 20 75 73 65 73 20 66 65 77 65 72 0a 2a 2a 20  X uses fewer.** 
28240 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
28250 6d 73 20 74 68 61 6e 20 59 20 61 6e 64 20 74 68  ms than Y and th
28260 61 74 20 65 76 65 72 79 20 57 48 45 52 45 20 63  at every WHERE c
28270 6c 61 75 73 65 20 74 65 72 6d 20 75 73 65 64 20  lause term used 
28280 62 79 20 58 20 69 73 0a 2a 2a 20 61 6c 73 6f 20  by X is.** also 
28290 75 73 65 64 20 62 79 20 59 2e 0a 2a 2f 0a 73 74  used by Y..*/.st
282a0 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c  atic void whereL
282b0 6f 6f 70 41 64 6a 75 73 74 43 6f 73 74 28 63 6f  oopAdjustCost(co
282c0 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  nst WhereLoop *p
282d0 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65  , WhereLoop *pTe
282e0 6d 70 6c 61 74 65 29 7b 0a 20 20 69 66 28 20 28  mplate){.  if( (
282f0 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61  pTemplate->wsFla
28300 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
28310 45 44 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ED)==0 ) return;
28320 0a 20 20 66 6f 72 28 3b 20 70 3b 20 70 3d 70 2d  .  for(; p; p=p-
28330 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20 20  >pNextLoop){.   
28340 20 69 66 28 20 70 2d 3e 69 54 61 62 21 3d 70 54   if( p->iTab!=pT
28350 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20 29 20  emplate->iTab ) 
28360 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
28370 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  ( (p->wsFlags & 
28380 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d  WHERE_INDEXED)==
28390 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
283a0 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 43    if( whereLoopC
283b0 68 65 61 70 65 72 50 72 6f 70 65 72 53 75 62 73  heaperProperSubs
283c0 65 74 28 70 2c 20 70 54 65 6d 70 6c 61 74 65 29  et(p, pTemplate)
283d0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a   ){.      /* Adj
283e0 75 73 74 20 70 54 65 6d 70 6c 61 74 65 20 63 6f  ust pTemplate co
283f0 73 74 20 64 6f 77 6e 77 61 72 64 20 73 6f 20 74  st downward so t
28400 68 61 74 20 69 74 20 69 73 20 63 68 65 61 70 65  hat it is cheape
28410 72 20 74 68 61 6e 20 69 74 73 20 0a 20 20 20 20  r than its .    
28420 20 20 2a 2a 20 73 75 62 73 65 74 20 70 2e 20 2a    ** subset p. *
28430 2f 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41  /.      WHERETRA
28440 43 45 28 30 78 38 30 2c 28 22 73 75 62 73 65 74  CE(0x80,("subset
28450 20 63 6f 73 74 20 61 64 6a 75 73 74 6d 65 6e 74   cost adjustment
28460 20 25 64 2c 25 64 20 74 6f 20 25 64 2c 25 64 5c   %d,%d to %d,%d\
28470 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
28480 20 20 20 20 20 20 20 20 20 20 20 70 54 65 6d 70             pTemp
28490 6c 61 74 65 2d 3e 72 52 75 6e 2c 20 70 54 65 6d  late->rRun, pTem
284a0 70 6c 61 74 65 2d 3e 6e 4f 75 74 2c 20 70 2d 3e  plate->nOut, p->
284b0 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 2d 31 29  rRun, p->nOut-1)
284c0 29 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61  );.      pTempla
284d0 74 65 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e 72 52  te->rRun = p->rR
284e0 75 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c  un;.      pTempl
284f0 61 74 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e  ate->nOut = p->n
28500 4f 75 74 20 2d 20 31 3b 0a 20 20 20 20 7d 65 6c  Out - 1;.    }el
28510 73 65 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70  se if( whereLoop
28520 43 68 65 61 70 65 72 50 72 6f 70 65 72 53 75 62  CheaperProperSub
28530 73 65 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70  set(pTemplate, p
28540 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64  ) ){.      /* Ad
28550 6a 75 73 74 20 70 54 65 6d 70 6c 61 74 65 20 63  just pTemplate c
28560 6f 73 74 20 75 70 77 61 72 64 20 73 6f 20 74 68  ost upward so th
28570 61 74 20 69 74 20 69 73 20 63 6f 73 74 6c 69 65  at it is costlie
28580 72 20 74 68 61 6e 20 70 20 73 69 6e 63 65 0a 20  r than p since. 
28590 20 20 20 20 20 2a 2a 20 70 54 65 6d 70 6c 61 74       ** pTemplat
285a0 65 20 69 73 20 61 20 70 72 6f 70 65 72 20 73 75  e is a proper su
285b0 62 73 65 74 20 6f 66 20 70 20 2a 2f 0a 20 20 20  bset of p */.   
285c0 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
285d0 38 30 2c 28 22 73 75 62 73 65 74 20 63 6f 73 74  80,("subset cost
285e0 20 61 64 6a 75 73 74 6d 65 6e 74 20 25 64 2c 25   adjustment %d,%
285f0 64 20 74 6f 20 25 64 2c 25 64 5c 6e 22 2c 0a 20  d to %d,%d\n",. 
28600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28610 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d        pTemplate-
28620 3e 72 52 75 6e 2c 20 70 54 65 6d 70 6c 61 74 65  >rRun, pTemplate
28630 2d 3e 6e 4f 75 74 2c 20 70 2d 3e 72 52 75 6e 2c  ->nOut, p->rRun,
28640 20 70 2d 3e 6e 4f 75 74 2b 31 29 29 3b 0a 20 20   p->nOut+1));.  
28650 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72      pTemplate->r
28660 52 75 6e 20 3d 20 70 2d 3e 72 52 75 6e 3b 0a 20  Run = p->rRun;. 
28670 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e       pTemplate->
28680 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f 75 74 20 2b  nOut = p->nOut +
28690 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   1;.    }.  }.}.
286a0 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68  ./*.** Search th
286b0 65 20 6c 69 73 74 20 6f 66 20 57 68 65 72 65 4c  e list of WhereL
286c0 6f 6f 70 73 20 69 6e 20 2a 70 70 50 72 65 76 20  oops in *ppPrev 
286d0 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 6e 65 20  looking for one 
286e0 74 68 61 74 20 63 61 6e 20 62 65 0a 2a 2a 20 73  that can be.** s
286f0 75 70 70 6c 61 6e 74 65 64 20 62 79 20 70 54 65  upplanted by pTe
28700 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  mplate..**.** Re
28710 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65  turn NULL if the
28720 20 57 68 65 72 65 4c 6f 6f 70 20 6c 69 73 74 20   WhereLoop list 
28730 63 6f 6e 74 61 69 6e 73 20 61 6e 20 65 6e 74 72  contains an entr
28740 79 20 74 68 61 74 20 63 61 6e 20 73 75 70 70 6c  y that can suppl
28750 61 6e 74 0a 2a 2a 20 70 54 65 6d 70 6c 61 74 65  ant.** pTemplate
28760 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  , in other words
28770 20 69 66 20 70 54 65 6d 70 6c 61 74 65 20 64 6f   if pTemplate do
28780 65 73 20 6e 6f 74 20 62 65 6c 6f 6e 67 20 6f 6e  es not belong on
28790 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a   the list..**.**
287a0 20 49 66 20 70 58 20 69 73 20 61 20 57 68 65 72   If pX is a Wher
287b0 65 4c 6f 6f 70 20 74 68 61 74 20 70 54 65 6d 70  eLoop that pTemp
287c0 6c 61 74 65 20 63 61 6e 20 73 75 70 70 6c 61 6e  late can supplan
287d0 74 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74  t, then return t
287e0 68 65 0a 2a 2a 20 6c 69 6e 6b 20 74 68 61 74 20  he.** link that 
287f0 70 6f 69 6e 74 73 20 74 6f 20 70 58 2e 0a 2a 2a  points to pX..**
28800 0a 2a 2a 20 49 66 20 70 54 65 6d 70 6c 61 74 65  .** If pTemplate
28810 20 63 61 6e 6e 6f 74 20 73 75 70 70 6c 61 6e 74   cannot supplant
28820 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 65 6c   any existing el
28830 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6c 69 73  ement of the lis
28840 74 20 62 75 74 20 6e 65 65 64 73 0a 2a 2a 20 74  t but needs.** t
28850 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68  o be added to th
28860 65 20 6c 69 73 74 2c 20 74 68 65 6e 20 72 65 74  e list, then ret
28870 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
28880 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65   the tail of the
28890 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
288a0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 77 68 65   WhereLoop **whe
288b0 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72  reLoopFindLesser
288c0 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a  (.  WhereLoop **
288d0 70 70 50 72 65 76 2c 0a 20 20 63 6f 6e 73 74 20  ppPrev,.  const 
288e0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70  WhereLoop *pTemp
288f0 6c 61 74 65 0a 29 7b 0a 20 20 57 68 65 72 65 4c  late.){.  WhereL
28900 6f 6f 70 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d  oop *p;.  for(p=
28910 28 2a 70 70 50 72 65 76 29 3b 20 70 3b 20 70 70  (*ppPrev); p; pp
28920 50 72 65 76 3d 26 70 2d 3e 70 4e 65 78 74 4c 6f  Prev=&p->pNextLo
28930 6f 70 2c 20 70 3d 2a 70 70 50 72 65 76 29 7b 0a  op, p=*ppPrev){.
28940 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61 62 21      if( p->iTab!
28950 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62  =pTemplate->iTab
28960 20 7c 7c 20 70 2d 3e 69 53 6f 72 74 49 64 78 21   || p->iSortIdx!
28970 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 53 6f 72  =pTemplate->iSor
28980 74 49 64 78 20 29 7b 0a 20 20 20 20 20 20 2f 2a  tIdx ){.      /*
28990 20 49 66 20 65 69 74 68 65 72 20 74 68 65 20 69   If either the i
289a0 54 61 62 20 6f 72 20 69 53 6f 72 74 49 64 78 20  Tab or iSortIdx 
289b0 76 61 6c 75 65 73 20 66 6f 72 20 74 77 6f 20 57  values for two W
289c0 68 65 72 65 4c 6f 6f 70 20 61 72 65 20 64 69 66  hereLoop are dif
289d0 66 65 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20  ferent.      ** 
289e0 74 68 65 6e 20 74 68 6f 73 65 20 57 68 65 72 65  then those Where
289f0 4c 6f 6f 70 73 20 6e 65 65 64 20 74 6f 20 62 65  Loops need to be
28a00 20 63 6f 6e 73 69 64 65 72 65 64 20 73 65 70 61   considered sepa
28a10 72 61 74 65 6c 79 2e 20 20 4e 65 69 74 68 65 72  rately.  Neither
28a20 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 63   is.      ** a c
28a30 61 6e 64 69 64 61 74 65 20 74 6f 20 72 65 70 6c  andidate to repl
28a40 61 63 65 20 74 68 65 20 6f 74 68 65 72 2e 20 2a  ace the other. *
28a50 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  /.      continue
28a60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49  ;.    }.    /* I
28a70 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d  n the current im
28a80 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68  plementation, th
28a90 65 20 72 53 65 74 75 70 20 76 61 6c 75 65 20 69  e rSetup value i
28aa0 73 20 65 69 74 68 65 72 20 7a 65 72 6f 0a 20 20  s either zero.  
28ab0 20 20 2a 2a 20 6f 72 20 74 68 65 20 63 6f 73 74    ** or the cost
28ac0 20 6f 66 20 62 75 69 6c 64 69 6e 67 20 61 6e 20   of building an 
28ad0 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
28ae0 28 4e 6c 6f 67 4e 29 20 61 6e 64 20 74 68 65 20  (NlogN) and the 
28af0 4e 6c 6f 67 4e 0a 20 20 20 20 2a 2a 20 69 73 20  NlogN.    ** is 
28b00 74 68 65 20 73 61 6d 65 20 66 6f 72 20 63 6f 6d  the same for com
28b10 70 61 74 69 62 6c 65 20 57 68 65 72 65 4c 6f 6f  patible WhereLoo
28b20 70 73 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ps. */.    asser
28b30 74 28 20 70 2d 3e 72 53 65 74 75 70 3d 3d 30 20  t( p->rSetup==0 
28b40 7c 7c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53  || pTemplate->rS
28b50 65 74 75 70 3d 3d 30 20 0a 20 20 20 20 20 20 20  etup==0 .       
28b60 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e            || p->
28b70 72 53 65 74 75 70 3d 3d 70 54 65 6d 70 6c 61 74  rSetup==pTemplat
28b80 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20 20  e->rSetup );..  
28b90 20 20 2f 2a 20 77 68 65 72 65 4c 6f 6f 70 41 64    /* whereLoopAd
28ba0 64 42 74 72 65 65 28 29 20 61 6c 77 61 79 73 20  dBtree() always 
28bb0 67 65 6e 65 72 61 74 65 73 20 61 6e 64 20 69 6e  generates and in
28bc0 73 65 72 74 73 20 74 68 65 20 61 75 74 6f 6d 61  serts the automa
28bd0 74 69 63 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a  tic index.    **
28be0 20 63 61 73 65 20 66 69 72 73 74 2e 20 20 48 65   case first.  He
28bf0 6e 63 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 63  nce compatible c
28c00 61 6e 64 69 64 61 74 65 20 57 68 65 72 65 4c 6f  andidate WhereLo
28c10 6f 70 73 20 6e 65 76 65 72 20 68 61 76 65 20 61  ops never have a
28c20 20 6c 61 72 67 65 72 0a 20 20 20 20 2a 2a 20 72   larger.    ** r
28c30 53 65 74 75 70 2e 20 43 61 6c 6c 20 74 68 69 73  Setup. Call this
28c40 20 53 45 54 55 50 2d 49 4e 56 41 52 49 41 4e 54   SETUP-INVARIANT
28c50 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
28c60 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d 70  p->rSetup>=pTemp
28c70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a  late->rSetup );.
28c80 0a 20 20 20 20 2f 2a 20 41 6e 79 20 6c 6f 6f 70  .    /* Any loop
28c90 20 75 73 69 6e 67 20 61 6e 20 61 70 70 6c 69 61   using an applia
28ca0 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20 69 6e 64  tion-defined ind
28cb0 65 78 20 28 6f 72 20 50 52 49 4d 41 52 59 20 4b  ex (or PRIMARY K
28cc0 45 59 20 6f 72 0a 20 20 20 20 2a 2a 20 55 4e 49  EY or.    ** UNI
28cd0 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 29 20  QUE constraint) 
28ce0 77 69 74 68 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  with one or more
28cf0 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   == constraints 
28d00 69 73 20 62 65 74 74 65 72 0a 20 20 20 20 2a 2a  is better.    **
28d10 20 74 68 61 6e 20 61 6e 20 61 75 74 6f 6d 61 74   than an automat
28d20 69 63 20 69 6e 64 65 78 2e 20 55 6e 6c 65 73 73  ic index. Unless
28d30 20 69 74 20 69 73 20 61 20 73 6b 69 70 2d 73 63   it is a skip-sc
28d40 61 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 28  an. */.    if( (
28d50 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
28d60 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d  RE_AUTO_INDEX)!=
28d70 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d 70  0.     && (pTemp
28d80 6c 61 74 65 2d 3e 6e 53 6b 69 70 29 3d 3d 30 0a  late->nSkip)==0.
28d90 20 20 20 20 20 26 26 20 28 70 54 65 6d 70 6c 61       && (pTempla
28da0 74 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  te->wsFlags & WH
28db0 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a  ERE_INDEXED)!=0.
28dc0 20 20 20 20 20 26 26 20 28 70 54 65 6d 70 6c 61       && (pTempla
28dd0 74 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  te->wsFlags & WH
28de0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 21 3d  ERE_COLUMN_EQ)!=
28df0 30 0a 20 20 20 20 20 26 26 20 28 70 2d 3e 70 72  0.     && (p->pr
28e00 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65  ereq & pTemplate
28e10 2d 3e 70 72 65 72 65 71 29 3d 3d 70 54 65 6d 70  ->prereq)==pTemp
28e20 6c 61 74 65 2d 3e 70 72 65 72 65 71 0a 20 20 20  late->prereq.   
28e30 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   ){.      break;
28e40 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
28e50 66 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65  f existing Where
28e60 4c 6f 6f 70 20 70 20 69 73 20 62 65 74 74 65 72  Loop p is better
28e70 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c   than pTemplate,
28e80 20 70 54 65 6d 70 6c 61 74 65 20 63 61 6e 20 62   pTemplate can b
28e90 65 0a 20 20 20 20 2a 2a 20 64 69 73 63 61 72 64  e.    ** discard
28ea0 65 64 2e 20 20 57 68 65 72 65 4c 6f 6f 70 20 70  ed.  WhereLoop p
28eb0 20 69 73 20 62 65 74 74 65 72 20 69 66 3a 0a 20   is better if:. 
28ec0 20 20 20 2a 2a 20 20 20 28 31 29 20 20 70 20 68     **   (1)  p h
28ed0 61 73 20 6e 6f 20 6d 6f 72 65 20 64 65 70 65 6e  as no more depen
28ee0 64 65 6e 63 69 65 73 20 74 68 61 6e 20 70 54 65  dencies than pTe
28ef0 6d 70 6c 61 74 65 2c 20 61 6e 64 0a 20 20 20 20  mplate, and.    
28f00 2a 2a 20 20 20 28 32 29 20 20 70 20 68 61 73 20  **   (2)  p has 
28f10 61 6e 20 65 71 75 61 6c 20 6f 72 20 6c 6f 77 65  an equal or lowe
28f20 72 20 63 6f 73 74 20 74 68 61 6e 20 70 54 65 6d  r cost than pTem
28f30 70 6c 61 74 65 0a 20 20 20 20 2a 2f 0a 20 20 20  plate.    */.   
28f40 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71 20   if( (p->prereq 
28f50 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65  & pTemplate->pre
28f60 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20  req)==p->prereq 
28f70 20 20 20 2f 2a 20 28 31 29 20 20 2a 2f 0a 20 20     /* (1)  */.  
28f80 20 20 20 26 26 20 70 2d 3e 72 53 65 74 75 70 3c     && p->rSetup<
28f90 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74  =pTemplate->rSet
28fa0 75 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  up              
28fb0 20 20 20 20 2f 2a 20 28 32 61 29 20 2a 2f 0a 20      /* (2a) */. 
28fc0 20 20 20 20 26 26 20 70 2d 3e 72 52 75 6e 3c 3d      && p->rRun<=
28fd0 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20  pTemplate->rRun 
28fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ff0 20 20 20 20 20 2f 2a 20 28 32 62 29 20 2a 2f 0a       /* (2b) */.
29000 20 20 20 20 20 26 26 20 70 2d 3e 6e 4f 75 74 3c       && p->nOut<
29010 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74  =pTemplate->nOut
29020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29030 20 20 20 20 20 20 2f 2a 20 28 32 63 29 20 2a 2f        /* (2c) */
29040 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
29050 74 75 72 6e 20 30 3b 20 20 2f 2a 20 44 69 73 63  turn 0;  /* Disc
29060 61 72 64 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f  ard pTemplate */
29070 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
29080 66 20 70 54 65 6d 70 6c 61 74 65 20 69 73 20 61  f pTemplate is a
29090 6c 77 61 79 73 20 62 65 74 74 65 72 20 74 68 61  lways better tha
290a0 6e 20 70 2c 20 74 68 65 6e 20 63 61 75 73 65 20  n p, then cause 
290b0 70 20 74 6f 20 62 65 20 6f 76 65 72 77 72 69 74  p to be overwrit
290c0 74 65 6e 0a 20 20 20 20 2a 2a 20 77 69 74 68 20  ten.    ** with 
290d0 70 54 65 6d 70 6c 61 74 65 2e 20 20 70 54 65 6d  pTemplate.  pTem
290e0 70 6c 61 74 65 20 69 73 20 62 65 74 74 65 72 20  plate is better 
290f0 74 68 61 6e 20 70 20 69 66 3a 0a 20 20 20 20 2a  than p if:.    *
29100 2a 20 20 20 28 31 29 20 20 70 54 65 6d 70 6c 61  *   (1)  pTempla
29110 74 65 20 68 61 73 20 6e 6f 20 6d 6f 72 65 20 64  te has no more d
29120 65 70 65 6e 64 65 6e 63 65 73 20 74 68 61 6e 20  ependences than 
29130 70 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20  p, and.    **   
29140 28 32 29 20 20 70 54 65 6d 70 6c 61 74 65 20 68  (2)  pTemplate h
29150 61 73 20 61 6e 20 65 71 75 61 6c 20 6f 72 20 6c  as an equal or l
29160 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20 70  ower cost than p
29170 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
29180 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54   (p->prereq & pT
29190 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29  emplate->prereq)
291a0 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65  ==pTemplate->pre
291b0 72 65 71 20 20 20 2f 2a 20 28 31 29 20 20 2a 2f  req   /* (1)  */
291c0 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75 6e  .     && p->rRun
291d0 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75  >=pTemplate->rRu
291e0 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
291f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29200 20 28 32 61 29 20 2a 2f 0a 20 20 20 20 20 26 26   (2a) */.     &&
29210 20 70 2d 3e 6e 4f 75 74 3e 3d 70 54 65 6d 70 6c   p->nOut>=pTempl
29220 61 74 65 2d 3e 6e 4f 75 74 20 20 20 20 20 20 20  ate->nOut       
29230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29240 20 20 20 20 20 20 2f 2a 20 28 32 62 29 20 2a 2f        /* (2b) */
29250 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73  .    ){.      as
29260 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3e  sert( p->rSetup>
29270 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74  =pTemplate->rSet
29280 75 70 20 29 3b 20 2f 2a 20 53 45 54 55 50 2d 49  up ); /* SETUP-I
29290 4e 56 41 52 49 41 4e 54 20 61 62 6f 76 65 20 2a  NVARIANT above *
292a0 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 20 20  /.      break;  
292b0 20 2f 2a 20 43 61 75 73 65 20 70 20 74 6f 20 62   /* Cause p to b
292c0 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 62 79  e overwritten by
292d0 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20   pTemplate */.  
292e0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
292f0 20 70 70 50 72 65 76 3b 0a 7d 0a 0a 2f 2a 0a 2a   ppPrev;.}../*.*
29300 2a 20 49 6e 73 65 72 74 20 6f 72 20 72 65 70 6c  * Insert or repl
29310 61 63 65 20 61 20 57 68 65 72 65 4c 6f 6f 70 20  ace a WhereLoop 
29320 65 6e 74 72 79 20 75 73 69 6e 67 20 74 68 65 20  entry using the 
29330 74 65 6d 70 6c 61 74 65 20 73 75 70 70 6c 69 65  template supplie
29340 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73  d..**.** An exis
29350 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 65  ting WhereLoop e
29360 6e 74 72 79 20 6d 69 67 68 74 20 62 65 20 6f 76  ntry might be ov
29370 65 72 77 72 69 74 74 65 6e 20 69 66 20 74 68 65  erwritten if the
29380 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 0a 2a 2a   new template.**
29390 20 69 73 20 62 65 74 74 65 72 20 61 6e 64 20 68   is better and h
293a0 61 73 20 66 65 77 65 72 20 64 65 70 65 6e 64 65  as fewer depende
293b0 6e 63 69 65 73 2e 20 20 4f 72 20 74 68 65 20 74  ncies.  Or the t
293c0 65 6d 70 6c 61 74 65 20 77 69 6c 6c 20 62 65 20  emplate will be 
293d0 69 67 6e 6f 72 65 64 0a 2a 2a 20 61 6e 64 20 6e  ignored.** and n
293e0 6f 20 69 6e 73 65 72 74 20 77 69 6c 6c 20 6f 63  o insert will oc
293f0 63 75 72 20 69 66 20 61 6e 20 65 78 69 73 74 69  cur if an existi
29400 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20  ng WhereLoop is 
29410 66 61 73 74 65 72 20 61 6e 64 20 68 61 73 0a 2a  faster and has.*
29420 2a 20 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e  * fewer dependen
29430 63 69 65 73 20 74 68 61 6e 20 74 68 65 20 74 65  cies than the te
29440 6d 70 6c 61 74 65 2e 20 20 4f 74 68 65 72 77 69  mplate.  Otherwi
29450 73 65 20 61 20 6e 65 77 20 57 68 65 72 65 4c 6f  se a new WhereLo
29460 6f 70 20 69 73 0a 2a 2a 20 61 64 64 65 64 20 62  op is.** added b
29470 61 73 65 64 20 6f 6e 20 74 68 65 20 74 65 6d 70  ased on the temp
29480 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  late..**.** If p
29490 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20  Builder->pOrSet 
294a0 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e  is not NULL then
294b0 20 77 65 20 63 61 72 65 20 61 62 6f 75 74 20 6f   we care about o
294c0 6e 6c 79 20 74 68 65 0a 2a 2a 20 70 72 65 72 65  nly the.** prere
294d0 71 75 69 73 69 74 65 73 20 61 6e 64 20 72 52 75  quisites and rRu
294e0 6e 20 61 6e 64 20 6e 4f 75 74 20 63 6f 73 74 73  n and nOut costs
294f0 20 6f 66 20 74 68 65 20 4e 20 62 65 73 74 20 6c   of the N best l
29500 6f 6f 70 73 2e 20 20 54 68 61 74 0a 2a 2a 20 69  oops.  That.** i
29510 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 67 61  nformation is ga
29520 74 68 65 72 65 64 20 69 6e 20 74 68 65 20 70 42  thered in the pB
29530 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 6f  uilder->pOrSet o
29540 62 6a 65 63 74 2e 20 20 54 68 69 73 20 73 70 65  bject.  This spe
29550 63 69 61 6c 0a 2a 2a 20 70 72 6f 63 65 73 73 69  cial.** processi
29560 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65 64 20  ng mode is used 
29570 6f 6e 6c 79 20 66 6f 72 20 4f 52 20 63 6c 61 75  only for OR clau
29580 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a  se processing..*
29590 2a 0a 2a 2a 20 57 68 65 6e 20 61 63 63 75 6d 75  *.** When accumu
295a0 6c 61 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20  lating multiple 
295b0 6c 6f 6f 70 73 20 28 77 68 65 6e 20 70 42 75 69  loops (when pBui
295c0 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20  lder->pOrSet is 
295d0 4e 55 4c 4c 29 20 77 65 0a 2a 2a 20 73 74 69 6c  NULL) we.** stil
295e0 6c 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69 74  l might overwrit
295f0 65 20 73 69 6d 69 6c 61 72 20 6c 6f 6f 70 73 20  e similar loops 
29600 77 69 74 68 20 74 68 65 20 6e 65 77 20 74 65 6d  with the new tem
29610 70 6c 61 74 65 20 69 66 20 74 68 65 0a 2a 2a 20  plate if the.** 
29620 6e 65 77 20 74 65 6d 70 6c 61 74 65 20 69 73 20  new template is 
29630 62 65 74 74 65 72 2e 20 20 4c 6f 6f 70 73 20 6d  better.  Loops m
29640 61 79 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  ay be overwritte
29650 6e 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  n if the followi
29660 6e 67 20 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e  ng .** condition
29670 73 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a  s are met:.**.**
29680 20 20 20 20 28 31 29 20 20 54 68 65 79 20 68 61      (1)  They ha
29690 76 65 20 74 68 65 20 73 61 6d 65 20 69 54 61 62  ve the same iTab
296a0 2e 0a 2a 2a 20 20 20 20 28 32 29 20 20 54 68 65  ..**    (2)  The
296b0 79 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  y have the same 
296c0 69 53 6f 72 74 49 64 78 2e 0a 2a 2a 20 20 20 20  iSortIdx..**    
296d0 28 33 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74  (3)  The templat
296e0 65 20 68 61 73 20 73 61 6d 65 20 6f 72 20 66 65  e has same or fe
296f0 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73  wer dependencies
29700 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
29710 74 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28 34 29  t loop.**    (4)
29720 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20 68    The template h
29730 61 73 20 74 68 65 20 73 61 6d 65 20 6f 72 20 6c  as the same or l
29740 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20 74  ower cost than t
29750 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a  he current loop.
29760 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
29770 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 57 68  ereLoopInsert(Wh
29780 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
29790 70 42 75 69 6c 64 65 72 2c 20 57 68 65 72 65 4c  pBuilder, WhereL
297a0 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b  oop *pTemplate){
297b0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70  .  WhereLoop **p
297c0 70 50 72 65 76 2c 20 2a 70 3b 0a 20 20 57 68 65  pPrev, *p;.  Whe
297d0 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d  reInfo *pWInfo =
297e0 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
297f0 6f 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  o;.  sqlite3 *db
29800 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
29810 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20  e->db;..  /* If 
29820 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74  pBuilder->pOrSet
29830 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65   is defined, the
29840 6e 20 6f 6e 6c 79 20 6b 65 65 70 20 74 72 61 63  n only keep trac
29850 6b 20 6f 66 20 74 68 65 20 63 6f 73 74 73 0a 20  k of the costs. 
29860 20 2a 2a 20 61 6e 64 20 70 72 65 72 65 71 73 2e   ** and prereqs.
29870 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 75 69  .  */.  if( pBui
29880 6c 64 65 72 2d 3e 70 4f 72 53 65 74 21 3d 30 20  lder->pOrSet!=0 
29890 29 7b 0a 23 69 66 20 57 48 45 52 45 54 52 41 43  ){.#if WHERETRAC
298a0 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 75 31  E_ENABLED.    u1
298b0 36 20 6e 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  6 n = pBuilder->
298c0 70 4f 72 53 65 74 2d 3e 6e 3b 0a 20 20 20 20 69  pOrSet->n;.    i
298d0 6e 74 20 78 20 3d 0a 23 65 6e 64 69 66 0a 20 20  nt x =.#endif.  
298e0 20 20 77 68 65 72 65 4f 72 49 6e 73 65 72 74 28    whereOrInsert(
298f0 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74  pBuilder->pOrSet
29900 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65  , pTemplate->pre
29910 72 65 71 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e  req, pTemplate->
29920 72 52 75 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  rRun,.          
29930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29940 20 20 20 20 20 20 20 20 20 20 70 54 65 6d 70 6c            pTempl
29950 61 74 65 2d 3e 6e 4f 75 74 29 3b 0a 23 69 66 20  ate->nOut);.#if 
29960 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
29970 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20  ED /* 0x8 */.   
29980 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
29990 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a  eTrace & 0x8 ){.
299a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
299b0 75 67 50 72 69 6e 74 66 28 78 3f 22 20 20 20 6f  ugPrintf(x?"   o
299c0 72 2d 25 64 3a 20 20 22 3a 22 20 20 20 6f 72 2d  r-%d:  ":"   or-
299d0 58 3a 20 20 22 2c 20 6e 29 3b 0a 20 20 20 20 20  X:  ", n);.     
299e0 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
299f0 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c  pTemplate, pBuil
29a00 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20 7d  der->pWC);.    }
29a10 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
29a20 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
29a30 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72  }..  /* Look for
29a40 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65   an existing Whe
29a50 72 65 4c 6f 6f 70 20 74 6f 20 72 65 70 6c 61 63  reLoop to replac
29a60 65 20 77 69 74 68 20 70 54 65 6d 70 6c 61 74 65  e with pTemplate
29a70 0a 20 20 2a 2f 0a 20 20 77 68 65 72 65 4c 6f 6f  .  */.  whereLoo
29a80 70 41 64 6a 75 73 74 43 6f 73 74 28 70 57 49 6e  pAdjustCost(pWIn
29a90 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 54 65 6d  fo->pLoops, pTem
29aa0 70 6c 61 74 65 29 3b 0a 20 20 70 70 50 72 65 76  plate);.  ppPrev
29ab0 20 3d 20 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64   = whereLoopFind
29ac0 4c 65 73 73 65 72 28 26 70 57 49 6e 66 6f 2d 3e  Lesser(&pWInfo->
29ad0 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70 6c 61 74  pLoops, pTemplat
29ae0 65 29 3b 0a 0a 20 20 69 66 28 20 70 70 50 72 65  e);..  if( ppPre
29af0 76 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  v==0 ){.    /* T
29b00 68 65 72 65 20 61 6c 72 65 61 64 79 20 65 78 69  here already exi
29b10 73 74 73 20 61 20 57 68 65 72 65 4c 6f 6f 70 20  sts a WhereLoop 
29b20 6f 6e 20 74 68 65 20 6c 69 73 74 20 74 68 61 74  on the list that
29b30 20 69 73 20 62 65 74 74 65 72 0a 20 20 20 20 2a   is better.    *
29b40 2a 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65  * than pTemplate
29b50 2c 20 73 6f 20 6a 75 73 74 20 69 67 6e 6f 72 65  , so just ignore
29b60 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 23 69   pTemplate */.#i
29b70 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
29b80 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20  BLED /* 0x8 */. 
29b90 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
29ba0 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29  ereTrace & 0x8 )
29bb0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
29bc0 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 20 73  ebugPrintf("   s
29bd0 6b 69 70 3a 20 22 29 3b 0a 20 20 20 20 20 20 77  kip: ");.      w
29be0 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54  hereLoopPrint(pT
29bf0 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64 65  emplate, pBuilde
29c00 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20 7d 0a 23  r->pWC);.    }.#
29c10 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e  endif.    return
29c20 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 0a 20 20   SQLITE_OK;  .  
29c30 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 2a  }else{.    p = *
29c40 70 70 50 72 65 76 3b 0a 20 20 7d 0a 0a 20 20 2f  ppPrev;.  }..  /
29c50 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
29c60 69 73 20 70 6f 69 6e 74 20 69 74 20 6d 65 61 6e  is point it mean
29c70 73 20 74 68 61 74 20 65 69 74 68 65 72 20 70 5b  s that either p[
29c80 5d 20 73 68 6f 75 6c 64 20 62 65 20 6f 76 65 72  ] should be over
29c90 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 77 69 74  written.  ** wit
29ca0 68 20 70 54 65 6d 70 6c 61 74 65 5b 5d 20 69 66  h pTemplate[] if
29cb0 20 70 5b 5d 20 65 78 69 73 74 73 2c 20 6f 72 20   p[] exists, or 
29cc0 69 66 20 70 3d 3d 4e 55 4c 4c 20 74 68 65 6e 20  if p==NULL then 
29cd0 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 0a 20  allocate a new. 
29ce0 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20 61 6e   ** WhereLoop an
29cf0 64 20 69 6e 73 65 72 74 20 69 74 2e 0a 20 20 2a  d insert it..  *
29d00 2f 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45  /.#if WHERETRACE
29d10 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20  _ENABLED /* 0x8 
29d20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
29d30 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38  WhereTrace & 0x8
29d40 20 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 30   ){.    if( p!=0
29d50 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
29d60 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 72 65  3DebugPrintf("re
29d70 70 6c 61 63 65 3a 20 22 29 3b 0a 20 20 20 20 20  place: ");.     
29d80 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
29d90 70 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43  p, pBuilder->pWC
29da0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
29db0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
29dc0 22 20 20 20 20 61 64 64 3a 20 22 29 3b 0a 20 20  "    add: ");.  
29dd0 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
29de0 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69  (pTemplate, pBui
29df0 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 7d 0a  lder->pWC);.  }.
29e00 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 3d 3d  #endif.  if( p==
29e10 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f  0 ){.    /* Allo
29e20 63 61 74 65 20 61 20 6e 65 77 20 57 68 65 72 65  cate a new Where
29e30 4c 6f 6f 70 20 74 6f 20 61 64 64 20 74 6f 20 74  Loop to add to t
29e40 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 69  he end of the li
29e50 73 74 20 2a 2f 0a 20 20 20 20 2a 70 70 50 72 65  st */.    *ppPre
29e60 76 20 3d 20 70 20 3d 20 73 71 6c 69 74 65 33 44  v = p = sqlite3D
29e70 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
29e80 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29  izeof(WhereLoop)
29e90 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20  );.    if( p==0 
29ea0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
29eb0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 77 68 65 72 65  NOMEM;.    where
29ec0 4c 6f 6f 70 49 6e 69 74 28 70 29 3b 0a 20 20 20  LoopInit(p);.   
29ed0 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 20 3d 20   p->pNextLoop = 
29ee0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
29ef0 2f 2a 20 57 65 20 77 69 6c 6c 20 62 65 20 6f 76  /* We will be ov
29f00 65 72 77 72 69 74 69 6e 67 20 57 68 65 72 65 4c  erwriting WhereL
29f10 6f 6f 70 20 70 5b 5d 2e 20 20 42 75 74 20 62 65  oop p[].  But be
29f20 66 6f 72 65 20 77 65 20 64 6f 2c 20 66 69 72 73  fore we do, firs
29f30 74 0a 20 20 20 20 2a 2a 20 67 6f 20 74 68 72 6f  t.    ** go thro
29f40 75 67 68 20 74 68 65 20 72 65 73 74 20 6f 66 20  ugh the rest of 
29f50 74 68 65 20 6c 69 73 74 20 61 6e 64 20 64 65 6c  the list and del
29f60 65 74 65 20 61 6e 79 20 6f 74 68 65 72 20 65 6e  ete any other en
29f70 74 72 69 65 73 20 62 65 73 69 64 65 73 0a 20 20  tries besides.  
29f80 20 20 2a 2a 20 70 5b 5d 20 74 68 61 74 20 61 72    ** p[] that ar
29f90 65 20 61 6c 73 6f 20 73 75 70 70 6c 61 74 65 64  e also supplated
29fa0 20 62 79 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f   by pTemplate */
29fb0 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  .    WhereLoop *
29fc0 2a 70 70 54 61 69 6c 20 3d 20 26 70 2d 3e 70 4e  *ppTail = &p->pN
29fd0 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 57 68 65  extLoop;.    Whe
29fe0 72 65 4c 6f 6f 70 20 2a 70 54 6f 44 65 6c 3b 0a  reLoop *pToDel;.
29ff0 20 20 20 20 77 68 69 6c 65 28 20 2a 70 70 54 61      while( *ppTa
2a000 69 6c 20 29 7b 0a 20 20 20 20 20 20 70 70 54 61  il ){.      ppTa
2a010 69 6c 20 3d 20 77 68 65 72 65 4c 6f 6f 70 46 69  il = whereLoopFi
2a020 6e 64 4c 65 73 73 65 72 28 70 70 54 61 69 6c 2c  ndLesser(ppTail,
2a030 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 20   pTemplate);.   
2a040 20 20 20 69 66 28 20 70 70 54 61 69 6c 3d 3d 30     if( ppTail==0
2a050 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
2a060 70 54 6f 44 65 6c 20 3d 20 2a 70 70 54 61 69 6c  pToDel = *ppTail
2a070 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 6f 44  ;.      if( pToD
2a080 65 6c 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  el==0 ) break;. 
2a090 20 20 20 20 20 2a 70 70 54 61 69 6c 20 3d 20 70       *ppTail = p
2a0a0 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 4c 6f 6f 70  ToDel->pNextLoop
2a0b0 3b 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45  ;.#if WHERETRACE
2a0c0 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20  _ENABLED /* 0x8 
2a0d0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  */.      if( sql
2a0e0 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26  ite3WhereTrace &
2a0f0 20 30 78 38 20 29 7b 0a 20 20 20 20 20 20 20 20   0x8 ){.        
2a100 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
2a110 74 66 28 22 20 64 65 6c 65 74 65 3a 20 22 29 3b  tf(" delete: ");
2a120 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f  .        whereLo
2a130 6f 70 50 72 69 6e 74 28 70 54 6f 44 65 6c 2c 20  opPrint(pToDel, 
2a140 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a  pBuilder->pWC);.
2a150 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
2a160 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 44 65       whereLoopDe
2a170 6c 65 74 65 28 64 62 2c 20 70 54 6f 44 65 6c 29  lete(db, pToDel)
2a180 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77 68  ;.    }.  }.  wh
2a190 65 72 65 4c 6f 6f 70 58 66 65 72 28 64 62 2c 20  ereLoopXfer(db, 
2a1a0 70 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20  p, pTemplate);. 
2a1b0 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73   if( (p->wsFlags
2a1c0 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
2a1d0 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20  TABLE)==0 ){.   
2a1e0 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d   Index *pIndex =
2a1f0 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
2a200 65 78 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64  ex;.    if( pInd
2a210 65 78 20 26 26 20 70 49 6e 64 65 78 2d 3e 74 6e  ex && pIndex->tn
2a220 75 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  um==0 ){.      p
2a230 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
2a240 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
2a250 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2a260 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a  OK;.}../*.** Adj
2a270 75 73 74 20 74 68 65 20 57 68 65 72 65 4c 6f 6f  ust the WhereLoo
2a280 70 2e 6e 4f 75 74 20 76 61 6c 75 65 20 64 6f 77  p.nOut value dow
2a290 6e 77 61 72 64 20 74 6f 20 61 63 63 6f 75 6e 74  nward to account
2a2a0 20 66 6f 72 20 74 65 72 6d 73 20 6f 66 20 74 68   for terms of th
2a2b0 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  e.** WHERE claus
2a2c0 65 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  e that reference
2a2d0 20 74 68 65 20 6c 6f 6f 70 20 62 75 74 20 77 68   the loop but wh
2a2e0 69 63 68 20 61 72 65 20 6e 6f 74 20 75 73 65 64  ich are not used
2a2f0 20 62 79 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e   by an.** index.
2a300 0a 2a 0a 2a 2a 20 46 6f 72 20 65 76 65 72 79 20  .*.** For every 
2a310 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
2a320 6d 20 74 68 61 74 20 69 73 20 6e 6f 74 20 75 73  m that is not us
2a330 65 64 20 62 79 20 74 68 65 20 69 6e 64 65 78 0a  ed by the index.
2a340 2a 2a 20 61 6e 64 20 77 68 69 63 68 20 68 61 73  ** and which has
2a350 20 61 20 74 72 75 74 68 20 70 72 6f 62 61 62 69   a truth probabi
2a360 6c 69 74 79 20 61 73 73 69 67 6e 65 64 20 62 79  lity assigned by
2a370 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 69 6b 65   one of the like
2a380 6c 69 68 6f 6f 64 28 29 2c 0a 2a 2a 20 6c 69 6b  lihood(),.** lik
2a390 65 6c 79 28 29 2c 20 6f 72 20 75 6e 6c 69 6b 65  ely(), or unlike
2a3a0 6c 79 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f  ly() SQL functio
2a3b0 6e 73 2c 20 72 65 64 75 63 65 20 74 68 65 20 65  ns, reduce the e
2a3c0 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 0a  stimated number.
2a3d0 2a 2a 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77  ** of output row
2a3e0 73 20 62 79 20 74 68 65 20 70 72 6f 62 61 62 69  s by the probabi
2a3f0 6c 69 74 79 20 73 70 65 63 69 66 69 65 64 2e 0a  lity specified..
2a400 2a 2a 0a 2a 2a 20 54 55 4e 49 4e 47 3a 20 20 46  **.** TUNING:  F
2a410 6f 72 20 65 76 65 72 79 20 57 48 45 52 45 20 63  or every WHERE c
2a420 6c 61 75 73 65 20 74 65 72 6d 20 74 68 61 74 20  lause term that 
2a430 69 73 20 6e 6f 74 20 75 73 65 64 20 62 79 20 74  is not used by t
2a440 68 65 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20  he index.** and 
2a450 77 68 69 63 68 20 64 6f 65 73 20 6e 6f 74 20 68  which does not h
2a460 61 76 65 20 61 6e 20 61 73 73 69 67 6e 65 64 20  ave an assigned 
2a470 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74  truth probabilit
2a480 79 2c 20 68 65 75 72 69 73 74 69 63 73 0a 2a 2a  y, heuristics.**
2a490 20 64 65 73 63 72 69 62 65 64 20 62 65 6c 6f 77   described below
2a4a0 20 61 72 65 20 75 73 65 64 20 74 6f 20 74 72 79   are used to try
2a4b0 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65   to estimate the
2a4c0 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69   truth probabili
2a4d0 74 79 2e 0a 2a 2a 20 54 4f 44 4f 20 2d 2d 3e 20  ty..** TODO --> 
2a4e0 50 65 72 68 61 70 73 20 74 68 69 73 20 69 73 20  Perhaps this is 
2a4f0 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 63  something that c
2a500 6f 75 6c 64 20 62 65 20 69 6d 70 72 6f 76 65 64  ould be improved
2a510 20 62 79 20 62 65 74 74 65 72 0a 2a 2a 20 74 61   by better.** ta
2a520 62 6c 65 20 73 74 61 74 69 73 74 69 63 73 2e 0a  ble statistics..
2a530 2a 2a 0a 2a 2a 20 48 65 75 72 69 73 74 69 63 20  **.** Heuristic 
2a540 31 3a 20 20 45 73 74 69 6d 61 74 65 20 74 68 65  1:  Estimate the
2a550 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69   truth probabili
2a560 74 79 20 61 73 20 39 33 2e 37 35 25 2e 20 20 54  ty as 93.75%.  T
2a570 68 65 20 39 33 2e 37 35 25 0a 2a 2a 20 76 61 6c  he 93.75%.** val
2a580 75 65 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  ue corresponds t
2a590 6f 20 2d 31 20 69 6e 20 4c 6f 67 45 73 74 20 6e  o -1 in LogEst n
2a5a0 6f 74 61 74 69 6f 6e 2c 20 73 6f 20 74 68 69 73  otation, so this
2a5b0 20 6d 65 61 6e 73 20 64 65 63 72 65 6d 65 6e 74   means decrement
2a5c0 0a 2a 2a 20 74 68 65 20 57 68 65 72 65 4c 6f 6f  .** the WhereLoo
2a5d0 70 2e 6e 4f 75 74 20 66 69 65 6c 64 20 66 6f 72  p.nOut field for
2a5e0 20 65 76 65 72 79 20 73 75 63 68 20 57 48 45 52   every such WHER
2a5f0 45 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 2a  E clause term..*
2a600 2a 0a 2a 2a 20 48 65 75 72 69 73 74 69 63 20 32  *.** Heuristic 2
2a610 3a 20 20 49 66 20 74 68 65 72 65 20 65 78 69 73  :  If there exis
2a620 74 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57  ts one or more W
2a630 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
2a640 73 20 6f 66 20 74 68 65 0a 2a 2a 20 66 6f 72 6d  s of the.** form
2a650 20 22 78 3d 3d 45 58 50 52 22 20 61 6e 64 20 45   "x==EXPR" and E
2a660 58 50 52 20 69 73 20 6e 6f 74 20 61 20 63 6f 6e  XPR is not a con
2a670 73 74 61 6e 74 20 30 20 6f 72 20 31 2c 20 74 68  stant 0 or 1, th
2a680 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  en make sure the
2a690 0a 2a 2a 20 66 69 6e 61 6c 20 6f 75 74 70 75 74  .** final output
2a6a0 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20 69 73   row estimate is
2a6b0 20 6e 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e   no greater than
2a6c0 20 31 2f 34 20 6f 66 20 74 68 65 20 74 6f 74 61   1/4 of the tota
2a6d0 6c 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72  l number.** of r
2a6e0 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
2a6f0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
2a700 73 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 78  s, assume that x
2a710 3d 3d 45 58 50 52 20 77 69 6c 6c 20 66 69 6c 74  ==EXPR will filt
2a720 65 72 0a 2a 2a 20 6f 75 74 20 61 74 20 6c 65 61  er.** out at lea
2a730 73 74 20 33 20 6f 75 74 20 6f 66 20 34 20 72 6f  st 3 out of 4 ro
2a740 77 73 2e 20 20 49 66 20 45 58 50 52 20 69 73 20  ws.  If EXPR is 
2a750 2d 31 20 6f 72 20 30 20 6f 72 20 31 2c 20 74 68  -1 or 0 or 1, th
2a760 65 6e 20 6d 61 79 62 65 20 74 68 65 0a 2a 2a 20  en maybe the.** 
2a770 22 78 22 20 63 6f 6c 75 6d 6e 20 69 73 20 62 6f  "x" column is bo
2a780 6f 6c 65 61 6e 20 6f 72 20 65 6c 73 65 20 2d 31  olean or else -1
2a790 20 6f 72 20 30 20 6f 72 20 31 20 69 73 20 61 20   or 0 or 1 is a 
2a7a0 63 6f 6d 6d 6f 6e 20 64 65 66 61 75 6c 74 20 76  common default v
2a7b0 61 6c 75 65 0a 2a 2a 20 6f 6e 20 74 68 65 20 22  alue.** on the "
2a7c0 78 22 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73 6f  x" column and so
2a7d0 20 69 6e 20 74 68 61 74 20 63 61 73 65 20 6f 6e   in that case on
2a7e0 6c 79 20 63 61 70 20 74 68 65 20 6f 75 74 70 75  ly cap the outpu
2a7f0 74 20 72 6f 77 20 65 73 74 69 6d 61 74 65 0a 2a  t row estimate.*
2a800 2a 20 61 74 20 31 2f 32 20 69 6e 73 74 65 61 64  * at 1/2 instead
2a810 20 6f 66 20 31 2f 34 2e 0a 2a 2f 0a 73 74 61 74   of 1/4..*/.stat
2a820 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f  ic void whereLoo
2a830 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28 0a 20  pOutputAdjust(. 
2a840 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
2a850 43 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57  C,      /* The W
2a860 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
2a870 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
2a880 70 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c  p,      /* The l
2a890 6f 6f 70 20 74 6f 20 61 64 6a 75 73 74 20 64 6f  oop to adjust do
2a8a0 77 6e 77 61 72 64 20 2a 2f 0a 20 20 4c 6f 67 45  wnward */.  LogE
2a8b0 73 74 20 6e 52 6f 77 20 20 20 20 20 20 20 20 20  st nRow         
2a8c0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2a8d0 72 6f 77 73 20 69 6e 20 74 68 65 20 65 6e 74 69  rows in the enti
2a8e0 72 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20  re table */.){. 
2a8f0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
2a900 6d 2c 20 2a 70 58 3b 0a 20 20 42 69 74 6d 61 73  m, *pX;.  Bitmas
2a910 6b 20 6e 6f 74 41 6c 6c 6f 77 65 64 20 3d 20 7e  k notAllowed = ~
2a920 28 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 7c 70  (pLoop->prereq|p
2a930 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 3b  Loop->maskSelf);
2a940 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a  .  int i, j, k;.
2a950 20 20 4c 6f 67 45 73 74 20 69 52 65 64 75 63 65    LogEst iReduce
2a960 20 3d 20 30 3b 20 20 20 20 2f 2a 20 70 4c 6f 6f   = 0;    /* pLoo
2a970 70 2d 3e 6e 4f 75 74 20 73 68 6f 75 6c 64 20 6e  p->nOut should n
2a980 6f 74 20 65 78 63 65 65 64 20 6e 52 6f 77 2d 69  ot exceed nRow-i
2a990 52 65 64 75 63 65 20 2a 2f 0a 0a 20 20 61 73 73  Reduce */..  ass
2a9a0 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46  ert( (pLoop->wsF
2a9b0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54  lags & WHERE_AUT
2a9c0 4f 5f 49 4e 44 45 58 29 3d 3d 30 20 29 3b 0a 20  O_INDEX)==0 );. 
2a9d0 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72   for(i=pWC->nTer
2a9e0 6d 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  m, pTerm=pWC->a;
2a9f0 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 54 65 72 6d   i>0; i--, pTerm
2aa00 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70 54  ++){.    if( (pT
2aa10 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
2aa20 45 52 4d 5f 56 49 52 54 55 41 4c 29 21 3d 30 20  ERM_VIRTUAL)!=0 
2aa30 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
2aa40 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41   (pTerm->prereqA
2aa50 6c 6c 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b  ll & pLoop->mask
2aa60 53 65 6c 66 29 3d 3d 30 20 29 20 63 6f 6e 74 69  Self)==0 ) conti
2aa70 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70 54  nue;.    if( (pT
2aa80 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26  erm->prereqAll &
2aa90 20 6e 6f 74 41 6c 6c 6f 77 65 64 29 21 3d 30 20   notAllowed)!=0 
2aaa0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2aab0 66 6f 72 28 6a 3d 70 4c 6f 6f 70 2d 3e 6e 4c 54  for(j=pLoop->nLT
2aac0 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d  erm-1; j>=0; j--
2aad0 29 7b 0a 20 20 20 20 20 20 70 58 20 3d 20 70 4c  ){.      pX = pL
2aae0 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a  oop->aLTerm[j];.
2aaf0 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d 30 20        if( pX==0 
2ab00 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2ab10 20 20 69 66 28 20 70 58 3d 3d 70 54 65 72 6d 20    if( pX==pTerm 
2ab20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69  ) break;.      i
2ab30 66 28 20 70 58 2d 3e 69 50 61 72 65 6e 74 3e 3d  f( pX->iParent>=
2ab40 30 20 26 26 20 28 26 70 57 43 2d 3e 61 5b 70 58  0 && (&pWC->a[pX
2ab50 2d 3e 69 50 61 72 65 6e 74 5d 29 3d 3d 70 54 65  ->iParent])==pTe
2ab60 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  rm ) break;.    
2ab70 7d 0a 20 20 20 20 69 66 28 20 6a 3c 30 20 29 7b  }.    if( j<0 ){
2ab80 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
2ab90 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30 20 29  ->truthProb<=0 )
2aba0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
2abb0 61 20 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c  a truth probabil
2abc0 69 74 79 20 69 73 20 73 70 65 63 69 66 69 65 64  ity is specified
2abd0 20 75 73 69 6e 67 20 74 68 65 20 6c 69 6b 65 6c   using the likel
2abe0 69 68 6f 6f 64 28 29 20 68 69 6e 74 73 2c 0a 20  ihood() hints,. 
2abf0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 75         ** then u
2ac00 73 65 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69  se the probabili
2ac10 74 79 20 70 72 6f 76 69 64 65 64 20 62 79 20 74  ty provided by t
2ac20 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 2e 20  he application. 
2ac30 2a 2f 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70  */.        pLoop
2ac40 2d 3e 6e 4f 75 74 20 2b 3d 20 70 54 65 72 6d 2d  ->nOut += pTerm-
2ac50 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20 20 20 20  >truthProb;.    
2ac60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2ac70 20 2f 2a 20 49 6e 20 74 68 65 20 61 62 73 65 6e   /* In the absen
2ac80 63 65 20 6f 66 20 65 78 70 6c 69 63 69 74 20 74  ce of explicit t
2ac90 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74 69  ruth probabiliti
2aca0 65 73 2c 20 75 73 65 20 68 65 75 72 69 73 74 69  es, use heuristi
2acb0 63 73 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a  cs to.        **
2acc0 20 67 75 65 73 73 20 61 20 72 65 61 73 6f 6e 61   guess a reasona
2acd0 62 6c 65 20 74 72 75 74 68 20 70 72 6f 62 61 62  ble truth probab
2ace0 69 6c 69 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20  ility. */.      
2acf0 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 2d 2d 3b    pLoop->nOut--;
2ad00 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65  .        if( pTe
2ad10 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 57 4f  rm->eOperator&WO
2ad20 5f 45 51 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _EQ ){.         
2ad30 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20   Expr *pRight = 
2ad40 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52  pTerm->pExpr->pR
2ad50 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20  ight;.          
2ad60 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
2ad70 73 49 6e 74 65 67 65 72 28 70 52 69 67 68 74 2c  sInteger(pRight,
2ad80 20 26 6b 29 20 26 26 20 6b 3e 3d 28 2d 31 29 20   &k) && k>=(-1) 
2ad90 26 26 20 6b 3c 3d 31 20 29 7b 0a 20 20 20 20 20  && k<=1 ){.     
2ada0 20 20 20 20 20 20 20 6b 20 3d 20 31 30 3b 0a 20         k = 10;. 
2adb0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2adc0 20 20 20 20 20 20 20 20 20 20 20 20 6b 20 3d 20              k = 
2add0 32 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  20;.          }.
2ade0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 52            if( iR
2adf0 65 64 75 63 65 3c 6b 20 29 20 69 52 65 64 75 63  educe<k ) iReduc
2ae00 65 20 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20 7d  e = k;.        }
2ae10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2ae20 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e   }.  if( pLoop->
2ae30 6e 4f 75 74 20 3e 20 6e 52 6f 77 2d 69 52 65 64  nOut > nRow-iRed
2ae40 75 63 65 20 29 20 20 70 4c 6f 6f 70 2d 3e 6e 4f  uce )  pLoop->nO
2ae50 75 74 20 3d 20 6e 52 6f 77 20 2d 20 69 52 65 64  ut = nRow - iRed
2ae60 75 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  uce;.}../*.** Ad
2ae70 6a 75 73 74 20 74 68 65 20 63 6f 73 74 20 43 20  just the cost C 
2ae80 62 79 20 74 68 65 20 63 6f 73 74 4d 75 6c 74 20  by the costMult 
2ae90 66 61 63 74 65 72 20 54 2e 20 20 54 68 69 73 20  facter T.  This 
2aea0 6f 6e 6c 79 20 6f 63 63 75 72 73 20 69 66 0a 2a  only occurs if.*
2aeb0 2a 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20  * compiled with 
2aec0 2d 44 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  -DSQLITE_ENABLE_
2aed0 43 4f 53 54 4d 55 4c 54 0a 2a 2f 0a 23 69 66 64  COSTMULT.*/.#ifd
2aee0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
2aef0 5f 43 4f 53 54 4d 55 4c 54 0a 23 20 64 65 66 69  _COSTMULT.# defi
2af00 6e 65 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74  ne ApplyCostMult
2af10 69 70 6c 69 65 72 28 43 2c 54 29 20 20 43 20 2b  iplier(C,T)  C +
2af20 3d 20 54 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  = T.#else.# defi
2af30 6e 65 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74  ne ApplyCostMult
2af40 69 70 6c 69 65 72 28 43 2c 54 29 0a 23 65 6e 64  iplier(C,T).#end
2af50 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 68 61 76  if../*.** We hav
2af60 65 20 73 6f 20 66 61 72 20 6d 61 74 63 68 65 64  e so far matched
2af70 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d   pBuilder->pNew-
2af80 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 74 65 72  >u.btree.nEq ter
2af90 6d 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 69 6e  ms of the .** in
2afa0 64 65 78 20 70 49 6e 64 65 78 2e 20 54 72 79 20  dex pIndex. Try 
2afb0 74 6f 20 6d 61 74 63 68 20 6f 6e 65 20 6d 6f 72  to match one mor
2afc0 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  e..**.** When th
2afd0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
2afe0 61 6c 6c 65 64 2c 20 70 42 75 69 6c 64 65 72 2d  alled, pBuilder-
2aff0 3e 70 4e 65 77 2d 3e 6e 4f 75 74 20 63 6f 6e 74  >pNew->nOut cont
2b000 61 69 6e 73 20 74 68 65 20 0a 2a 2a 20 6e 75 6d  ains the .** num
2b010 62 65 72 20 6f 66 20 72 6f 77 73 20 65 78 70 65  ber of rows expe
2b020 63 74 65 64 20 74 6f 20 62 65 20 76 69 73 69 74  cted to be visit
2b030 65 64 20 62 79 20 66 69 6c 74 65 72 69 6e 67 20  ed by filtering 
2b040 75 73 69 6e 67 20 74 68 65 20 6e 45 71 20 0a 2a  using the nEq .*
2b050 2a 20 74 65 72 6d 73 20 6f 6e 6c 79 2e 20 49 66  * terms only. If
2b060 20 69 74 20 69 73 20 6d 6f 64 69 66 69 65 64 2c   it is modified,
2b070 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 72   this value is r
2b080 65 73 74 6f 72 65 64 20 62 65 66 6f 72 65 20 74  estored before t
2b090 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
2b0a0 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20   returns..**.** 
2b0b0 49 66 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3d  If pProbe->tnum=
2b0c0 3d 30 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 70  =0, that means p
2b0d0 49 6e 64 65 78 20 69 73 20 61 20 66 61 6b 65 20  Index is a fake 
2b0e0 69 6e 64 65 78 20 75 73 65 64 20 66 6f 72 20 74  index used for t
2b0f0 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52  he.** INTEGER PR
2b100 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2f 0a 73 74  IMARY KEY..*/.st
2b110 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
2b120 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28  opAddBtreeIndex(
2b130 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
2b140 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 20  der *pBuilder,  
2b150 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c     /* The WhereL
2b160 6f 6f 70 20 66 61 63 74 6f 72 79 20 2a 2f 0a 20  oop factory */. 
2b170 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2b180 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20  item *pSrc,     
2b190 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
2b1a0 74 65 72 6d 20 62 65 69 6e 67 20 61 6e 61 6c 79  term being analy
2b1b0 7a 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  zed */.  Index *
2b1c0 70 50 72 6f 62 65 2c 20 20 20 20 20 20 20 20 20  pProbe,         
2b1d0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69           /* An i
2b1e0 6e 64 65 78 20 6f 6e 20 70 53 72 63 20 2a 2f 0a  ndex on pSrc */.
2b1f0 20 20 4c 6f 67 45 73 74 20 6e 49 6e 4d 75 6c 20    LogEst nInMul 
2b200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b210 20 20 2f 2a 20 6c 6f 67 28 4e 75 6d 62 65 72 20    /* log(Number 
2b220 6f 66 20 69 74 65 72 61 74 69 6f 6e 73 20 64 75  of iterations du
2b230 65 20 74 6f 20 49 4e 29 20 2a 2f 0a 29 7b 0a 20  e to IN) */.){. 
2b240 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
2b250 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  fo = pBuilder->p
2b260 57 49 6e 66 6f 3b 20 20 2f 2a 20 57 48 45 52 45  WInfo;  /* WHERE
2b270 20 61 6e 61 6c 79 73 65 20 63 6f 6e 74 65 78 74   analyse context
2b280 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
2b290 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  rse = pWInfo->pP
2b2a0 61 72 73 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  arse;        /* 
2b2b0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
2b2c0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
2b2d0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
2b2e0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
2b2f0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6c 6c   connection mall
2b300 6f 63 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  oc context */.  
2b310 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b  WhereLoop *pNew;
2b320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b330 2f 2a 20 54 65 6d 70 6c 61 74 65 20 57 68 65 72  /* Template Wher
2b340 65 4c 6f 6f 70 20 75 6e 64 65 72 20 63 6f 6e 73  eLoop under cons
2b350 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68  truction */.  Wh
2b360 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
2b370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b380 20 41 20 57 68 65 72 65 54 65 72 6d 20 75 6e 64   A WhereTerm und
2b390 65 72 20 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e  er consideration
2b3a0 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 4d 61 73 6b   */.  int opMask
2b3b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b3c0 20 20 20 20 20 20 2f 2a 20 56 61 6c 69 64 20 6f        /* Valid o
2b3d0 70 65 72 61 74 6f 72 73 20 66 6f 72 20 63 6f 6e  perators for con
2b3e0 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 57 68  straints */.  Wh
2b3f0 65 72 65 53 63 61 6e 20 73 63 61 6e 3b 20 20 20  ereScan scan;   
2b400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b410 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20 57 48   Iterator for WH
2b420 45 52 45 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42  ERE terms */.  B
2b430 69 74 6d 61 73 6b 20 73 61 76 65 64 5f 70 72 65  itmask saved_pre
2b440 72 65 71 3b 20 20 20 20 20 20 20 20 20 20 20 2f  req;           /
2b450 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
2b460 20 6f 66 20 70 4e 65 77 2d 3e 70 72 65 72 65 71   of pNew->prereq
2b470 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f   */.  u16 saved_
2b480 6e 4c 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  nLTerm;         
2b490 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61        /* Origina
2b4a0 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d  l value of pNew-
2b4b0 3e 6e 4c 54 65 72 6d 20 2a 2f 0a 20 20 75 31 36  >nLTerm */.  u16
2b4c0 20 73 61 76 65 64 5f 6e 45 71 3b 20 20 20 20 20   saved_nEq;     
2b4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b4e0 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f  Original value o
2b4f0 66 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  f pNew->u.btree.
2b500 6e 45 71 20 2a 2f 0a 20 20 75 31 36 20 73 61 76  nEq */.  u16 sav
2b510 65 64 5f 6e 53 6b 69 70 3b 20 20 20 20 20 20 20  ed_nSkip;       
2b520 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
2b530 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e  inal value of pN
2b540 65 77 2d 3e 6e 53 6b 69 70 20 2a 2f 0a 20 20 75  ew->nSkip */.  u
2b550 33 32 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73  32 saved_wsFlags
2b560 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2b570 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
2b580 20 6f 66 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67   of pNew->wsFlag
2b590 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 73 61  s */.  LogEst sa
2b5a0 76 65 64 5f 6e 4f 75 74 3b 20 20 20 20 20 20 20  ved_nOut;       
2b5b0 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e         /* Origin
2b5c0 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77  al value of pNew
2b5d0 2d 3e 6e 4f 75 74 20 2a 2f 0a 20 20 69 6e 74 20  ->nOut */.  int 
2b5e0 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  iCol;           
2b5f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2b600 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75  ndex of the colu
2b610 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  mn in the table 
2b620 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
2b630 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
2b640 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
2b650 6f 64 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  ode */.  LogEst 
2b660 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  rSize;          
2b670 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2b680 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
2b690 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 4c 6f 67  e table */.  Log
2b6a0 45 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20 20  Est rLogSize;   
2b6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b6c0 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 61 62  Logarithm of tab
2b6d0 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 57 68 65  le size */.  Whe
2b6e0 72 65 54 65 72 6d 20 2a 70 54 6f 70 20 3d 20 30  reTerm *pTop = 0
2b6f0 2c 20 2a 70 42 74 6d 20 3d 20 30 3b 20 2f 2a 20  , *pBtm = 0; /* 
2b700 54 6f 70 20 61 6e 64 20 62 6f 74 74 6f 6d 20 72  Top and bottom r
2b710 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  ange constraints
2b720 20 2a 2f 0a 0a 20 20 70 4e 65 77 20 3d 20 70 42   */..  pNew = pB
2b730 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20  uilder->pNew;.  
2b740 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
2b750 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53 51  iled ) return SQ
2b760 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 61  LITE_NOMEM;..  a
2b770 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77 73  ssert( (pNew->ws
2b780 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49  Flags & WHERE_VI
2b790 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29  RTUALTABLE)==0 )
2b7a0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e 65  ;.  assert( (pNe
2b7b0 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
2b7c0 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30  RE_TOP_LIMIT)==0
2b7d0 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e   );.  if( pNew->
2b7e0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2b7f0 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  BTM_LIMIT ){.   
2b800 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 4c 54 7c   opMask = WO_LT|
2b810 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65 20 69  WO_LE;.  }else i
2b820 66 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c  f( pProbe->tnum<
2b830 3d 30 20 7c 7c 20 28 70 53 72 63 2d 3e 6a 6f 69  =0 || (pSrc->joi
2b840 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29  ntype & JT_LEFT)
2b850 21 3d 30 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73  !=0 ){.    opMas
2b860 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c  k = WO_EQ|WO_IN|
2b870 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c  WO_GT|WO_GE|WO_L
2b880 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73 65  T|WO_LE;.  }else
2b890 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57  {.    opMask = W
2b8a0 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53  O_EQ|WO_IN|WO_IS
2b8b0 4e 55 4c 4c 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45  NULL|WO_GT|WO_GE
2b8c0 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20  |WO_LT|WO_LE;.  
2b8d0 7d 0a 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e  }.  if( pProbe->
2b8e0 62 55 6e 6f 72 64 65 72 65 64 20 29 20 6f 70 4d  bUnordered ) opM
2b8f0 61 73 6b 20 26 3d 20 7e 28 57 4f 5f 47 54 7c 57  ask &= ~(WO_GT|W
2b900 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  O_GE|WO_LT|WO_LE
2b910 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e  );..  assert( pN
2b920 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c  ew->u.btree.nEq<
2b930 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20  pProbe->nColumn 
2b940 29 3b 0a 20 20 69 43 6f 6c 20 3d 20 70 50 72 6f  );.  iCol = pPro
2b950 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70 4e 65  be->aiColumn[pNe
2b960 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 5d 3b  w->u.btree.nEq];
2b970 0a 0a 20 20 70 54 65 72 6d 20 3d 20 77 68 65 72  ..  pTerm = wher
2b980 65 53 63 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c  eScanInit(&scan,
2b990 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 2c 20   pBuilder->pWC, 
2b9a0 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20 69  pSrc->iCursor, i
2b9b0 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Col,.           
2b9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 4d               opM
2b9d0 61 73 6b 2c 20 70 50 72 6f 62 65 29 3b 0a 20 20  ask, pProbe);.  
2b9e0 73 61 76 65 64 5f 6e 45 71 20 3d 20 70 4e 65 77  saved_nEq = pNew
2b9f0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20  ->u.btree.nEq;. 
2ba00 20 73 61 76 65 64 5f 6e 53 6b 69 70 20 3d 20 70   saved_nSkip = p
2ba10 4e 65 77 2d 3e 6e 53 6b 69 70 3b 0a 20 20 73 61  New->nSkip;.  sa
2ba20 76 65 64 5f 6e 4c 54 65 72 6d 20 3d 20 70 4e 65  ved_nLTerm = pNe
2ba30 77 2d 3e 6e 4c 54 65 72 6d 3b 0a 20 20 73 61 76  w->nLTerm;.  sav
2ba40 65 64 5f 77 73 46 6c 61 67 73 20 3d 20 70 4e 65  ed_wsFlags = pNe
2ba50 77 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 73 61  w->wsFlags;.  sa
2ba60 76 65 64 5f 70 72 65 72 65 71 20 3d 20 70 4e 65  ved_prereq = pNe
2ba70 77 2d 3e 70 72 65 72 65 71 3b 0a 20 20 73 61 76  w->prereq;.  sav
2ba80 65 64 5f 6e 4f 75 74 20 3d 20 70 4e 65 77 2d 3e  ed_nOut = pNew->
2ba90 6e 4f 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 72 53  nOut;.  pNew->rS
2baa0 65 74 75 70 20 3d 20 30 3b 0a 20 20 72 53 69 7a  etup = 0;.  rSiz
2bab0 65 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f  e = pProbe->aiRo
2bac0 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20 20 72 4c  wLogEst[0];.  rL
2bad0 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28  ogSize = estLog(
2bae0 72 53 69 7a 65 29 3b 0a 20 20 66 6f 72 28 3b 20  rSize);.  for(; 
2baf0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2bb00 20 70 54 65 72 6d 21 3d 30 3b 20 70 54 65 72 6d   pTerm!=0; pTerm
2bb10 20 3d 20 77 68 65 72 65 53 63 61 6e 4e 65 78 74   = whereScanNext
2bb20 28 26 73 63 61 6e 29 29 7b 0a 20 20 20 20 75 31  (&scan)){.    u1
2bb30 36 20 65 4f 70 20 3d 20 70 54 65 72 6d 2d 3e 65  6 eOp = pTerm->e
2bb40 4f 70 65 72 61 74 6f 72 3b 20 20 20 2f 2a 20 53  Operator;   /* S
2bb50 68 6f 72 74 68 61 6e 64 20 66 6f 72 20 70 54 65  horthand for pTe
2bb60 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 2a 2f  rm->eOperator */
2bb70 0a 20 20 20 20 4c 6f 67 45 73 74 20 72 43 6f 73  .    LogEst rCos
2bb80 74 49 64 78 3b 0a 20 20 20 20 4c 6f 67 45 73 74  tIdx;.    LogEst
2bb90 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65 64 3b   nOutUnadjusted;
2bba0 20 20 20 20 20 20 20 20 2f 2a 20 6e 4f 75 74 20          /* nOut 
2bbb0 62 65 66 6f 72 65 20 49 4e 28 29 20 61 6e 64 20  before IN() and 
2bbc0 57 48 45 52 45 20 61 64 6a 75 73 74 6d 65 6e 74  WHERE adjustment
2bbd0 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 49 6e  s */.    int nIn
2bbe0 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
2bbf0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
2bc00 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 69 6e  _OR_STAT4.    in
2bc10 74 20 6e 52 65 63 56 61 6c 69 64 20 3d 20 70 42  t nRecValid = pB
2bc20 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
2bc30 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  d;.#endif.    if
2bc40 28 20 28 65 4f 70 3d 3d 57 4f 5f 49 53 4e 55 4c  ( (eOp==WO_ISNUL
2bc50 4c 20 7c 7c 20 28 70 54 65 72 6d 2d 3e 77 74 46  L || (pTerm->wtF
2bc60 6c 61 67 73 26 54 45 52 4d 5f 56 4e 55 4c 4c 29  lags&TERM_VNULL)
2bc70 21 3d 30 29 0a 20 20 20 20 20 26 26 20 28 69 43  !=0).     && (iC
2bc80 6f 6c 3c 30 20 7c 7c 20 70 53 72 63 2d 3e 70 54  ol<0 || pSrc->pT
2bc90 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e  ab->aCol[iCol].n
2bca0 6f 74 4e 75 6c 6c 29 0a 20 20 20 20 29 7b 0a 20  otNull).    ){. 
2bcb0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 2f       continue; /
2bcc0 2a 20 69 67 6e 6f 72 65 20 49 53 20 5b 4e 4f 54  * ignore IS [NOT
2bcd0 5d 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e  ] NULL constrain
2bce0 74 73 20 6f 6e 20 4e 4f 54 20 4e 55 4c 4c 20 63  ts on NOT NULL c
2bcf0 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a  olumns */.    }.
2bd00 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70      if( pTerm->p
2bd10 72 65 72 65 71 52 69 67 68 74 20 26 20 70 4e 65  rereqRight & pNe
2bd20 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f  w->maskSelf ) co
2bd30 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20  ntinue;..    /* 
2bd40 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 74 68 65  Do not allow the
2bd50 20 75 70 70 65 72 20 62 6f 75 6e 64 20 6f 66 20   upper bound of 
2bd60 61 20 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74  a LIKE optimizat
2bd70 69 6f 6e 20 72 61 6e 67 65 20 63 6f 6e 73 74 72  ion range constr
2bd80 61 69 6e 74 0a 20 20 20 20 2a 2a 20 74 6f 20 6d  aint.    ** to m
2bd90 69 78 20 77 69 74 68 20 61 20 6c 6f 77 65 72 20  ix with a lower 
2bda0 72 61 6e 67 65 20 62 6f 75 6e 64 20 66 72 6f 6d  range bound from
2bdb0 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 6f 75 72   some other sour
2bdc0 63 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54  ce */.    if( pT
2bdd0 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
2bde0 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 26 26 20 70  ERM_LIKEOPT && p
2bdf0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d  Term->eOperator=
2be00 3d 57 4f 5f 4c 54 20 29 20 63 6f 6e 74 69 6e 75  =WO_LT ) continu
2be10 65 3b 0a 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73  e;..    pNew->ws
2be20 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73  Flags = saved_ws
2be30 46 6c 61 67 73 3b 0a 20 20 20 20 70 4e 65 77 2d  Flags;.    pNew-
2be40 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73  >u.btree.nEq = s
2be50 61 76 65 64 5f 6e 45 71 3b 0a 20 20 20 20 70 4e  aved_nEq;.    pN
2be60 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76  ew->nLTerm = sav
2be70 65 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20 20 20 69  ed_nLTerm;.    i
2be80 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69  f( whereLoopResi
2be90 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65  ze(db, pNew, pNe
2bea0 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20 29 20 62  w->nLTerm+1) ) b
2beb0 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a  reak; /* OOM */.
2bec0 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d      pNew->aLTerm
2bed0 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d  [pNew->nLTerm++]
2bee0 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 70 4e   = pTerm;.    pN
2bef0 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 28 73 61  ew->prereq = (sa
2bf00 76 65 64 5f 70 72 65 72 65 71 20 7c 20 70 54 65  ved_prereq | pTe
2bf10 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 29  rm->prereqRight)
2bf20 20 26 20 7e 70 4e 65 77 2d 3e 6d 61 73 6b 53 65   & ~pNew->maskSe
2bf30 6c 66 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  lf;..    assert(
2bf40 20 6e 49 6e 4d 75 6c 3d 3d 30 0a 20 20 20 20 20   nInMul==0.     
2bf50 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46     || (pNew->wsF
2bf60 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c  lags & WHERE_COL
2bf70 55 4d 4e 5f 4e 55 4c 4c 29 21 3d 30 20 0a 20 20  UMN_NULL)!=0 .  
2bf80 20 20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e        || (pNew->
2bf90 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2bfa0 43 4f 4c 55 4d 4e 5f 49 4e 29 21 3d 30 20 0a 20  COLUMN_IN)!=0 . 
2bfb0 20 20 20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d         || (pNew-
2bfc0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
2bfd0 5f 53 4b 49 50 53 43 41 4e 29 21 3d 30 20 0a 20  _SKIPSCAN)!=0 . 
2bfe0 20 20 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 65     );..    if( e
2bff0 4f 70 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20  Op & WO_IN ){.  
2c000 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
2c010 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
2c020 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
2c030 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
2c040 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20 20 69 66  UMN_IN;.      if
2c050 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
2c060 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
2c070 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
2c080 20 20 2f 2a 20 22 78 20 49 4e 20 28 53 45 4c 45    /* "x IN (SELE
2c090 43 54 20 2e 2e 2e 29 22 3a 20 20 54 55 4e 49 4e  CT ...)":  TUNIN
2c0a0 47 3a 20 74 68 65 20 53 45 4c 45 43 54 20 72 65  G: the SELECT re
2c0b0 74 75 72 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f  turns 25 rows */
2c0c0 0a 20 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 34  .        nIn = 4
2c0d0 36 3b 20 20 61 73 73 65 72 74 28 20 34 36 3d 3d  6;  assert( 46==
2c0e0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 35  sqlite3LogEst(25
2c0f0 29 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ) );.      }else
2c100 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 78 70   if( ALWAYS(pExp
2c110 72 2d 3e 78 2e 70 4c 69 73 74 20 26 26 20 70 45  r->x.pList && pE
2c120 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
2c130 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
2c140 2f 2a 20 22 78 20 49 4e 20 28 76 61 6c 75 65 2c  /* "x IN (value,
2c150 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 22 20 2a 2f   value, ...)" */
2c160 0a 20 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 73  .        nIn = s
2c170 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 45 78  qlite3LogEst(pEx
2c180 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
2c190 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pr);.      }.   
2c1a0 20 20 20 61 73 73 65 72 74 28 20 6e 49 6e 3e 30     assert( nIn>0
2c1b0 20 29 3b 20 20 2f 2a 20 52 48 53 20 61 6c 77 61   );  /* RHS alwa
2c1c0 79 73 20 68 61 73 20 32 20 6f 72 20 6d 6f 72 65  ys has 2 or more
2c1d0 20 74 65 72 6d 73 2e 2e 2e 20 20 54 68 65 20 70   terms...  The p
2c1e0 61 72 73 65 72 0a 20 20 20 20 20 20 20 20 20 20  arser.          
2c1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
2c200 20 63 68 61 6e 67 65 73 20 22 78 20 49 4e 20 28   changes "x IN (
2c210 3f 29 22 20 69 6e 74 6f 20 22 78 3d 3f 22 2e 20  ?)" into "x=?". 
2c220 2a 2f 0a 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  */..    }else if
2c230 28 20 65 4f 70 20 26 20 28 57 4f 5f 45 51 29 20  ( eOp & (WO_EQ) 
2c240 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  ){.      pNew->w
2c250 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
2c260 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20 20 20  COLUMN_EQ;.     
2c270 20 69 66 28 20 69 43 6f 6c 3c 30 20 7c 7c 20 28   if( iCol<0 || (
2c280 6e 49 6e 4d 75 6c 3d 3d 30 20 26 26 20 70 4e 65  nInMul==0 && pNe
2c290 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3d 3d  w->u.btree.nEq==
2c2a0 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 2d  pProbe->nKeyCol-
2c2b0 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  1) ){.        if
2c2c0 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 21 49 73  ( iCol>=0 && !Is
2c2d0 55 6e 69 71 75 65 49 6e 64 65 78 28 70 50 72 6f  UniqueIndex(pPro
2c2e0 62 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  be) ){.         
2c2f0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c   pNew->wsFlags |
2c300 3d 20 57 48 45 52 45 5f 55 4e 51 5f 57 41 4e 54  = WHERE_UNQ_WANT
2c310 45 44 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ED;.        }els
2c320 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  e{.          pNe
2c330 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
2c340 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20  ERE_ONEROW;.    
2c350 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2c360 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4f 70 20    }else if( eOp 
2c370 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20  & WO_ISNULL ){. 
2c380 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
2c390 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
2c3a0 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c  MN_NULL;.    }el
2c3b0 73 65 20 69 66 28 20 65 4f 70 20 26 20 28 57 4f  se if( eOp & (WO
2c3c0 5f 47 54 7c 57 4f 5f 47 45 29 20 29 7b 0a 20 20  _GT|WO_GE) ){.  
2c3d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f      testcase( eO
2c3e0 70 20 26 20 57 4f 5f 47 54 20 29 3b 0a 20 20 20  p & WO_GT );.   
2c3f0 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70     testcase( eOp
2c400 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20   & WO_GE );.    
2c410 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
2c420 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
2c430 52 41 4e 47 45 7c 57 48 45 52 45 5f 42 54 4d 5f  RANGE|WHERE_BTM_
2c440 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 70 42 74  LIMIT;.      pBt
2c450 6d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  m = pTerm;.     
2c460 20 70 54 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20   pTop = 0;.     
2c470 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c   if( pTerm->wtFl
2c480 61 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f  ags & TERM_LIKEO
2c490 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  PT ){.        /*
2c4a0 20 52 61 6e 67 65 20 63 6f 6e 74 72 61 69 6e 74   Range contraint
2c4b0 73 20 74 68 61 74 20 63 6f 6d 65 20 66 72 6f 6d  s that come from
2c4c0 20 74 68 65 20 4c 49 4b 45 20 6f 70 74 69 6d 69   the LIKE optimi
2c4d0 7a 61 74 69 6f 6e 20 61 72 65 0a 20 20 20 20 20  zation are.     
2c4e0 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 75 73 65     ** always use
2c4f0 64 20 69 6e 20 70 61 69 72 73 2e 20 2a 2f 0a 20  d in pairs. */. 
2c500 20 20 20 20 20 20 20 70 54 6f 70 20 3d 20 26 70         pTop = &p
2c510 54 65 72 6d 5b 31 5d 3b 0a 20 20 20 20 20 20 20  Term[1];.       
2c520 20 61 73 73 65 72 74 28 20 28 70 54 6f 70 2d 28   assert( (pTop-(
2c530 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 61 29 29 3c  pTerm->pWC->a))<
2c540 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 6e 54 65 72  pTerm->pWC->nTer
2c550 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  m );.        ass
2c560 65 72 74 28 20 70 54 6f 70 2d 3e 77 74 46 6c 61  ert( pTop->wtFla
2c570 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50  gs & TERM_LIKEOP
2c580 54 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  T );.        ass
2c590 65 72 74 28 20 70 54 6f 70 2d 3e 65 4f 70 65 72  ert( pTop->eOper
2c5a0 61 74 6f 72 3d 3d 57 4f 5f 4c 54 20 29 3b 0a 20  ator==WO_LT );. 
2c5b0 20 20 20 20 20 20 20 69 66 28 20 77 68 65 72 65         if( where
2c5c0 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70  LoopResize(db, p
2c5d0 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  New, pNew->nLTer
2c5e0 6d 2b 31 29 20 29 20 62 72 65 61 6b 3b 20 2f 2a  m+1) ) break; /*
2c5f0 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20 20 20 20 20   OOM */.        
2c600 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65  pNew->aLTerm[pNe
2c610 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 70  w->nLTerm++] = p
2c620 54 6f 70 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  Top;.        pNe
2c630 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
2c640 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20  ERE_TOP_LIMIT;. 
2c650 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
2c660 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2c670 65 4f 70 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f  eOp & (WO_LT|WO_
2c680 4c 45 29 20 29 3b 0a 20 20 20 20 20 20 74 65 73  LE) );.      tes
2c690 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f  tcase( eOp & WO_
2c6a0 4c 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  LT );.      test
2c6b0 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 4c  case( eOp & WO_L
2c6c0 45 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  E );.      pNew-
2c6d0 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
2c6e0 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57  E_COLUMN_RANGE|W
2c6f0 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a  HERE_TOP_LIMIT;.
2c700 20 20 20 20 20 20 70 54 6f 70 20 3d 20 70 54 65        pTop = pTe
2c710 72 6d 3b 0a 20 20 20 20 20 20 70 42 74 6d 20 3d  rm;.      pBtm =
2c720 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20   (pNew->wsFlags 
2c730 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  & WHERE_BTM_LIMI
2c740 54 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20 20  T)!=0 ?.        
2c750 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65               pNe
2c760 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e  w->aLTerm[pNew->
2c770 6e 4c 54 65 72 6d 2d 32 5d 20 3a 20 30 3b 0a 20  nLTerm-2] : 0;. 
2c780 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20     }..    /* At 
2c790 74 68 69 73 20 70 6f 69 6e 74 20 70 4e 65 77 2d  this point pNew-
2c7a0 3e 6e 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  >nOut is set to 
2c7b0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
2c7c0 77 73 20 65 78 70 65 63 74 65 64 20 74 6f 0a 20  ws expected to. 
2c7d0 20 20 20 2a 2a 20 62 65 20 76 69 73 69 74 65 64     ** be visited
2c7e0 20 62 79 20 74 68 65 20 69 6e 64 65 78 20 73 63   by the index sc
2c7f0 61 6e 20 62 65 66 6f 72 65 20 63 6f 6e 73 69 64  an before consid
2c800 65 72 69 6e 67 20 74 65 72 6d 20 70 54 65 72 6d  ering term pTerm
2c810 2c 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20  , or the.    ** 
2c820 76 61 6c 75 65 73 20 6f 66 20 6e 49 6e 20 61 6e  values of nIn an
2c830 64 20 6e 49 6e 4d 75 6c 2e 20 49 6e 20 6f 74 68  d nInMul. In oth
2c840 65 72 20 77 6f 72 64 73 2c 20 61 73 73 75 6d 69  er words, assumi
2c850 6e 67 20 74 68 61 74 20 61 6c 6c 20 0a 20 20 20  ng that all .   
2c860 20 2a 2a 20 22 78 20 49 4e 28 2e 2e 2e 29 22 20   ** "x IN(...)" 
2c870 74 65 72 6d 73 20 61 72 65 20 72 65 70 6c 61 63  terms are replac
2c880 65 64 20 77 69 74 68 20 22 78 20 3d 20 3f 22 2e  ed with "x = ?".
2c890 20 54 68 69 73 20 62 6c 6f 63 6b 20 75 70 64 61   This block upda
2c8a0 74 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 76  tes.    ** the v
2c8b0 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f  alue of pNew->nO
2c8c0 75 74 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f  ut to account fo
2c8d0 72 20 70 54 65 72 6d 20 28 62 75 74 20 6e 6f 74  r pTerm (but not
2c8e0 20 6e 49 6e 2f 6e 49 6e 4d 75 6c 29 2e 20 20 2a   nIn/nInMul).  *
2c8f0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  /.    assert( pN
2c900 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65 64 5f  ew->nOut==saved_
2c910 6e 4f 75 74 20 29 3b 0a 20 20 20 20 69 66 28 20  nOut );.    if( 
2c920 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
2c930 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
2c940 47 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  GE ){.      /* A
2c950 64 6a 75 73 74 20 6e 4f 75 74 20 75 73 69 6e 67  djust nOut using
2c960 20 73 74 61 74 33 2f 73 74 61 74 34 20 64 61 74   stat3/stat4 dat
2c970 61 2e 20 4f 72 2c 20 69 66 20 74 68 65 72 65 20  a. Or, if there 
2c980 69 73 20 6e 6f 20 73 74 61 74 33 2f 73 74 61 74  is no stat3/stat
2c990 34 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 2c  4.      ** data,
2c9a0 20 75 73 69 6e 67 20 73 6f 6d 65 20 6f 74 68 65   using some othe
2c9b0 72 20 65 73 74 69 6d 61 74 65 2e 20 20 2a 2f 0a  r estimate.  */.
2c9c0 20 20 20 20 20 20 77 68 65 72 65 52 61 6e 67 65        whereRange
2c9d0 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20  ScanEst(pParse, 
2c9e0 70 42 75 69 6c 64 65 72 2c 20 70 42 74 6d 2c 20  pBuilder, pBtm, 
2c9f0 70 54 6f 70 2c 20 70 4e 65 77 29 3b 0a 20 20 20  pTop, pNew);.   
2ca00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
2ca10 74 20 6e 45 71 20 3d 20 2b 2b 70 4e 65 77 2d 3e  t nEq = ++pNew->
2ca20 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 20  u.btree.nEq;.   
2ca30 20 20 20 61 73 73 65 72 74 28 20 65 4f 70 20 26     assert( eOp &
2ca40 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45   (WO_ISNULL|WO_E
2ca50 51 7c 57 4f 5f 49 4e 29 20 29 3b 0a 0a 20 20 20  Q|WO_IN) );..   
2ca60 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
2ca70 3e 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75  >nOut==saved_nOu
2ca80 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t );.      if( p
2ca90 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c  Term->truthProb<
2caa0 3d 30 20 26 26 20 69 43 6f 6c 3e 3d 30 20 29 7b  =0 && iCol>=0 ){
2cab0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2cac0 20 28 65 4f 70 20 26 20 57 4f 5f 49 4e 29 20 7c   (eOp & WO_IN) |
2cad0 7c 20 6e 49 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  | nIn==0 );.    
2cae0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f      testcase( eO
2caf0 70 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20  p & WO_IN );.   
2cb00 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
2cb10 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50  += pTerm->truthP
2cb20 72 6f 62 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  rob;.        pNe
2cb30 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a  w->nOut -= nIn;.
2cb40 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66        }else{.#if
2cb50 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
2cb60 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
2cb70 0a 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74  .        tRowcnt
2cb80 20 6e 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20   nOut = 0;.     
2cb90 20 20 20 69 66 28 20 6e 49 6e 4d 75 6c 3d 3d 30     if( nInMul==0
2cba0 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50   .         && pP
2cbb0 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20  robe->nSample . 
2cbc0 20 20 20 20 20 20 20 20 26 26 20 70 4e 65 77 2d          && pNew-
2cbd0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 3d 70 50  >u.btree.nEq<=pP
2cbe0 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c  robe->nSampleCol
2cbf0 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 28 65  .         && ((e
2cc00 4f 70 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 7c  Op & WO_IN)==0 |
2cc10 7c 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  | !ExprHasProper
2cc20 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  ty(pTerm->pExpr,
2cc30 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 29 0a   EP_xIsSelect)).
2cc40 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
2cc50 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
2cc60 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
2cc70 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28  .          if( (
2cc80 65 4f 70 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f  eOp & (WO_EQ|WO_
2cc90 49 53 4e 55 4c 4c 29 29 21 3d 30 20 29 7b 0a 20  ISNULL))!=0 ){. 
2cca0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
2ccb0 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 45 51  ase( eOp & WO_EQ
2ccc0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
2ccd0 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20  testcase( eOp & 
2cce0 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  WO_ISNULL );.   
2ccf0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68           rc = wh
2cd00 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28  ereEqualScanEst(
2cd10 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72  pParse, pBuilder
2cd20 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
2cd30 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20   &nOut);.       
2cd40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2cd50 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
2cd60 49 6e 53 63 61 6e 45 73 74 28 70 50 61 72 73 65  InScanEst(pParse
2cd70 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 45 78 70  , pBuilder, pExp
2cd80 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 4f 75  r->x.pList, &nOu
2cd90 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  t);.          }.
2cda0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
2cdb0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  ==SQLITE_NOTFOUN
2cdc0 44 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  D ) rc = SQLITE_
2cdd0 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  OK;.          if
2cde0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2cdf0 29 20 62 72 65 61 6b 3b 20 20 20 20 20 20 20 20  ) break;        
2ce00 20 20 2f 2a 20 4a 75 6d 70 20 6f 75 74 20 6f 66    /* Jump out of
2ce10 20 74 68 65 20 70 54 65 72 6d 20 6c 6f 6f 70 20   the pTerm loop 
2ce20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
2ce30 20 6e 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 20   nOut ){.       
2ce40 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
2ce50 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
2ce60 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20  nOut);.         
2ce70 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 6e 4f 75     if( pNew->nOu
2ce80 74 3e 73 61 76 65 64 5f 6e 4f 75 74 20 29 20 70  t>saved_nOut ) p
2ce90 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65  New->nOut = save
2cea0 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20  d_nOut;.        
2ceb0 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d      pNew->nOut -
2cec0 3d 20 6e 49 6e 3b 0a 20 20 20 20 20 20 20 20 20  = nIn;.         
2ced0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2cee0 20 20 20 20 20 69 66 28 20 6e 4f 75 74 3d 3d 30       if( nOut==0
2cef0 20 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   ).#endif.      
2cf00 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e    {.          pN
2cf10 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 28 70 50 72  ew->nOut += (pPr
2cf20 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  obe->aiRowLogEst
2cf30 5b 6e 45 71 5d 20 2d 20 70 50 72 6f 62 65 2d 3e  [nEq] - pProbe->
2cf40 61 69 52 6f 77 4c 6f 67 45 73 74 5b 6e 45 71 2d  aiRowLogEst[nEq-
2cf50 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  1]);.          i
2cf60 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55  f( eOp & WO_ISNU
2cf70 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  LL ){.          
2cf80 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 49 66 20    /* TUNING: If 
2cf90 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6b 65  there is no like
2cfa0 6c 69 68 6f 6f 64 28 29 20 76 61 6c 75 65 2c 20  lihood() value, 
2cfb0 61 73 73 75 6d 65 20 74 68 61 74 20 61 20 0a 20  assume that a . 
2cfc0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 22 63             ** "c
2cfd0 6f 6c 20 49 53 20 4e 55 4c 4c 22 20 65 78 70 72  ol IS NULL" expr
2cfe0 65 73 73 69 6f 6e 20 6d 61 74 63 68 65 73 20 74  ession matches t
2cff0 77 69 63 65 20 61 73 20 6d 61 6e 79 20 72 6f 77  wice as many row
2d000 73 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  s .            *
2d010 2a 20 61 73 20 28 63 6f 6c 3d 3f 29 2e 20 2a 2f  * as (col=?). */
2d020 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65  .            pNe
2d030 77 2d 3e 6e 4f 75 74 20 2b 3d 20 31 30 3b 0a 20  w->nOut += 10;. 
2d040 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2d050 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2d060 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 72   }..    /* Set r
2d070 43 6f 73 74 49 64 78 20 74 6f 20 74 68 65 20 63  CostIdx to the c
2d080 6f 73 74 20 6f 66 20 76 69 73 69 74 69 6e 67 20  ost of visiting 
2d090 73 65 6c 65 63 74 65 64 20 72 6f 77 73 20 69 6e  selected rows in
2d0a0 20 69 6e 64 65 78 2e 20 41 64 64 0a 20 20 20 20   index. Add.    
2d0b0 2a 2a 20 69 74 20 74 6f 20 70 4e 65 77 2d 3e 72  ** it to pNew->r
2d0c0 52 75 6e 2c 20 77 68 69 63 68 20 69 73 20 63 75  Run, which is cu
2d0d0 72 72 65 6e 74 6c 79 20 73 65 74 20 74 6f 20 74  rrently set to t
2d0e0 68 65 20 63 6f 73 74 20 6f 66 20 74 68 65 20 69  he cost of the i
2d0f0 6e 64 65 78 0a 20 20 20 20 2a 2a 20 73 65 65 6b  ndex.    ** seek
2d100 20 6f 6e 6c 79 2e 20 54 68 65 6e 2c 20 69 66 20   only. Then, if 
2d110 74 68 69 73 20 69 73 20 61 20 6e 6f 6e 2d 63 6f  this is a non-co
2d120 76 65 72 69 6e 67 20 69 6e 64 65 78 2c 20 61 64  vering index, ad
2d130 64 20 74 68 65 20 63 6f 73 74 20 6f 66 0a 20 20  d the cost of.  
2d140 20 20 2a 2a 20 76 69 73 69 74 69 6e 67 20 74 68    ** visiting th
2d150 65 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6d 61  e rows in the ma
2d160 69 6e 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  in table.  */.  
2d170 20 20 72 43 6f 73 74 49 64 78 20 3d 20 70 4e 65    rCostIdx = pNe
2d180 77 2d 3e 6e 4f 75 74 20 2b 20 31 20 2b 20 28 31  w->nOut + 1 + (1
2d190 35 2a 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52  5*pProbe->szIdxR
2d1a0 6f 77 29 2f 70 53 72 63 2d 3e 70 54 61 62 2d 3e  ow)/pSrc->pTab->
2d1b0 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20 70 4e  szTabRow;.    pN
2d1c0 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74  ew->rRun = sqlit
2d1d0 65 33 4c 6f 67 45 73 74 41 64 64 28 72 4c 6f 67  e3LogEstAdd(rLog
2d1e0 53 69 7a 65 2c 20 72 43 6f 73 74 49 64 78 29 3b  Size, rCostIdx);
2d1f0 0a 20 20 20 20 69 66 28 20 28 70 4e 65 77 2d 3e  .    if( (pNew->
2d200 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  wsFlags & (WHERE
2d210 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f  _IDX_ONLY|WHERE_
2d220 49 50 4b 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  IPK))==0 ){.    
2d230 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73    pNew->rRun = s
2d240 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
2d250 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 4e 65 77  pNew->rRun, pNew
2d260 2d 3e 6e 4f 75 74 20 2b 20 31 36 29 3b 0a 20 20  ->nOut + 16);.  
2d270 20 20 7d 0a 20 20 20 20 41 70 70 6c 79 43 6f 73    }.    ApplyCos
2d280 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e 65 77  tMultiplier(pNew
2d290 2d 3e 72 52 75 6e 2c 20 70 50 72 6f 62 65 2d 3e  ->rRun, pProbe->
2d2a0 70 54 61 62 6c 65 2d 3e 63 6f 73 74 4d 75 6c 74  pTable->costMult
2d2b0 29 3b 0a 0a 20 20 20 20 6e 4f 75 74 55 6e 61 64  );..    nOutUnad
2d2c0 6a 75 73 74 65 64 20 3d 20 70 4e 65 77 2d 3e 6e  justed = pNew->n
2d2d0 4f 75 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72  Out;.    pNew->r
2d2e0 52 75 6e 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b 20  Run += nInMul + 
2d2f0 6e 49 6e 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  nIn;.    pNew->n
2d300 4f 75 74 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b 20  Out += nInMul + 
2d310 6e 49 6e 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f  nIn;.    whereLo
2d320 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28 70  opOutputAdjust(p
2d330 42 75 69 6c 64 65 72 2d 3e 70 57 43 2c 20 70 4e  Builder->pWC, pN
2d340 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20 20  ew, rSize);.    
2d350 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e  rc = whereLoopIn
2d360 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70  sert(pBuilder, p
2d370 4e 65 77 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  New);..    if( p
2d380 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
2d390 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
2d3a0 45 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  E ){.      pNew-
2d3b0 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f  >nOut = saved_nO
2d3c0 75 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ut;.    }else{. 
2d3d0 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
2d3e0 3d 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65 64  = nOutUnadjusted
2d3f0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
2d400 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20   (pNew->wsFlags 
2d410 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  & WHERE_TOP_LIMI
2d420 54 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 4e  T)==0.     && pN
2d430 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c  ew->u.btree.nEq<
2d440 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 0a  pProbe->nColumn.
2d450 20 20 20 20 29 7b 0a 20 20 20 20 20 20 77 68 65      ){.      whe
2d460 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e  reLoopAddBtreeIn
2d470 64 65 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53  dex(pBuilder, pS
2d480 72 63 2c 20 70 50 72 6f 62 65 2c 20 6e 49 6e 4d  rc, pProbe, nInM
2d490 75 6c 2b 6e 49 6e 29 3b 0a 20 20 20 20 7d 0a 20  ul+nIn);.    }. 
2d4a0 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
2d4b0 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 23 69 66 64  saved_nOut;.#ifd
2d4c0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
2d4d0 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
2d4e0 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52      pBuilder->nR
2d4f0 65 63 56 61 6c 69 64 20 3d 20 6e 52 65 63 56 61  ecValid = nRecVa
2d500 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  lid;.#endif.  }.
2d510 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d    pNew->prereq =
2d520 20 73 61 76 65 64 5f 70 72 65 72 65 71 3b 0a 20   saved_prereq;. 
2d530 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
2d540 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a  Eq = saved_nEq;.
2d550 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20    pNew->nSkip = 
2d560 73 61 76 65 64 5f 6e 53 6b 69 70 3b 0a 20 20 70  saved_nSkip;.  p
2d570 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73  New->wsFlags = s
2d580 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20  aved_wsFlags;.  
2d590 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76  pNew->nOut = sav
2d5a0 65 64 5f 6e 4f 75 74 3b 0a 20 20 70 4e 65 77 2d  ed_nOut;.  pNew-
2d5b0 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65 64 5f  >nLTerm = saved_
2d5c0 6e 4c 54 65 72 6d 3b 0a 0a 20 20 2f 2a 20 43 6f  nLTerm;..  /* Co
2d5d0 6e 73 69 64 65 72 20 75 73 69 6e 67 20 61 20 73  nsider using a s
2d5e0 6b 69 70 2d 73 63 61 6e 20 69 66 20 74 68 65 72  kip-scan if ther
2d5f0 65 20 61 72 65 20 6e 6f 20 57 48 45 52 45 20 63  e are no WHERE c
2d600 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74  lause constraint
2d610 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65  s.  ** available
2d620 20 66 6f 72 20 74 68 65 20 6c 65 66 74 2d 6d 6f   for the left-mo
2d630 73 74 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  st terms of the 
2d640 69 6e 64 65 78 2c 20 61 6e 64 20 69 66 20 74 68  index, and if th
2d650 65 20 61 76 65 72 61 67 65 0a 20 20 2a 2a 20 6e  e average.  ** n
2d660 75 6d 62 65 72 20 6f 66 20 72 65 70 65 61 74 73  umber of repeats
2d670 20 69 6e 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73   in the left-mos
2d680 74 20 74 65 72 6d 73 20 69 73 20 61 74 20 6c 65  t terms is at le
2d690 61 73 74 20 31 38 2e 20 0a 20 20 2a 2a 0a 20 20  ast 18. .  **.  
2d6a0 2a 2a 20 54 68 65 20 6d 61 67 69 63 20 6e 75 6d  ** The magic num
2d6b0 62 65 72 20 31 38 20 69 73 20 73 65 6c 65 63 74  ber 18 is select
2d6c0 65 64 20 6f 6e 20 74 68 65 20 62 61 73 69 73 20  ed on the basis 
2d6d0 74 68 61 74 20 73 63 61 6e 6e 69 6e 67 20 31 37  that scanning 17
2d6e0 20 72 6f 77 73 0a 20 20 2a 2a 20 69 73 20 61 6c   rows.  ** is al
2d6f0 6d 6f 73 74 20 61 6c 77 61 79 73 20 71 75 69 63  most always quic
2d700 6b 65 72 20 74 68 61 6e 20 61 6e 20 69 6e 64 65  ker than an inde
2d710 78 20 73 65 65 6b 20 28 65 76 65 6e 20 74 68 6f  x seek (even tho
2d720 75 67 68 20 69 66 20 74 68 65 20 69 6e 64 65 78  ugh if the index
2d730 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 66  .  ** contains f
2d740 65 77 65 72 20 74 68 61 6e 20 32 5e 31 37 20 72  ewer than 2^17 r
2d750 6f 77 73 20 77 65 20 61 73 73 75 6d 65 20 6f 74  ows we assume ot
2d760 68 65 72 77 69 73 65 20 69 6e 20 6f 74 68 65 72  herwise in other
2d770 20 70 61 72 74 73 20 6f 66 0a 20 20 2a 2a 20 74   parts of.  ** t
2d780 68 65 20 63 6f 64 65 29 2e 20 41 6e 64 2c 20 65  he code). And, e
2d790 76 65 6e 20 69 66 20 69 74 20 69 73 20 6e 6f 74  ven if it is not
2d7a0 2c 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20  , it should not 
2d7b0 62 65 20 74 6f 6f 20 6d 75 63 68 20 73 6c 6f 77  be too much slow
2d7c0 65 72 2e 20 0a 20 20 2a 2a 20 4f 6e 20 74 68 65  er. .  ** On the
2d7d0 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 74 68 65   other hand, the
2d7e0 20 65 78 74 72 61 20 73 65 65 6b 73 20 63 6f 75   extra seeks cou
2d7f0 6c 64 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20  ld end up being 
2d800 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20  significantly.  
2d810 2a 2a 20 6d 6f 72 65 20 65 78 70 65 6e 73 69 76  ** more expensiv
2d820 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
2d830 20 34 32 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   42==sqlite3LogE
2d840 73 74 28 31 38 29 20 29 3b 0a 20 20 69 66 28 20  st(18) );.  if( 
2d850 73 61 76 65 64 5f 6e 45 71 3d 3d 73 61 76 65 64  saved_nEq==saved
2d860 5f 6e 53 6b 69 70 0a 20 20 20 26 26 20 73 61 76  _nSkip.   && sav
2d870 65 64 5f 6e 45 71 2b 31 3c 70 50 72 6f 62 65 2d  ed_nEq+1<pProbe-
2d880 3e 6e 4b 65 79 43 6f 6c 0a 20 20 20 26 26 20 70  >nKeyCol.   && p
2d890 50 72 6f 62 65 2d 3e 6e 6f 53 6b 69 70 53 63 61  Probe->noSkipSca
2d8a0 6e 3d 3d 30 0a 20 20 20 26 26 20 70 50 72 6f 62  n==0.   && pProb
2d8b0 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73  e->aiRowLogEst[s
2d8c0 61 76 65 64 5f 6e 45 71 2b 31 5d 3e 3d 34 32 20  aved_nEq+1]>=42 
2d8d0 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4d 69 6e 69   /* TUNING: Mini
2d8e0 6d 75 6d 20 66 6f 72 20 73 6b 69 70 2d 73 63 61  mum for skip-sca
2d8f0 6e 20 2a 2f 0a 20 20 20 26 26 20 28 72 63 20 3d  n */.   && (rc =
2d900 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65   whereLoopResize
2d910 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d  (db, pNew, pNew-
2d920 3e 6e 4c 54 65 72 6d 2b 31 29 29 3d 3d 53 51 4c  >nLTerm+1))==SQL
2d930 49 54 45 5f 4f 4b 0a 20 20 29 7b 0a 20 20 20 20  ITE_OK.  ){.    
2d940 4c 6f 67 45 73 74 20 6e 49 74 65 72 3b 0a 20 20  LogEst nIter;.  
2d950 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
2d960 6e 45 71 2b 2b 3b 0a 20 20 20 20 70 4e 65 77 2d  nEq++;.    pNew-
2d970 3e 6e 53 6b 69 70 2b 2b 3b 0a 20 20 20 20 70 4e  >nSkip++;.    pN
2d980 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d  ew->aLTerm[pNew-
2d990 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 30 3b 0a  >nLTerm++] = 0;.
2d9a0 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
2d9b0 73 20 7c 3d 20 57 48 45 52 45 5f 53 4b 49 50 53  s |= WHERE_SKIPS
2d9c0 43 41 4e 3b 0a 20 20 20 20 6e 49 74 65 72 20 3d  CAN;.    nIter =
2d9d0 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f   pProbe->aiRowLo
2d9e0 67 45 73 74 5b 73 61 76 65 64 5f 6e 45 71 5d 20  gEst[saved_nEq] 
2d9f0 2d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c  - pProbe->aiRowL
2da00 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e 45 71 2b  ogEst[saved_nEq+
2da10 31 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f  1];.    pNew->nO
2da20 75 74 20 2d 3d 20 6e 49 74 65 72 3b 0a 20 20 20  ut -= nIter;.   
2da30 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 42 65 63   /* TUNING:  Bec
2da40 61 75 73 65 20 75 6e 63 65 72 74 61 69 6e 74 69  ause uncertainti
2da50 65 73 20 69 6e 20 74 68 65 20 65 73 74 69 6d 61  es in the estima
2da60 74 65 73 20 66 6f 72 20 73 6b 69 70 2d 73 63 61  tes for skip-sca
2da70 6e 20 71 75 65 72 69 65 73 2c 0a 20 20 20 20 2a  n queries,.    *
2da80 2a 20 61 64 64 20 61 20 31 2e 33 37 35 20 66 75  * add a 1.375 fu
2da90 64 67 65 20 66 61 63 74 6f 72 20 74 6f 20 6d 61  dge factor to ma
2daa0 6b 65 20 73 6b 69 70 2d 73 63 61 6e 20 73 6c 69  ke skip-scan sli
2dab0 67 68 74 6c 79 20 6c 65 73 73 20 6c 69 6b 65 6c  ghtly less likel
2dac0 79 2e 20 2a 2f 0a 20 20 20 20 6e 49 74 65 72 20  y. */.    nIter 
2dad0 2b 3d 20 35 3b 0a 20 20 20 20 77 68 65 72 65 4c  += 5;.    whereL
2dae0 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65 78  oopAddBtreeIndex
2daf0 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c  (pBuilder, pSrc,
2db00 20 70 50 72 6f 62 65 2c 20 6e 49 74 65 72 20 2b   pProbe, nIter +
2db10 20 6e 49 6e 4d 75 6c 29 3b 0a 20 20 20 20 70 4e   nInMul);.    pN
2db20 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64  ew->nOut = saved
2db30 5f 6e 4f 75 74 3b 0a 20 20 20 20 70 4e 65 77 2d  _nOut;.    pNew-
2db40 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73  >u.btree.nEq = s
2db50 61 76 65 64 5f 6e 45 71 3b 0a 20 20 20 20 70 4e  aved_nEq;.    pN
2db60 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 73 61 76 65  ew->nSkip = save
2db70 64 5f 6e 53 6b 69 70 3b 0a 20 20 20 20 70 4e 65  d_nSkip;.    pNe
2db80 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76  w->wsFlags = sav
2db90 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 7d 0a  ed_wsFlags;.  }.
2dba0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2dbb0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 72  ./*.** Return Tr
2dbc0 75 65 20 69 66 20 69 74 20 69 73 20 70 6f 73 73  ue if it is poss
2dbd0 69 62 6c 65 20 74 68 61 74 20 70 49 6e 64 65 78  ible that pIndex
2dbe0 20 6d 69 67 68 74 20 62 65 20 75 73 65 66 75 6c   might be useful
2dbf0 20 69 6e 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74   in.** implement
2dc00 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42 59  ing the ORDER BY
2dc10 20 63 6c 61 75 73 65 20 69 6e 20 70 42 75 69 6c   clause in pBuil
2dc20 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  der..**.** Retur
2dc30 6e 20 46 61 6c 73 65 20 69 66 20 70 42 75 69 6c  n False if pBuil
2dc40 64 65 72 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  der does not con
2dc50 74 61 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59  tain an ORDER BY
2dc60 20 63 6c 61 75 73 65 20 6f 72 0a 2a 2a 20 69 66   clause or.** if
2dc70 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79   there is no way
2dc80 20 66 6f 72 20 70 49 6e 64 65 78 20 74 6f 20 62   for pIndex to b
2dc90 65 20 75 73 65 66 75 6c 20 69 6e 20 69 6d 70 6c  e useful in impl
2dca0 65 6d 65 6e 74 69 6e 67 20 74 68 61 74 0a 2a 2a  ementing that.**
2dcb0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2dcc0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2dcd0 69 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69  indexMightHelpWi
2dce0 74 68 4f 72 64 65 72 42 79 28 0a 20 20 57 68 65  thOrderBy(.  Whe
2dcf0 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
2dd00 42 75 69 6c 64 65 72 2c 0a 20 20 49 6e 64 65 78  Builder,.  Index
2dd10 20 2a 70 49 6e 64 65 78 2c 0a 20 20 69 6e 74 20   *pIndex,.  int 
2dd20 69 43 75 72 73 6f 72 0a 29 7b 0a 20 20 45 78 70  iCursor.){.  Exp
2dd30 72 4c 69 73 74 20 2a 70 4f 42 3b 0a 20 20 69 6e  rList *pOB;.  in
2dd40 74 20 69 69 2c 20 6a 6a 3b 0a 0a 20 20 69 66 28  t ii, jj;..  if(
2dd50 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65   pIndex->bUnorde
2dd60 72 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  red ) return 0;.
2dd70 20 20 69 66 28 20 28 70 4f 42 20 3d 20 70 42 75    if( (pOB = pBu
2dd80 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70  ilder->pWInfo->p
2dd90 4f 72 64 65 72 42 79 29 3d 3d 30 20 29 20 72 65  OrderBy)==0 ) re
2dda0 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 69  turn 0;.  for(ii
2ddb0 3d 30 3b 20 69 69 3c 70 4f 42 2d 3e 6e 45 78 70  =0; ii<pOB->nExp
2ddc0 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 45 78  r; ii++){.    Ex
2ddd0 70 72 20 2a 70 45 78 70 72 20 3d 20 73 71 6c 69  pr *pExpr = sqli
2dde0 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
2ddf0 74 65 28 70 4f 42 2d 3e 61 5b 69 69 5d 2e 70 45  te(pOB->a[ii].pE
2de00 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 45  xpr);.    if( pE
2de10 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
2de20 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  MN ) return 0;. 
2de30 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54     if( pExpr->iT
2de40 61 62 6c 65 3d 3d 69 43 75 72 73 6f 72 20 29 7b  able==iCursor ){
2de50 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
2de60 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65  ->iColumn<0 ) re
2de70 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 66 6f  turn 1;.      fo
2de80 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65  r(jj=0; jj<pInde
2de90 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 6a 2b 2b  x->nKeyCol; jj++
2dea0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
2deb0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70  Expr->iColumn==p
2dec0 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
2ded0 6a 6a 5d 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  jj] ) return 1;.
2dee0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2def0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
2df00 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
2df10 62 69 74 6d 61 73 6b 20 77 68 65 72 65 20 31 73  bitmask where 1s
2df20 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
2df30 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
2df40 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68   column of.** th
2df50 65 20 74 61 62 6c 65 20 69 73 20 75 73 65 64 20  e table is used 
2df60 62 79 20 61 6e 20 69 6e 64 65 78 2e 20 20 4f 6e  by an index.  On
2df70 6c 79 20 74 68 65 20 66 69 72 73 74 20 36 33 20  ly the first 63 
2df80 63 6f 6c 75 6d 6e 73 20 61 72 65 20 63 6f 6e 73  columns are cons
2df90 69 64 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  idered..*/.stati
2dfa0 63 20 42 69 74 6d 61 73 6b 20 63 6f 6c 75 6d 6e  c Bitmask column
2dfb0 73 49 6e 49 6e 64 65 78 28 49 6e 64 65 78 20 2a  sInIndex(Index *
2dfc0 70 49 64 78 29 7b 0a 20 20 42 69 74 6d 61 73 6b  pIdx){.  Bitmask
2dfd0 20 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b   m = 0;.  int j;
2dfe0 0a 20 20 66 6f 72 28 6a 3d 70 49 64 78 2d 3e 6e  .  for(j=pIdx->n
2dff0 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b 20  Column-1; j>=0; 
2e000 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 78 20  j--){.    int x 
2e010 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
2e020 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 78 3e 3d  [j];.    if( x>=
2e030 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  0 ){.      testc
2e040 61 73 65 28 20 78 3d 3d 42 4d 53 2d 31 20 29 3b  ase( x==BMS-1 );
2e050 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2e060 20 78 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 20   x==BMS-2 );.   
2e070 20 20 20 69 66 28 20 78 3c 42 4d 53 2d 31 20 29     if( x<BMS-1 )
2e080 20 6d 20 7c 3d 20 4d 41 53 4b 42 49 54 28 78 29   m |= MASKBIT(x)
2e090 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2e0a0 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 20 43 68  turn m;.}../* Ch
2e0b0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 20  eck to see if a 
2e0c0 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20 77 69  partial index wi
2e0d0 74 68 20 70 50 61 72 74 49 6e 64 65 78 57 68 65  th pPartIndexWhe
2e0e0 72 65 20 63 61 6e 20 62 65 20 75 73 65 64 0a 2a  re can be used.*
2e0f0 2a 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  * in the current
2e100 20 71 75 65 72 79 2e 20 20 52 65 74 75 72 6e 20   query.  Return 
2e110 74 72 75 65 20 69 66 20 69 74 20 63 61 6e 20 62  true if it can b
2e120 65 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 6e  e and false if n
2e130 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ot..*/.static in
2e140 74 20 77 68 65 72 65 55 73 61 62 6c 65 50 61 72  t whereUsablePar
2e150 74 69 61 6c 49 6e 64 65 78 28 69 6e 74 20 69 54  tialIndex(int iT
2e160 61 62 2c 20 57 68 65 72 65 43 6c 61 75 73 65 20  ab, WhereClause 
2e170 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 57 68 65  *pWC, Expr *pWhe
2e180 72 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  re){.  int i;.  
2e190 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
2e1a0 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 54 65  ;.  for(i=0, pTe
2e1b0 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43  rm=pWC->a; i<pWC
2e1c0 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54  ->nTerm; i++, pT
2e1d0 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  erm++){.    Expr
2e1e0 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d   *pExpr = pTerm-
2e1f0 3e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  >pExpr;.    if( 
2e200 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69  sqlite3ExprImpli
2e210 65 73 45 78 70 72 28 70 45 78 70 72 2c 20 70 57  esExpr(pExpr, pW
2e220 68 65 72 65 2c 20 69 54 61 62 29 20 0a 20 20 20  here, iTab) .   
2e230 20 20 26 26 20 28 21 45 78 70 72 48 61 73 50 72    && (!ExprHasPr
2e240 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
2e250 5f 46 72 6f 6d 4a 6f 69 6e 29 20 7c 7c 20 70 45  _FromJoin) || pE
2e260 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54  xpr->iRightJoinT
2e270 61 62 6c 65 3d 3d 69 54 61 62 29 0a 20 20 20 20  able==iTab).    
2e280 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2e290 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
2e2a0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
2e2b0 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c  * Add all WhereL
2e2c0 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20  oop objects for 
2e2d0 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 6f  a single table o
2e2e0 66 20 74 68 65 20 6a 6f 69 6e 20 77 68 65 72 65  f the join where
2e2f0 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 69 73   the table.** is
2e300 20 69 64 65 6e 66 69 65 64 20 62 79 20 70 42 75   idenfied by pBu
2e310 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61  ilder->pNew->iTa
2e320 62 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20 69  b.  That table i
2e330 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
2e340 62 65 0a 2a 2a 20 61 20 62 2d 74 72 65 65 20 74  be.** a b-tree t
2e350 61 62 6c 65 2c 20 6e 6f 74 20 61 20 76 69 72 74  able, not a virt
2e360 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  ual table..**.**
2e370 20 54 68 65 20 63 6f 73 74 73 20 28 57 68 65 72   The costs (Wher
2e380 65 4c 6f 6f 70 2e 72 52 75 6e 29 20 6f 66 20 74  eLoop.rRun) of t
2e390 68 65 20 62 2d 74 72 65 65 20 6c 6f 6f 70 73 20  he b-tree loops 
2e3a0 61 64 64 65 64 20 62 79 20 74 68 69 73 20 66 75  added by this fu
2e3b0 6e 63 74 69 6f 6e 0a 2a 2a 20 61 72 65 20 63 61  nction.** are ca
2e3c0 6c 63 75 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c  lculated as foll
2e3d0 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61  ows:.**.** For a
2e3e0 20 66 75 6c 6c 20 73 63 61 6e 2c 20 61 73 73 75   full scan, assu
2e3f0 6d 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20 28  ming the table (
2e400 6f 72 20 69 6e 64 65 78 29 20 63 6f 6e 74 61 69  or index) contai
2e410 6e 73 20 6e 52 6f 77 20 72 6f 77 73 3a 0a 2a 2a  ns nRow rows:.**
2e420 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e  .**     cost = n
2e430 52 6f 77 20 2a 20 33 2e 30 20 20 20 20 20 20 20  Row * 3.0       
2e440 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
2e450 66 75 6c 6c 2d 74 61 62 6c 65 20 73 63 61 6e 0a  full-table scan.
2e460 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 52  **     cost = nR
2e470 6f 77 20 2a 20 4b 20 20 20 20 20 20 20 20 20 20  ow * K          
2e480 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 73              // s
2e490 63 61 6e 20 6f 66 20 63 6f 76 65 72 69 6e 67 20  can of covering 
2e4a0 69 6e 64 65 78 0a 2a 2a 20 20 20 20 20 63 6f 73  index.**     cos
2e4b0 74 20 3d 20 6e 52 6f 77 20 2a 20 28 4b 2b 33 2e  t = nRow * (K+3.
2e4c0 30 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0)              
2e4d0 20 20 2f 2f 20 73 63 61 6e 20 6f 66 20 6e 6f 6e    // scan of non
2e4e0 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a  -covering index.
2e4f0 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 4b 20 69 73  **.** where K is
2e500 20 61 20 76 61 6c 75 65 20 62 65 74 77 65 65 6e   a value between
2e510 20 31 2e 31 20 61 6e 64 20 33 2e 30 20 73 65 74   1.1 and 3.0 set
2e520 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65   based on the re
2e530 6c 61 74 69 76 65 20 0a 2a 2a 20 65 73 74 69 6d  lative .** estim
2e540 61 74 65 64 20 61 76 65 72 61 67 65 20 73 69 7a  ated average siz
2e550 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61  e of the index a
2e560 6e 64 20 74 61 62 6c 65 20 72 65 63 6f 72 64 73  nd table records
2e570 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69  ..**.** For an i
2e580 6e 64 65 78 20 73 63 61 6e 2c 20 77 68 65 72 65  ndex scan, where
2e590 20 6e 56 69 73 69 74 20 69 73 20 74 68 65 20 6e   nVisit is the n
2e5a0 75 6d 62 65 72 20 6f 66 20 69 6e 64 65 78 20 72  umber of index r
2e5b0 6f 77 73 20 76 69 73 69 74 65 64 0a 2a 2a 20 62  ows visited.** b
2e5c0 79 20 74 68 65 20 73 63 61 6e 2c 20 61 6e 64 20  y the scan, and 
2e5d0 6e 53 65 65 6b 20 69 73 20 74 68 65 20 6e 75 6d  nSeek is the num
2e5e0 62 65 72 20 6f 66 20 73 65 65 6b 20 6f 70 65 72  ber of seek oper
2e5f0 61 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20  ations required 
2e600 6f 6e 20 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78  on .** the index
2e610 20 62 2d 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20   b-tree:.**.**  
2e620 20 20 20 63 6f 73 74 20 3d 20 6e 53 65 65 6b 20     cost = nSeek 
2e630 2a 20 28 6c 6f 67 28 6e 52 6f 77 29 20 2b 20 4b  * (log(nRow) + K
2e640 20 2a 20 6e 56 69 73 69 74 29 20 20 20 20 20 20   * nVisit)      
2e650 20 20 20 20 2f 2f 20 63 6f 76 65 72 69 6e 67 20      // covering 
2e660 69 6e 64 65 78 0a 2a 2a 20 20 20 20 20 63 6f 73  index.**     cos
2e670 74 20 3d 20 6e 53 65 65 6b 20 2a 20 28 6c 6f 67  t = nSeek * (log
2e680 28 6e 52 6f 77 29 20 2b 20 28 4b 2b 33 2e 30 29  (nRow) + (K+3.0)
2e690 20 2a 20 6e 56 69 73 69 74 29 20 20 20 20 2f 2f   * nVisit)    //
2e6a0 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e   non-covering in
2e6b0 64 65 78 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c  dex.**.** Normal
2e6c0 6c 79 2c 20 6e 53 65 65 6b 20 69 73 20 31 2e 20  ly, nSeek is 1. 
2e6d0 6e 53 65 65 6b 20 76 61 6c 75 65 73 20 67 72 65  nSeek values gre
2e6e0 61 74 65 72 20 74 68 61 6e 20 31 20 63 6f 6d 65  ater than 1 come
2e6f0 20 61 62 6f 75 74 20 69 66 20 74 68 65 20 0a 2a   about if the .*
2e700 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  * WHERE clause i
2e710 6e 63 6c 75 64 65 73 20 22 78 20 49 4e 20 28 2e  ncludes "x IN (.
2e720 2e 2e 2e 29 22 20 74 65 72 6d 73 20 75 73 65 64  ...)" terms used
2e730 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 22 78 3d   in place of "x=
2e740 3f 22 2e 20 4f 72 20 77 68 65 6e 20 0a 2a 2a 20  ?". Or when .** 
2e750 69 6d 70 6c 69 63 69 74 20 22 78 20 49 4e 20 28  implicit "x IN (
2e760 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 62  SELECT x FROM tb
2e770 6c 29 22 20 74 65 72 6d 73 20 61 72 65 20 61 64  l)" terms are ad
2e780 64 65 64 20 66 6f 72 20 73 6b 69 70 2d 73 63 61  ded for skip-sca
2e790 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73  ns..**.** The es
2e7a0 74 69 6d 61 74 65 64 20 76 61 6c 75 65 73 20 28  timated values (
2e7b0 6e 52 6f 77 2c 20 6e 56 69 73 69 74 2c 20 6e 53  nRow, nVisit, nS
2e7c0 65 65 6b 29 20 6f 66 74 65 6e 20 63 6f 6e 74 61  eek) often conta
2e7d0 69 6e 20 61 20 6c 61 72 67 65 20 61 6d 6f 75 6e  in a large amoun
2e7e0 74 0a 2a 2a 20 6f 66 20 75 6e 63 65 72 74 61 69  t.** of uncertai
2e7f0 6e 74 79 2e 20 20 46 6f 72 20 74 68 69 73 20 72  nty.  For this r
2e800 65 61 73 6f 6e 2c 20 73 63 6f 72 69 6e 67 20 69  eason, scoring i
2e810 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20 70 69  s designed to pi
2e820 63 6b 20 70 6c 61 6e 73 20 74 68 61 74 0a 2a 2a  ck plans that.**
2e830 20 22 64 6f 20 74 68 65 20 6c 65 61 73 74 20 68   "do the least h
2e840 61 72 6d 22 20 69 66 20 74 68 65 20 65 73 74 69  arm" if the esti
2e850 6d 61 74 65 73 20 61 72 65 20 69 6e 61 63 63 75  mates are inaccu
2e860 72 61 74 65 2e 20 20 46 6f 72 20 65 78 61 6d 70  rate.  For examp
2e870 6c 65 2c 20 61 0a 2a 2a 20 6c 6f 67 28 6e 52 6f  le, a.** log(nRo
2e880 77 29 20 66 61 63 74 6f 72 20 69 73 20 6f 6d 69  w) factor is omi
2e890 74 74 65 64 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d  tted from a non-
2e8a0 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 73  covering index s
2e8b0 63 61 6e 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a  can in order to.
2e8c0 2a 2a 20 62 69 61 73 20 74 68 65 20 73 63 6f 72  ** bias the scor
2e8d0 69 6e 67 20 69 6e 20 66 61 76 6f 72 20 6f 66 20  ing in favor of 
2e8e0 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 2c 20  using an index, 
2e8f0 73 69 6e 63 65 20 74 68 65 20 77 6f 72 73 74 2d  since the worst-
2e900 63 61 73 65 0a 2a 2a 20 70 65 72 66 6f 72 6d 61  case.** performa
2e910 6e 63 65 20 6f 66 20 75 73 69 6e 67 20 61 6e 20  nce of using an 
2e920 69 6e 64 65 78 20 69 73 20 66 61 72 20 62 65 74  index is far bet
2e930 74 65 72 20 74 68 61 6e 20 74 68 65 20 77 6f 72  ter than the wor
2e940 73 74 2d 63 61 73 65 20 70 65 72 66 6f 72 6d 61  st-case performa
2e950 6e 63 65 0a 2a 2a 20 6f 66 20 61 20 66 75 6c 6c  nce.** of a full
2e960 20 74 61 62 6c 65 20 73 63 61 6e 2e 0a 2a 2f 0a   table scan..*/.
2e970 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
2e980 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 0a 20 20  LoopAddBtree(.  
2e990 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
2e9a0 20 2a 70 42 75 69 6c 64 65 72 2c 20 2f 2a 20 57   *pBuilder, /* W
2e9b0 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 66 6f  HERE clause info
2e9c0 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74  rmation */.  Bit
2e9d0 6d 61 73 6b 20 6d 45 78 74 72 61 20 20 20 20 20  mask mExtra     
2e9e0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
2e9f0 61 20 70 72 65 72 65 71 75 65 73 69 74 65 73 20  a prerequesites 
2ea00 66 6f 72 20 75 73 69 6e 67 20 74 68 69 73 20 74  for using this t
2ea10 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65  able */.){.  Whe
2ea20 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20  reInfo *pWInfo; 
2ea30 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52           /* WHER
2ea40 45 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65  E analysis conte
2ea50 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  xt */.  Index *p
2ea60 50 72 6f 62 65 3b 20 20 20 20 20 20 20 20 20 20  Probe;          
2ea70 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20      /* An index 
2ea80 77 65 20 61 72 65 20 65 76 61 6c 75 61 74 69 6e  we are evaluatin
2ea90 67 20 2a 2f 0a 20 20 49 6e 64 65 78 20 73 50 6b  g */.  Index sPk
2eaa0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2eab0 20 20 20 2f 2a 20 41 20 66 61 6b 65 20 69 6e 64     /* A fake ind
2eac0 65 78 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68  ex object for th
2ead0 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f  e primary key */
2eae0 0a 20 20 4c 6f 67 45 73 74 20 61 69 52 6f 77 45  .  LogEst aiRowE
2eaf0 73 74 50 6b 5b 32 5d 3b 20 20 20 20 20 20 20 2f  stPk[2];       /
2eb00 2a 20 54 68 65 20 61 69 52 6f 77 4c 6f 67 45 73  * The aiRowLogEs
2eb10 74 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68  t[] value for th
2eb20 65 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20  e sPk index */. 
2eb30 20 69 31 36 20 61 69 43 6f 6c 75 6d 6e 50 6b 20   i16 aiColumnPk 
2eb40 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 2f 2a 20  = -1;        /* 
2eb50 54 68 65 20 61 43 6f 6c 75 6d 6e 5b 5d 20 76 61  The aColumn[] va
2eb60 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20  lue for the sPk 
2eb70 69 6e 64 65 78 20 2a 2f 0a 20 20 53 72 63 4c 69  index */.  SrcLi
2eb80 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20  st *pTabList;   
2eb90 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52         /* The FR
2eba0 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  OM clause */.  s
2ebb0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2ebc0 65 6d 20 2a 70 53 72 63 3b 20 20 2f 2a 20 54 68  em *pSrc;  /* Th
2ebd0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 62 74  e FROM clause bt
2ebe0 72 65 65 20 74 65 72 6d 20 74 6f 20 61 64 64 20  ree term to add 
2ebf0 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
2ec00 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  pNew;           
2ec10 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20 57 68 65   /* Template Whe
2ec20 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f  reLoop object */
2ec30 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2ec40 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f  TE_OK;         /
2ec50 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
2ec60 0a 20 20 69 6e 74 20 69 53 6f 72 74 49 64 78 20  .  int iSortIdx 
2ec70 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 1;           /
2ec80 2a 20 49 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a  * Index number *
2ec90 2f 0a 20 20 69 6e 74 20 62 3b 20 20 20 20 20 20  /.  int b;      
2eca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ecb0 2f 2a 20 41 20 62 6f 6f 6c 65 61 6e 20 76 61 6c  /* A boolean val
2ecc0 75 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72  ue */.  LogEst r
2ecd0 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
2ece0 20 20 20 20 2f 2a 20 6e 75 6d 62 65 72 20 6f 66      /* number of
2ecf0 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
2ed00 6c 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72  le */.  LogEst r
2ed10 4c 6f 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20  LogSize;        
2ed20 20 20 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d      /* Logarithm
2ed30 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
2ed40 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  f rows in the ta
2ed50 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ble */.  WhereCl
2ed60 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20  ause *pWC;      
2ed70 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
2ed80 65 64 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ed WHERE clause 
2ed90 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
2eda0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2edb0 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20   /* Table being 
2edc0 71 75 65 72 69 65 64 20 2a 2f 0a 20 20 0a 20 20  queried */.  .  
2edd0 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d  pNew = pBuilder-
2ede0 3e 70 4e 65 77 3b 0a 20 20 70 57 49 6e 66 6f 20  >pNew;.  pWInfo 
2edf0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
2ee00 66 6f 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d  fo;.  pTabList =
2ee10 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
2ee20 74 3b 0a 20 20 70 53 72 63 20 3d 20 70 54 61 62  t;.  pSrc = pTab
2ee30 4c 69 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e  List->a + pNew->
2ee40 69 54 61 62 3b 0a 20 20 70 54 61 62 20 3d 20 70  iTab;.  pTab = p
2ee50 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 70 57 43  Src->pTab;.  pWC
2ee60 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43   = pBuilder->pWC
2ee70 3b 0a 20 20 61 73 73 65 72 74 28 20 21 49 73 56  ;.  assert( !IsV
2ee80 69 72 74 75 61 6c 28 70 53 72 63 2d 3e 70 54 61  irtual(pSrc->pTa
2ee90 62 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 72  b) );..  if( pSr
2eea0 63 2d 3e 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  c->pIndex ){.   
2eeb0 20 2f 2a 20 41 6e 20 49 4e 44 45 58 45 44 20 42   /* An INDEXED B
2eec0 59 20 63 6c 61 75 73 65 20 73 70 65 63 69 66 69  Y clause specifi
2eed0 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  es a particular 
2eee0 69 6e 64 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a  index to use */.
2eef0 20 20 20 20 70 50 72 6f 62 65 20 3d 20 70 53 72      pProbe = pSr
2ef00 63 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 7d 65 6c  c->pIndex;.  }el
2ef10 73 65 20 69 66 28 20 21 48 61 73 52 6f 77 69 64  se if( !HasRowid
2ef20 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 70 50  (pTab) ){.    pP
2ef30 72 6f 62 65 20 3d 20 70 54 61 62 2d 3e 70 49 6e  robe = pTab->pIn
2ef40 64 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  dex;.  }else{.  
2ef50 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f    /* There is no
2ef60 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
2ef70 73 65 2e 20 20 43 72 65 61 74 65 20 61 20 66 61  se.  Create a fa
2ef80 6b 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  ke Index object 
2ef90 69 6e 20 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20  in local.    ** 
2efa0 76 61 72 69 61 62 6c 65 20 73 50 6b 20 74 6f 20  variable sPk to 
2efb0 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 72 6f  represent the ro
2efc0 77 69 64 20 70 72 69 6d 61 72 79 20 6b 65 79 20  wid primary key 
2efd0 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 74 68 69  index.  Make thi
2efe0 73 0a 20 20 20 20 2a 2a 20 66 61 6b 65 20 69 6e  s.    ** fake in
2eff0 64 65 78 20 74 68 65 20 66 69 72 73 74 20 69 6e  dex the first in
2f000 20 61 20 63 68 61 69 6e 20 6f 66 20 49 6e 64 65   a chain of Inde
2f010 78 20 6f 62 6a 65 63 74 73 20 77 69 74 68 20 61  x objects with a
2f020 6c 6c 20 6f 66 20 74 68 65 20 72 65 61 6c 0a 20  ll of the real. 
2f030 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f     ** indices to
2f040 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 49   follow */.    I
2f050 6e 64 65 78 20 2a 70 46 69 72 73 74 3b 20 20 20  ndex *pFirst;   
2f060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f070 2a 20 46 69 72 73 74 20 6f 66 20 72 65 61 6c 20  * First of real 
2f080 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20 74  indices on the t
2f090 61 62 6c 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  able */.    mems
2f0a0 65 74 28 26 73 50 6b 2c 20 30 2c 20 73 69 7a 65  et(&sPk, 0, size
2f0b0 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20  of(Index));.    
2f0c0 73 50 6b 2e 6e 4b 65 79 43 6f 6c 20 3d 20 31 3b  sPk.nKeyCol = 1;
2f0d0 0a 20 20 20 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e  .    sPk.nColumn
2f0e0 20 3d 20 31 3b 0a 20 20 20 20 73 50 6b 2e 61 69   = 1;.    sPk.ai
2f0f0 43 6f 6c 75 6d 6e 20 3d 20 26 61 69 43 6f 6c 75  Column = &aiColu
2f100 6d 6e 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 61 69  mnPk;.    sPk.ai
2f110 52 6f 77 4c 6f 67 45 73 74 20 3d 20 61 69 52 6f  RowLogEst = aiRo
2f120 77 45 73 74 50 6b 3b 0a 20 20 20 20 73 50 6b 2e  wEstPk;.    sPk.
2f130 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 52 65 70  onError = OE_Rep
2f140 6c 61 63 65 3b 0a 20 20 20 20 73 50 6b 2e 70 54  lace;.    sPk.pT
2f150 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 20  able = pTab;.   
2f160 20 73 50 6b 2e 73 7a 49 64 78 52 6f 77 20 3d 20   sPk.szIdxRow = 
2f170 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a  pTab->szTabRow;.
2f180 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 30      aiRowEstPk[0
2f190 5d 20 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f  ] = pTab->nRowLo
2f1a0 67 45 73 74 3b 0a 20 20 20 20 61 69 52 6f 77 45  gEst;.    aiRowE
2f1b0 73 74 50 6b 5b 31 5d 20 3d 20 30 3b 0a 20 20 20  stPk[1] = 0;.   
2f1c0 20 70 46 69 72 73 74 20 3d 20 70 53 72 63 2d 3e   pFirst = pSrc->
2f1d0 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
2f1e0 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74 49    if( pSrc->notI
2f1f0 6e 64 65 78 65 64 3d 3d 30 20 29 7b 0a 20 20 20  ndexed==0 ){.   
2f200 20 20 20 2f 2a 20 54 68 65 20 72 65 61 6c 20 69     /* The real i
2f210 6e 64 69 63 65 73 20 6f 66 20 74 68 65 20 74 61  ndices of the ta
2f220 62 6c 65 20 61 72 65 20 6f 6e 6c 79 20 63 6f 6e  ble are only con
2f230 73 69 64 65 72 65 64 20 69 66 20 74 68 65 0a 20  sidered if the. 
2f240 20 20 20 20 20 2a 2a 20 4e 4f 54 20 49 4e 44 45       ** NOT INDE
2f250 58 45 44 20 71 75 61 6c 69 66 69 65 72 20 69 73  XED qualifier is
2f260 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68   omitted from th
2f270 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
2f280 0a 20 20 20 20 20 20 73 50 6b 2e 70 4e 65 78 74  .      sPk.pNext
2f290 20 3d 20 70 46 69 72 73 74 3b 0a 20 20 20 20 7d   = pFirst;.    }
2f2a0 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20 26 73  .    pProbe = &s
2f2b0 50 6b 3b 0a 20 20 7d 0a 20 20 72 53 69 7a 65 20  Pk;.  }.  rSize 
2f2c0 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45  = pTab->nRowLogE
2f2d0 73 74 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d  st;.  rLogSize =
2f2e0 20 65 73 74 4c 6f 67 28 72 53 69 7a 65 29 3b 0a   estLog(rSize);.
2f2f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2f300 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  OMIT_AUTOMATIC_I
2f310 4e 44 45 58 0a 20 20 2f 2a 20 41 75 74 6f 6d 61  NDEX.  /* Automa
2f320 74 69 63 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20  tic indexes */. 
2f330 20 69 66 28 20 21 70 42 75 69 6c 64 65 72 2d 3e   if( !pBuilder->
2f340 70 4f 72 53 65 74 0a 20 20 20 26 26 20 28 70 57  pOrSet.   && (pW
2f350 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
2f360 20 26 20 57 48 45 52 45 5f 4e 4f 5f 41 55 54 4f   & WHERE_NO_AUTO
2f370 49 4e 44 45 58 29 3d 3d 30 0a 20 20 20 26 26 20  INDEX)==0.   && 
2f380 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d  (pWInfo->pParse-
2f390 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
2f3a0 49 54 45 5f 41 75 74 6f 49 6e 64 65 78 29 21 3d  ITE_AutoIndex)!=
2f3b0 30 0a 20 20 20 26 26 20 70 53 72 63 2d 3e 70 49  0.   && pSrc->pI
2f3c0 6e 64 65 78 3d 3d 30 0a 20 20 20 26 26 20 21 70  ndex==0.   && !p
2f3d0 53 72 63 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e  Src->viaCoroutin
2f3e0 65 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e 6e  e.   && !pSrc->n
2f3f0 6f 74 49 6e 64 65 78 65 64 0a 20 20 20 26 26 20  otIndexed.   && 
2f400 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 0a 20  HasRowid(pTab). 
2f410 20 20 26 26 20 21 70 53 72 63 2d 3e 69 73 43 6f    && !pSrc->isCo
2f420 72 72 65 6c 61 74 65 64 0a 20 20 20 26 26 20 21  rrelated.   && !
2f430 70 53 72 63 2d 3e 69 73 52 65 63 75 72 73 69 76  pSrc->isRecursiv
2f440 65 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 47 65  e.  ){.    /* Ge
2f450 6e 65 72 61 74 65 20 61 75 74 6f 2d 69 6e 64 65  nerate auto-inde
2f460 78 20 57 68 65 72 65 4c 6f 6f 70 73 20 2a 2f 0a  x WhereLoops */.
2f470 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
2f480 54 65 72 6d 3b 0a 20 20 20 20 57 68 65 72 65 54  Term;.    WhereT
2f490 65 72 6d 20 2a 70 57 43 45 6e 64 20 3d 20 70 57  erm *pWCEnd = pW
2f4a0 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72  C->a + pWC->nTer
2f4b0 6d 3b 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d  m;.    for(pTerm
2f4c0 3d 70 57 43 2d 3e 61 3b 20 72 63 3d 3d 53 51 4c  =pWC->a; rc==SQL
2f4d0 49 54 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d 3c  ITE_OK && pTerm<
2f4e0 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29  pWCEnd; pTerm++)
2f4f0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  {.      if( pTer
2f500 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  m->prereqRight &
2f510 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20   pNew->maskSelf 
2f520 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2f530 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69    if( termCanDri
2f540 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70  veIndex(pTerm, p
2f550 53 72 63 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  Src, 0) ){.     
2f560 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
2f570 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20  .nEq = 1;.      
2f580 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20    pNew->nSkip = 
2f590 30 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  0;.        pNew-
2f5a0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
2f5b0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  = 0;.        pNe
2f5c0 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20  w->nLTerm = 1;. 
2f5d0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54         pNew->aLT
2f5e0 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a  erm[0] = pTerm;.
2f5f0 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e          /* TUNIN
2f600 47 3a 20 4f 6e 65 2d 74 69 6d 65 20 63 6f 73 74  G: One-time cost
2f610 20 66 6f 72 20 63 6f 6d 70 75 74 69 6e 67 20 74   for computing t
2f620 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  he automatic ind
2f630 65 78 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a  ex is.        **
2f640 20 65 73 74 69 6d 61 74 65 64 20 74 6f 20 62 65   estimated to be
2f650 20 58 2a 4e 2a 6c 6f 67 32 28 4e 29 20 77 68 65   X*N*log2(N) whe
2f660 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62  re N is the numb
2f670 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 0a 20 20  er of rows in.  
2f680 20 20 20 20 20 20 2a 2a 20 74 68 65 20 74 61 62        ** the tab
2f690 6c 65 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64  le being indexed
2f6a0 20 61 6e 64 20 77 68 65 72 65 20 58 20 69 73 20   and where X is 
2f6b0 37 20 28 4c 6f 67 45 73 74 3d 32 38 29 20 66 6f  7 (LogEst=28) fo
2f6c0 72 20 6e 6f 72 6d 61 6c 0a 20 20 20 20 20 20 20  r normal.       
2f6d0 20 2a 2a 20 74 61 62 6c 65 73 20 6f 72 20 31 2e   ** tables or 1.
2f6e0 33 37 35 20 28 4c 6f 67 45 73 74 3d 34 29 20 66  375 (LogEst=4) f
2f6f0 6f 72 20 76 69 65 77 73 20 61 6e 64 20 73 75 62  or views and sub
2f700 71 75 65 72 69 65 73 2e 20 20 54 68 65 20 76 61  queries.  The va
2f710 6c 75 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  lue.        ** o
2f720 66 20 58 20 69 73 20 73 6d 61 6c 6c 65 72 20 66  f X is smaller f
2f730 6f 72 20 76 69 65 77 73 20 61 6e 64 20 73 75 62  or views and sub
2f740 71 75 65 72 69 65 73 20 73 6f 20 74 68 61 74 20  queries so that 
2f750 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65  the query planne
2f760 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 6c  r.        ** wil
2f770 6c 20 62 65 20 6d 6f 72 65 20 61 67 67 72 65 73  l be more aggres
2f780 73 69 76 65 20 61 62 6f 75 74 20 67 65 6e 65 72  sive about gener
2f790 61 74 69 6e 67 20 61 75 74 6f 6d 61 74 69 63 20  ating automatic 
2f7a0 69 6e 64 65 78 65 73 20 66 6f 72 0a 20 20 20 20  indexes for.    
2f7b0 20 20 20 20 2a 2a 20 74 68 6f 73 65 20 6f 62 6a      ** those obj
2f7c0 65 63 74 73 2c 20 73 69 6e 63 65 20 74 68 65 72  ects, since ther
2f7d0 65 20 69 73 20 6e 6f 20 6f 70 70 6f 72 74 75 6e  e is no opportun
2f7e0 69 74 79 20 74 6f 20 61 64 64 20 73 63 68 65 6d  ity to add schem
2f7f0 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64  a.        ** ind
2f800 65 78 65 73 20 6f 6e 20 73 75 62 71 75 65 72 69  exes on subqueri
2f810 65 73 20 61 6e 64 20 76 69 65 77 73 2e 20 2a 2f  es and views. */
2f820 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  .        pNew->r
2f830 53 65 74 75 70 20 3d 20 72 4c 6f 67 53 69 7a 65  Setup = rLogSize
2f840 20 2b 20 72 53 69 7a 65 20 2b 20 34 3b 0a 20 20   + rSize + 4;.  
2f850 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e        if( pTab->
2f860 70 53 65 6c 65 63 74 3d 3d 30 20 26 26 20 28 70  pSelect==0 && (p
2f870 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  Tab->tabFlags & 
2f880 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30  TF_Ephemeral)==0
2f890 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e   ){.          pN
2f8a0 65 77 2d 3e 72 53 65 74 75 70 20 2b 3d 20 32 34  ew->rSetup += 24
2f8b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2f8c0 20 20 20 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c      ApplyCostMul
2f8d0 74 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72 53  tiplier(pNew->rS
2f8e0 65 74 75 70 2c 20 70 54 61 62 2d 3e 63 6f 73 74  etup, pTab->cost
2f8f0 4d 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 2f  Mult);.        /
2f900 2a 20 54 55 4e 49 4e 47 3a 20 45 61 63 68 20 69  * TUNING: Each i
2f910 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 79 69 65 6c  ndex lookup yiel
2f920 64 73 20 32 30 20 72 6f 77 73 20 69 6e 20 74 68  ds 20 rows in th
2f930 65 20 74 61 62 6c 65 2e 20 20 54 68 69 73 0a 20  e table.  This. 
2f940 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6d 6f 72         ** is mor
2f950 65 20 74 68 61 6e 20 74 68 65 20 75 73 75 61 6c  e than the usual
2f960 20 67 75 65 73 73 20 6f 66 20 31 30 20 72 6f 77   guess of 10 row
2f970 73 2c 20 73 69 6e 63 65 20 77 65 20 68 61 76 65  s, since we have
2f980 20 6e 6f 20 77 61 79 0a 20 20 20 20 20 20 20 20   no way.        
2f990 2a 2a 20 6f 66 20 6b 6e 6f 77 69 6e 67 20 68 6f  ** of knowing ho
2f9a0 77 20 73 65 6c 65 63 74 69 76 65 20 74 68 65 20  w selective the 
2f9b0 69 6e 64 65 78 20 77 69 6c 6c 20 75 6c 74 69 6d  index will ultim
2f9c0 61 74 65 6c 79 20 62 65 2e 20 20 49 74 20 77 6f  ately be.  It wo
2f9d0 75 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  uld.        ** n
2f9e0 6f 74 20 62 65 20 75 6e 72 65 61 73 6f 6e 61 62  ot be unreasonab
2f9f0 6c 65 20 74 6f 20 6d 61 6b 65 20 74 68 69 73 20  le to make this 
2fa00 76 61 6c 75 65 20 6d 75 63 68 20 6c 61 72 67 65  value much large
2fa10 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e  r. */.        pN
2fa20 65 77 2d 3e 6e 4f 75 74 20 3d 20 34 33 3b 20 20  ew->nOut = 43;  
2fa30 61 73 73 65 72 74 28 20 34 33 3d 3d 73 71 6c 69  assert( 43==sqli
2fa40 74 65 33 4c 6f 67 45 73 74 28 32 30 29 20 29 3b  te3LogEst(20) );
2fa50 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  .        pNew->r
2fa60 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Run = sqlite3Log
2fa70 45 73 74 41 64 64 28 72 4c 6f 67 53 69 7a 65 2c  EstAdd(rLogSize,
2fa80 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20  pNew->nOut);.   
2fa90 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
2faa0 67 73 20 3d 20 57 48 45 52 45 5f 41 55 54 4f 5f  gs = WHERE_AUTO_
2fab0 49 4e 44 45 58 3b 0a 20 20 20 20 20 20 20 20 70  INDEX;.        p
2fac0 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45  New->prereq = mE
2fad0 78 74 72 61 20 7c 20 70 54 65 72 6d 2d 3e 70 72  xtra | pTerm->pr
2fae0 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20  ereqRight;.     
2faf0 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
2fb00 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72  pInsert(pBuilder
2fb10 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d  , pNew);.      }
2fb20 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
2fb30 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
2fb40 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58  _AUTOMATIC_INDEX
2fb50 20 2a 2f 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f   */..  /* Loop o
2fb60 76 65 72 20 61 6c 6c 20 69 6e 64 69 63 65 73 0a  ver all indices.
2fb70 20 20 2a 2f 0a 20 20 66 6f 72 28 3b 20 72 63 3d    */.  for(; rc=
2fb80 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
2fb90 72 6f 62 65 3b 20 70 50 72 6f 62 65 3d 70 50 72  robe; pProbe=pPr
2fba0 6f 62 65 2d 3e 70 4e 65 78 74 2c 20 69 53 6f 72  obe->pNext, iSor
2fbb0 74 49 64 78 2b 2b 29 7b 0a 20 20 20 20 69 66 28  tIdx++){.    if(
2fbc0 20 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49 64   pProbe->pPartId
2fbd0 78 57 68 65 72 65 21 3d 30 0a 20 20 20 20 20 26  xWhere!=0.     &
2fbe0 26 20 21 77 68 65 72 65 55 73 61 62 6c 65 50 61  & !whereUsablePa
2fbf0 72 74 69 61 6c 49 6e 64 65 78 28 70 53 72 63 2d  rtialIndex(pSrc-
2fc00 3e 69 43 75 72 73 6f 72 2c 20 70 57 43 2c 20 70  >iCursor, pWC, p
2fc10 50 72 6f 62 65 2d 3e 70 50 61 72 74 49 64 78 57  Probe->pPartIdxW
2fc20 68 65 72 65 29 20 29 7b 0a 20 20 20 20 20 20 74  here) ){.      t
2fc30 65 73 74 63 61 73 65 28 20 70 4e 65 77 2d 3e 69  estcase( pNew->i
2fc40 54 61 62 21 3d 70 53 72 63 2d 3e 69 43 75 72 73  Tab!=pSrc->iCurs
2fc50 6f 72 20 29 3b 20 20 2f 2a 20 53 65 65 20 74 69  or );  /* See ti
2fc60 63 6b 65 74 20 5b 39 38 64 39 37 33 62 38 66 35  cket [98d973b8f5
2fc70 5d 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69  ] */.      conti
2fc80 6e 75 65 3b 20 20 2f 2a 20 50 61 72 74 69 61 6c  nue;  /* Partial
2fc90 20 69 6e 64 65 78 20 69 6e 61 70 70 72 6f 70 72   index inappropr
2fca0 69 61 74 65 20 66 6f 72 20 74 68 69 73 20 71 75  iate for this qu
2fcb0 65 72 79 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ery */.    }.   
2fcc0 20 72 53 69 7a 65 20 3d 20 70 50 72 6f 62 65 2d   rSize = pProbe-
2fcd0 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b  >aiRowLogEst[0];
2fce0 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  .    pNew->u.btr
2fcf0 65 65 2e 6e 45 71 20 3d 20 30 3b 0a 20 20 20 20  ee.nEq = 0;.    
2fd00 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b  pNew->nSkip = 0;
2fd10 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  .    pNew->nLTer
2fd20 6d 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  m = 0;.    pNew-
2fd30 3e 69 53 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20  >iSortIdx = 0;. 
2fd40 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20     pNew->rSetup 
2fd50 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  = 0;.    pNew->p
2fd60 72 65 72 65 71 20 3d 20 6d 45 78 74 72 61 3b 0a  rereq = mExtra;.
2fd70 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
2fd80 20 72 53 69 7a 65 3b 0a 20 20 20 20 70 4e 65 77   rSize;.    pNew
2fd90 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
2fda0 20 3d 20 70 50 72 6f 62 65 3b 0a 20 20 20 20 62   = pProbe;.    b
2fdb0 20 3d 20 69 6e 64 65 78 4d 69 67 68 74 48 65 6c   = indexMightHel
2fdc0 70 57 69 74 68 4f 72 64 65 72 42 79 28 70 42 75  pWithOrderBy(pBu
2fdd0 69 6c 64 65 72 2c 20 70 50 72 6f 62 65 2c 20 70  ilder, pProbe, p
2fde0 53 72 63 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  Src->iCursor);. 
2fdf0 20 20 20 2f 2a 20 54 68 65 20 4f 4e 45 50 41 53     /* The ONEPAS
2fe00 53 5f 44 45 53 49 52 45 44 20 66 6c 61 67 73 20  S_DESIRED flags 
2fe10 6e 65 76 65 72 20 6f 63 63 75 72 73 20 74 6f 67  never occurs tog
2fe20 65 74 68 65 72 20 77 69 74 68 20 4f 52 44 45 52  ether with ORDER
2fe30 20 42 59 20 2a 2f 0a 20 20 20 20 61 73 73 65 72   BY */.    asser
2fe40 74 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  t( (pWInfo->wctr
2fe50 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
2fe60 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d  NEPASS_DESIRED)=
2fe70 3d 30 20 7c 7c 20 62 3d 3d 30 20 29 3b 0a 20 20  =0 || b==0 );.  
2fe80 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 74 6e    if( pProbe->tn
2fe90 75 6d 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  um<=0 ){.      /
2fea0 2a 20 49 6e 74 65 67 65 72 20 70 72 69 6d 61 72  * Integer primar
2feb0 79 20 6b 65 79 20 69 6e 64 65 78 20 2a 2f 0a 20  y key index */. 
2fec0 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
2fed0 67 73 20 3d 20 57 48 45 52 45 5f 49 50 4b 3b 0a  gs = WHERE_IPK;.
2fee0 0a 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 74  .      /* Full t
2fef0 61 62 6c 65 20 73 63 61 6e 20 2a 2f 0a 20 20 20  able scan */.   
2ff00 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64     pNew->iSortId
2ff10 78 20 3d 20 62 20 3f 20 69 53 6f 72 74 49 64 78  x = b ? iSortIdx
2ff20 20 3a 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20 54   : 0;.      /* T
2ff30 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 66  UNING: Cost of f
2ff40 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 69  ull table scan i
2ff50 73 20 28 4e 2a 33 2e 30 29 2e 20 2a 2f 0a 20 20  s (N*3.0). */.  
2ff60 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
2ff70 20 72 53 69 7a 65 20 2b 20 31 36 3b 0a 20 20 20   rSize + 16;.   
2ff80 20 20 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74     ApplyCostMult
2ff90 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72 52 75  iplier(pNew->rRu
2ffa0 6e 2c 20 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c  n, pTab->costMul
2ffb0 74 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c  t);.      whereL
2ffc0 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28  oopOutputAdjust(
2ffd0 70 57 43 2c 20 70 4e 65 77 2c 20 72 53 69 7a 65  pWC, pNew, rSize
2ffe0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68  );.      rc = wh
2fff0 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42  ereLoopInsert(pB
30000 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20  uilder, pNew);. 
30010 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
30020 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 69  = rSize;.      i
30030 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20  f( rc ) break;. 
30040 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30050 42 69 74 6d 61 73 6b 20 6d 3b 0a 20 20 20 20 20  Bitmask m;.     
30060 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 69 73 43   if( pProbe->isC
30070 6f 76 65 72 69 6e 67 20 29 7b 0a 20 20 20 20 20  overing ){.     
30080 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
30090 20 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   = WHERE_IDX_ONL
300a0 59 20 7c 20 57 48 45 52 45 5f 49 4e 44 45 58 45  Y | WHERE_INDEXE
300b0 44 3b 0a 20 20 20 20 20 20 20 20 6d 20 3d 20 30  D;.        m = 0
300c0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
300d0 20 20 20 20 20 20 20 6d 20 3d 20 70 53 72 63 2d         m = pSrc-
300e0 3e 63 6f 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75  >colUsed & ~colu
300f0 6d 6e 73 49 6e 49 6e 64 65 78 28 70 50 72 6f 62  mnsInIndex(pProb
30100 65 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  e);.        pNew
30110 2d 3e 77 73 46 6c 61 67 73 20 3d 20 28 6d 3d 3d  ->wsFlags = (m==
30120 30 29 20 3f 20 28 57 48 45 52 45 5f 49 44 58 5f  0) ? (WHERE_IDX_
30130 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 4e 44 45 58  ONLY|WHERE_INDEX
30140 45 44 29 20 3a 20 57 48 45 52 45 5f 49 4e 44 45  ED) : WHERE_INDE
30150 58 45 44 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  XED;.      }..  
30160 20 20 20 20 2f 2a 20 46 75 6c 6c 20 73 63 61 6e      /* Full scan
30170 20 76 69 61 20 69 6e 64 65 78 20 2a 2f 0a 20 20   via index */.  
30180 20 20 20 20 69 66 28 20 62 0a 20 20 20 20 20 20      if( b.      
30190 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 54   || !HasRowid(pT
301a0 61 62 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 20  ab).       || ( 
301b0 6d 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  m==0.         &&
301c0 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65   pProbe->bUnorde
301d0 72 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  red==0.         
301e0 26 26 20 28 70 50 72 6f 62 65 2d 3e 73 7a 49 64  && (pProbe->szId
301f0 78 52 6f 77 3c 70 54 61 62 2d 3e 73 7a 54 61 62  xRow<pTab->szTab
30200 52 6f 77 29 0a 20 20 20 20 20 20 20 20 20 26 26  Row).         &&
30210 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
30220 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
30230 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30  PASS_DESIRED)==0
30240 0a 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c  .         && sql
30250 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
30260 2e 62 55 73 65 43 69 73 0a 20 20 20 20 20 20 20  .bUseCis.       
30270 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f    && Optimizatio
30280 6e 45 6e 61 62 6c 65 64 28 70 57 49 6e 66 6f 2d  nEnabled(pWInfo-
30290 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c  >pParse->db, SQL
302a0 49 54 45 5f 43 6f 76 65 72 49 64 78 53 63 61 6e  ITE_CoverIdxScan
302b0 29 0a 20 20 20 20 20 20 20 20 20 20 29 0a 20 20  ).          ).  
302c0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70      ){.        p
302d0 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20  New->iSortIdx = 
302e0 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a 20 30  b ? iSortIdx : 0
302f0 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;..        /* Th
30300 65 20 63 6f 73 74 20 6f 66 20 76 69 73 69 74 69  e cost of visiti
30310 6e 67 20 74 68 65 20 69 6e 64 65 78 20 72 6f 77  ng the index row
30320 73 20 69 73 20 4e 2a 4b 2c 20 77 68 65 72 65 20  s is N*K, where 
30330 4b 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  K is.        ** 
30340 62 65 74 77 65 65 6e 20 31 2e 31 20 61 6e 64 20  between 1.1 and 
30350 33 2e 30 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f  3.0, depending o
30360 6e 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 73  n the relative s
30370 69 7a 65 73 20 6f 66 20 74 68 65 0a 20 20 20 20  izes of the.    
30380 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 61 6e 64      ** index and
30390 20 74 61 62 6c 65 20 72 6f 77 73 2e 20 49 66 20   table rows. If 
303a0 74 68 69 73 20 69 73 20 61 20 6e 6f 6e 2d 63 6f  this is a non-co
303b0 76 65 72 69 6e 67 20 69 6e 64 65 78 20 73 63 61  vering index sca
303c0 6e 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  n,.        ** al
303d0 73 6f 20 61 64 64 20 74 68 65 20 63 6f 73 74 20  so add the cost 
303e0 6f 66 20 76 69 73 69 74 69 6e 67 20 74 61 62 6c  of visiting tabl
303f0 65 20 72 6f 77 73 20 28 4e 2a 33 2e 30 29 2e 20  e rows (N*3.0). 
30400 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77   */.        pNew
30410 2d 3e 72 52 75 6e 20 3d 20 72 53 69 7a 65 20 2b  ->rRun = rSize +
30420 20 31 20 2b 20 28 31 35 2a 70 50 72 6f 62 65 2d   1 + (15*pProbe-
30430 3e 73 7a 49 64 78 52 6f 77 29 2f 70 54 61 62 2d  >szIdxRow)/pTab-
30440 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20 20  >szTabRow;.     
30450 20 20 20 69 66 28 20 6d 21 3d 30 20 29 7b 0a 20     if( m!=0 ){. 
30460 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72           pNew->r
30470 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Run = sqlite3Log
30480 45 73 74 41 64 64 28 70 4e 65 77 2d 3e 72 52 75  EstAdd(pNew->rRu
30490 6e 2c 20 72 53 69 7a 65 2b 31 36 29 3b 0a 20 20  n, rSize+16);.  
304a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
304b0 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c  ApplyCostMultipl
304c0 69 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20  ier(pNew->rRun, 
304d0 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b  pTab->costMult);
304e0 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f  .        whereLo
304f0 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28 70  opOutputAdjust(p
30500 57 43 2c 20 70 4e 65 77 2c 20 72 53 69 7a 65 29  WC, pNew, rSize)
30510 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ;.        rc = w
30520 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70  hereLoopInsert(p
30530 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a  Builder, pNew);.
30540 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f          pNew->nO
30550 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20  ut = rSize;.    
30560 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65      if( rc ) bre
30570 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
30580 7d 0a 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72  }..    rc = wher
30590 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64  eLoopAddBtreeInd
305a0 65 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72  ex(pBuilder, pSr
305b0 63 2c 20 70 50 72 6f 62 65 2c 20 30 29 3b 0a 23  c, pProbe, 0);.#
305c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
305d0 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
305e0 54 34 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74  T4.    sqlite3St
305f0 61 74 34 50 72 6f 62 65 46 72 65 65 28 70 42 75  at4ProbeFree(pBu
30600 69 6c 64 65 72 2d 3e 70 52 65 63 29 3b 0a 20 20  ilder->pRec);.  
30610 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63    pBuilder->nRec
30620 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 70  Valid = 0;.    p
30630 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20  Builder->pRec = 
30640 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f  0;.#endif..    /
30650 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61  * If there was a
30660 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  n INDEXED BY cla
30670 75 73 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 74  use, then only t
30680 68 61 74 20 6f 6e 65 20 69 6e 64 65 78 20 69 73  hat one index is
30690 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72  .    ** consider
306a0 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ed. */.    if( p
306b0 53 72 63 2d 3e 70 49 6e 64 65 78 20 29 20 62 72  Src->pIndex ) br
306c0 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
306d0 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
306e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
306f0 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20  TUALTABLE./*.** 
30700 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f  Add all WhereLoo
30710 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 20  p objects for a 
30720 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69  table of the joi
30730 6e 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 0a  n identified by.
30740 2a 2a 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65  ** pBuilder->pNe
30750 77 2d 3e 69 54 61 62 2e 20 20 54 68 61 74 20 74  w->iTab.  That t
30760 61 62 6c 65 20 69 73 20 67 75 61 72 61 6e 74 65  able is guarante
30770 65 64 20 74 6f 20 62 65 20 61 20 76 69 72 74 75  ed to be a virtu
30780 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  al table..*/.sta
30790 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
307a0 70 41 64 64 56 69 72 74 75 61 6c 28 0a 20 20 57  pAddVirtual(.  W
307b0 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
307c0 2a 70 42 75 69 6c 64 65 72 2c 20 20 2f 2a 20 57  *pBuilder,  /* W
307d0 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 66 6f  HERE clause info
307e0 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74  rmation */.  Bit
307f0 6d 61 73 6b 20 6d 45 78 74 72 61 0a 29 7b 0a 20  mask mExtra.){. 
30800 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
30810 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  fo;           /*
30820 20 57 48 45 52 45 20 61 6e 61 6c 79 73 69 73 20   WHERE analysis 
30830 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61 72  context */.  Par
30840 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20  se *pParse;     
30850 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
30860 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
30870 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
30880 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20  e *pWC;         
30890 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
308a0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
308b0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
308c0 2a 70 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20  *pSrc;   /* The 
308d0 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
308e0 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20   to search */.  
308f0 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73  Table *pTab;.  s
30900 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 71  qlite3 *db;.  sq
30910 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
30920 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 20 20 73 74   *pIdxInfo;.  st
30930 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
30940 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70  ex_constraint *p
30950 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63  IdxCons;.  struc
30960 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
30970 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65  constraint_usage
30980 20 2a 70 55 73 61 67 65 3b 0a 20 20 57 68 65 72   *pUsage;.  Wher
30990 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20  eTerm *pTerm;.  
309a0 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20  int i, j;.  int 
309b0 69 54 65 72 6d 2c 20 6d 78 54 65 72 6d 3b 0a 20  iTerm, mxTerm;. 
309c0 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74   int nConstraint
309d0 3b 0a 20 20 69 6e 74 20 73 65 65 6e 49 6e 20 3d  ;.  int seenIn =
309e0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
309f0 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20 49   /* True if an I
30a00 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 73 65  N operator is se
30a10 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 65 65 6e  en */.  int seen
30a20 56 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Var = 0;        
30a30 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
30a40 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 20 63  a non-constant c
30a50 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 73 65 65  onstraint is see
30a60 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 50 68 61 73  n */.  int iPhas
30a70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
30a80 20 20 20 20 2f 2a 20 30 3a 20 63 6f 6e 73 74 20      /* 0: const 
30a90 77 2f 6f 20 49 4e 2c 20 31 3a 20 63 6f 6e 73 74  w/o IN, 1: const
30aa0 2c 20 32 3a 20 6e 6f 20 49 4e 2c 20 20 32 3a 20  , 2: no IN,  2: 
30ab0 49 4e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  IN */.  WhereLoo
30ac0 70 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72  p *pNew;.  int r
30ad0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
30ae0 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c    pWInfo = pBuil
30af0 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70  der->pWInfo;.  p
30b00 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e  Parse = pWInfo->
30b10 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70  pParse;.  db = p
30b20 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 57 43  Parse->db;.  pWC
30b30 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43   = pBuilder->pWC
30b40 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c  ;.  pNew = pBuil
30b50 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 53 72  der->pNew;.  pSr
30b60 63 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61  c = &pWInfo->pTa
30b70 62 4c 69 73 74 2d 3e 61 5b 70 4e 65 77 2d 3e 69  bList->a[pNew->i
30b80 54 61 62 5d 3b 0a 20 20 70 54 61 62 20 3d 20 70  Tab];.  pTab = p
30b90 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 61 73 73  Src->pTab;.  ass
30ba0 65 72 74 28 20 49 73 56 69 72 74 75 61 6c 28 70  ert( IsVirtual(p
30bb0 54 61 62 29 20 29 3b 0a 20 20 70 49 64 78 49 6e  Tab) );.  pIdxIn
30bc0 66 6f 20 3d 20 61 6c 6c 6f 63 61 74 65 49 6e 64  fo = allocateInd
30bd0 65 78 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  exInfo(pParse, p
30be0 57 43 2c 20 70 53 72 63 2c 20 70 42 75 69 6c 64  WC, pSrc, pBuild
30bf0 65 72 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20  er->pOrderBy);. 
30c00 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30   if( pIdxInfo==0
30c10 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
30c20 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 4e 65 77 2d 3e  _NOMEM;.  pNew->
30c30 70 72 65 72 65 71 20 3d 20 30 3b 0a 20 20 70 4e  prereq = 0;.  pN
30c40 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a  ew->rSetup = 0;.
30c50 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
30c60 3d 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  = WHERE_VIRTUALT
30c70 41 42 4c 45 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c  ABLE;.  pNew->nL
30c80 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 4e 65 77  Term = 0;.  pNew
30c90 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
30ca0 65 20 3d 20 30 3b 0a 20 20 70 55 73 61 67 65 20  e = 0;.  pUsage 
30cb0 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  = pIdxInfo->aCon
30cc0 73 74 72 61 69 6e 74 55 73 61 67 65 3b 0a 20 20  straintUsage;.  
30cd0 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49  nConstraint = pI
30ce0 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61  dxInfo->nConstra
30cf0 69 6e 74 3b 0a 20 20 69 66 28 20 77 68 65 72 65  int;.  if( where
30d00 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70  LoopResize(db, p
30d10 4e 65 77 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  New, nConstraint
30d20 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
30d30 44 62 46 72 65 65 28 64 62 2c 20 70 49 64 78 49  DbFree(db, pIdxI
30d40 6e 66 6f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  nfo);.    return
30d50 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
30d60 20 7d 0a 0a 20 20 66 6f 72 28 69 50 68 61 73 65   }..  for(iPhase
30d70 3d 30 3b 20 69 50 68 61 73 65 3c 3d 33 3b 20 69  =0; iPhase<=3; i
30d80 50 68 61 73 65 2b 2b 29 7b 0a 20 20 20 20 69 66  Phase++){.    if
30d90 28 20 21 73 65 65 6e 49 6e 20 26 26 20 28 69 50  ( !seenIn && (iP
30da0 68 61 73 65 26 31 29 21 3d 30 20 29 7b 0a 20 20  hase&1)!=0 ){.  
30db0 20 20 20 20 69 50 68 61 73 65 2b 2b 3b 0a 20 20      iPhase++;.  
30dc0 20 20 20 20 69 66 28 20 69 50 68 61 73 65 3e 33      if( iPhase>3
30dd0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
30de0 20 20 20 20 69 66 28 20 21 73 65 65 6e 56 61 72      if( !seenVar
30df0 20 26 26 20 69 50 68 61 73 65 3e 31 20 29 20 62   && iPhase>1 ) b
30e00 72 65 61 6b 3b 0a 20 20 20 20 70 49 64 78 43 6f  reak;.    pIdxCo
30e10 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71  ns = *(struct sq
30e20 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
30e30 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e  traint**)&pIdxIn
30e40 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->aConstraint;
30e50 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
30e60 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74  pIdxInfo->nConst
30e70 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78  raint; i++, pIdx
30e80 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 20 20 6a  Cons++){.      j
30e90 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65   = pIdxCons->iTe
30ea0 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  rmOffset;.      
30eb0 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
30ec0 6a 5d 3b 0a 20 20 20 20 20 20 73 77 69 74 63 68  j];.      switch
30ed0 28 20 69 50 68 61 73 65 20 29 7b 0a 20 20 20 20  ( iPhase ){.    
30ee0 20 20 20 20 63 61 73 65 20 30 3a 20 20 20 20 2f      case 0:    /
30ef0 2a 20 43 6f 6e 73 74 61 6e 74 73 20 77 69 74 68  * Constants with
30f00 6f 75 74 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  out IN operator 
30f10 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 49 64  */.          pId
30f20 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20  xCons->usable = 
30f30 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  0;.          if(
30f40 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
30f50 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29  or & WO_IN)!=0 )
30f60 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  {.            se
30f70 65 6e 49 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  enIn = 1;.      
30f80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
30f90 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  if( pTerm->prere
30fa0 71 52 69 67 68 74 21 3d 30 20 29 7b 0a 20 20 20  qRight!=0 ){.   
30fb0 20 20 20 20 20 20 20 20 20 73 65 65 6e 56 61 72           seenVar
30fc0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
30fd0 7d 65 6c 73 65 20 69 66 28 20 28 70 54 65 72 6d  }else if( (pTerm
30fe0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
30ff0 5f 49 4e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  _IN)==0 ){.     
31000 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d         pIdxCons-
31010 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  >usable = 1;.   
31020 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31030 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
31040 20 20 63 61 73 65 20 31 3a 20 20 20 20 2f 2a 20    case 1:    /* 
31050 43 6f 6e 73 74 61 6e 74 73 20 77 69 74 68 20 49  Constants with I
31060 4e 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20  N operators */. 
31070 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
31080 20 73 65 65 6e 49 6e 20 29 3b 0a 20 20 20 20 20   seenIn );.     
31090 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75       pIdxCons->u
310a0 73 61 62 6c 65 20 3d 20 28 70 54 65 72 6d 2d 3e  sable = (pTerm->
310b0 70 72 65 72 65 71 52 69 67 68 74 3d 3d 30 29 3b  prereqRight==0);
310c0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
310d0 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 32  ;.        case 2
310e0 3a 20 20 20 20 2f 2a 20 56 61 72 69 61 62 6c 65  :    /* Variable
310f0 73 20 77 69 74 68 6f 75 74 20 49 4e 20 2a 2f 0a  s without IN */.
31100 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
31110 28 20 73 65 65 6e 56 61 72 20 29 3b 0a 20 20 20  ( seenVar );.   
31120 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d         pIdxCons-
31130 3e 75 73 61 62 6c 65 20 3d 20 28 70 54 65 72 6d  >usable = (pTerm
31140 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
31150 5f 49 4e 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20  _IN)==0;.       
31160 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
31170 20 20 64 65 66 61 75 6c 74 3a 20 20 20 2f 2a 20    default:   /* 
31180 56 61 72 69 61 62 6c 65 73 20 77 69 74 68 20 49  Variables with I
31190 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  N */.          a
311a0 73 73 65 72 74 28 20 73 65 65 6e 56 61 72 20 26  ssert( seenVar &
311b0 26 20 73 65 65 6e 49 6e 20 29 3b 0a 20 20 20 20  & seenIn );.    
311c0 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e        pIdxCons->
311d0 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  usable = 1;.    
311e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
311f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6d     }.    }.    m
31200 65 6d 73 65 74 28 70 55 73 61 67 65 2c 20 30 2c  emset(pUsage, 0,
31210 20 73 69 7a 65 6f 66 28 70 55 73 61 67 65 5b 30   sizeof(pUsage[0
31220 5d 29 2a 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f  ])*pIdxInfo->nCo
31230 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 20 20 69  nstraint);.    i
31240 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65  f( pIdxInfo->nee
31250 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 29 20  dToFreeIdxStr ) 
31260 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64  sqlite3_free(pId
31270 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a  xInfo->idxStr);.
31280 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64      pIdxInfo->id
31290 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 70 49  xStr = 0;.    pI
312a0 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d  dxInfo->idxNum =
312b0 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f   0;.    pIdxInfo
312c0 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
312d0 74 72 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78  tr = 0;.    pIdx
312e0 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e  Info->orderByCon
312f0 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20 70  sumed = 0;.    p
31300 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
31310 65 64 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f  edCost = SQLITE_
31320 42 49 47 5f 44 42 4c 20 2f 20 28 64 6f 75 62 6c  BIG_DBL / (doubl
31330 65 29 32 3b 0a 20 20 20 20 70 49 64 78 49 6e 66  e)2;.    pIdxInf
31340 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73  o->estimatedRows
31350 20 3d 20 32 35 3b 0a 20 20 20 20 72 63 20 3d 20   = 25;.    rc = 
31360 76 74 61 62 42 65 73 74 49 6e 64 65 78 28 70 50  vtabBestIndex(pP
31370 61 72 73 65 2c 20 70 54 61 62 2c 20 70 49 64 78  arse, pTab, pIdx
31380 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66 28 20 72  Info);.    if( r
31390 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f  c ) goto whereLo
313a0 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74 3b 0a  opAddVtab_exit;.
313b0 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a      pIdxCons = *
313c0 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
313d0 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
313e0 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43  **)&pIdxInfo->aC
313f0 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 70  onstraint;.    p
31400 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 45  New->prereq = mE
31410 78 74 72 61 3b 0a 20 20 20 20 6d 78 54 65 72 6d  xtra;.    mxTerm
31420 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72   = -1;.    asser
31430 74 28 20 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 3e  t( pNew->nLSlot>
31440 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 3b 0a  =nConstraint );.
31450 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
31460 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29  Constraint; i++)
31470 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d   pNew->aLTerm[i]
31480 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
31490 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20  u.vtab.omitMask 
314a0 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 0;.    for(i=0
314b0 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  ; i<nConstraint;
314c0 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b   i++, pIdxCons++
314d0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69 54  ){.      if( (iT
314e0 65 72 6d 20 3d 20 70 55 73 61 67 65 5b 69 5d 2e  erm = pUsage[i].
314f0 61 72 67 76 49 6e 64 65 78 20 2d 20 31 29 3e 3d  argvIndex - 1)>=
31500 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 20 3d  0 ){.        j =
31510 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d   pIdxCons->iTerm
31520 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  Offset;.        
31530 69 66 28 20 69 54 65 72 6d 3e 3d 6e 43 6f 6e 73  if( iTerm>=nCons
31540 74 72 61 69 6e 74 0a 20 20 20 20 20 20 20 20 20  traint.         
31550 7c 7c 20 6a 3c 30 0a 20 20 20 20 20 20 20 20 20  || j<0.         
31560 7c 7c 20 6a 3e 3d 70 57 43 2d 3e 6e 54 65 72 6d  || j>=pWC->nTerm
31570 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 4e 65  .         || pNe
31580 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d  w->aLTerm[iTerm]
31590 21 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  !=0.        ){. 
315a0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
315b0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
315c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
315d0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
315e0 73 2e 78 42 65 73 74 49 6e 64 65 78 28 29 20 6d  s.xBestIndex() m
315f0 61 6c 66 75 6e 63 74 69 6f 6e 22 2c 20 70 54 61  alfunction", pTa
31600 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
31610 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 4c       goto whereL
31620 6f 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74 3b  oopAddVtab_exit;
31630 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
31640 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65     testcase( iTe
31650 72 6d 3d 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 2d  rm==nConstraint-
31660 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  1 );.        tes
31670 74 63 61 73 65 28 20 6a 3d 3d 30 20 29 3b 0a 20  tcase( j==0 );. 
31680 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
31690 20 6a 3d 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31   j==pWC->nTerm-1
316a0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72   );.        pTer
316b0 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a  m = &pWC->a[j];.
316c0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72          pNew->pr
316d0 65 72 65 71 20 7c 3d 20 70 54 65 72 6d 2d 3e 70  ereq |= pTerm->p
316e0 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20  rereqRight;.    
316f0 20 20 20 20 61 73 73 65 72 74 28 20 69 54 65 72      assert( iTer
31700 6d 3c 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29  m<pNew->nLSlot )
31710 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
31720 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 20 3d 20  aLTerm[iTerm] = 
31730 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69  pTerm;.        i
31740 66 28 20 69 54 65 72 6d 3e 6d 78 54 65 72 6d 20  f( iTerm>mxTerm 
31750 29 20 6d 78 54 65 72 6d 20 3d 20 69 54 65 72 6d  ) mxTerm = iTerm
31760 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
31770 73 65 28 20 69 54 65 72 6d 3d 3d 31 35 20 29 3b  se( iTerm==15 );
31780 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
31790 65 28 20 69 54 65 72 6d 3d 3d 31 36 20 29 3b 0a  e( iTerm==16 );.
317a0 20 20 20 20 20 20 20 20 69 66 28 20 69 54 65 72          if( iTer
317b0 6d 3c 31 36 20 26 26 20 70 55 73 61 67 65 5b 69  m<16 && pUsage[i
317c0 5d 2e 6f 6d 69 74 20 29 20 70 4e 65 77 2d 3e 75  ].omit ) pNew->u
317d0 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 7c  .vtab.omitMask |
317e0 3d 20 31 3c 3c 69 54 65 72 6d 3b 0a 20 20 20 20  = 1<<iTerm;.    
317f0 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
31800 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
31810 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  N)!=0 ){.       
31820 20 20 20 69 66 28 20 70 55 73 61 67 65 5b 69 5d     if( pUsage[i]
31830 2e 6f 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  .omit==0 ){.    
31840 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
31850 74 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  t attempt to use
31860 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e   an IN constrain
31870 74 20 69 66 20 74 68 65 20 76 69 72 74 75 61 6c  t if the virtual
31880 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20   table.         
31890 20 20 20 2a 2a 20 73 61 79 73 20 74 68 61 74 20     ** says that 
318a0 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 45  the equivalent E
318b0 51 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e  Q constraint can
318c0 6e 6f 74 20 62 65 20 73 61 66 65 6c 79 20 6f 6d  not be safely om
318d0 69 74 74 65 64 2e 0a 20 20 20 20 20 20 20 20 20  itted..         
318e0 20 20 20 2a 2a 20 49 66 20 77 65 20 64 6f 20 61     ** If we do a
318f0 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 73 75  ttempt to use su
31900 63 68 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c  ch a constraint,
31910 20 73 6f 6d 65 20 72 6f 77 73 20 6d 69 67 68 74   some rows might
31920 20 62 65 0a 20 20 20 20 20 20 20 20 20 20 20 20   be.            
31930 2a 2a 20 72 65 70 65 61 74 65 64 20 69 6e 20 74  ** repeated in t
31940 68 65 20 6f 75 74 70 75 74 2e 20 2a 2f 0a 20 20  he output. */.  
31950 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
31960 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
31970 20 20 20 20 20 20 20 2f 2a 20 41 20 76 69 72 74         /* A virt
31980 75 61 6c 20 74 61 62 6c 65 20 74 68 61 74 20 69  ual table that i
31990 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79  s constrained by
319a0 20 61 6e 20 49 4e 20 63 6c 61 75 73 65 20 6d 61   an IN clause ma
319b0 79 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 20 20  y not.          
319c0 2a 2a 20 63 6f 6e 73 75 6d 65 20 74 68 65 20 4f  ** consume the O
319d0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 62  RDER BY clause b
319e0 65 63 61 75 73 65 20 28 31 29 20 74 68 65 20 6f  ecause (1) the o
319f0 72 64 65 72 20 6f 66 20 49 4e 20 74 65 72 6d 73  rder of IN terms
31a00 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73  .          ** is
31a10 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
31a20 20 72 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20   related to the 
31a30 6f 72 64 65 72 20 6f 66 20 6f 75 74 70 75 74 20  order of output 
31a40 74 65 72 6d 73 20 61 6e 64 0a 20 20 20 20 20 20  terms and.      
31a50 20 20 20 20 2a 2a 20 28 32 29 20 4d 75 6c 74 69      ** (2) Multi
31a60 70 6c 65 20 6f 75 74 70 75 74 73 20 66 72 6f 6d  ple outputs from
31a70 20 61 20 73 69 6e 67 6c 65 20 49 4e 20 76 61 6c   a single IN val
31a80 75 65 20 77 69 6c 6c 20 6e 6f 74 20 6d 65 72 67  ue will not merg
31a90 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  e.          ** t
31aa0 6f 67 65 74 68 65 72 2e 20 20 2a 2f 0a 20 20 20  ogether.  */.   
31ab0 20 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d         pIdxInfo-
31ac0 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64  >orderByConsumed
31ad0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
31ae0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
31af0 20 20 69 66 28 20 69 3e 3d 6e 43 6f 6e 73 74 72    if( i>=nConstr
31b00 61 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 70 4e  aint ){.      pN
31b10 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6d 78 54  ew->nLTerm = mxT
31b20 65 72 6d 2b 31 3b 0a 20 20 20 20 20 20 61 73 73  erm+1;.      ass
31b30 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  ert( pNew->nLTer
31b40 6d 3c 3d 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20  m<=pNew->nLSlot 
31b50 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  );.      pNew->u
31b60 2e 76 74 61 62 2e 69 64 78 4e 75 6d 20 3d 20 70  .vtab.idxNum = p
31b70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 3b  IdxInfo->idxNum;
31b80 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76  .      pNew->u.v
31b90 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 70  tab.needFree = p
31ba0 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46  IdxInfo->needToF
31bb0 72 65 65 49 64 78 53 74 72 3b 0a 20 20 20 20 20  reeIdxStr;.     
31bc0 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54   pIdxInfo->needT
31bd0 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b  oFreeIdxStr = 0;
31be0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76  .      pNew->u.v
31bf0 74 61 62 2e 69 64 78 53 74 72 20 3d 20 70 49 64  tab.idxStr = pId
31c00 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 3b 0a 20  xInfo->idxStr;. 
31c10 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61       pNew->u.vta
31c20 62 2e 69 73 4f 72 64 65 72 65 64 20 3d 20 28 69  b.isOrdered = (i
31c30 38 29 28 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64  8)(pIdxInfo->ord
31c40 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3f 0a 20  erByConsumed ?. 
31c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c70 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e       pIdxInfo->n
31c80 4f 72 64 65 72 42 79 20 3a 20 30 29 3b 0a 20 20  OrderBy : 0);.  
31c90 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70      pNew->rSetup
31ca0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77   = 0;.      pNew
31cb0 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33  ->rRun = sqlite3
31cc0 4c 6f 67 45 73 74 46 72 6f 6d 44 6f 75 62 6c 65  LogEstFromDouble
31cd0 28 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d  (pIdxInfo->estim
31ce0 61 74 65 64 43 6f 73 74 29 3b 0a 20 20 20 20 20  atedCost);.     
31cf0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 71   pNew->nOut = sq
31d00 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 49 64 78  lite3LogEst(pIdx
31d10 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52  Info->estimatedR
31d20 6f 77 73 29 3b 0a 20 20 20 20 20 20 77 68 65 72  ows);.      wher
31d30 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69  eLoopInsert(pBui
31d40 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20  lder, pNew);.   
31d50 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e 76     if( pNew->u.v
31d60 74 61 62 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a  tab.needFree ){.
31d70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
31d80 66 72 65 65 28 70 4e 65 77 2d 3e 75 2e 76 74 61  free(pNew->u.vta
31d90 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20  b.idxStr);.     
31da0 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e     pNew->u.vtab.
31db0 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20  needFree = 0;.  
31dc0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20      }.    }.  } 
31dd0 20 0a 0a 77 68 65 72 65 4c 6f 6f 70 41 64 64 56   ..whereLoopAddV
31de0 74 61 62 5f 65 78 69 74 3a 0a 20 20 69 66 28 20  tab_exit:.  if( 
31df0 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f  pIdxInfo->needTo
31e00 46 72 65 65 49 64 78 53 74 72 20 29 20 73 71 6c  FreeIdxStr ) sql
31e10 69 74 65 33 5f 66 72 65 65 28 70 49 64 78 49 6e  ite3_free(pIdxIn
31e20 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 73  fo->idxStr);.  s
31e30 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
31e40 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 72 65   pIdxInfo);.  re
31e50 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
31e60 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
31e70 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
31e80 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 57 68 65 72  ../*.** Add Wher
31e90 65 4c 6f 6f 70 20 65 6e 74 72 69 65 73 20 74 6f  eLoop entries to
31ea0 20 68 61 6e 64 6c 65 20 4f 52 20 74 65 72 6d 73   handle OR terms
31eb0 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20 66 6f  .  This works fo
31ec0 72 20 65 69 74 68 65 72 0a 2a 2a 20 62 74 72 65  r either.** btre
31ed0 65 73 20 6f 72 20 76 69 72 74 75 61 6c 20 74 61  es or virtual ta
31ee0 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  bles..*/.static 
31ef0 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
31f00 4f 72 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  Or(WhereLoopBuil
31f10 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 42  der *pBuilder, B
31f20 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 29 7b 0a  itmask mExtra){.
31f30 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
31f40 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  nfo = pBuilder->
31f50 70 57 49 6e 66 6f 3b 0a 20 20 57 68 65 72 65 43  pWInfo;.  WhereC
31f60 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20 20 57 68  lause *pWC;.  Wh
31f70 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20  ereLoop *pNew;. 
31f80 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
31f90 6d 2c 20 2a 70 57 43 45 6e 64 3b 0a 20 20 69 6e  m, *pWCEnd;.  in
31fa0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
31fb0 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20  ;.  int iCur;.  
31fc0 57 68 65 72 65 43 6c 61 75 73 65 20 74 65 6d 70  WhereClause temp
31fd0 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42  WC;.  WhereLoopB
31fe0 75 69 6c 64 65 72 20 73 53 75 62 42 75 69 6c 64  uilder sSubBuild
31ff0 3b 0a 20 20 57 68 65 72 65 4f 72 53 65 74 20 73  ;.  WhereOrSet s
32000 53 75 6d 2c 20 73 43 75 72 3b 0a 20 20 73 74 72  Sum, sCur;.  str
32010 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
32020 20 2a 70 49 74 65 6d 3b 0a 20 20 0a 20 20 70 57   *pItem;.  .  pW
32030 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  C = pBuilder->pW
32040 43 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 70 57  C;.  pWCEnd = pW
32050 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72  C->a + pWC->nTer
32060 6d 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69  m;.  pNew = pBui
32070 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 6d 65  lder->pNew;.  me
32080 6d 73 65 74 28 26 73 53 75 6d 2c 20 30 2c 20 73  mset(&sSum, 0, s
32090 69 7a 65 6f 66 28 73 53 75 6d 29 29 3b 0a 20 20  izeof(sSum));.  
320a0 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e  pItem = pWInfo->
320b0 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e  pTabList->a + pN
320c0 65 77 2d 3e 69 54 61 62 3b 0a 20 20 69 43 75 72  ew->iTab;.  iCur
320d0 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f   = pItem->iCurso
320e0 72 3b 0a 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d  r;..  for(pTerm=
320f0 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57  pWC->a; pTerm<pW
32100 43 45 6e 64 20 26 26 20 72 63 3d 3d 53 51 4c 49  CEnd && rc==SQLI
32110 54 45 5f 4f 4b 3b 20 70 54 65 72 6d 2b 2b 29 7b  TE_OK; pTerm++){
32120 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d  .    if( (pTerm-
32130 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
32140 4f 52 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28  OR)!=0.     && (
32150 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f  pTerm->u.pOrInfo
32160 2d 3e 69 6e 64 65 78 61 62 6c 65 20 26 20 70 4e  ->indexable & pN
32170 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30  ew->maskSelf)!=0
32180 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 57   .    ){.      W
32190 68 65 72 65 43 6c 61 75 73 65 20 2a 20 63 6f 6e  hereClause * con
321a0 73 74 20 70 4f 72 57 43 20 3d 20 26 70 54 65 72  st pOrWC = &pTer
321b0 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63  m->u.pOrInfo->wc
321c0 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  ;.      WhereTer
321d0 6d 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 45  m * const pOrWCE
321e0 6e 64 20 3d 20 26 70 4f 72 57 43 2d 3e 61 5b 70  nd = &pOrWC->a[p
321f0 4f 72 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20  OrWC->nTerm];.  
32200 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
32210 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e  OrTerm;.      in
32220 74 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20  t once = 1;.    
32230 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20    int i, j;.    
32240 0a 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64  .      sSubBuild
32250 20 3d 20 2a 70 42 75 69 6c 64 65 72 3b 0a 20 20   = *pBuilder;.  
32260 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 4f      sSubBuild.pO
32270 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
32280 20 20 73 53 75 62 42 75 69 6c 64 2e 70 4f 72 53    sSubBuild.pOrS
32290 65 74 20 3d 20 26 73 43 75 72 3b 0a 0a 20 20 20  et = &sCur;..   
322a0 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
322b0 32 30 30 2c 20 28 22 42 65 67 69 6e 20 70 72 6f  200, ("Begin pro
322c0 63 65 73 73 69 6e 67 20 4f 52 2d 63 6c 61 75 73  cessing OR-claus
322d0 65 20 25 70 5c 6e 22 2c 20 70 54 65 72 6d 29 29  e %p\n", pTerm))
322e0 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 4f 72 54  ;.      for(pOrT
322f0 65 72 6d 3d 70 4f 72 57 43 2d 3e 61 3b 20 70 4f  erm=pOrWC->a; pO
32300 72 54 65 72 6d 3c 70 4f 72 57 43 45 6e 64 3b 20  rTerm<pOrWCEnd; 
32310 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  pOrTerm++){.    
32320 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d      if( (pOrTerm
32330 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
32340 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20 20  _AND)!=0 ){.    
32350 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e        sSubBuild.
32360 70 57 43 20 3d 20 26 70 4f 72 54 65 72 6d 2d 3e  pWC = &pOrTerm->
32370 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a  u.pAndInfo->wc;.
32380 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
32390 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  ( pOrTerm->leftC
323a0 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 7b 0a 20  ursor==iCur ){. 
323b0 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
323c0 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57  pWInfo = pWC->pW
323d0 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  Info;.          
323e0 74 65 6d 70 57 43 2e 70 4f 75 74 65 72 20 3d 20  tempWC.pOuter = 
323f0 70 57 43 3b 0a 20 20 20 20 20 20 20 20 20 20 74  pWC;.          t
32400 65 6d 70 57 43 2e 6f 70 20 3d 20 54 4b 5f 41 4e  empWC.op = TK_AN
32410 44 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d  D;.          tem
32420 70 57 43 2e 6e 54 65 72 6d 20 3d 20 31 3b 0a 20  pWC.nTerm = 1;. 
32430 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
32440 61 20 3d 20 70 4f 72 54 65 72 6d 3b 0a 20 20 20  a = pOrTerm;.   
32450 20 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64         sSubBuild
32460 2e 70 57 43 20 3d 20 26 74 65 6d 70 57 43 3b 0a  .pWC = &tempWC;.
32470 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
32480 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
32490 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
324a0 20 20 20 20 20 73 43 75 72 2e 6e 20 3d 20 30 3b       sCur.n = 0;
324b0 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
324c0 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20  CE_ENABLED.     
324d0 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
324e0 32 30 30 2c 20 28 22 4f 52 2d 74 65 72 6d 20 25  200, ("OR-term %
324f0 64 20 6f 66 20 25 70 20 68 61 73 20 25 64 20 73  d of %p has %d s
32500 75 62 74 65 72 6d 73 3a 5c 6e 22 2c 20 0a 20 20  ubterms:\n", .  
32510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32520 20 28 69 6e 74 29 28 70 4f 72 54 65 72 6d 2d 70   (int)(pOrTerm-p
32530 4f 72 57 43 2d 3e 61 29 2c 20 70 54 65 72 6d 2c  OrWC->a), pTerm,
32540 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43 2d 3e   sSubBuild.pWC->
32550 6e 54 65 72 6d 29 29 3b 0a 20 20 20 20 20 20 20  nTerm));.       
32560 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
32570 65 54 72 61 63 65 20 26 20 30 78 34 30 30 20 29  eTrace & 0x400 )
32580 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  {.          for(
32590 69 3d 30 3b 20 69 3c 73 53 75 62 42 75 69 6c 64  i=0; i<sSubBuild
325a0 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b  .pWC->nTerm; i++
325b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 77  ){.            w
325c0 68 65 72 65 54 65 72 6d 50 72 69 6e 74 28 26 73  hereTermPrint(&s
325d0 53 75 62 42 75 69 6c 64 2e 70 57 43 2d 3e 61 5b  SubBuild.pWC->a[
325e0 69 5d 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  i], i);.        
325f0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 65    }.        }.#e
32600 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c  ndif.#ifndef SQL
32610 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
32620 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20 69 66  TABLE.        if
32630 28 20 49 73 56 69 72 74 75 61 6c 28 70 49 74 65  ( IsVirtual(pIte
32640 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20  m->pTab) ){.    
32650 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
32660 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28 26  LoopAddVirtual(&
32670 73 53 75 62 42 75 69 6c 64 2c 20 6d 45 78 74 72  sSubBuild, mExtr
32680 61 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  a);.        }els
32690 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  e.#endif.       
326a0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20   {.          rc 
326b0 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  = whereLoopAddBt
326c0 72 65 65 28 26 73 53 75 62 42 75 69 6c 64 2c 20  ree(&sSubBuild, 
326d0 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20 20  mExtra);.       
326e0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
326f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
32700 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77            rc = w
32710 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 26 73  hereLoopAddOr(&s
32720 53 75 62 42 75 69 6c 64 2c 20 6d 45 78 74 72 61  SubBuild, mExtra
32730 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
32740 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
32750 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 43  =SQLITE_OK || sC
32760 75 72 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ur.n==0 );.     
32770 20 20 20 69 66 28 20 73 43 75 72 2e 6e 3d 3d 30     if( sCur.n==0
32780 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 53   ){.          sS
32790 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  um.n = 0;.      
327a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
327b0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e 63     }else if( onc
327c0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  e ){.          w
327d0 68 65 72 65 4f 72 4d 6f 76 65 28 26 73 53 75 6d  hereOrMove(&sSum
327e0 2c 20 26 73 43 75 72 29 3b 0a 20 20 20 20 20 20  , &sCur);.      
327f0 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20      once = 0;.  
32800 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
32810 20 20 20 20 20 20 20 57 68 65 72 65 4f 72 53 65         WhereOrSe
32820 74 20 73 50 72 65 76 3b 0a 20 20 20 20 20 20 20  t sPrev;.       
32830 20 20 20 77 68 65 72 65 4f 72 4d 6f 76 65 28 26     whereOrMove(&
32840 73 50 72 65 76 2c 20 26 73 53 75 6d 29 3b 0a 20  sPrev, &sSum);. 
32850 20 20 20 20 20 20 20 20 20 73 53 75 6d 2e 6e 20           sSum.n 
32860 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66  = 0;.          f
32870 6f 72 28 69 3d 30 3b 20 69 3c 73 50 72 65 76 2e  or(i=0; i<sPrev.
32880 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
32890 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
328a0 73 43 75 72 2e 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  sCur.n; j++){.  
328b0 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
328c0 65 4f 72 49 6e 73 65 72 74 28 26 73 53 75 6d 2c  eOrInsert(&sSum,
328d0 20 73 50 72 65 76 2e 61 5b 69 5d 2e 70 72 65 72   sPrev.a[i].prer
328e0 65 71 20 7c 20 73 43 75 72 2e 61 5b 6a 5d 2e 70  eq | sCur.a[j].p
328f0 72 65 72 65 71 2c 0a 20 20 20 20 20 20 20 20 20  rereq,.         
32900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32910 20 20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74     sqlite3LogEst
32920 41 64 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e 72  Add(sPrev.a[i].r
32930 52 75 6e 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 72  Run, sCur.a[j].r
32940 52 75 6e 29 2c 0a 20 20 20 20 20 20 20 20 20 20  Run),.          
32950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32960 20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41    sqlite3LogEstA
32970 64 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e 6e 4f  dd(sPrev.a[i].nO
32980 75 74 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 6e 4f  ut, sCur.a[j].nO
32990 75 74 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ut));.          
329a0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
329b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
329c0 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c  }.      pNew->nL
329d0 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  Term = 1;.      
329e0 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20  pNew->aLTerm[0] 
329f0 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  = pTerm;.      p
32a00 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  New->wsFlags = W
32a10 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20  HERE_MULTI_OR;. 
32a20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75       pNew->rSetu
32a30 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65  p = 0;.      pNe
32a40 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 30 3b  w->iSortIdx = 0;
32a50 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70  .      memset(&p
32a60 4e 65 77 2d 3e 75 2c 20 30 2c 20 73 69 7a 65 6f  New->u, 0, sizeo
32a70 66 28 70 4e 65 77 2d 3e 75 29 29 3b 0a 20 20 20  f(pNew->u));.   
32a80 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
32a90 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 73  SQLITE_OK && i<s
32aa0 53 75 6d 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  Sum.n; i++){.   
32ab0 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
32ac0 43 75 72 72 65 6e 74 6c 79 20 73 53 75 6d 2e 61  Currently sSum.a
32ad0 5b 69 5d 2e 72 52 75 6e 20 69 73 20 73 65 74 20  [i].rRun is set 
32ae0 74 6f 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  to the sum of th
32af0 65 20 63 6f 73 74 73 0a 20 20 20 20 20 20 20 20  e costs.        
32b00 2a 2a 20 6f 66 20 61 6c 6c 20 73 75 62 2d 73 63  ** of all sub-sc
32b10 61 6e 73 20 72 65 71 75 69 72 65 64 20 62 79 20  ans required by 
32b20 74 68 65 20 4f 52 2d 73 63 61 6e 2e 20 48 6f 77  the OR-scan. How
32b30 65 76 65 72 2c 20 64 75 65 20 74 6f 20 72 6f 75  ever, due to rou
32b40 6e 64 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a  nding.        **
32b50 20 65 72 72 6f 72 73 2c 20 69 74 20 6d 61 79 20   errors, it may 
32b60 62 65 20 74 68 61 74 20 74 68 65 20 63 6f 73 74  be that the cost
32b70 20 6f 66 20 74 68 65 20 4f 52 2d 73 63 61 6e 20   of the OR-scan 
32b80 69 73 20 65 71 75 61 6c 20 74 6f 20 69 74 73 0a  is equal to its.
32b90 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 73 74 20          ** most 
32ba0 65 78 70 65 6e 73 69 76 65 20 73 75 62 2d 73 63  expensive sub-sc
32bb0 61 6e 2e 20 41 64 64 20 74 68 65 20 73 6d 61 6c  an. Add the smal
32bc0 6c 65 73 74 20 70 6f 73 73 69 62 6c 65 20 70 65  lest possible pe
32bd0 6e 61 6c 74 79 20 0a 20 20 20 20 20 20 20 20 2a  nalty .        *
32be0 2a 20 28 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  * (equivalent to
32bf0 20 6d 75 6c 74 69 70 6c 79 69 6e 67 20 74 68 65   multiplying the
32c00 20 63 6f 73 74 20 62 79 20 31 2e 30 37 29 20 74   cost by 1.07) t
32c10 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 0a 20  o ensure that . 
32c20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 64         ** this d
32c30 6f 65 73 20 6e 6f 74 20 68 61 70 70 65 6e 2e 20  oes not happen. 
32c40 4f 74 68 65 72 77 69 73 65 2c 20 66 6f 72 20 57  Otherwise, for W
32c50 48 45 52 45 20 63 6c 61 75 73 65 73 20 73 75 63  HERE clauses suc
32c60 68 20 61 73 20 74 68 65 0a 20 20 20 20 20 20 20  h as the.       
32c70 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 68   ** following wh
32c80 65 72 65 20 74 68 65 72 65 20 69 73 20 61 6e 20  ere there is an 
32c90 69 6e 64 65 78 20 6f 6e 20 22 79 22 3a 0a 20 20  index on "y":.  
32ca0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
32cb0 20 2a 2a 20 20 20 20 20 57 48 45 52 45 20 6c 69   **     WHERE li
32cc0 6b 65 6c 69 68 6f 6f 64 28 78 3d 3f 2c 20 30 2e  kelihood(x=?, 0.
32cd0 39 39 29 20 4f 52 20 79 3d 3f 0a 20 20 20 20 20  99) OR y=?.     
32ce0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
32cf0 20 74 68 65 20 70 6c 61 6e 6e 65 72 20 6d 61 79   the planner may
32d00 20 65 6c 65 63 74 20 74 6f 20 22 4f 52 22 20 74   elect to "OR" t
32d10 6f 67 65 74 68 65 72 20 61 20 66 75 6c 6c 2d 74  ogether a full-t
32d20 61 62 6c 65 20 73 63 61 6e 20 61 6e 64 20 61 6e  able scan and an
32d30 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65  .        ** inde
32d40 78 20 6c 6f 6f 6b 75 70 2e 20 41 6e 64 20 6f 74  x lookup. And ot
32d50 68 65 72 20 73 69 6d 69 6c 61 72 6c 79 20 6f 64  her similarly od
32d60 64 20 72 65 73 75 6c 74 73 2e 20 20 2a 2f 0a 20  d results.  */. 
32d70 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75         pNew->rRu
32d80 6e 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 72 52  n = sSum.a[i].rR
32d90 75 6e 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20  un + 1;.        
32da0 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 53 75  pNew->nOut = sSu
32db0 6d 2e 61 5b 69 5d 2e 6e 4f 75 74 3b 0a 20 20 20  m.a[i].nOut;.   
32dc0 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65       pNew->prere
32dd0 71 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 70 72  q = sSum.a[i].pr
32de0 65 72 65 71 3b 0a 20 20 20 20 20 20 20 20 72 63  ereq;.        rc
32df0 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65   = whereLoopInse
32e00 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65  rt(pBuilder, pNe
32e10 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  w);.      }.    
32e20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 32    WHERETRACE(0x2
32e30 30 30 2c 20 28 22 45 6e 64 20 70 72 6f 63 65 73  00, ("End proces
32e40 73 69 6e 67 20 4f 52 2d 63 6c 61 75 73 65 20 25  sing OR-clause %
32e50 70 5c 6e 22 2c 20 70 54 65 72 6d 29 29 3b 0a 20  p\n", pTerm));. 
32e60 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
32e70 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
32e80 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70  dd all WhereLoop
32e90 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
32ea0 20 74 61 62 6c 65 73 20 0a 2a 2f 0a 73 74 61 74   tables .*/.stat
32eb0 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
32ec0 41 64 64 41 6c 6c 28 57 68 65 72 65 4c 6f 6f 70  AddAll(WhereLoop
32ed0 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
32ee0 72 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  r){.  WhereInfo 
32ef0 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64  *pWInfo = pBuild
32f00 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 42 69  er->pWInfo;.  Bi
32f10 74 6d 61 73 6b 20 6d 45 78 74 72 61 20 3d 20 30  tmask mExtra = 0
32f20 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 69  ;.  Bitmask mPri
32f30 6f 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54  or = 0;.  int iT
32f40 61 62 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  ab;.  SrcList *p
32f50 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f  TabList = pWInfo
32f60 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74  ->pTabList;.  st
32f70 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
32f80 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69  m *pItem;.  sqli
32f90 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f  te3 *db = pWInfo
32fa0 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  ->pParse->db;.  
32fb0 69 6e 74 20 6e 54 61 62 4c 69 73 74 20 3d 20 70  int nTabList = p
32fc0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20  WInfo->nLevel;. 
32fd0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
32fe0 5f 4f 4b 3b 0a 20 20 75 38 20 70 72 69 6f 72 4a  _OK;.  u8 priorJ
32ff0 6f 69 6e 54 79 70 65 20 3d 20 30 3b 0a 20 20 57  oinType = 0;.  W
33000 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a  hereLoop *pNew;.
33010 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20  .  /* Loop over 
33020 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68  the tables in th
33030 65 20 6a 6f 69 6e 2c 20 66 72 6f 6d 20 6c 65 66  e join, from lef
33040 74 20 74 6f 20 72 69 67 68 74 20 2a 2f 0a 20 20  t to right */.  
33050 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d  pNew = pBuilder-
33060 3e 70 4e 65 77 3b 0a 20 20 77 68 65 72 65 4c 6f  >pNew;.  whereLo
33070 6f 70 49 6e 69 74 28 70 4e 65 77 29 3b 0a 20 20  opInit(pNew);.  
33080 66 6f 72 28 69 54 61 62 3d 30 2c 20 70 49 74 65  for(iTab=0, pIte
33090 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69  m=pTabList->a; i
330a0 54 61 62 3c 6e 54 61 62 4c 69 73 74 3b 20 69 54  Tab<nTabList; iT
330b0 61 62 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a  ab++, pItem++){.
330c0 20 20 20 20 70 4e 65 77 2d 3e 69 54 61 62 20 3d      pNew->iTab =
330d0 20 69 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 2d   iTab;.    pNew-
330e0 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 67 65 74 4d  >maskSelf = getM
330f0 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  ask(&pWInfo->sMa
33100 73 6b 53 65 74 2c 20 70 49 74 65 6d 2d 3e 69 43  skSet, pItem->iC
33110 75 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20  ursor);.    if( 
33120 28 28 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70  ((pItem->jointyp
33130 65 7c 70 72 69 6f 72 4a 6f 69 6e 54 79 70 65 29  e|priorJoinType)
33140 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43   & (JT_LEFT|JT_C
33150 52 4f 53 53 29 29 21 3d 30 20 29 7b 0a 20 20 20  ROSS))!=0 ){.   
33160 20 20 20 6d 45 78 74 72 61 20 3d 20 6d 50 72 69     mExtra = mPri
33170 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 72  or;.    }.    pr
33180 69 6f 72 4a 6f 69 6e 54 79 70 65 20 3d 20 70 49  iorJoinType = pI
33190 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20  tem->jointype;. 
331a0 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c     if( IsVirtual
331b0 28 70 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b  (pItem->pTab) ){
331c0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72  .      rc = wher
331d0 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28  eLoopAddVirtual(
331e0 70 42 75 69 6c 64 65 72 2c 20 6d 45 78 74 72 61  pBuilder, mExtra
331f0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
33200 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
33210 6f 70 41 64 64 42 74 72 65 65 28 70 42 75 69 6c  opAddBtree(pBuil
33220 64 65 72 2c 20 6d 45 78 74 72 61 29 3b 0a 20 20  der, mExtra);.  
33230 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
33240 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
33250 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
33260 70 41 64 64 4f 72 28 70 42 75 69 6c 64 65 72 2c  pAddOr(pBuilder,
33270 20 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a   mExtra);.    }.
33280 20 20 20 20 6d 50 72 69 6f 72 20 7c 3d 20 70 4e      mPrior |= pN
33290 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20  ew->maskSelf;.  
332a0 20 20 69 66 28 20 72 63 20 7c 7c 20 64 62 2d 3e    if( rc || db->
332b0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 62  mallocFailed ) b
332c0 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 77 68 65 72  reak;.  }.  wher
332d0 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70  eLoopClear(db, p
332e0 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  New);.  return r
332f0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 61 6d  c;.}../*.** Exam
33300 69 6e 65 20 61 20 57 68 65 72 65 50 61 74 68 20  ine a WherePath 
33310 28 77 69 74 68 20 74 68 65 20 61 64 64 69 74 69  (with the additi
33320 6f 6e 20 6f 66 20 74 68 65 20 65 78 74 72 61 20  on of the extra 
33330 57 68 65 72 65 4c 6f 6f 70 20 6f 66 20 74 68 65  WhereLoop of the
33340 20 35 74 68 0a 2a 2a 20 70 61 72 61 6d 65 74 65   5th.** paramete
33350 72 73 29 20 74 6f 20 73 65 65 20 69 66 20 69 74  rs) to see if it
33360 20 6f 75 74 70 75 74 73 20 72 6f 77 73 20 69 6e   outputs rows in
33370 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 4f   the requested O
33380 52 44 45 52 20 42 59 0a 2a 2a 20 28 6f 72 20 47  RDER BY.** (or G
33390 52 4f 55 50 20 42 59 29 20 77 69 74 68 6f 75 74  ROUP BY) without
333a0 20 72 65 71 75 69 72 69 6e 67 20 61 20 73 65 70   requiring a sep
333b0 61 72 61 74 65 20 73 6f 72 74 20 6f 70 65 72 61  arate sort opera
333c0 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 4e 3a  tion.  Return N:
333d0 0a 2a 2a 20 0a 2a 2a 20 20 20 4e 3e 30 3a 20 20  .** .**   N>0:  
333e0 20 4e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20   N terms of the 
333f0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
33400 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a  are satisfied.**
33410 20 20 20 4e 3d 3d 30 3a 20 20 4e 6f 20 74 65 72     N==0:  No ter
33420 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ms of the ORDER 
33430 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 73 61  BY clause are sa
33440 74 69 73 66 69 65 64 0a 2a 2a 20 20 20 4e 3c 30  tisfied.**   N<0
33450 3a 20 20 20 55 6e 6b 6e 6f 77 6e 20 79 65 74 20  :   Unknown yet 
33460 68 6f 77 20 6d 61 6e 79 20 74 65 72 6d 73 20 6f  how many terms o
33470 66 20 4f 52 44 45 52 20 42 59 20 6d 69 67 68 74  f ORDER BY might
33480 20 62 65 20 73 61 74 69 73 66 69 65 64 2e 20 20   be satisfied.  
33490 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61   .**.** Note tha
334a0 74 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72  t processing for
334b0 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 61   WHERE_GROUPBY a
334c0 6e 64 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43  nd WHERE_DISTINC
334d0 54 42 59 20 69 73 20 6e 6f 74 20 61 73 0a 2a 2a  TBY is not as.**
334e0 20 73 74 72 69 63 74 2e 20 20 57 69 74 68 20 47   strict.  With G
334f0 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49 53 54  ROUP BY and DIST
33500 49 4e 43 54 20 74 68 65 20 6f 6e 6c 79 20 72 65  INCT the only re
33510 71 75 69 72 65 6d 65 6e 74 20 69 73 20 74 68 61  quirement is tha
33520 74 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20  t.** equivalent 
33530 72 6f 77 73 20 61 70 70 65 61 72 20 69 6d 6d 65  rows appear imme
33540 64 69 61 74 65 6c 79 20 61 64 6a 61 63 65 6e 74  diately adjacent
33550 20 74 6f 20 6f 6e 65 20 61 6e 6f 74 68 65 72 2e   to one another.
33560 20 20 47 52 4f 55 50 20 42 59 0a 2a 2a 20 61 6e    GROUP BY.** an
33570 64 20 44 49 53 54 49 4e 43 54 20 64 6f 20 6e 6f  d DISTINCT do no
33580 74 20 72 65 71 75 69 72 65 20 72 6f 77 73 20 74  t require rows t
33590 6f 20 61 70 70 65 61 72 20 69 6e 20 61 6e 79 20  o appear in any 
335a0 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72  particular order
335b0 20 61 73 20 6c 6f 6e 67 0a 2a 2a 20 61 73 20 65   as long.** as e
335c0 71 75 69 76 61 6c 65 6e 74 20 72 6f 77 73 20 61  quivalent rows a
335d0 72 65 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74  re grouped toget
335e0 68 65 72 2e 20 20 54 68 75 73 20 66 6f 72 20 47  her.  Thus for G
335f0 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49 53 54  ROUP BY and DIST
33600 49 4e 43 54 0a 2a 2a 20 74 68 65 20 70 4f 72 64  INCT.** the pOrd
33610 65 72 42 79 20 74 65 72 6d 73 20 63 61 6e 20 62  erBy terms can b
33620 65 20 6d 61 74 63 68 65 64 20 69 6e 20 61 6e 79  e matched in any
33630 20 6f 72 64 65 72 2e 20 20 57 69 74 68 20 4f 52   order.  With OR
33640 44 45 52 20 42 59 2c 20 74 68 65 20 0a 2a 2a 20  DER BY, the .** 
33650 70 4f 72 64 65 72 42 79 20 74 65 72 6d 73 20 6d  pOrderBy terms m
33660 75 73 74 20 62 65 20 6d 61 74 63 68 65 64 20 69  ust be matched i
33670 6e 20 73 74 72 69 63 74 20 6c 65 66 74 2d 74 6f  n strict left-to
33680 2d 72 69 67 68 74 20 6f 72 64 65 72 2e 0a 2a 2f  -right order..*/
33690 0a 73 74 61 74 69 63 20 69 38 20 77 68 65 72 65  .static i8 where
336a0 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64  PathSatisfiesOrd
336b0 65 72 42 79 28 0a 20 20 57 68 65 72 65 49 6e 66  erBy(.  WhereInf
336c0 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 20 2f 2a  o *pWInfo,    /*
336d0 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
336e0 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
336f0 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20  *pOrderBy,   /* 
33700 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55  ORDER BY or GROU
33710 50 20 42 59 20 6f 72 20 44 49 53 54 49 4e 43 54  P BY or DISTINCT
33720 20 63 6c 61 75 73 65 20 74 6f 20 63 68 65 63 6b   clause to check
33730 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20   */.  WherePath 
33740 2a 70 50 61 74 68 2c 20 20 20 20 20 2f 2a 20 54  *pPath,     /* T
33750 68 65 20 57 68 65 72 65 50 61 74 68 20 74 6f 20  he WherePath to 
33760 63 68 65 63 6b 20 2a 2f 0a 20 20 75 31 36 20 77  check */.  u16 w
33770 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20  ctrlFlags,      
33780 20 2f 2a 20 57 48 45 52 45 5f 47 52 4f 55 50 42   /* WHERE_GROUPB
33790 59 2c 20 5f 44 49 53 54 49 4e 43 54 42 59 20 20  Y, _DISTINCTBY  
337a0 6f 72 20 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49  or _ORDERBY_LIMI
337b0 54 20 2a 2f 0a 20 20 75 31 36 20 6e 4c 6f 6f 70  T */.  u16 nLoop
337c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
337d0 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
337e0 73 20 69 6e 20 70 50 61 74 68 2d 3e 61 4c 6f 6f  s in pPath->aLoo
337f0 70 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  p[] */.  WhereLo
33800 6f 70 20 2a 70 4c 61 73 74 2c 20 20 20 20 20 2f  op *pLast,     /
33810 2a 20 41 64 64 20 74 68 69 73 20 57 68 65 72 65  * Add this Where
33820 4c 6f 6f 70 20 74 6f 20 74 68 65 20 65 6e 64 20  Loop to the end 
33830 6f 66 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b  of pPath->aLoop[
33840 5d 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 2a  ] */.  Bitmask *
33850 70 52 65 76 4d 61 73 6b 20 20 20 20 20 2f 2a 20  pRevMask     /* 
33860 4f 55 54 3a 20 4d 61 73 6b 20 6f 66 20 57 68 65  OUT: Mask of Whe
33870 72 65 4c 6f 6f 70 73 20 74 6f 20 72 75 6e 20 69  reLoops to run i
33880 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20  n reverse order 
33890 2a 2f 0a 29 7b 0a 20 20 75 38 20 72 65 76 53 65  */.){.  u8 revSe
338a0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
338b0 20 54 72 75 65 20 69 66 20 72 65 76 20 69 73 20   True if rev is 
338c0 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38 20 72 65  known */.  u8 re
338d0 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
338e0 20 2f 2a 20 43 6f 6d 70 6f 73 69 74 65 20 73 6f   /* Composite so
338f0 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38  rt order */.  u8
33900 20 72 65 76 49 64 78 3b 20 20 20 20 20 20 20 20   revIdx;        
33910 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 6f 72      /* Index sor
33920 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20  t order */.  u8 
33930 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 3b  isOrderDistinct;
33940 20 20 20 2f 2a 20 41 6c 6c 20 70 72 69 6f 72 20     /* All prior 
33950 57 68 65 72 65 4c 6f 6f 70 73 20 61 72 65 20 6f  WhereLoops are o
33960 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20 2a 2f  rder-distinct */
33970 0a 20 20 75 38 20 64 69 73 74 69 6e 63 74 43 6f  .  u8 distinctCo
33980 6c 75 6d 6e 73 3b 20 20 20 2f 2a 20 54 72 75 65  lumns;   /* True
33990 20 69 66 20 74 68 65 20 6c 6f 6f 70 20 68 61 73   if the loop has
339a0 20 55 4e 49 51 55 45 20 4e 4f 54 20 4e 55 4c 4c   UNIQUE NOT NULL
339b0 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38   columns */.  u8
339c0 20 69 73 4d 61 74 63 68 3b 20 20 20 20 20 20 20   isMatch;       
339d0 20 20 20 20 2f 2a 20 69 43 6f 6c 75 6d 6e 20 6d      /* iColumn m
339e0 61 74 63 68 65 73 20 61 20 74 65 72 6d 20 6f 66  atches a term of
339f0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
33a00 61 75 73 65 20 2a 2f 0a 20 20 75 31 36 20 65 71  ause */.  u16 eq
33a10 4f 70 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  OpMask;         
33a20 2f 2a 20 41 6c 6c 6f 77 65 64 20 65 71 75 61 6c  /* Allowed equal
33a30 69 74 79 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f  ity operators */
33a40 0a 20 20 75 31 36 20 6e 4b 65 79 43 6f 6c 3b 20  .  u16 nKeyCol; 
33a50 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
33a60 65 72 20 6f 66 20 6b 65 79 20 63 6f 6c 75 6d 6e  er of key column
33a70 73 20 69 6e 20 70 49 6e 64 65 78 20 2a 2f 0a 20  s in pIndex */. 
33a80 20 75 31 36 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20   u16 nColumn;   
33a90 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
33aa0 6e 75 6d 62 65 72 20 6f 66 20 6f 72 64 65 72 65  number of ordere
33ab0 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  d columns in the
33ac0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36 20   index */.  u16 
33ad0 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20  nOrderBy;       
33ae0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 74 65 72 6d    /* Number term
33af0 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42  s in the ORDER B
33b00 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  Y clause */.  in
33b10 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20  t iLoop;        
33b20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
33b30 57 68 65 72 65 4c 6f 6f 70 20 69 6e 20 70 50 61  WhereLoop in pPa
33b40 74 68 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73  th being process
33b50 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  ed */.  int i, j
33b60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
33b70 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
33b80 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20  /.  int iCur;   
33b90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
33ba0 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 63  sor number for c
33bb0 75 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70  urrent WhereLoop
33bc0 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d   */.  int iColum
33bd0 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  n;          /* A
33be0 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77   column number w
33bf0 69 74 68 69 6e 20 74 61 62 6c 65 20 69 43 75 72  ithin table iCur
33c00 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
33c10 2a 70 4c 6f 6f 70 20 3d 20 30 3b 20 2f 2a 20 43  *pLoop = 0; /* C
33c20 75 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70  urrent WhereLoop
33c30 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64   being processed
33c40 2e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  . */.  WhereTerm
33c50 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 2f 2a 20   *pTerm;     /* 
33c60 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66  A single term of
33c70 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
33c80 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 42  e */.  Expr *pOB
33c90 45 78 70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  Expr;        /* 
33ca0 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72  An expression fr
33cb0 6f 6d 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  om the ORDER BY 
33cc0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 43 6f 6c 6c  clause */.  Coll
33cd0 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20  Seq *pColl;     
33ce0 20 20 2f 2a 20 43 4f 4c 4c 41 54 45 20 66 75 6e    /* COLLATE fun
33cf0 63 74 69 6f 6e 20 66 72 6f 6d 20 61 6e 20 4f 52  ction from an OR
33d00 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65  DER BY clause te
33d10 72 6d 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  rm */.  Index *p
33d20 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 2f 2a  Index;        /*
33d30 20 54 68 65 20 69 6e 64 65 78 20 61 73 73 6f 63   The index assoc
33d40 69 61 74 65 64 20 77 69 74 68 20 70 4c 6f 6f 70  iated with pLoop
33d50 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
33d60 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  b = pWInfo->pPar
33d70 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61  se->db;  /* Data
33d80 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
33d90 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62 53  */.  Bitmask obS
33da0 61 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4d 61  at = 0;    /* Ma
33db0 73 6b 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74  sk of ORDER BY t
33dc0 65 72 6d 73 20 73 61 74 69 73 66 69 65 64 20 73  erms satisfied s
33dd0 6f 20 66 61 72 20 2a 2f 0a 20 20 42 69 74 6d 61  o far */.  Bitma
33de0 73 6b 20 6f 62 44 6f 6e 65 3b 20 20 20 20 20 20  sk obDone;      
33df0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20   /* Mask of all 
33e00 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a  ORDER BY terms *
33e10 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 72 64 65  /.  Bitmask orde
33e20 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 3b 20 20  rDistinctMask;  
33e30 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 77  /* Mask of all w
33e40 65 6c 6c 2d 6f 72 64 65 72 65 64 20 6c 6f 6f 70  ell-ordered loop
33e50 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 72  s */.  Bitmask r
33e60 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 20  eady;           
33e70 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 69 6e     /* Mask of in
33e80 6e 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a 0a 20 20  ner loops */..  
33e90 2f 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79 20 74  /*.  ** We say t
33ea0 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20  he WhereLoop is 
33eb0 22 6f 6e 65 2d 72 6f 77 22 20 69 66 20 69 74 20  "one-row" if it 
33ec0 67 65 6e 65 72 61 74 65 73 20 6e 6f 20 6d 6f 72  generates no mor
33ed0 65 20 74 68 61 6e 20 6f 6e 65 0a 20 20 2a 2a 20  e than one.  ** 
33ee0 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 2e 20 20  row of output.  
33ef0 41 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 6f  A WhereLoop is o
33f00 6e 65 2d 72 6f 77 20 69 66 20 61 6c 6c 20 6f 66  ne-row if all of
33f10 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
33f20 72 65 20 74 72 75 65 3a 0a 20 20 2a 2a 20 20 28  re true:.  **  (
33f30 61 29 20 41 6c 6c 20 69 6e 64 65 78 20 63 6f 6c  a) All index col
33f40 75 6d 6e 73 20 6d 61 74 63 68 20 77 69 74 68 20  umns match with 
33f50 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 2e  WHERE_COLUMN_EQ.
33f60 0a 20 20 2a 2a 20 20 28 62 29 20 54 68 65 20 69  .  **  (b) The i
33f70 6e 64 65 78 20 69 73 20 75 6e 69 71 75 65 0a 20  ndex is unique. 
33f80 20 2a 2a 20 41 6e 79 20 57 68 65 72 65 4c 6f 6f   ** Any WhereLoo
33f90 70 20 77 69 74 68 20 61 6e 20 57 48 45 52 45 5f  p with an WHERE_
33fa0 43 4f 4c 55 4d 4e 5f 45 51 20 63 6f 6e 73 74 72  COLUMN_EQ constr
33fb0 61 69 6e 74 20 6f 6e 20 74 68 65 20 72 6f 77 69  aint on the rowi
33fc0 64 20 69 73 20 6f 6e 65 2d 72 6f 77 2e 0a 20 20  d is one-row..  
33fd0 2a 2a 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77  ** Every one-row
33fe0 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 6c 6c 20   WhereLoop will 
33ff0 68 61 76 65 20 74 68 65 20 57 48 45 52 45 5f 4f  have the WHERE_O
34000 4e 45 52 4f 57 20 62 69 74 20 73 65 74 20 69 6e  NEROW bit set in
34010 20 77 73 46 6c 61 67 73 2e 0a 20 20 2a 2a 0a 20   wsFlags..  **. 
34020 20 2a 2a 20 57 65 20 73 61 79 20 74 68 65 20 57   ** We say the W
34030 68 65 72 65 4c 6f 6f 70 20 69 73 20 22 6f 72 64  hereLoop is "ord
34040 65 72 2d 64 69 73 74 69 6e 63 74 22 20 69 66 20  er-distinct" if 
34050 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6c 75 6d  the set of colum
34060 6e 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 61  ns from.  ** tha
34070 74 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74  t WhereLoop that
34080 20 61 72 65 20 69 6e 20 74 68 65 20 4f 52 44 45   are in the ORDE
34090 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20  R BY clause are 
340a0 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76  different for ev
340b0 65 72 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20  ery.  ** row of 
340c0 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 20 20  the WhereLoop.  
340d0 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68  Every one-row Wh
340e0 65 72 65 4c 6f 6f 70 20 69 73 20 61 75 74 6f 6d  ereLoop is autom
340f0 61 74 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 6f 72  atically.  ** or
34100 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 20 20 20  der-distinct.   
34110 41 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74  A WhereLoop that
34120 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 73 20   has no columns 
34130 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  in the ORDER BY 
34140 63 6c 61 75 73 65 0a 20 20 2a 2a 20 69 73 20 6e  clause.  ** is n
34150 6f 74 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  ot order-distinc
34160 74 2e 20 54 6f 20 62 65 20 6f 72 64 65 72 2d 64  t. To be order-d
34170 69 73 74 69 6e 63 74 20 69 73 20 6e 6f 74 20 71  istinct is not q
34180 75 69 74 65 20 74 68 65 20 73 61 6d 65 20 61 73  uite the same as
34190 20 62 65 69 6e 67 0a 20 20 2a 2a 20 55 4e 49 51   being.  ** UNIQ
341a0 55 45 20 73 69 6e 63 65 20 61 20 55 4e 49 51 55  UE since a UNIQU
341b0 45 20 63 6f 6c 75 6d 6e 20 6f 72 20 69 6e 64 65  E column or inde
341c0 78 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 69  x can have multi
341d0 70 6c 65 20 72 6f 77 73 20 74 68 61 74 20 0a 20  ple rows that . 
341e0 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 20 61 6e 64   ** are NULL and
341f0 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65   NULL values are
34200 20 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 20   equivalent for 
34210 74 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 6f  the purpose of o
34220 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20  rder-distinct.. 
34230 20 2a 2a 20 54 6f 20 62 65 20 6f 72 64 65 72 2d   ** To be order-
34240 64 69 73 74 69 6e 63 74 2c 20 74 68 65 20 63 6f  distinct, the co
34250 6c 75 6d 6e 73 20 6d 75 73 74 20 62 65 20 55 4e  lumns must be UN
34260 49 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c  IQUE and NOT NUL
34270 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  L..  **.  ** The
34280 20 72 6f 77 69 64 20 66 6f 72 20 61 20 74 61 62   rowid for a tab
34290 6c 65 20 69 73 20 61 6c 77 61 79 73 20 55 4e 49  le is always UNI
342a0 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c  QUE and NOT NULL
342b0 20 73 6f 20 77 68 65 6e 65 76 65 72 20 74 68 65   so whenever the
342c0 0a 20 20 2a 2a 20 72 6f 77 69 64 20 61 70 70 65  .  ** rowid appe
342d0 61 72 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52  ars in the ORDER
342e0 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 20   BY clause, the 
342f0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68  corresponding Wh
34300 65 72 65 4c 6f 6f 70 20 69 73 0a 20 20 2a 2a 20  ereLoop is.  ** 
34310 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 6f 72  automatically or
34320 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20 20  der-distinct..  
34330 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f  */..  assert( pO
34340 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 69  rderBy!=0 );.  i
34350 66 28 20 6e 4c 6f 6f 70 20 26 26 20 4f 70 74 69  f( nLoop && Opti
34360 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64  mizationDisabled
34370 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 72 64 65  (db, SQLITE_Orde
34380 72 42 79 49 64 78 4a 6f 69 6e 29 20 29 20 72 65  rByIdxJoin) ) re
34390 74 75 72 6e 20 30 3b 0a 0a 20 20 6e 4f 72 64 65  turn 0;..  nOrde
343a0 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  rBy = pOrderBy->
343b0 6e 45 78 70 72 3b 0a 20 20 74 65 73 74 63 61 73  nExpr;.  testcas
343c0 65 28 20 6e 4f 72 64 65 72 42 79 3d 3d 42 4d 53  e( nOrderBy==BMS
343d0 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 4f 72 64  -1 );.  if( nOrd
343e0 65 72 42 79 3e 42 4d 53 2d 31 20 29 20 72 65 74  erBy>BMS-1 ) ret
343f0 75 72 6e 20 30 3b 20 20 2f 2a 20 43 61 6e 6e 6f  urn 0;  /* Canno
34400 74 20 6f 70 74 69 6d 69 7a 65 20 6f 76 65 72 6c  t optimize overl
34410 79 20 6c 61 72 67 65 20 4f 52 44 45 52 20 42 59  y large ORDER BY
34420 73 20 2a 2f 0a 20 20 69 73 4f 72 64 65 72 44 69  s */.  isOrderDi
34430 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20 6f 62  stinct = 1;.  ob
34440 44 6f 6e 65 20 3d 20 4d 41 53 4b 42 49 54 28 6e  Done = MASKBIT(n
34450 4f 72 64 65 72 42 79 29 2d 31 3b 0a 20 20 6f 72  OrderBy)-1;.  or
34460 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 20  derDistinctMask 
34470 3d 20 30 3b 0a 20 20 72 65 61 64 79 20 3d 20 30  = 0;.  ready = 0
34480 3b 0a 20 20 65 71 4f 70 4d 61 73 6b 20 3d 20 57  ;.  eqOpMask = W
34490 4f 5f 45 51 20 7c 20 57 4f 5f 49 53 4e 55 4c 4c  O_EQ | WO_ISNULL
344a0 3b 0a 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61  ;.  if( wctrlFla
344b0 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52  gs & WHERE_ORDER
344c0 42 59 5f 4c 49 4d 49 54 20 29 20 65 71 4f 70 4d  BY_LIMIT ) eqOpM
344d0 61 73 6b 20 7c 3d 20 57 4f 5f 49 4e 3b 0a 20 20  ask |= WO_IN;.  
344e0 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 73 4f  for(iLoop=0; isO
344f0 72 64 65 72 44 69 73 74 69 6e 63 74 20 26 26 20  rderDistinct && 
34500 6f 62 53 61 74 3c 6f 62 44 6f 6e 65 20 26 26 20  obSat<obDone && 
34510 69 4c 6f 6f 70 3c 3d 6e 4c 6f 6f 70 3b 20 69 4c  iLoop<=nLoop; iL
34520 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  oop++){.    if( 
34530 69 4c 6f 6f 70 3e 30 20 29 20 72 65 61 64 79 20  iLoop>0 ) ready 
34540 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65  |= pLoop->maskSe
34550 6c 66 3b 0a 20 20 20 20 69 66 28 20 69 4c 6f 6f  lf;.    if( iLoo
34560 70 3c 6e 4c 6f 6f 70 20 29 7b 0a 20 20 20 20 20  p<nLoop ){.     
34570 20 70 4c 6f 6f 70 20 3d 20 70 50 61 74 68 2d 3e   pLoop = pPath->
34580 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a 20 20  aLoop[iLoop];.  
34590 20 20 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61      if( wctrlFla
345a0 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52  gs & WHERE_ORDER
345b0 42 59 5f 4c 49 4d 49 54 20 29 20 63 6f 6e 74 69  BY_LIMIT ) conti
345c0 6e 75 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  nue;.    }else{.
345d0 20 20 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c        pLoop = pL
345e0 61 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ast;.    }.    p
345f0 4c 6f 6f 70 20 3d 20 69 4c 6f 6f 70 3c 6e 4c 6f  Loop = iLoop<nLo
34600 6f 70 20 3f 20 70 50 61 74 68 2d 3e 61 4c 6f 6f  op ? pPath->aLoo
34610 70 5b 69 4c 6f 6f 70 5d 20 3a 20 70 4c 61 73 74  p[iLoop] : pLast
34620 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d  ;.    if( pLoop-
34630 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
34640 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 29 7b  _VIRTUALTABLE ){
34650 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70  .      if( pLoop
34660 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64 65 72  ->u.vtab.isOrder
34670 65 64 20 29 20 6f 62 53 61 74 20 3d 20 6f 62 44  ed ) obSat = obD
34680 6f 6e 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  one;.      break
34690 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 43 75 72  ;.    }.    iCur
346a0 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
346b0 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54  ist->a[pLoop->iT
346c0 61 62 5d 2e 69 43 75 72 73 6f 72 3b 0a 0a 20 20  ab].iCursor;..  
346d0 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e    /* Mark off an
346e0 79 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20  y ORDER BY term 
346f0 58 20 74 68 61 74 20 69 73 20 61 20 63 6f 6c 75  X that is a colu
34700 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  mn in the table 
34710 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75  of.    ** the cu
34720 72 72 65 6e 74 20 6c 6f 6f 70 20 66 6f 72 20 77  rrent loop for w
34730 68 69 63 68 20 74 68 65 72 65 20 69 73 20 74 65  hich there is te
34740 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 0a  rm in the WHERE.
34750 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66      ** clause of
34760 20 74 68 65 20 66 6f 72 6d 20 58 20 49 53 20 4e   the form X IS N
34770 55 4c 4c 20 6f 72 20 58 3d 3f 20 74 68 61 74 20  ULL or X=? that 
34780 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f  reference only o
34790 75 74 65 72 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70  uter.    ** loop
347a0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  s..    */.    fo
347b0 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42  r(i=0; i<nOrderB
347c0 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  y; i++){.      i
347d0 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20  f( MASKBIT(i) & 
347e0 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65  obSat ) continue
347f0 3b 0a 20 20 20 20 20 20 70 4f 42 45 78 70 72 20  ;.      pOBExpr 
34800 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
34810 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72 42  pCollate(pOrderB
34820 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  y->a[i].pExpr);.
34830 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70        if( pOBExp
34840 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
34850 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
34860 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e     if( pOBExpr->
34870 69 54 61 62 6c 65 21 3d 69 43 75 72 20 29 20 63  iTable!=iCur ) c
34880 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70  ontinue;.      p
34890 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28  Term = findTerm(
348a0 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 69 43  &pWInfo->sWC, iC
348b0 75 72 2c 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f  ur, pOBExpr->iCo
348c0 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  lumn,.          
348d0 20 20 20 20 20 20 20 20 20 20 20 20 20 7e 72 65               ~re
348e0 61 64 79 2c 20 65 71 4f 70 4d 61 73 6b 2c 20 30  ady, eqOpMask, 0
348f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  );.      if( pTe
34900 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  rm==0 ) continue
34910 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
34920 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  m->eOperator==WO
34930 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  _IN ){.        /
34940 2a 20 49 4e 20 74 65 72 6d 73 20 61 72 65 20 6f  * IN terms are o
34950 6e 6c 79 20 76 61 6c 69 64 20 66 6f 72 20 73 6f  nly valid for so
34960 72 74 69 6e 67 20 69 6e 20 74 68 65 20 4f 52 44  rting in the ORD
34970 45 52 20 42 59 20 4c 49 4d 49 54 20 0a 20 20 20  ER BY LIMIT .   
34980 20 20 20 20 20 2a 2a 20 6f 70 74 69 6d 69 7a 61       ** optimiza
34990 74 69 6f 6e 2c 20 61 6e 64 20 74 68 65 6e 20 6f  tion, and then o
349a0 6e 6c 79 20 69 66 20 74 68 65 79 20 61 72 65 20  nly if they are 
349b0 61 63 74 75 61 6c 6c 79 20 75 73 65 64 0a 20 20  actually used.  
349c0 20 20 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20        ** by the 
349d0 71 75 65 72 79 20 70 6c 61 6e 20 2a 2f 0a 20 20  query plan */.  
349e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 77 63        assert( wc
349f0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
34a00 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49 54 20 29  _ORDERBY_LIMIT )
34a10 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  ;.        for(j=
34a20 30 3b 20 6a 3c 70 4c 6f 6f 70 2d 3e 6e 4c 54 65  0; j<pLoop->nLTe
34a30 72 6d 20 26 26 20 70 54 65 72 6d 21 3d 70 4c 6f  rm && pTerm!=pLo
34a40 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 20 6a  op->aLTerm[j]; j
34a50 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 69 66  ++){}.        if
34a60 28 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 6e 4c 54 65  ( j>=pLoop->nLTe
34a70 72 6d 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  rm ) continue;. 
34a80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
34a90 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
34aa0 6f 72 26 57 4f 5f 45 51 29 21 3d 30 20 26 26 20  or&WO_EQ)!=0 && 
34ab0 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  pOBExpr->iColumn
34ac0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  >=0 ){.        c
34ad0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 2c 20 2a  onst char *z1, *
34ae0 7a 32 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  z2;.        pCol
34af0 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
34b00 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70  ollSeq(pWInfo->p
34b10 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d  Parse, pOrderBy-
34b20 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
34b30 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
34b40 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   ) pColl = db->p
34b50 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
34b60 20 20 7a 31 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e    z1 = pColl->zN
34b70 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  ame;.        pCo
34b80 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
34b90 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e  CollSeq(pWInfo->
34ba0 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70  pParse, pTerm->p
34bb0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69  Expr);.        i
34bc0 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c  f( !pColl ) pCol
34bd0 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
34be0 6c 3b 0a 20 20 20 20 20 20 20 20 7a 32 20 3d 20  l;.        z2 = 
34bf0 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  pColl->zName;.  
34c00 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
34c10 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29  3StrICmp(z1, z2)
34c20 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
34c30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6f 62        }.      ob
34c40 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69  Sat |= MASKBIT(i
34c50 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
34c60 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
34c70 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57  s & WHERE_ONEROW
34c80 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )==0 ){.      if
34c90 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
34ca0 20 26 20 57 48 45 52 45 5f 49 50 4b 20 29 7b 0a   & WHERE_IPK ){.
34cb0 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 20 3d          pIndex =
34cc0 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 4b 65 79   0;.        nKey
34cd0 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Col = 0;.       
34ce0 20 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20   nColumn = 1;.  
34cf0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
34d00 49 6e 64 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75  Index = pLoop->u
34d10 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29 3d 3d  .btree.pIndex)==
34d20 30 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 62 55 6e  0 || pIndex->bUn
34d30 6f 72 64 65 72 65 64 20 29 7b 0a 20 20 20 20 20  ordered ){.     
34d40 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
34d50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
34d60 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 70 49 6e 64    nKeyCol = pInd
34d70 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20  ex->nKeyCol;.   
34d80 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70       nColumn = p
34d90 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a  Index->nColumn;.
34da0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
34db0 6e 43 6f 6c 75 6d 6e 3d 3d 6e 4b 65 79 43 6f 6c  nColumn==nKeyCol
34dc0 2b 31 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28  +1 || !HasRowid(
34dd0 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 29 20  pIndex->pTable) 
34de0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
34df0 74 28 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  t( pIndex->aiCol
34e00 75 6d 6e 5b 6e 43 6f 6c 75 6d 6e 2d 31 5d 3d 3d  umn[nColumn-1]==
34e10 28 2d 31 29 20 7c 7c 20 21 48 61 73 52 6f 77 69  (-1) || !HasRowi
34e20 64 28 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  d(pIndex->pTable
34e30 29 29 3b 0a 20 20 20 20 20 20 20 20 69 73 4f 72  ));.        isOr
34e40 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 49 73  derDistinct = Is
34e50 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 6e 64  UniqueIndex(pInd
34e60 65 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  ex);.      }..  
34e70 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f      /* Loop thro
34e80 75 67 68 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20  ugh all columns 
34e90 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  of the index and
34ea0 20 64 65 61 6c 20 77 69 74 68 20 74 68 65 20 6f   deal with the o
34eb0 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  nes.      ** tha
34ec0 74 20 61 72 65 20 6e 6f 74 20 63 6f 6e 73 74 72  t are not constr
34ed0 61 69 6e 65 64 20 62 79 20 3d 3d 20 6f 72 20 49  ained by == or I
34ee0 4e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  N..      */.    
34ef0 20 20 72 65 76 20 3d 20 72 65 76 53 65 74 20 3d    rev = revSet =
34f00 20 30 3b 0a 20 20 20 20 20 20 64 69 73 74 69 6e   0;.      distin
34f10 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 30 3b 0a 20  ctColumns = 0;. 
34f20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
34f30 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20  nColumn; j++){. 
34f40 20 20 20 20 20 20 20 75 38 20 62 4f 6e 63 65 3b         u8 bOnce;
34f50 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 75     /* True to ru
34f60 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 73  n the ORDER BY s
34f70 65 61 72 63 68 20 6c 6f 6f 70 20 2a 2f 0a 0a 20  earch loop */.. 
34f80 20 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 6f         /* Skip o
34f90 76 65 72 20 3d 3d 20 61 6e 64 20 49 53 20 4e 55  ver == and IS NU
34fa0 4c 4c 20 74 65 72 6d 73 0a 20 20 20 20 20 20 20  LL terms.       
34fb0 20 2a 2a 20 28 41 6c 73 6f 20 73 6b 69 70 20 49   ** (Also skip I
34fc0 4e 20 74 65 72 6d 73 20 77 68 65 6e 20 64 6f 69  N terms when doi
34fd0 6e 67 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  ng WHERE_ORDERBY
34fe0 5f 4c 49 4d 49 54 20 70 72 6f 63 65 73 73 69 6e  _LIMIT processin
34ff0 67 29 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  g).        */.  
35000 20 20 20 20 20 20 69 66 28 20 6a 3c 70 4c 6f 6f        if( j<pLoo
35010 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20  p->u.btree.nEq. 
35020 20 20 20 20 20 20 20 20 26 26 20 70 4c 6f 6f 70          && pLoop
35030 2d 3e 6e 53 6b 69 70 3d 3d 30 0a 20 20 20 20 20  ->nSkip==0.     
35040 20 20 20 20 26 26 20 28 28 69 20 3d 20 70 4c 6f      && ((i = pLo
35050 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 65  op->aLTerm[j]->e
35060 4f 70 65 72 61 74 6f 72 29 20 26 20 65 71 4f 70  Operator) & eqOp
35070 4d 61 73 6b 29 21 3d 30 0a 20 20 20 20 20 20 20  Mask)!=0.       
35080 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
35090 28 20 69 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20  ( i & WO_ISNULL 
350a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  ){.            t
350b0 65 73 74 63 61 73 65 28 20 69 73 4f 72 64 65 72  estcase( isOrder
350c0 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20  Distinct );.    
350d0 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44          isOrderD
350e0 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20  istinct = 0;.   
350f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
35100 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 0a 20     continue;  . 
35110 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
35120 20 20 2f 2a 20 47 65 74 20 74 68 65 20 63 6f 6c    /* Get the col
35130 75 6d 6e 20 6e 75 6d 62 65 72 20 69 6e 20 74 68  umn number in th
35140 65 20 74 61 62 6c 65 20 28 69 43 6f 6c 75 6d 6e  e table (iColumn
35150 29 20 61 6e 64 20 73 6f 72 74 20 6f 72 64 65 72  ) and sort order
35160 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 72 65 76  .        ** (rev
35170 49 64 78 29 20 66 6f 72 20 74 68 65 20 6a 2d 74  Idx) for the j-t
35180 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  h column of the 
35190 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a  index..        *
351a0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  /.        if( pI
351b0 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20  ndex ){.        
351c0 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64    iColumn = pInd
351d0 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b  ex->aiColumn[j];
351e0 0a 20 20 20 20 20 20 20 20 20 20 72 65 76 49 64  .          revId
351f0 78 20 3d 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72  x = pIndex->aSor
35200 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20  tOrder[j];.     
35210 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e       if( iColumn
35220 3d 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  ==pIndex->pTable
35230 2d 3e 69 50 4b 65 79 20 29 20 69 43 6f 6c 75 6d  ->iPKey ) iColum
35240 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  n = -1;.        
35250 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
35260 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20   iColumn = -1;. 
35270 20 20 20 20 20 20 20 20 20 72 65 76 49 64 78 20           revIdx 
35280 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  = 0;.        }..
35290 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 75 6e          /* An un
352a0 63 6f 6e 73 74 72 61 69 6e 65 64 20 63 6f 6c 75  constrained colu
352b0 6d 6e 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  mn that might be
352c0 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74   NULL means that
352d0 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a   this.        **
352e0 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 6e 6f   WhereLoop is no
352f0 74 20 77 65 6c 6c 2d 6f 72 64 65 72 65 64 0a 20  t well-ordered. 
35300 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
35310 20 20 69 66 28 20 69 73 4f 72 64 65 72 44 69 73    if( isOrderDis
35320 74 69 6e 63 74 0a 20 20 20 20 20 20 20 20 20 26  tinct.         &
35330 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20  & iColumn>=0.   
35340 20 20 20 20 20 20 26 26 20 6a 3e 3d 70 4c 6f 6f        && j>=pLoo
35350 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20  p->u.btree.nEq. 
35360 20 20 20 20 20 20 20 20 26 26 20 70 49 6e 64 65          && pInde
35370 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b  x->pTable->aCol[
35380 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c  iColumn].notNull
35390 3d 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  ==0.        ){. 
353a0 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
353b0 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20  Distinct = 0;.  
353c0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
353d0 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 4f 52 44   /* Find the ORD
353e0 45 52 20 42 59 20 74 65 72 6d 20 74 68 61 74 20  ER BY term that 
353f0 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74  corresponds to t
35400 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 0a 20  he j-th column. 
35410 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65         ** of the
35420 20 69 6e 64 65 78 20 61 6e 64 20 6d 61 72 6b 20   index and mark 
35430 74 68 61 74 20 4f 52 44 45 52 20 42 59 20 74 65  that ORDER BY te
35440 72 6d 20 6f 66 66 20 0a 20 20 20 20 20 20 20 20  rm off .        
35450 2a 2f 0a 20 20 20 20 20 20 20 20 62 4f 6e 63 65  */.        bOnce
35460 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69 73   = 1;.        is
35470 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20  Match = 0;.     
35480 20 20 20 66 6f 72 28 69 3d 30 3b 20 62 4f 6e 63     for(i=0; bOnc
35490 65 20 26 26 20 69 3c 6e 4f 72 64 65 72 42 79 3b  e && i<nOrderBy;
354a0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
354b0 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20   if( MASKBIT(i) 
354c0 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e  & obSat ) contin
354d0 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f  ue;.          pO
354e0 42 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  BExpr = sqlite3E
354f0 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
35500 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
35510 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
35520 74 65 73 74 63 61 73 65 28 20 77 63 74 72 6c 46  testcase( wctrlF
35530 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f  lags & WHERE_GRO
35540 55 50 42 59 20 29 3b 0a 20 20 20 20 20 20 20 20  UPBY );.        
35550 20 20 74 65 73 74 63 61 73 65 28 20 77 63 74 72    testcase( wctr
35560 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44  lFlags & WHERE_D
35570 49 53 54 49 4e 43 54 42 59 20 29 3b 0a 20 20 20  ISTINCTBY );.   
35580 20 20 20 20 20 20 20 69 66 28 20 28 77 63 74 72         if( (wctr
35590 6c 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  lFlags & (WHERE_
355a0 47 52 4f 55 50 42 59 7c 57 48 45 52 45 5f 44 49  GROUPBY|WHERE_DI
355b0 53 54 49 4e 43 54 42 59 29 29 3d 3d 30 20 29 20  STINCTBY))==0 ) 
355c0 62 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20  bOnce = 0;.     
355d0 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72       if( pOBExpr
355e0 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
355f0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
35600 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70        if( pOBExp
35610 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72 20  r->iTable!=iCur 
35620 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
35630 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70        if( pOBExp
35640 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c  r->iColumn!=iCol
35650 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  umn ) continue;.
35660 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43            if( iC
35670 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20  olumn>=0 ){.    
35680 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
35690 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
356a0 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  eq(pWInfo->pPars
356b0 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  e, pOrderBy->a[i
356c0 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
356d0 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
356e0 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   ) pColl = db->p
356f0 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
35700 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
35710 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e  3StrICmp(pColl->
35720 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78 2d 3e 61  zName, pIndex->a
35730 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 20 63  zColl[j])!=0 ) c
35740 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
35750 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
35760 73 4d 61 74 63 68 20 3d 20 31 3b 0a 20 20 20 20  sMatch = 1;.    
35770 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
35780 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
35790 66 28 20 69 73 4d 61 74 63 68 20 26 26 20 28 77  f( isMatch && (w
357a0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
357b0 45 5f 47 52 4f 55 50 42 59 29 3d 3d 30 20 29 7b  E_GROUPBY)==0 ){
357c0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61  .          /* Ma
357d0 6b 65 20 73 75 72 65 20 74 68 65 20 73 6f 72 74  ke sure the sort
357e0 20 6f 72 64 65 72 20 69 73 20 63 6f 6d 70 61 74   order is compat
357f0 69 62 6c 65 20 69 6e 20 61 6e 20 4f 52 44 45 52  ible in an ORDER
35800 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20   BY clause..    
35810 20 20 20 20 20 20 2a 2a 20 53 6f 72 74 20 6f 72        ** Sort or
35820 64 65 72 20 69 73 20 69 72 72 65 6c 65 76 61 6e  der is irrelevan
35830 74 20 66 6f 72 20 61 20 47 52 4f 55 50 20 42 59  t for a GROUP BY
35840 20 63 6c 61 75 73 65 2e 20 2a 2f 0a 20 20 20 20   clause. */.    
35850 20 20 20 20 20 20 69 66 28 20 72 65 76 53 65 74        if( revSet
35860 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
35870 69 66 28 20 28 72 65 76 20 5e 20 72 65 76 49 64  if( (rev ^ revId
35880 78 29 21 3d 70 4f 72 64 65 72 42 79 2d 3e 61 5b  x)!=pOrderBy->a[
35890 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29 20 69  i].sortOrder ) i
358a0 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20  sMatch = 0;.    
358b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
358c0 20 20 20 20 20 20 20 20 20 72 65 76 20 3d 20 72           rev = r
358d0 65 76 49 64 78 20 5e 20 70 4f 72 64 65 72 42 79  evIdx ^ pOrderBy
358e0 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
358f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
35900 28 20 72 65 76 20 29 20 2a 70 52 65 76 4d 61 73  ( rev ) *pRevMas
35910 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 4c 6f  k |= MASKBIT(iLo
35920 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  op);.           
35930 20 72 65 76 53 65 74 20 3d 20 31 3b 0a 20 20 20   revSet = 1;.   
35940 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
35950 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   }.        if( i
35960 73 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20  sMatch ){.      
35970 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3c      if( iColumn<
35980 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
35990 20 74 65 73 74 63 61 73 65 28 20 64 69 73 74 69   testcase( disti
359a0 6e 63 74 43 6f 6c 75 6d 6e 73 3d 3d 30 20 29 3b  nctColumns==0 );
359b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73  .            dis
359c0 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 31  tinctColumns = 1
359d0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
359e0 20 20 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d          obSat |=
359f0 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20   MASKBIT(i);.   
35a00 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
35a10 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6d 61 74 63        /* No matc
35a20 68 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20  h found */.     
35a30 20 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 7c 7c       if( j==0 ||
35a40 20 6a 3c 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20   j<nKeyCol ){.  
35a50 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
35a60 73 65 28 20 69 73 4f 72 64 65 72 44 69 73 74 69  se( isOrderDisti
35a70 6e 63 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  nct!=0 );.      
35a80 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73        isOrderDis
35a90 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20  tinct = 0;.     
35aa0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
35ab0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
35ac0 7d 0a 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64  }.      } /* end
35ad0 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69   Loop over all i
35ae0 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  ndex columns */.
35af0 20 20 20 20 20 20 69 66 28 20 64 69 73 74 69 6e        if( distin
35b00 63 74 43 6f 6c 75 6d 6e 73 20 29 7b 0a 20 20 20  ctColumns ){.   
35b10 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
35b20 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 3d 3d  sOrderDistinct==
35b30 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 73 4f  0 );.        isO
35b40 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 31  rderDistinct = 1
35b50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  ;.      }.    } 
35b60 2f 2a 20 65 6e 64 2d 69 66 20 6e 6f 74 20 6f 6e  /* end-if not on
35b70 65 2d 72 6f 77 20 2a 2f 0a 0a 20 20 20 20 2f 2a  e-row */..    /*
35b80 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79 20 6f 74   Mark off any ot
35b90 68 65 72 20 4f 52 44 45 52 20 42 59 20 74 65 72  her ORDER BY ter
35ba0 6d 73 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  ms that referenc
35bb0 65 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69  e pLoop */.    i
35bc0 66 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  f( isOrderDistin
35bd0 63 74 20 29 7b 0a 20 20 20 20 20 20 6f 72 64 65  ct ){.      orde
35be0 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 20 7c 3d  rDistinctMask |=
35bf0 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66   pLoop->maskSelf
35c00 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
35c10 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b   i<nOrderBy; i++
35c20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
35c30 2a 70 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d  *p;.        Bitm
35c40 61 73 6b 20 6d 54 65 72 6d 3b 0a 20 20 20 20 20  ask mTerm;.     
35c50 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69     if( MASKBIT(i
35c60 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74  ) & obSat ) cont
35c70 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 70 20  inue;.        p 
35c80 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
35c90 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
35ca0 6d 54 65 72 6d 20 3d 20 65 78 70 72 54 61 62 6c  mTerm = exprTabl
35cb0 65 55 73 61 67 65 28 26 70 57 49 6e 66 6f 2d 3e  eUsage(&pWInfo->
35cc0 73 4d 61 73 6b 53 65 74 2c 70 29 3b 0a 20 20 20  sMaskSet,p);.   
35cd0 20 20 20 20 20 69 66 28 20 6d 54 65 72 6d 3d 3d       if( mTerm==
35ce0 30 20 26 26 20 21 73 71 6c 69 74 65 33 45 78 70  0 && !sqlite3Exp
35cf0 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 29 20 29  rIsConstant(p) )
35d00 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
35d10 20 20 20 69 66 28 20 28 6d 54 65 72 6d 26 7e 6f     if( (mTerm&~o
35d20 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b  rderDistinctMask
35d30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
35d40 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42    obSat |= MASKB
35d50 49 54 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d  IT(i);.        }
35d60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
35d70 20 7d 20 2f 2a 20 45 6e 64 20 74 68 65 20 6c 6f   } /* End the lo
35d80 6f 70 20 6f 76 65 72 20 61 6c 6c 20 57 68 65 72  op over all Wher
35d90 65 4c 6f 6f 70 73 20 66 72 6f 6d 20 6f 75 74 65  eLoops from oute
35da0 72 2d 6d 6f 73 74 20 64 6f 77 6e 20 74 6f 20 69  r-most down to i
35db0 6e 6e 65 72 2d 6d 6f 73 74 20 2a 2f 0a 20 20 69  nner-most */.  i
35dc0 66 28 20 6f 62 53 61 74 3d 3d 6f 62 44 6f 6e 65  f( obSat==obDone
35dd0 20 29 20 72 65 74 75 72 6e 20 28 69 38 29 6e 4f   ) return (i8)nO
35de0 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20 21 69  rderBy;.  if( !i
35df0 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 29  sOrderDistinct )
35e00 7b 0a 20 20 20 20 66 6f 72 28 69 3d 6e 4f 72 64  {.    for(i=nOrd
35e10 65 72 42 79 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d  erBy-1; i>0; i--
35e20 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  ){.      Bitmask
35e30 20 6d 20 3d 20 4d 41 53 4b 42 49 54 28 69 29 20   m = MASKBIT(i) 
35e40 2d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 28  - 1;.      if( (
35e50 6f 62 53 61 74 26 6d 29 3d 3d 6d 20 29 20 72 65  obSat&m)==m ) re
35e60 74 75 72 6e 20 69 3b 0a 20 20 20 20 7d 0a 20 20  turn i;.    }.  
35e70 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
35e80 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a    return -1;.}..
35e90 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48  ./*.** If the WH
35ea0 45 52 45 5f 47 52 4f 55 50 42 59 20 66 6c 61 67  ERE_GROUPBY flag
35eb0 20 69 73 20 73 65 74 20 69 6e 20 74 68 65 20 6d   is set in the m
35ec0 61 73 6b 20 70 61 73 73 65 64 20 74 6f 20 73 71  ask passed to sq
35ed0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
35ee0 29 2c 0a 2a 2a 20 74 68 65 20 70 6c 61 6e 6e 65  ),.** the planne
35ef0 72 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 74  r assumes that t
35f00 68 65 20 73 70 65 63 69 66 69 65 64 20 70 4f 72  he specified pOr
35f10 64 65 72 42 79 20 6c 69 73 74 20 69 73 20 61 63  derBy list is ac
35f20 74 75 61 6c 6c 79 20 61 20 47 52 4f 55 50 0a 2a  tually a GROUP.*
35f30 2a 20 42 59 20 63 6c 61 75 73 65 20 2d 20 61 6e  * BY clause - an
35f40 64 20 73 6f 20 61 6e 79 20 6f 72 64 65 72 20 74  d so any order t
35f50 68 61 74 20 67 72 6f 75 70 73 20 72 6f 77 73 20  hat groups rows 
35f60 61 73 20 72 65 71 75 69 72 65 64 20 73 61 74 69  as required sati
35f70 73 66 69 65 73 20 74 68 65 0a 2a 2a 20 72 65 71  sfies the.** req
35f80 75 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d  uest..**.** Norm
35f90 61 6c 6c 79 2c 20 69 6e 20 74 68 69 73 20 63 61  ally, in this ca
35fa0 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  se it is not pos
35fb0 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20 63 61  sible for the ca
35fc0 6c 6c 65 72 20 74 6f 20 64 65 74 65 72 6d 69 6e  ller to determin
35fd0 65 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20  e.** whether or 
35fe0 6e 6f 74 20 74 68 65 20 72 6f 77 73 20 61 72 65  not the rows are
35ff0 20 72 65 61 6c 6c 79 20 62 65 69 6e 67 20 64 65   really being de
36000 6c 69 76 65 72 65 64 20 69 6e 20 73 6f 72 74 65  livered in sorte
36010 64 20 6f 72 64 65 72 2c 20 6f 72 0a 2a 2a 20 6a  d order, or.** j
36020 75 73 74 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65  ust in some othe
36030 72 20 6f 72 64 65 72 20 74 68 61 74 20 70 72 6f  r order that pro
36040 76 69 64 65 73 20 74 68 65 20 72 65 71 75 69 72  vides the requir
36050 65 64 20 67 72 6f 75 70 69 6e 67 2e 20 48 6f 77  ed grouping. How
36060 65 76 65 72 2c 0a 2a 2a 20 69 66 20 74 68 65 20  ever,.** if the 
36070 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55  WHERE_SORTBYGROU
36080 50 20 66 6c 61 67 20 69 73 20 61 6c 73 6f 20 70  P flag is also p
36090 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33  assed to sqlite3
360a0 57 68 65 72 65 42 65 67 69 6e 28 29 2c 20 74 68  WhereBegin(), th
360b0 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  en.** this funct
360c0 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65  ion may be calle
360d0 64 20 6f 6e 20 74 68 65 20 72 65 74 75 72 6e 65  d on the returne
360e0 64 20 57 68 65 72 65 49 6e 66 6f 20 6f 62 6a 65  d WhereInfo obje
360f0 63 74 2e 20 49 74 20 72 65 74 75 72 6e 73 0a 2a  ct. It returns.*
36100 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 72 6f  * true if the ro
36110 77 73 20 72 65 61 6c 6c 79 20 77 69 6c 6c 20 62  ws really will b
36120 65 20 73 6f 72 74 65 64 20 69 6e 20 74 68 65 20  e sorted in the 
36130 73 70 65 63 69 66 69 65 64 20 6f 72 64 65 72 2c  specified order,
36140 20 6f 72 20 66 61 6c 73 65 0a 2a 2a 20 6f 74 68   or false.** oth
36150 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f  erwise..**.** Fo
36160 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d  r example, assum
36170 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45  ing:.**.**   CRE
36180 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20  ATE INDEX i1 ON 
36190 74 31 28 78 2c 20 59 29 3b 0a 2a 2a 0a 2a 2a 20  t1(x, Y);.**.** 
361a0 74 68 65 6e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c  then.**.**   SEL
361b0 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 47 52  ECT * FROM t1 GR
361c0 4f 55 50 20 42 59 20 78 2c 79 20 4f 52 44 45 52  OUP BY x,y ORDER
361d0 20 42 59 20 78 2c 79 3b 20 20 20 2d 2d 20 49 73   BY x,y;   -- Is
361e0 53 6f 72 74 65 64 28 29 3d 3d 31 0a 2a 2a 20 20  Sorted()==1.**  
361f0 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
36200 31 20 47 52 4f 55 50 20 42 59 20 79 2c 78 20 4f  1 GROUP BY y,x O
36210 52 44 45 52 20 42 59 20 79 2c 78 3b 20 20 20 2d  RDER BY y,x;   -
36220 2d 20 49 73 53 6f 72 74 65 64 28 29 3d 3d 30 0a  - IsSorted()==0.
36230 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68  */.int sqlite3Wh
36240 65 72 65 49 73 53 6f 72 74 65 64 28 57 68 65 72  ereIsSorted(Wher
36250 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
36260 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f    assert( pWInfo
36270 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
36280 48 45 52 45 5f 47 52 4f 55 50 42 59 20 29 3b 0a  HERE_GROUPBY );.
36290 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f    assert( pWInfo
362a0 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
362b0 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50  HERE_SORTBYGROUP
362c0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49   );.  return pWI
362d0 6e 66 6f 2d 3e 73 6f 72 74 65 64 3b 0a 7d 0a 0a  nfo->sorted;.}..
362e0 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
362f0 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 20 46 6f 72  E_ENABLED./* For
36300 20 64 65 62 75 67 67 69 6e 67 20 75 73 65 20 6f   debugging use o
36310 6e 6c 79 3a 20 2a 2f 0a 73 74 61 74 69 63 20 63  nly: */.static c
36320 6f 6e 73 74 20 63 68 61 72 20 2a 77 68 65 72 65  onst char *where
36330 50 61 74 68 4e 61 6d 65 28 57 68 65 72 65 50 61  PathName(WherePa
36340 74 68 20 2a 70 50 61 74 68 2c 20 69 6e 74 20 6e  th *pPath, int n
36350 4c 6f 6f 70 2c 20 57 68 65 72 65 4c 6f 6f 70 20  Loop, WhereLoop 
36360 2a 70 4c 61 73 74 29 7b 0a 20 20 73 74 61 74 69  *pLast){.  stati
36370 63 20 63 68 61 72 20 7a 4e 61 6d 65 5b 36 35 5d  c char zName[65]
36380 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
36390 28 69 3d 30 3b 20 69 3c 6e 4c 6f 6f 70 3b 20 69  (i=0; i<nLoop; i
363a0 2b 2b 29 7b 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20  ++){ zName[i] = 
363b0 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 5d 2d  pPath->aLoop[i]-
363c0 3e 63 49 64 3b 20 7d 0a 20 20 69 66 28 20 70 4c  >cId; }.  if( pL
363d0 61 73 74 20 29 20 7a 4e 61 6d 65 5b 69 2b 2b 5d  ast ) zName[i++]
363e0 20 3d 20 70 4c 61 73 74 2d 3e 63 49 64 3b 0a 20   = pLast->cId;. 
363f0 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b 0a 20   zName[i] = 0;. 
36400 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d   return zName;.}
36410 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
36420 65 74 75 72 6e 20 74 68 65 20 63 6f 73 74 20 6f  eturn the cost o
36430 66 20 73 6f 72 74 69 6e 67 20 6e 52 6f 77 20 72  f sorting nRow r
36440 6f 77 73 2c 20 61 73 73 75 6d 69 6e 67 20 74 68  ows, assuming th
36450 61 74 20 74 68 65 20 6b 65 79 73 20 68 61 76 65  at the keys have
36460 20 0a 2a 2a 20 6e 4f 72 64 65 72 62 79 20 63 6f   .** nOrderby co
36470 6c 75 6d 6e 73 20 61 6e 64 20 74 68 61 74 20 74  lumns and that t
36480 68 65 20 66 69 72 73 74 20 6e 53 6f 72 74 65 64  he first nSorted
36490 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 61 6c 72   columns are alr
364a0 65 61 64 79 20 69 6e 0a 2a 2a 20 6f 72 64 65 72  eady in.** order
364b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45  ..*/.static LogE
364c0 73 74 20 77 68 65 72 65 53 6f 72 74 69 6e 67 43  st whereSortingC
364d0 6f 73 74 28 0a 20 20 57 68 65 72 65 49 6e 66 6f  ost(.  WhereInfo
364e0 20 2a 70 57 49 6e 66 6f 2c 0a 20 20 4c 6f 67 45   *pWInfo,.  LogE
364f0 73 74 20 6e 52 6f 77 2c 0a 20 20 69 6e 74 20 6e  st nRow,.  int n
36500 4f 72 64 65 72 42 79 2c 0a 20 20 69 6e 74 20 6e  OrderBy,.  int n
36510 53 6f 72 74 65 64 0a 29 7b 0a 20 20 2f 2a 20 54  Sorted.){.  /* T
36520 55 4e 49 4e 47 3a 20 45 73 74 69 6d 61 74 65 64  UNING: Estimated
36530 20 63 6f 73 74 20 6f 66 20 61 20 66 75 6c 6c 20   cost of a full 
36540 65 78 74 65 72 6e 61 6c 20 73 6f 72 74 2c 20 77  external sort, w
36550 68 65 72 65 20 4e 20 69 73 20 0a 20 20 2a 2a 20  here N is .  ** 
36560 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
36570 77 73 20 74 6f 20 73 6f 72 74 20 69 73 3a 0a 20  ws to sort is:. 
36580 20 2a 2a 0a 20 20 2a 2a 20 20 20 63 6f 73 74 20   **.  **   cost 
36590 3d 20 28 33 2e 30 20 2a 20 4e 20 2a 20 6c 6f 67  = (3.0 * N * log
365a0 28 4e 29 29 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a  (N))..  ** .  **
365b0 20 4f 72 2c 20 69 66 20 74 68 65 20 6f 72 64 65   Or, if the orde
365c0 72 2d 62 79 20 63 6c 61 75 73 65 20 68 61 73 20  r-by clause has 
365d0 58 20 74 65 72 6d 73 20 62 75 74 20 6f 6e 6c 79  X terms but only
365e0 20 74 68 65 20 6c 61 73 74 20 59 20 0a 20 20 2a   the last Y .  *
365f0 2a 20 74 65 72 6d 73 20 61 72 65 20 6f 75 74 20  * terms are out 
36600 6f 66 20 6f 72 64 65 72 2c 20 74 68 65 6e 20 62  of order, then b
36610 6c 6f 63 6b 2d 73 6f 72 74 69 6e 67 20 77 69 6c  lock-sorting wil
36620 6c 20 72 65 64 75 63 65 20 74 68 65 20 0a 20 20  l reduce the .  
36630 2a 2a 20 73 6f 72 74 69 6e 67 20 63 6f 73 74 20  ** sorting cost 
36640 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  to:.  **.  **   
36650 63 6f 73 74 20 3d 20 28 33 2e 30 20 2a 20 4e 20  cost = (3.0 * N 
36660 2a 20 6c 6f 67 28 4e 29 29 20 2a 20 28 59 2f 58  * log(N)) * (Y/X
36670 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ).  **.  ** The 
36680 28 59 2f 58 29 20 74 65 72 6d 20 69 73 20 69 6d  (Y/X) term is im
36690 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20  plemented using 
366a0 73 74 61 63 6b 20 76 61 72 69 61 62 6c 65 20 72  stack variable r
366b0 53 63 61 6c 65 0a 20 20 2a 2a 20 62 65 6c 6f 77  Scale.  ** below
366c0 2e 20 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72  .  */.  LogEst r
366d0 53 63 61 6c 65 2c 20 72 53 6f 72 74 43 6f 73 74  Scale, rSortCost
366e0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 72 64  ;.  assert( nOrd
366f0 65 72 42 79 3e 30 20 26 26 20 36 36 3d 3d 73 71  erBy>0 && 66==sq
36700 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 30 29  lite3LogEst(100)
36710 20 29 3b 0a 20 20 72 53 63 61 6c 65 20 3d 20 73   );.  rScale = s
36720 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 6e 4f  qlite3LogEst((nO
36730 72 64 65 72 42 79 2d 6e 53 6f 72 74 65 64 29 2a  rderBy-nSorted)*
36740 31 30 30 2f 6e 4f 72 64 65 72 42 79 29 20 2d 20  100/nOrderBy) - 
36750 36 36 3b 0a 20 20 72 53 6f 72 74 43 6f 73 74 20  66;.  rSortCost 
36760 3d 20 6e 52 6f 77 20 2b 20 65 73 74 4c 6f 67 28  = nRow + estLog(
36770 6e 52 6f 77 29 20 2b 20 72 53 63 61 6c 65 20 2b  nRow) + rScale +
36780 20 31 36 3b 0a 0a 20 20 2f 2a 20 54 55 4e 49 4e   16;..  /* TUNIN
36790 47 3a 20 54 68 65 20 63 6f 73 74 20 6f 66 20 69  G: The cost of i
367a0 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 44 49 53 54  mplementing DIST
367b0 49 4e 43 54 20 75 73 69 6e 67 20 61 20 42 2d 54  INCT using a B-T
367c0 52 45 45 20 69 73 0a 20 20 2a 2a 20 73 69 6d 69  REE is.  ** simi
367d0 6c 61 72 20 62 75 74 20 77 69 74 68 20 61 20 6c  lar but with a l
367e0 61 72 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 6f  arger constant o
367f0 66 20 70 72 6f 70 6f 72 74 69 6f 6e 61 6c 69 74  f proportionalit
36800 79 2e 20 0a 20 20 2a 2a 20 4d 75 6c 74 69 70 6c  y. .  ** Multipl
36810 79 20 62 79 20 61 6e 20 61 64 64 69 74 69 6f 6e  y by an addition
36820 61 6c 20 66 61 63 74 6f 72 20 6f 66 20 33 2e 30  al factor of 3.0
36830 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 49 6e  .  */.  if( pWIn
36840 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
36850 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54   WHERE_WANT_DIST
36860 49 4e 43 54 20 29 7b 0a 20 20 20 20 72 53 6f 72  INCT ){.    rSor
36870 74 43 6f 73 74 20 2b 3d 20 31 36 3b 0a 20 20 7d  tCost += 16;.  }
36880 0a 0a 20 20 72 65 74 75 72 6e 20 72 53 6f 72 74  ..  return rSort
36890 43 6f 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  Cost;.}../*.** G
368a0 69 76 65 6e 20 74 68 65 20 6c 69 73 74 20 6f 66  iven the list of
368b0 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
368c0 74 73 20 61 74 20 70 57 49 6e 66 6f 2d 3e 70 4c  ts at pWInfo->pL
368d0 6f 6f 70 73 2c 20 74 68 69 73 20 72 6f 75 74 69  oops, this routi
368e0 6e 65 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74  ne.** attempts t
368f0 6f 20 66 69 6e 64 20 74 68 65 20 6c 6f 77 65 73  o find the lowes
36900 74 20 63 6f 73 74 20 70 61 74 68 20 74 68 61 74  t cost path that
36910 20 76 69 73 69 74 73 20 65 61 63 68 20 57 68 65   visits each Whe
36920 72 65 4c 6f 6f 70 0a 2a 2a 20 6f 6e 63 65 2e 20  reLoop.** once. 
36930 20 54 68 69 73 20 70 61 74 68 20 69 73 20 74 68   This path is th
36940 65 6e 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 74  en loaded into t
36950 68 65 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70  he pWInfo->a[].p
36960 57 4c 6f 6f 70 20 66 69 65 6c 64 73 2e 0a 2a 2a  WLoop fields..**
36970 0a 2a 2a 20 41 73 73 75 6d 65 20 74 68 61 74 20  .** Assume that 
36980 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
36990 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20   of output rows 
369a0 74 68 61 74 20 77 69 6c 6c 20 6e 65 65 64 20 74  that will need t
369b0 6f 20 62 65 20 73 6f 72 74 65 64 0a 2a 2a 20 77  o be sorted.** w
369c0 69 6c 6c 20 62 65 20 6e 52 6f 77 45 73 74 20 28  ill be nRowEst (
369d0 69 6e 20 74 68 65 20 31 30 2a 6c 6f 67 32 20 72  in the 10*log2 r
369e0 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 29 2e 20  epresentation). 
369f0 20 4f 72 2c 20 69 67 6e 6f 72 65 20 73 6f 72 74   Or, ignore sort
36a00 69 6e 67 0a 2a 2a 20 63 6f 73 74 73 20 69 66 20  ing.** costs if 
36a10 6e 52 6f 77 45 73 74 3d 3d 30 2e 0a 2a 2a 0a 2a  nRowEst==0..**.*
36a20 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
36a30 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  OK on success or
36a40 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 66   SQLITE_NOMEM of
36a50 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
36a60 74 69 6f 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f 63  tion.** error oc
36a70 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  curs..*/.static 
36a80 69 6e 74 20 77 68 65 72 65 50 61 74 68 53 6f 6c  int wherePathSol
36a90 76 65 72 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  ver(WhereInfo *p
36aa0 57 49 6e 66 6f 2c 20 4c 6f 67 45 73 74 20 6e 52  WInfo, LogEst nR
36ab0 6f 77 45 73 74 29 7b 0a 20 20 69 6e 74 20 6d 78  owEst){.  int mx
36ac0 43 68 6f 69 63 65 3b 20 20 20 20 20 20 20 20 20  Choice;         
36ad0 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e      /* Maximum n
36ae0 75 6d 62 65 72 20 6f 66 20 73 69 6d 75 6c 74 61  umber of simulta
36af0 6e 65 6f 75 73 20 70 61 74 68 73 20 74 72 61 63  neous paths trac
36b00 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f  ked */.  int nLo
36b10 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
36b20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
36b30 74 65 72 6d 73 20 69 6e 20 74 68 65 20 6a 6f 69  terms in the joi
36b40 6e 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  n */.  Parse *pP
36b50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  arse;           
36b60 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
36b70 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ext */.  sqlite3
36b80 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
36b90 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
36ba0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
36bb0 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20  .  int iLoop;   
36bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36bd0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 6f 76 65  Loop counter ove
36be0 72 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74  r the terms of t
36bf0 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 69 6e 74  he join */.  int
36c00 20 69 69 2c 20 6a 6a 3b 20 20 20 20 20 20 20 20   ii, jj;        
36c10 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
36c20 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ounters */.  int
36c30 20 6d 78 49 20 3d 20 30 3b 20 20 20 20 20 20 20   mxI = 0;       
36c40 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
36c50 6f 66 20 6e 65 78 74 20 65 6e 74 72 79 20 74 6f  of next entry to
36c60 20 72 65 70 6c 61 63 65 20 2a 2f 0a 20 20 69 6e   replace */.  in
36c70 74 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20  t nOrderBy;     
36c80 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
36c90 72 20 6f 66 20 4f 52 44 45 52 20 42 59 20 63 6c  r of ORDER BY cl
36ca0 61 75 73 65 20 74 65 72 6d 73 20 2a 2f 0a 20 20  ause terms */.  
36cb0 4c 6f 67 45 73 74 20 6d 78 43 6f 73 74 20 3d 20  LogEst mxCost = 
36cc0 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78  0;        /* Max
36cd0 69 6d 75 6d 20 63 6f 73 74 20 6f 66 20 61 20 73  imum cost of a s
36ce0 65 74 20 6f 66 20 70 61 74 68 73 20 2a 2f 0a 20  et of paths */. 
36cf0 20 4c 6f 67 45 73 74 20 6d 78 55 6e 73 6f 72 74   LogEst mxUnsort
36d00 65 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4d 61  ed = 0;    /* Ma
36d10 78 69 6d 75 6d 20 75 6e 73 6f 72 74 65 64 20 63  ximum unsorted c
36d20 6f 73 74 20 6f 66 20 61 20 73 65 74 20 6f 66 20  ost of a set of 
36d30 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  path */.  int nT
36d40 6f 2c 20 6e 46 72 6f 6d 3b 20 20 20 20 20 20 20  o, nFrom;       
36d50 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
36d60 20 76 61 6c 69 64 20 65 6e 74 72 69 65 73 20 69   valid entries i
36d70 6e 20 61 54 6f 5b 5d 20 61 6e 64 20 61 46 72 6f  n aTo[] and aFro
36d80 6d 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 50 61  m[] */.  WherePa
36d90 74 68 20 2a 61 46 72 6f 6d 3b 20 20 20 20 20 20  th *aFrom;      
36da0 20 20 20 2f 2a 20 41 6c 6c 20 6e 46 72 6f 6d 20     /* All nFrom 
36db0 70 61 74 68 73 20 61 74 20 74 68 65 20 70 72 65  paths at the pre
36dc0 76 69 6f 75 73 20 6c 65 76 65 6c 20 2a 2f 0a 20  vious level */. 
36dd0 20 57 68 65 72 65 50 61 74 68 20 2a 61 54 6f 3b   WherePath *aTo;
36de0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
36df0 65 20 6e 54 6f 20 62 65 73 74 20 70 61 74 68 73  e nTo best paths
36e00 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20   at the current 
36e10 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65  level */.  Where
36e20 50 61 74 68 20 2a 70 46 72 6f 6d 3b 20 20 20 20  Path *pFrom;    
36e30 20 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65       /* An eleme
36e40 6e 74 20 6f 66 20 61 46 72 6f 6d 5b 5d 20 74 68  nt of aFrom[] th
36e50 61 74 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e  at we are workin
36e60 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 50  g on */.  WhereP
36e70 61 74 68 20 2a 70 54 6f 3b 20 20 20 20 20 20 20  ath *pTo;       
36e80 20 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e      /* An elemen
36e90 74 20 6f 66 20 61 54 6f 5b 5d 20 74 68 61 74 20  t of aTo[] that 
36ea0 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f  we are working o
36eb0 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  n */.  WhereLoop
36ec0 20 2a 70 57 4c 6f 6f 70 3b 20 20 20 20 20 20 20   *pWLoop;       
36ed0 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57   /* One of the W
36ee0 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
36ef0 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
36f00 2a 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20  **pX;           
36f10 2f 2a 20 55 73 65 64 20 74 6f 20 64 69 76 79 20  /* Used to divy 
36f20 75 70 20 74 68 65 20 70 53 70 61 63 65 20 6d 65  up the pSpace me
36f30 6d 6f 72 79 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  mory */.  LogEst
36f40 20 2a 61 53 6f 72 74 43 6f 73 74 20 3d 20 30 3b   *aSortCost = 0;
36f50 20 20 20 20 2f 2a 20 53 6f 72 74 69 6e 67 20 61      /* Sorting a
36f60 6e 64 20 70 61 72 74 69 61 6c 20 73 6f 72 74 69  nd partial sorti
36f70 6e 67 20 63 6f 73 74 73 20 2a 2f 0a 20 20 63 68  ng costs */.  ch
36f80 61 72 20 2a 70 53 70 61 63 65 3b 20 20 20 20 20  ar *pSpace;     
36f90 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f          /* Tempo
36fa0 72 61 72 79 20 6d 65 6d 6f 72 79 20 75 73 65 64  rary memory used
36fb0 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
36fc0 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 70 61 63 65   */.  int nSpace
36fd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
36fe0 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61 63  /* Bytes of spac
36ff0 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 74 20 70  e allocated at p
37000 53 70 61 63 65 20 2a 2f 0a 0a 20 20 70 50 61 72  Space */..  pPar
37010 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  se = pWInfo->pPa
37020 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  rse;.  db = pPar
37030 73 65 2d 3e 64 62 3b 0a 20 20 6e 4c 6f 6f 70 20  se->db;.  nLoop 
37040 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  = pWInfo->nLevel
37050 3b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 46  ;.  /* TUNING: F
37060 6f 72 20 73 69 6d 70 6c 65 20 71 75 65 72 69 65  or simple querie
37070 73 2c 20 6f 6e 6c 79 20 74 68 65 20 62 65 73 74  s, only the best
37080 20 70 61 74 68 20 69 73 20 74 72 61 63 6b 65 64   path is tracked
37090 2e 0a 20 20 2a 2a 20 46 6f 72 20 32 2d 77 61 79  ..  ** For 2-way
370a0 20 6a 6f 69 6e 73 2c 20 74 68 65 20 35 20 62 65   joins, the 5 be
370b0 73 74 20 70 61 74 68 73 20 61 72 65 20 66 6f 6c  st paths are fol
370c0 6c 6f 77 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20  lowed..  ** For 
370d0 6a 6f 69 6e 73 20 6f 66 20 33 20 6f 72 20 6d 6f  joins of 3 or mo
370e0 72 65 20 74 61 62 6c 65 73 2c 20 74 72 61 63 6b  re tables, track
370f0 20 74 68 65 20 31 30 20 62 65 73 74 20 70 61 74   the 10 best pat
37100 68 73 20 2a 2f 0a 20 20 6d 78 43 68 6f 69 63 65  hs */.  mxChoice
37110 20 3d 20 28 6e 4c 6f 6f 70 3c 3d 31 29 20 3f 20   = (nLoop<=1) ? 
37120 31 20 3a 20 28 6e 4c 6f 6f 70 3d 3d 32 20 3f 20  1 : (nLoop==2 ? 
37130 35 20 3a 20 31 30 29 3b 0a 20 20 61 73 73 65 72  5 : 10);.  asser
37140 74 28 20 6e 4c 6f 6f 70 3c 3d 70 57 49 6e 66 6f  t( nLoop<=pWInfo
37150 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ->pTabList->nSrc
37160 20 29 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45   );.  WHERETRACE
37170 28 30 78 30 30 32 2c 20 28 22 2d 2d 2d 2d 20 62  (0x002, ("---- b
37180 65 67 69 6e 20 73 6f 6c 76 65 72 2e 20 20 28 6e  egin solver.  (n
37190 52 6f 77 45 73 74 3d 25 64 29 5c 6e 22 2c 20 6e  RowEst=%d)\n", n
371a0 52 6f 77 45 73 74 29 29 3b 0a 0a 20 20 2f 2a 20  RowEst));..  /* 
371b0 49 66 20 6e 52 6f 77 45 73 74 20 69 73 20 7a 65  If nRowEst is ze
371c0 72 6f 20 61 6e 64 20 74 68 65 72 65 20 69 73 20  ro and there is 
371d0 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
371e0 73 65 2c 20 69 67 6e 6f 72 65 20 69 74 2e 20 49  se, ignore it. I
371f0 6e 20 74 68 69 73 0a 20 20 2a 2a 20 63 61 73 65  n this.  ** case
37200 20 74 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20   the purpose of 
37210 74 68 69 73 20 63 61 6c 6c 20 69 73 20 74 6f 20  this call is to 
37220 65 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d  estimate the num
37230 62 65 72 20 6f 66 20 72 6f 77 73 20 72 65 74 75  ber of rows retu
37240 72 6e 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 65  rned.  ** by the
37250 20 6f 76 65 72 61 6c 6c 20 71 75 65 72 79 2e 20   overall query. 
37260 4f 6e 63 65 20 74 68 69 73 20 65 73 74 69 6d 61  Once this estima
37270 74 65 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61  te has been obta
37280 69 6e 65 64 2c 20 74 68 65 20 63 61 6c 6c 65 72  ined, the caller
37290 0a 20 20 2a 2a 20 77 69 6c 6c 20 69 6e 76 6f 6b  .  ** will invok
372a0 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
372b0 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 2c 20 70  a second time, p
372c0 61 73 73 69 6e 67 20 74 68 65 20 65 73 74 69 6d  assing the estim
372d0 61 74 65 20 61 73 20 74 68 65 0a 20 20 2a 2a 20  ate as the.  ** 
372e0 6e 52 6f 77 45 73 74 20 70 61 72 61 6d 65 74 65  nRowEst paramete
372f0 72 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 49  r.  */.  if( pWI
37300 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  nfo->pOrderBy==0
37310 20 7c 7c 20 6e 52 6f 77 45 73 74 3d 3d 30 20 29   || nRowEst==0 )
37320 7b 0a 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d  {.    nOrderBy =
37330 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
37340 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 57 49 6e   nOrderBy = pWIn
37350 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  fo->pOrderBy->nE
37360 78 70 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  xpr;.  }..  /* A
37370 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74  llocate and init
37380 69 61 6c 69 7a 65 20 73 70 61 63 65 20 66 6f 72  ialize space for
37390 20 61 54 6f 2c 20 61 46 72 6f 6d 20 61 6e 64 20   aTo, aFrom and 
373a0 61 53 6f 72 74 43 6f 73 74 5b 5d 20 2a 2f 0a 20  aSortCost[] */. 
373b0 20 6e 53 70 61 63 65 20 3d 20 28 73 69 7a 65 6f   nSpace = (sizeo
373c0 66 28 57 68 65 72 65 50 61 74 68 29 2b 73 69 7a  f(WherePath)+siz
373d0 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a  eof(WhereLoop*)*
373e0 6e 4c 6f 6f 70 29 2a 6d 78 43 68 6f 69 63 65 2a  nLoop)*mxChoice*
373f0 32 3b 0a 20 20 6e 53 70 61 63 65 20 2b 3d 20 73  2;.  nSpace += s
37400 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 20 2a 20  izeof(LogEst) * 
37410 6e 4f 72 64 65 72 42 79 3b 0a 20 20 70 53 70 61  nOrderBy;.  pSpa
37420 63 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ce = sqlite3DbMa
37430 6c 6c 6f 63 52 61 77 28 64 62 2c 20 6e 53 70 61  llocRaw(db, nSpa
37440 63 65 29 3b 0a 20 20 69 66 28 20 70 53 70 61 63  ce);.  if( pSpac
37450 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  e==0 ) return SQ
37460 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 61 54  LITE_NOMEM;.  aT
37470 6f 20 3d 20 28 57 68 65 72 65 50 61 74 68 2a 29  o = (WherePath*)
37480 70 53 70 61 63 65 3b 0a 20 20 61 46 72 6f 6d 20  pSpace;.  aFrom 
37490 3d 20 61 54 6f 2b 6d 78 43 68 6f 69 63 65 3b 0a  = aTo+mxChoice;.
374a0 20 20 6d 65 6d 73 65 74 28 61 46 72 6f 6d 2c 20    memset(aFrom, 
374b0 30 2c 20 73 69 7a 65 6f 66 28 61 46 72 6f 6d 5b  0, sizeof(aFrom[
374c0 30 5d 29 29 3b 0a 20 20 70 58 20 3d 20 28 57 68  0]));.  pX = (Wh
374d0 65 72 65 4c 6f 6f 70 2a 2a 29 28 61 46 72 6f 6d  ereLoop**)(aFrom
374e0 2b 6d 78 43 68 6f 69 63 65 29 3b 0a 20 20 66 6f  +mxChoice);.  fo
374f0 72 28 69 69 3d 6d 78 43 68 6f 69 63 65 2a 32 2c  r(ii=mxChoice*2,
37500 20 70 46 72 6f 6d 3d 61 54 6f 3b 20 69 69 3e 30   pFrom=aTo; ii>0
37510 3b 20 69 69 2d 2d 2c 20 70 46 72 6f 6d 2b 2b 2c  ; ii--, pFrom++,
37520 20 70 58 20 2b 3d 20 6e 4c 6f 6f 70 29 7b 0a 20   pX += nLoop){. 
37530 20 20 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 20     pFrom->aLoop 
37540 3d 20 70 58 3b 0a 20 20 7d 0a 20 20 69 66 28 20  = pX;.  }.  if( 
37550 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  nOrderBy ){.    
37560 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
37570 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
37580 65 20 61 6e 64 20 69 74 20 69 73 20 6e 6f 74 20  e and it is not 
37590 62 65 69 6e 67 20 69 67 6e 6f 72 65 64 2c 20 73  being ignored, s
375a0 65 74 20 75 70 0a 20 20 20 20 2a 2a 20 73 70 61  et up.    ** spa
375b0 63 65 20 66 6f 72 20 74 68 65 20 61 53 6f 72 74  ce for the aSort
375c0 43 6f 73 74 5b 5d 20 61 72 72 61 79 2e 20 45 61  Cost[] array. Ea
375d0 63 68 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  ch element of th
375e0 65 20 61 53 6f 72 74 43 6f 73 74 20 61 72 72 61  e aSortCost arra
375f0 79 0a 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68  y.    ** is eith
37600 65 72 20 7a 65 72 6f 20 2d 20 6d 65 61 6e 69 6e  er zero - meanin
37610 67 20 69 74 20 68 61 73 20 6e 6f 74 20 79 65 74  g it has not yet
37620 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65   been initialize
37630 64 20 2d 20 6f 72 20 74 68 65 0a 20 20 20 20 2a  d - or the.    *
37640 2a 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e  * cost of sortin
37650 67 20 6e 52 6f 77 45 73 74 20 72 6f 77 73 20 6f  g nRowEst rows o
37660 66 20 64 61 74 61 20 77 68 65 72 65 20 74 68 65  f data where the
37670 20 66 69 72 73 74 20 58 20 74 65 72 6d 73 20 6f   first X terms o
37680 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 4f 52 44  f.    ** the ORD
37690 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65  ER BY clause are
376a0 20 61 6c 72 65 61 64 79 20 69 6e 20 6f 72 64 65   already in orde
376b0 72 2c 20 77 68 65 72 65 20 58 20 69 73 20 74 68  r, where X is th
376c0 65 20 61 72 72 61 79 20 0a 20 20 20 20 2a 2a 20  e array .    ** 
376d0 69 6e 64 65 78 2e 20 20 2a 2f 0a 20 20 20 20 61  index.  */.    a
376e0 53 6f 72 74 43 6f 73 74 20 3d 20 28 4c 6f 67 45  SortCost = (LogE
376f0 73 74 2a 29 70 58 3b 0a 20 20 20 20 6d 65 6d 73  st*)pX;.    mems
37700 65 74 28 61 53 6f 72 74 43 6f 73 74 2c 20 30 2c  et(aSortCost, 0,
37710 20 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 20   sizeof(LogEst) 
37720 2a 20 6e 4f 72 64 65 72 42 79 29 3b 0a 20 20 7d  * nOrderBy);.  }
37730 0a 20 20 61 73 73 65 72 74 28 20 61 53 6f 72 74  .  assert( aSort
37740 43 6f 73 74 3d 3d 30 20 7c 7c 20 26 70 53 70 61  Cost==0 || &pSpa
37750 63 65 5b 6e 53 70 61 63 65 5d 3d 3d 28 63 68 61  ce[nSpace]==(cha
37760 72 2a 29 26 61 53 6f 72 74 43 6f 73 74 5b 6e 4f  r*)&aSortCost[nO
37770 72 64 65 72 42 79 5d 20 29 3b 0a 20 20 61 73 73  rderBy] );.  ass
37780 65 72 74 28 20 61 53 6f 72 74 43 6f 73 74 21 3d  ert( aSortCost!=
37790 30 20 7c 7c 20 26 70 53 70 61 63 65 5b 6e 53 70  0 || &pSpace[nSp
377a0 61 63 65 5d 3d 3d 28 63 68 61 72 2a 29 70 58 20  ace]==(char*)pX 
377b0 29 3b 0a 0a 20 20 2f 2a 20 53 65 65 64 20 74 68  );..  /* Seed th
377c0 65 20 73 65 61 72 63 68 20 77 69 74 68 20 61 20  e search with a 
377d0 73 69 6e 67 6c 65 20 57 68 65 72 65 50 61 74 68  single WherePath
377e0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 7a 65 72 6f   containing zero
377f0 20 57 68 65 72 65 4c 6f 6f 70 73 2e 0a 20 20 2a   WhereLoops..  *
37800 2a 0a 20 20 2a 2a 20 54 55 4e 49 4e 47 3a 20 44  *.  ** TUNING: D
37810 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65 20 6e 75  o not let the nu
37820 6d 62 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f  mber of iteratio
37830 6e 73 20 67 6f 20 61 62 6f 76 65 20 32 38 2e 20  ns go above 28. 
37840 20 49 66 20 74 68 65 20 63 6f 73 74 0a 20 20 2a   If the cost.  *
37850 2a 20 6f 66 20 63 6f 6d 70 75 74 69 6e 67 20 61  * of computing a
37860 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
37870 78 20 69 73 20 6e 6f 74 20 70 61 69 64 20 62 61  x is not paid ba
37880 63 6b 20 77 69 74 68 69 6e 20 74 68 65 20 66 69  ck within the fi
37890 72 73 74 20 32 38 0a 20 20 2a 2a 20 72 6f 77 73  rst 28.  ** rows
378a0 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 75 73  , then do not us
378b0 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  e the automatic 
378c0 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 61 46 72 6f  index. */.  aFro
378d0 6d 5b 30 5d 2e 6e 52 6f 77 20 3d 20 4d 49 4e 28  m[0].nRow = MIN(
378e0 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
378f0 6f 70 2c 20 34 38 29 3b 20 20 61 73 73 65 72 74  op, 48);  assert
37900 28 20 34 38 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  ( 48==sqlite3Log
37910 45 73 74 28 32 38 29 20 29 3b 0a 20 20 6e 46 72  Est(28) );.  nFr
37920 6f 6d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74  om = 1;.  assert
37930 28 20 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64  ( aFrom[0].isOrd
37940 65 72 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28  ered==0 );.  if(
37950 20 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   nOrderBy ){.   
37960 20 2f 2a 20 49 66 20 6e 4c 6f 6f 70 20 69 73 20   /* If nLoop is 
37970 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 72 65  zero, then there
37980 20 61 72 65 20 6e 6f 20 46 52 4f 4d 20 74 65 72   are no FROM ter
37990 6d 73 20 69 6e 20 74 68 65 20 71 75 65 72 79 2e  ms in the query.
379a0 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 69 6e   Since.    ** in
379b0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 71   this case the q
379c0 75 65 72 79 20 6d 61 79 20 72 65 74 75 72 6e 20  uery may return 
379d0 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20 6f 6e 65  a maximum of one
379e0 20 72 6f 77 2c 20 74 68 65 20 72 65 73 75 6c 74   row, the result
379f0 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 61 6c 72  s.    ** are alr
37a00 65 61 64 79 20 69 6e 20 74 68 65 20 72 65 71 75  eady in the requ
37a10 65 73 74 65 64 20 6f 72 64 65 72 2e 20 53 65 74  ested order. Set
37a20 20 69 73 4f 72 64 65 72 65 64 20 74 6f 20 6e 4f   isOrdered to nO
37a30 72 64 65 72 42 79 20 74 6f 0a 20 20 20 20 2a 2a  rderBy to.    **
37a40 20 69 6e 64 69 63 61 74 65 20 74 68 69 73 2e 20   indicate this. 
37a50 4f 72 2c 20 69 66 20 6e 4c 6f 6f 70 20 69 73 20  Or, if nLoop is 
37a60 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
37a70 6f 2c 20 73 65 74 20 69 73 4f 72 64 65 72 65 64  o, set isOrdered
37a80 20 74 6f 0a 20 20 20 20 2a 2a 20 2d 31 2c 20 69   to.    ** -1, i
37a90 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 74  ndicating that t
37aa0 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6d 61  he result set ma
37ab0 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
37ac0 6f 72 64 65 72 65 64 2c 20 0a 20 20 20 20 2a 2a  ordered, .    **
37ad0 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68   depending on th
37ae0 65 20 6c 6f 6f 70 73 20 61 64 64 65 64 20 74 6f  e loops added to
37af0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6c 61   the current pla
37b00 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 46 72 6f 6d  n.  */.    aFrom
37b10 5b 30 5d 2e 69 73 4f 72 64 65 72 65 64 20 3d 20  [0].isOrdered = 
37b20 6e 4c 6f 6f 70 3e 30 20 3f 20 2d 31 20 3a 20 6e  nLoop>0 ? -1 : n
37b30 4f 72 64 65 72 42 79 3b 0a 20 20 7d 0a 0a 20 20  OrderBy;.  }..  
37b40 2f 2a 20 43 6f 6d 70 75 74 65 20 73 75 63 63 65  /* Compute succe
37b50 73 73 69 76 65 6c 79 20 6c 6f 6e 67 65 72 20 57  ssively longer W
37b60 68 65 72 65 50 61 74 68 73 20 75 73 69 6e 67 20  herePaths using 
37b70 74 68 65 20 70 72 65 76 69 6f 75 73 20 67 65 6e  the previous gen
37b80 65 72 61 74 69 6f 6e 0a 20 20 2a 2a 20 6f 66 20  eration.  ** of 
37b90 57 68 65 72 65 50 61 74 68 73 20 61 73 20 74 68  WherePaths as th
37ba0 65 20 62 61 73 69 73 20 66 6f 72 20 74 68 65 20  e basis for the 
37bb0 6e 65 78 74 2e 20 20 4b 65 65 70 20 74 72 61 63  next.  Keep trac
37bc0 6b 20 6f 66 20 74 68 65 20 6d 78 43 68 6f 69 63  k of the mxChoic
37bd0 65 0a 20 20 2a 2a 20 62 65 73 74 20 70 61 74 68  e.  ** best path
37be0 73 20 61 74 20 65 61 63 68 20 67 65 6e 65 72 61  s at each genera
37bf0 74 69 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28 69 4c  tion */.  for(iL
37c00 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f  oop=0; iLoop<nLo
37c10 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20  op; iLoop++){.  
37c20 20 20 6e 54 6f 20 3d 20 30 3b 0a 20 20 20 20 66    nTo = 0;.    f
37c30 6f 72 28 69 69 3d 30 2c 20 70 46 72 6f 6d 3d 61  or(ii=0, pFrom=a
37c40 46 72 6f 6d 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20  From; ii<nFrom; 
37c50 69 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a  ii++, pFrom++){.
37c60 20 20 20 20 20 20 66 6f 72 28 70 57 4c 6f 6f 70        for(pWLoop
37c70 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b  =pWInfo->pLoops;
37c80 20 70 57 4c 6f 6f 70 3b 20 70 57 4c 6f 6f 70 3d   pWLoop; pWLoop=
37c90 70 57 4c 6f 6f 70 2d 3e 70 4e 65 78 74 4c 6f 6f  pWLoop->pNextLoo
37ca0 70 29 7b 0a 20 20 20 20 20 20 20 20 4c 6f 67 45  p){.        LogE
37cb0 73 74 20 6e 4f 75 74 3b 20 20 20 20 20 20 20 20  st nOut;        
37cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
37cd0 20 52 6f 77 73 20 76 69 73 69 74 65 64 20 62 79   Rows visited by
37ce0 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20   (pFrom+pWLoop) 
37cf0 2a 2f 0a 20 20 20 20 20 20 20 20 4c 6f 67 45 73  */.        LogEs
37d00 74 20 72 43 6f 73 74 3b 20 20 20 20 20 20 20 20  t rCost;        
37d10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37d20 43 6f 73 74 20 6f 66 20 70 61 74 68 20 28 70 46  Cost of path (pF
37d30 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20  rom+pWLoop) */. 
37d40 20 20 20 20 20 20 20 4c 6f 67 45 73 74 20 72 55         LogEst rU
37d50 6e 73 6f 72 74 65 64 3b 20 20 20 20 20 20 20 20  nsorted;        
37d60 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 6f           /* Unso
37d70 72 74 65 64 20 63 6f 73 74 20 6f 66 20 28 70 46  rted cost of (pF
37d80 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20  rom+pWLoop) */. 
37d90 20 20 20 20 20 20 20 69 38 20 69 73 4f 72 64 65         i8 isOrde
37da0 72 65 64 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f  red = pFrom->isO
37db0 72 64 65 72 65 64 3b 20 20 2f 2a 20 69 73 4f 72  rdered;  /* isOr
37dc0 64 65 72 65 64 20 66 6f 72 20 28 70 46 72 6f 6d  dered for (pFrom
37dd0 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20  +pWLoop) */.    
37de0 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b      Bitmask mask
37df0 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
37e00 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
37e10 20 73 72 63 20 76 69 73 69 74 65 64 20 62 79 20   src visited by 
37e20 28 2e 2e 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  (..) */.        
37e30 42 69 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20  Bitmask revMask 
37e40 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
37e50 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 72 65 76    /* Mask of rev
37e60 2d 6f 72 64 65 72 20 6c 6f 6f 70 73 20 66 6f 72  -order loops for
37e70 20 28 2e 2e 29 20 2a 2f 0a 0a 20 20 20 20 20 20   (..) */..      
37e80 20 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 70    if( (pWLoop->p
37e90 72 65 72 65 71 20 26 20 7e 70 46 72 6f 6d 2d 3e  rereq & ~pFrom->
37ea0 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63  maskLoop)!=0 ) c
37eb0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
37ec0 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 6d 61   if( (pWLoop->ma
37ed0 73 6b 53 65 6c 66 20 26 20 70 46 72 6f 6d 2d 3e  skSelf & pFrom->
37ee0 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63  maskLoop)!=0 ) c
37ef0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
37f00 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
37f10 74 2c 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 63  t, pWLoop is a c
37f20 61 6e 64 69 64 61 74 65 20 74 6f 20 62 65 20 74  andidate to be t
37f30 68 65 20 6e 65 78 74 20 6c 6f 6f 70 2e 20 0a 20  he next loop. . 
37f40 20 20 20 20 20 20 20 2a 2a 20 43 6f 6d 70 75 74         ** Comput
37f50 65 20 69 74 73 20 63 6f 73 74 20 2a 2f 0a 20 20  e its cost */.  
37f60 20 20 20 20 20 20 72 55 6e 73 6f 72 74 65 64 20        rUnsorted 
37f70 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
37f80 64 64 28 70 57 4c 6f 6f 70 2d 3e 72 53 65 74 75  dd(pWLoop->rSetu
37f90 70 2c 70 57 4c 6f 6f 70 2d 3e 72 52 75 6e 20 2b  p,pWLoop->rRun +
37fa0 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 29 3b 0a 20   pFrom->nRow);. 
37fb0 20 20 20 20 20 20 20 72 55 6e 73 6f 72 74 65 64         rUnsorted
37fc0 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
37fd0 41 64 64 28 72 55 6e 73 6f 72 74 65 64 2c 20 70  Add(rUnsorted, p
37fe0 46 72 6f 6d 2d 3e 72 55 6e 73 6f 72 74 65 64 29  From->rUnsorted)
37ff0 3b 0a 20 20 20 20 20 20 20 20 6e 4f 75 74 20 3d  ;.        nOut =
38000 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 20 2b 20 70   pFrom->nRow + p
38010 57 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 20  WLoop->nOut;.   
38020 20 20 20 20 20 6d 61 73 6b 4e 65 77 20 3d 20 70       maskNew = p
38030 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c  From->maskLoop |
38040 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c   pWLoop->maskSel
38050 66 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  f;.        if( i
38060 73 4f 72 64 65 72 65 64 3c 30 20 29 7b 0a 20 20  sOrdered<0 ){.  
38070 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65          isOrdere
38080 64 20 3d 20 77 68 65 72 65 50 61 74 68 53 61 74  d = wherePathSat
38090 69 73 66 69 65 73 4f 72 64 65 72 42 79 28 70 57  isfiesOrderBy(pW
380a0 49 6e 66 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  Info,.          
380b0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57 49               pWI
380c0 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70  nfo->pOrderBy, p
380d0 46 72 6f 6d 2c 20 70 57 49 6e 66 6f 2d 3e 77 63  From, pWInfo->wc
380e0 74 72 6c 46 6c 61 67 73 2c 0a 20 20 20 20 20 20  trlFlags,.      
380f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38100 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 2c 20   iLoop, pWLoop, 
38110 26 72 65 76 4d 61 73 6b 29 3b 0a 20 20 20 20 20  &revMask);.     
38120 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
38130 20 20 20 20 72 65 76 4d 61 73 6b 20 3d 20 70 46      revMask = pF
38140 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20  rom->revLoop;.  
38150 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
38160 69 66 28 20 69 73 4f 72 64 65 72 65 64 3e 3d 30  if( isOrdered>=0
38170 20 26 26 20 69 73 4f 72 64 65 72 65 64 3c 6e 4f   && isOrdered<nO
38180 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
38190 20 20 20 20 69 66 28 20 61 53 6f 72 74 43 6f 73      if( aSortCos
381a0 74 5b 69 73 4f 72 64 65 72 65 64 5d 3d 3d 30 20  t[isOrdered]==0 
381b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.