/ Hex Artifact Content
Login

Artifact f18400f121fd27385f41cdff7aa8a811feca842e:


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 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f  .../*.** Trace o
0350: 75 74 70 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a  utput macros.*/.
0360: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
0370: 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69  TE_TEST) || defi
0380: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
0390: 29 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73 71 6c 69  )./***/ int sqli
03a0: 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d 20  te3WhereTrace = 
03b0: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  0;.#endif.#if de
03c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
03d0: 55 47 29 20 5c 0a 20 20 20 20 26 26 20 28 64 65  UG) \.    && (de
03e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
03f0: 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  T) || defined(SQ
0400: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45 52  LITE_ENABLE_WHER
0410: 45 54 52 41 43 45 29 29 0a 23 20 64 65 66 69 6e  ETRACE)).# defin
0420: 65 20 57 48 45 52 45 54 52 41 43 45 28 4b 2c 58  e WHERETRACE(K,X
0430: 29 20 20 69 66 28 73 71 6c 69 74 65 33 57 68 65  )  if(sqlite3Whe
0440: 72 65 54 72 61 63 65 26 28 4b 29 29 20 73 71 6c  reTrace&(K)) sql
0450: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 20  ite3DebugPrintf 
0460: 58 0a 23 20 64 65 66 69 6e 65 20 57 48 45 52 45  X.# define WHERE
0470: 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 31 0a  TRACE_ENABLED 1.
0480: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 57  #else.# define W
0490: 48 45 52 45 54 52 41 43 45 28 4b 2c 58 29 0a 23  HERETRACE(K,X).#
04a0: 65 6e 64 69 66 0a 0a 2f 2a 20 46 6f 72 77 61 72  endif../* Forwar
04b0: 64 20 72 65 66 65 72 65 6e 63 65 73 0a 2a 2f 0a  d references.*/.
04c0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 57  typedef struct W
04d0: 68 65 72 65 43 6c 61 75 73 65 20 57 68 65 72 65  hereClause Where
04e0: 43 6c 61 75 73 65 3b 0a 74 79 70 65 64 65 66 20  Clause;.typedef 
04f0: 73 74 72 75 63 74 20 57 68 65 72 65 4d 61 73 6b  struct WhereMask
0500: 53 65 74 20 57 68 65 72 65 4d 61 73 6b 53 65 74  Set WhereMaskSet
0510: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
0520: 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 57 68 65   WhereOrInfo Whe
0530: 72 65 4f 72 49 6e 66 6f 3b 0a 74 79 70 65 64 65  reOrInfo;.typede
0540: 66 20 73 74 72 75 63 74 20 57 68 65 72 65 41 6e  f struct WhereAn
0550: 64 49 6e 66 6f 20 57 68 65 72 65 41 6e 64 49 6e  dInfo WhereAndIn
0560: 66 6f 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  fo;.typedef stru
0570: 63 74 20 57 68 65 72 65 4c 65 76 65 6c 20 57 68  ct WhereLevel Wh
0580: 65 72 65 4c 65 76 65 6c 3b 0a 74 79 70 65 64 65  ereLevel;.typede
0590: 66 20 73 74 72 75 63 74 20 57 68 65 72 65 4c 6f  f struct WhereLo
05a0: 6f 70 20 57 68 65 72 65 4c 6f 6f 70 3b 0a 74 79  op WhereLoop;.ty
05b0: 70 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65  pedef struct Whe
05c0: 72 65 50 61 74 68 20 57 68 65 72 65 50 61 74 68  rePath WherePath
05d0: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
05e0: 20 57 68 65 72 65 54 65 72 6d 20 57 68 65 72 65   WhereTerm Where
05f0: 54 65 72 6d 3b 0a 74 79 70 65 64 65 66 20 73 74  Term;.typedef st
0600: 72 75 63 74 20 57 68 65 72 65 4c 6f 6f 70 42 75  ruct WhereLoopBu
0610: 69 6c 64 65 72 20 57 68 65 72 65 4c 6f 6f 70 42  ilder WhereLoopB
0620: 75 69 6c 64 65 72 3b 0a 74 79 70 65 64 65 66 20  uilder;.typedef 
0630: 73 74 72 75 63 74 20 57 68 65 72 65 53 63 61 6e  struct WhereScan
0640: 20 57 68 65 72 65 53 63 61 6e 3b 0a 74 79 70 65   WhereScan;.type
0650: 64 65 66 20 73 74 72 75 63 74 20 57 68 65 72 65  def struct Where
0660: 4f 72 43 6f 73 74 20 57 68 65 72 65 4f 72 43 6f  OrCost WhereOrCo
0670: 73 74 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  st;.typedef stru
0680: 63 74 20 57 68 65 72 65 4f 72 53 65 74 20 57 68  ct WhereOrSet Wh
0690: 65 72 65 4f 72 53 65 74 3b 0a 0a 2f 2a 0a 2a 2a  ereOrSet;../*.**
06a0: 20 54 68 69 73 20 6f 62 6a 65 63 74 20 63 6f 6e   This object con
06b0: 74 61 69 6e 73 20 69 6e 66 6f 72 6d 61 74 69 6f  tains informatio
06c0: 6e 20 6e 65 65 64 65 64 20 74 6f 20 69 6d 70 6c  n needed to impl
06d0: 65 6d 65 6e 74 20 61 20 73 69 6e 67 6c 65 20 6e  ement a single n
06e0: 65 73 74 65 64 0a 2a 2a 20 6c 6f 6f 70 20 69 6e  ested.** loop in
06f0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a   WHERE clause..*
0700: 2a 0a 2a 2a 20 43 6f 6e 74 72 61 73 74 20 74 68  *.** Contrast th
0710: 69 73 20 6f 62 6a 65 63 74 20 77 69 74 68 20 57  is object with W
0720: 68 65 72 65 4c 6f 6f 70 2e 20 20 54 68 69 73 20  hereLoop.  This 
0730: 6f 62 6a 65 63 74 20 64 65 73 63 72 69 62 65 73  object describes
0740: 20 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e   the.** implemen
0750: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f  tation of the lo
0760: 6f 70 2e 20 20 57 68 65 72 65 4c 6f 6f 70 20 64  op.  WhereLoop d
0770: 65 73 63 72 69 62 65 73 20 74 68 65 20 61 6c 67  escribes the alg
0780: 6f 72 69 74 68 6d 2e 0a 2a 2a 20 54 68 69 73 20  orithm..** This 
0790: 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73 20  object contains 
07a0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
07b0: 20 57 68 65 72 65 4c 6f 6f 70 20 61 6c 67 6f 72   WhereLoop algor
07c0: 69 74 68 6d 20 61 73 20 6f 6e 65 20 6f 66 0a 2a  ithm as one of.*
07d0: 2a 20 69 74 73 20 65 6c 65 6d 65 6e 74 73 2e 0a  * its elements..
07e0: 2a 2a 0a 2a 2a 20 54 68 65 20 57 68 65 72 65 49  **.** The WhereI
07f0: 6e 66 6f 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61  nfo object conta
0800: 69 6e 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 73  ins a single ins
0810: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62  tance of this ob
0820: 6a 65 63 74 20 66 6f 72 0a 2a 2a 20 65 61 63 68  ject for.** each
0830: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 46 52 4f   term in the FRO
0840: 4d 20 63 6c 61 75 73 65 20 28 77 68 69 63 68 20  M clause (which 
0850: 69 73 20 74 6f 20 73 61 79 2c 20 66 6f 72 20 65  is to say, for e
0860: 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 65  ach of the.** ne
0870: 73 74 65 64 20 6c 6f 6f 70 73 20 61 73 20 69 6d  sted loops as im
0880: 70 6c 65 6d 65 6e 74 65 64 29 2e 20 20 54 68 65  plemented).  The
0890: 20 6f 72 64 65 72 20 6f 66 20 57 68 65 72 65 4c   order of WhereL
08a0: 65 76 65 6c 20 6f 62 6a 65 63 74 73 20 64 65 74  evel objects det
08b0: 65 72 6d 69 6e 65 73 0a 2a 2a 20 74 68 65 20 6c  ermines.** the l
08c0: 6f 6f 70 20 6e 65 73 74 65 64 20 6f 72 64 65 72  oop nested order
08d0: 2c 20 77 69 74 68 20 57 68 65 72 65 49 6e 66 6f  , with WhereInfo
08e0: 2e 61 5b 30 5d 20 62 65 69 6e 67 20 74 68 65 20  .a[0] being the 
08f0: 6f 75 74 65 72 20 6c 6f 6f 70 20 61 6e 64 0a 2a  outer loop and.*
0900: 2a 20 57 68 65 72 65 49 6e 66 6f 2e 61 5b 57 68  * WhereInfo.a[Wh
0910: 65 72 65 49 6e 66 6f 2e 6e 4c 65 76 65 6c 2d 31  ereInfo.nLevel-1
0920: 5d 20 62 65 69 6e 67 20 74 68 65 20 69 6e 6e 65  ] being the inne
0930: 72 20 6c 6f 6f 70 2e 0a 2a 2f 0a 73 74 72 75 63  r loop..*/.struc
0940: 74 20 57 68 65 72 65 4c 65 76 65 6c 20 7b 0a 20  t WhereLevel {. 
0950: 20 69 6e 74 20 69 4c 65 66 74 4a 6f 69 6e 3b 20   int iLeftJoin; 
0960: 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
0970: 20 63 65 6c 6c 20 75 73 65 64 20 74 6f 20 69 6d   cell used to im
0980: 70 6c 65 6d 65 6e 74 20 4c 45 46 54 20 4f 55 54  plement LEFT OUT
0990: 45 52 20 4a 4f 49 4e 20 2a 2f 0a 20 20 69 6e 74  ER JOIN */.  int
09a0: 20 69 54 61 62 43 75 72 3b 20 20 20 20 20 20 20   iTabCur;       
09b0: 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63     /* The VDBE c
09c0: 75 72 73 6f 72 20 75 73 65 64 20 74 6f 20 61 63  ursor used to ac
09d0: 63 65 73 73 20 74 68 65 20 74 61 62 6c 65 20 2a  cess the table *
09e0: 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 75 72 3b  /.  int iIdxCur;
09f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
0a00: 20 56 44 42 45 20 63 75 72 73 6f 72 20 75 73 65   VDBE cursor use
0a10: 64 20 74 6f 20 61 63 63 65 73 73 20 70 49 64 78  d to access pIdx
0a20: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 42 72   */.  int addrBr
0a30: 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  k;          /* J
0a40: 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65 61  ump here to brea
0a50: 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f  k out of the loo
0a60: 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4e  p */.  int addrN
0a70: 78 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  xt;          /* 
0a80: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73 74 61  Jump here to sta
0a90: 72 74 20 74 68 65 20 6e 65 78 74 20 49 4e 20 63  rt the next IN c
0aa0: 6f 6d 62 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20  ombination */.  
0ab0: 69 6e 74 20 61 64 64 72 43 6f 6e 74 3b 20 20 20  int addrCont;   
0ac0: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
0ad0: 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  re to continue w
0ae0: 69 74 68 20 74 68 65 20 6e 65 78 74 20 6c 6f 6f  ith the next loo
0af0: 70 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74  p cycle */.  int
0b00: 20 61 64 64 72 46 69 72 73 74 3b 20 20 20 20 20   addrFirst;     
0b10: 20 20 20 2f 2a 20 46 69 72 73 74 20 69 6e 73 74     /* First inst
0b20: 72 75 63 74 69 6f 6e 20 6f 66 20 69 6e 74 65 72  ruction of inter
0b30: 69 6f 72 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  ior of the loop 
0b40: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 42 6f 64  */.  int addrBod
0b50: 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65  y;         /* Be
0b60: 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 62  ginning of the b
0b70: 6f 64 79 20 6f 66 20 74 68 69 73 20 6c 6f 6f 70  ody of this loop
0b80: 20 2a 2f 0a 20 20 75 38 20 69 46 72 6f 6d 3b 20   */.  u8 iFrom; 
0b90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
0ba0: 68 69 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68  hich entry in th
0bb0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
0bc0: 0a 20 20 75 38 20 6f 70 2c 20 70 35 3b 20 20 20  .  u8 op, p5;   
0bd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f           /* Opco
0be0: 64 65 20 61 6e 64 20 50 35 20 6f 66 20 74 68 65  de and P5 of the
0bf0: 20 6f 70 63 6f 64 65 20 74 68 61 74 20 65 6e 64   opcode that end
0c00: 73 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20  s the loop */.  
0c10: 69 6e 74 20 70 31 2c 20 70 32 3b 20 20 20 20 20  int p1, p2;     
0c20: 20 20 20 20 20 20 2f 2a 20 4f 70 65 72 61 6e 64        /* Operand
0c30: 73 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20  s of the opcode 
0c40: 75 73 65 64 20 74 6f 20 65 6e 64 73 20 74 68 65  used to ends the
0c50: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 75 6e 69 6f 6e   loop */.  union
0c60: 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   {              
0c70: 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20   /* Information 
0c80: 74 68 61 74 20 64 65 70 65 6e 64 73 20 6f 6e 20  that depends on 
0c90: 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  pWLoop->wsFlags 
0ca0: 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 7b 0a  */.    struct {.
0cb0: 20 20 20 20 20 20 69 6e 74 20 6e 49 6e 3b 20 20        int nIn;  
0cc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
0cd0: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
0ce0: 20 69 6e 20 61 49 6e 4c 6f 6f 70 5b 5d 20 2a 2f   in aInLoop[] */
0cf0: 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 49 6e  .      struct In
0d00: 4c 6f 6f 70 20 7b 0a 20 20 20 20 20 20 20 20 69  Loop {.        i
0d10: 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20  nt iCur;        
0d20: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
0d30: 45 20 63 75 72 73 6f 72 20 75 73 65 64 20 62 79  E cursor used by
0d40: 20 74 68 69 73 20 49 4e 20 6f 70 65 72 61 74 6f   this IN operato
0d50: 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  r */.        int
0d60: 20 61 64 64 72 49 6e 54 6f 70 3b 20 20 20 20 20   addrInTop;     
0d70: 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68      /* Top of th
0d80: 65 20 49 4e 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20  e IN loop */.   
0d90: 20 20 20 20 20 75 38 20 65 45 6e 64 4c 6f 6f 70       u8 eEndLoop
0da0: 4f 70 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  Op;         /* I
0db0: 4e 20 4c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 6f  N Loop terminato
0dc0: 72 2e 20 4f 50 5f 4e 65 78 74 20 6f 72 20 4f 50  r. OP_Next or OP
0dd0: 5f 50 72 65 76 20 2a 2f 0a 20 20 20 20 20 20 7d  _Prev */.      }
0de0: 20 2a 61 49 6e 4c 6f 6f 70 3b 20 20 20 20 20 20   *aInLoop;      
0df0: 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
0e00: 69 6f 6e 20 61 62 6f 75 74 20 65 61 63 68 20 6e  ion about each n
0e10: 65 73 74 65 64 20 49 4e 20 6f 70 65 72 61 74 6f  ested IN operato
0e20: 72 20 2a 2f 0a 20 20 20 20 7d 20 69 6e 3b 20 20  r */.    } in;  
0e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0e40: 2a 20 55 73 65 64 20 77 68 65 6e 20 70 57 4c 6f  * Used when pWLo
0e50: 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52  op->wsFlags&WHER
0e60: 45 5f 49 4e 5f 41 42 4c 45 20 2a 2f 0a 20 20 20  E_IN_ABLE */.   
0e70: 20 49 6e 64 65 78 20 2a 70 43 6f 76 69 64 78 3b   Index *pCovidx;
0e80: 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62         /* Possib
0e90: 6c 65 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  le covering inde
0ea0: 78 20 66 6f 72 20 57 48 45 52 45 5f 4d 55 4c 54  x for WHERE_MULT
0eb0: 49 5f 4f 52 20 2a 2f 0a 20 20 7d 20 75 3b 0a 20  I_OR */.  } u;. 
0ec0: 20 73 74 72 75 63 74 20 57 68 65 72 65 4c 6f 6f   struct WhereLoo
0ed0: 70 20 2a 70 57 4c 6f 6f 70 3b 20 20 2f 2a 20 54  p *pWLoop;  /* T
0ee0: 68 65 20 73 65 6c 65 63 74 65 64 20 57 68 65 72  he selected Wher
0ef0: 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a  eLoop object */.
0f00: 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
0f10: 64 79 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  dy;          /* 
0f20: 46 52 4f 4d 20 65 6e 74 72 69 65 73 20 6e 6f 74  FROM entries not
0f30: 20 75 73 61 62 6c 65 20 61 74 20 74 68 69 73 20   usable at this 
0f40: 6c 65 76 65 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  level */.};../*.
0f50: 2a 2a 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65  ** Each instance
0f60: 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20   of this object 
0f70: 72 65 70 72 65 73 65 6e 74 73 20 61 6e 20 61 6c  represents an al
0f80: 67 6f 72 69 74 68 6d 20 66 6f 72 20 65 76 61 6c  gorithm for eval
0f90: 75 61 74 69 6e 67 20 6f 6e 65 0a 2a 2a 20 74 65  uating one.** te
0fa0: 72 6d 20 6f 66 20 61 20 6a 6f 69 6e 2e 20 20 45  rm of a join.  E
0fb0: 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68 65  very term of the
0fc0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 77 69 6c   FROM clause wil
0fd0: 6c 20 68 61 76 65 20 61 74 20 6c 65 61 73 74 0a  l have at least.
0fe0: 2a 2a 20 6f 6e 65 20 63 6f 72 72 65 73 70 6f 6e  ** one correspon
0ff0: 64 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 6f  ding WhereLoop o
1000: 62 6a 65 63 74 20 28 75 6e 6c 65 73 73 20 49 4e  bject (unless IN
1010: 44 45 58 45 44 20 42 59 20 63 6f 6e 73 74 72 61  DEXED BY constra
1020: 69 6e 74 73 0a 2a 2a 20 70 72 65 76 65 6e 74 20  ints.** prevent 
1030: 61 20 71 75 65 72 79 20 73 6f 6c 75 74 69 6f 6e  a query solution
1040: 20 2d 20 77 68 69 63 68 20 69 73 20 61 6e 20 65   - which is an e
1050: 72 72 6f 72 29 20 61 6e 64 20 6d 61 6e 79 20 74  rror) and many t
1060: 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 46  erms of the.** F
1070: 52 4f 4d 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  ROM clause will 
1080: 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 57 68  have multiple Wh
1090: 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 2c  ereLoop objects,
10a0: 20 65 61 63 68 20 64 65 73 63 72 69 62 69 6e 67   each describing
10b0: 20 61 0a 2a 2a 20 70 6f 74 65 6e 74 69 61 6c 20   a.** potential 
10c0: 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74  way of implement
10d0: 69 6e 67 20 74 68 61 74 20 46 52 4f 4d 2d 63 6c  ing that FROM-cl
10e0: 61 75 73 65 20 74 65 72 6d 2c 20 74 6f 67 65 74  ause term, toget
10f0: 68 65 72 20 77 69 74 68 0a 2a 2a 20 64 65 70 65  her with.** depe
1100: 6e 64 65 6e 63 69 65 73 20 61 6e 64 20 63 6f 73  ndencies and cos
1110: 74 20 65 73 74 69 6d 61 74 65 73 20 66 6f 72 20  t estimates for 
1120: 75 73 69 6e 67 20 74 68 65 20 63 68 6f 73 65 6e  using the chosen
1130: 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 2a 2a 0a 2a   algorithm..**.*
1140: 2a 20 51 75 65 72 79 20 70 6c 61 6e 6e 69 6e 67  * Query planning
1150: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 62 75 69   consists of bui
1160: 6c 64 69 6e 67 20 75 70 20 61 20 63 6f 6c 6c 65  lding up a colle
1170: 63 74 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 57  ction of these W
1180: 68 65 72 65 4c 6f 6f 70 0a 2a 2a 20 6f 62 6a 65  hereLoop.** obje
1190: 63 74 73 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74  cts, then comput
11a0: 69 6e 67 20 61 20 70 61 72 74 69 63 75 6c 61 72  ing a particular
11b0: 20 73 65 71 75 65 6e 63 65 20 6f 66 20 57 68 65   sequence of Whe
11c0: 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 2c 20  reLoop objects, 
11d0: 77 69 74 68 0a 2a 2a 20 6f 6e 65 20 57 68 65 72  with.** one Wher
11e0: 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 70 65 72  eLoop object per
11f0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
1200: 6d 2c 20 74 68 61 74 20 73 61 74 69 73 66 79 20  m, that satisfy 
1210: 61 6c 6c 20 64 65 70 65 6e 64 65 6e 63 69 65 73  all dependencies
1220: 0a 2a 2a 20 61 6e 64 20 74 68 61 74 20 6d 69 6e  .** and that min
1230: 69 6d 69 7a 65 20 74 68 65 20 6f 76 65 72 61 6c  imize the overal
1240: 6c 20 63 6f 73 74 2e 0a 2a 2f 0a 73 74 72 75 63  l cost..*/.struc
1250: 74 20 57 68 65 72 65 4c 6f 6f 70 20 7b 0a 20 20  t WhereLoop {.  
1260: 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 3b 20  Bitmask prereq; 
1270: 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b        /* Bitmask
1280: 20 6f 66 20 6f 74 68 65 72 20 6c 6f 6f 70 73 20   of other loops 
1290: 74 68 61 74 20 6d 75 73 74 20 72 75 6e 20 66 69  that must run fi
12a0: 72 73 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  rst */.  Bitmask
12b0: 20 6d 61 73 6b 53 65 6c 66 3b 20 20 20 20 20 2f   maskSelf;     /
12c0: 2a 20 42 69 74 6d 61 73 6b 20 69 64 65 6e 74 69  * Bitmask identi
12d0: 66 79 69 6e 67 20 74 61 62 6c 65 20 69 54 61 62  fying table iTab
12e0: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
12f0: 45 5f 44 45 42 55 47 0a 20 20 63 68 61 72 20 63  E_DEBUG.  char c
1300: 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Id;             
1310: 2f 2a 20 53 79 6d 62 6f 6c 69 63 20 49 44 20 6f  /* Symbolic ID o
1320: 66 20 74 68 69 73 20 6c 6f 6f 70 20 66 6f 72 20  f this loop for 
1330: 64 65 62 75 67 67 69 6e 67 20 75 73 65 20 2a 2f  debugging use */
1340: 0a 23 65 6e 64 69 66 0a 20 20 75 38 20 69 54 61  .#endif.  u8 iTa
1350: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
1360: 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 69 6e 20 46  /* Position in F
1370: 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 61  ROM clause of ta
1380: 62 6c 65 20 66 6f 72 20 74 68 69 73 20 6c 6f 6f  ble for this loo
1390: 70 20 2a 2f 0a 20 20 75 38 20 69 53 6f 72 74 49  p */.  u8 iSortI
13a0: 64 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  dx;          /* 
13b0: 53 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 6e 75  Sorting index nu
13c0: 6d 62 65 72 2e 20 20 30 3d 3d 4e 6f 6e 65 20 2a  mber.  0==None *
13d0: 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 65 74 75  /.  LogEst rSetu
13e0: 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  p;        /* One
13f0: 2d 74 69 6d 65 20 73 65 74 75 70 20 63 6f 73 74  -time setup cost
1400: 20 28 65 78 3a 20 63 72 65 61 74 65 20 74 72 61   (ex: create tra
1410: 6e 73 69 65 6e 74 20 69 6e 64 65 78 29 20 2a 2f  nsient index) */
1420: 0a 20 20 4c 6f 67 45 73 74 20 72 52 75 6e 3b 20  .  LogEst rRun; 
1430: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74           /* Cost
1440: 20 6f 66 20 72 75 6e 6e 69 6e 67 20 65 61 63 68   of running each
1450: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 4c 6f 67 45 73   loop */.  LogEs
1460: 74 20 6e 4f 75 74 3b 20 20 20 20 20 20 20 20 20  t nOut;         
1470: 20 2f 2a 20 45 73 74 69 6d 61 74 65 64 20 6e 75   /* Estimated nu
1480: 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72  mber of output r
1490: 6f 77 73 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20 7b  ows */.  union {
14a0: 0a 20 20 20 20 73 74 72 75 63 74 20 7b 20 20 20  .    struct {   
14b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
14c0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 69  nformation for i
14d0: 6e 74 65 72 6e 61 6c 20 62 74 72 65 65 20 74 61  nternal btree ta
14e0: 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  bles */.      in
14f0: 74 20 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20  t nEq;          
1500: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1510: 66 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  f equality const
1520: 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  raints */.      
1530: 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20  Index *pIndex;  
1540: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1550: 75 73 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  used, or NULL */
1560: 0a 20 20 20 20 7d 20 62 74 72 65 65 3b 0a 20 20  .    } btree;.  
1570: 20 20 73 74 72 75 63 74 20 7b 20 20 20 20 20 20    struct {      
1580: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f           /* Info
1590: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 76 69 72 74  rmation for virt
15a0: 75 61 6c 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  ual tables */.  
15b0: 20 20 20 20 69 6e 74 20 69 64 78 4e 75 6d 3b 20      int idxNum; 
15c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
15d0: 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  dex number */.  
15e0: 20 20 20 20 75 38 20 6e 65 65 64 46 72 65 65 3b      u8 needFree;
15f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1600: 75 65 20 69 66 20 73 71 6c 69 74 65 33 5f 66 72  ue if sqlite3_fr
1610: 65 65 28 69 64 78 53 74 72 29 20 69 73 20 6e 65  ee(idxStr) is ne
1620: 65 64 65 64 20 2a 2f 0a 20 20 20 20 20 20 75 38  eded */.      u8
1630: 20 69 73 4f 72 64 65 72 65 64 3b 20 20 20 20 20   isOrdered;     
1640: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1650: 73 61 74 69 73 66 69 65 73 20 4f 52 44 45 52 20  satisfies ORDER 
1660: 42 59 20 2a 2f 0a 20 20 20 20 20 20 75 31 36 20  BY */.      u16 
1670: 6f 6d 69 74 4d 61 73 6b 3b 20 20 20 20 20 20 20  omitMask;       
1680: 20 20 20 2f 2a 20 54 65 72 6d 73 20 74 68 61 74     /* Terms that
1690: 20 6d 61 79 20 62 65 20 6f 6d 69 74 74 65 64 20   may be omitted 
16a0: 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a 69  */.      char *i
16b0: 64 78 53 74 72 3b 20 20 20 20 20 20 20 20 20 20  dxStr;          
16c0: 2f 2a 20 49 6e 64 65 78 20 69 64 65 6e 74 69 66  /* Index identif
16d0: 69 65 72 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20  ier string */.  
16e0: 20 20 7d 20 76 74 61 62 3b 0a 20 20 7d 20 75 3b    } vtab;.  } u;
16f0: 0a 20 20 75 33 32 20 77 73 46 6c 61 67 73 3b 20  .  u32 wsFlags; 
1700: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52           /* WHER
1710: 45 5f 2a 20 66 6c 61 67 73 20 64 65 73 63 72 69  E_* flags descri
1720: 62 69 6e 67 20 74 68 65 20 70 6c 61 6e 20 2a 2f  bing the plan */
1730: 0a 20 20 75 31 36 20 6e 4c 54 65 72 6d 3b 20 20  .  u16 nLTerm;  
1740: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1750: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
1760: 20 61 4c 54 65 72 6d 5b 5d 20 2a 2f 0a 20 20 2f   aLTerm[] */.  /
1770: 2a 2a 2a 2a 20 77 68 65 72 65 4c 6f 6f 70 58 66  **** whereLoopXf
1780: 65 72 28 29 20 63 6f 70 69 65 73 20 66 69 65 6c  er() copies fiel
1790: 64 73 20 61 62 6f 76 65 20 2a 2a 2a 2a 2a 2a 2a  ds above *******
17a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17b0: 2f 0a 23 20 64 65 66 69 6e 65 20 57 48 45 52 45  /.# define WHERE
17c0: 5f 4c 4f 4f 50 5f 58 46 45 52 5f 53 5a 20 6f 66  _LOOP_XFER_SZ of
17d0: 66 73 65 74 6f 66 28 57 68 65 72 65 4c 6f 6f 70  fsetof(WhereLoop
17e0: 2c 6e 4c 53 6c 6f 74 29 0a 20 20 75 31 36 20 6e  ,nLSlot).  u16 n
17f0: 4c 53 6c 6f 74 3b 20 20 20 20 20 20 20 20 20 20  LSlot;          
1800: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 6c   /* Number of sl
1810: 6f 74 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  ots allocated fo
1820: 72 20 61 4c 54 65 72 6d 5b 5d 20 2a 2f 0a 20 20  r aLTerm[] */.  
1830: 57 68 65 72 65 54 65 72 6d 20 2a 2a 61 4c 54 65  WhereTerm **aLTe
1840: 72 6d 3b 20 20 20 2f 2a 20 57 68 65 72 65 54 65  rm;   /* WhereTe
1850: 72 6d 73 20 75 73 65 64 20 2a 2f 0a 20 20 57 68  rms used */.  Wh
1860: 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 78 74 4c 6f  ereLoop *pNextLo
1870: 6f 70 3b 20 2f 2a 20 4e 65 78 74 20 57 68 65 72  op; /* Next Wher
1880: 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 69 6e 20  eLoop object in 
1890: 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  the WhereClause 
18a0: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
18b0: 61 4c 54 65 72 6d 53 70 61 63 65 5b 34 5d 3b 20  aLTermSpace[4]; 
18c0: 20 2f 2a 20 49 6e 69 74 69 61 6c 20 61 4c 54 65   /* Initial aLTe
18d0: 72 6d 5b 5d 20 73 70 61 63 65 20 2a 2f 0a 7d 3b  rm[] space */.};
18e0: 0a 0a 2f 2a 20 54 68 69 73 20 6f 62 6a 65 63 74  ../* This object
18f0: 20 68 6f 6c 64 73 20 74 68 65 20 70 72 65 72 65   holds the prere
1900: 71 75 69 73 69 74 65 73 20 61 6e 64 20 74 68 65  quisites and the
1910: 20 63 6f 73 74 20 6f 66 20 72 75 6e 6e 69 6e 67   cost of running
1920: 20 61 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 6f   a.** subquery o
1930: 6e 20 6f 6e 65 20 6f 70 65 72 61 6e 64 20 6f 66  n one operand of
1940: 20 61 6e 20 4f 52 20 6f 70 65 72 61 74 6f 72 20   an OR operator 
1950: 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
1960: 75 73 65 2e 0a 2a 2a 20 53 65 65 20 57 68 65 72  use..** See Wher
1970: 65 4f 72 53 65 74 20 66 6f 72 20 61 64 64 69 74  eOrSet for addit
1980: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
1990: 6e 20 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65  n .*/.struct Whe
19a0: 72 65 4f 72 43 6f 73 74 20 7b 0a 20 20 42 69 74  reOrCost {.  Bit
19b0: 6d 61 73 6b 20 70 72 65 72 65 71 3b 20 20 20 20  mask prereq;    
19c0: 20 2f 2a 20 50 72 65 72 65 71 75 69 73 69 74 65   /* Prerequisite
19d0: 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 52  s */.  LogEst rR
19e0: 75 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  un;        /* Co
19f0: 73 74 20 6f 66 20 72 75 6e 6e 69 6e 67 20 74 68  st of running th
1a00: 69 73 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  is subquery */. 
1a10: 20 4c 6f 67 45 73 74 20 6e 4f 75 74 3b 20 20 20   LogEst nOut;   
1a20: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1a30: 66 20 6f 75 74 70 75 74 73 20 66 6f 72 20 74 68  f outputs for th
1a40: 69 73 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 7d  is subquery */.}
1a50: 3b 0a 0a 2f 2a 20 54 68 65 20 57 68 65 72 65 4f  ;../* The WhereO
1a60: 72 53 65 74 20 6f 62 6a 65 63 74 20 68 6f 6c 64  rSet object hold
1a70: 73 20 61 20 73 65 74 20 6f 66 20 70 6f 73 73 69  s a set of possi
1a80: 62 6c 65 20 57 68 65 72 65 4f 72 43 6f 73 74 73  ble WhereOrCosts
1a90: 20 74 68 61 74 0a 2a 2a 20 63 6f 72 72 65 73 70   that.** corresp
1aa0: 6f 6e 64 20 74 6f 20 74 68 65 20 73 75 62 71 75  ond to the subqu
1ab0: 65 72 79 28 73 29 20 6f 66 20 4f 52 2d 63 6c 61  ery(s) of OR-cla
1ac0: 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 20  use processing. 
1ad0: 20 4f 6e 6c 79 20 74 68 65 0a 2a 2a 20 62 65 73   Only the.** bes
1ae0: 74 20 4e 5f 4f 52 5f 43 4f 53 54 20 65 6c 65 6d  t N_OR_COST elem
1af0: 65 6e 74 73 20 61 72 65 20 72 65 74 61 69 6e 65  ents are retaine
1b00: 64 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 5f  d..*/.#define N_
1b10: 4f 52 5f 43 4f 53 54 20 33 0a 73 74 72 75 63 74  OR_COST 3.struct
1b20: 20 57 68 65 72 65 4f 72 53 65 74 20 7b 0a 20 20   WhereOrSet {.  
1b30: 75 31 36 20 6e 3b 20 20 20 20 20 20 20 20 20 20  u16 n;          
1b40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1b50: 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 61  umber of valid a
1b60: 5b 5d 20 65 6e 74 72 69 65 73 20 2a 2f 0a 20 20  [] entries */.  
1b70: 57 68 65 72 65 4f 72 43 6f 73 74 20 61 5b 4e 5f  WhereOrCost a[N_
1b80: 4f 52 5f 43 4f 53 54 5d 3b 20 20 20 2f 2a 20 53  OR_COST];   /* S
1b90: 65 74 20 6f 66 20 62 65 73 74 20 63 6f 73 74 73  et of best costs
1ba0: 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 20 46 6f 72 77   */.};.../* Forw
1bb0: 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  ard declaration 
1bc0: 6f 66 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 73 74  of methods */.st
1bd0: 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
1be0: 6f 70 52 65 73 69 7a 65 28 73 71 6c 69 74 65 33  opResize(sqlite3
1bf0: 2a 2c 20 57 68 65 72 65 4c 6f 6f 70 2a 2c 20 69  *, WhereLoop*, i
1c00: 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68  nt);../*.** Each
1c10: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
1c20: 73 20 6f 62 6a 65 63 74 20 68 6f 6c 64 73 20 61  s object holds a
1c30: 20 73 65 71 75 65 6e 63 65 20 6f 66 20 57 68 65   sequence of Whe
1c40: 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 0a 2a  reLoop objects.*
1c50: 2a 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  * that implement
1c60: 20 73 6f 6d 65 20 6f 72 20 61 6c 6c 20 6f 66 20   some or all of 
1c70: 61 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2a  a query plan..**
1c80: 0a 2a 2a 20 54 68 69 6e 6b 20 6f 66 20 65 61 63  .** Think of eac
1c90: 68 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  h WhereLoop obje
1ca0: 63 74 20 61 73 20 61 20 6e 6f 64 65 20 69 6e 20  ct as a node in 
1cb0: 61 20 67 72 61 70 68 20 77 69 74 68 20 61 72 63  a graph with arc
1cc0: 73 0a 2a 2a 20 73 68 6f 77 69 6e 67 20 64 65 70  s.** showing dep
1cd0: 65 6e 64 65 6e 63 69 65 73 20 61 6e 64 20 63 6f  endencies and co
1ce0: 73 74 73 20 66 6f 72 20 74 72 61 76 65 6c 6c 69  sts for travelli
1cf0: 6e 67 20 62 65 74 77 65 65 6e 20 6e 6f 64 65 73  ng between nodes
1d00: 2e 20 20 28 54 68 61 74 20 69 73 0a 2a 2a 20 6e  .  (That is.** n
1d10: 6f 74 20 61 20 63 6f 6d 70 6c 65 74 65 6c 79 20  ot a completely 
1d20: 61 63 63 75 72 61 74 65 20 64 65 73 63 72 69 70  accurate descrip
1d30: 74 69 6f 6e 20 62 65 63 61 75 73 65 20 57 68 65  tion because Whe
1d40: 72 65 4c 6f 6f 70 20 63 6f 73 74 73 20 61 72 65  reLoop costs are
1d50: 20 61 0a 2a 2a 20 76 65 63 74 6f 72 2c 20 6e 6f   a.** vector, no
1d60: 74 20 61 20 73 63 61 6c 61 72 2c 20 61 6e 64 20  t a scalar, and 
1d70: 62 65 63 61 75 73 65 20 64 65 70 65 6e 64 65 6e  because dependen
1d80: 63 69 65 73 20 61 72 65 20 6d 61 6e 79 2d 74 6f  cies are many-to
1d90: 2d 6f 6e 65 2c 20 6e 6f 74 0a 2a 2a 20 6f 6e 65  -one, not.** one
1da0: 2d 74 6f 2d 6f 6e 65 20 61 73 20 61 72 65 20 67  -to-one as are g
1db0: 72 61 70 68 20 6e 6f 64 65 73 2e 20 20 42 75 74  raph nodes.  But
1dc0: 20 69 74 20 69 73 20 61 20 75 73 65 66 75 6c 20   it is a useful 
1dd0: 76 69 73 75 61 6c 69 7a 61 74 69 6f 6e 20 61 69  visualization ai
1de0: 64 2e 29 0a 2a 2a 20 54 68 65 6e 20 61 20 57 68  d.).** Then a Wh
1df0: 65 72 65 50 61 74 68 20 6f 62 6a 65 63 74 20 69  erePath object i
1e00: 73 20 61 20 70 61 74 68 20 74 68 72 6f 75 67 68  s a path through
1e10: 20 74 68 65 20 67 72 61 70 68 20 74 68 61 74 20   the graph that 
1e20: 76 69 73 69 74 73 20 73 6f 6d 65 0a 2a 2a 20 6f  visits some.** o
1e30: 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 57 68 65  r all of the Whe
1e40: 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 6f  reLoop objects o
1e50: 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22  nce..**.** The "
1e60: 73 6f 6c 76 65 72 22 20 77 6f 72 6b 73 20 62 79  solver" works by
1e70: 20 63 72 65 61 74 69 6e 67 20 74 68 65 20 4e 20   creating the N 
1e80: 62 65 73 74 20 57 68 65 72 65 50 61 74 68 20 6f  best WherePath o
1e90: 62 6a 65 63 74 73 20 6f 66 20 6c 65 6e 67 74 68  bjects of length
1ea0: 0a 2a 2a 20 31 2e 20 20 54 68 65 6e 20 75 73 69  .** 1.  Then usi
1eb0: 6e 67 20 74 68 6f 73 65 20 61 73 20 61 20 62 61  ng those as a ba
1ec0: 73 69 73 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  sis to compute t
1ed0: 68 65 20 4e 20 62 65 73 74 20 57 68 65 72 65 50  he N best WhereP
1ee0: 61 74 68 20 6f 62 6a 65 63 74 73 0a 2a 2a 20 6f  ath objects.** o
1ef0: 66 20 6c 65 6e 67 74 68 20 32 2e 20 20 41 6e 64  f length 2.  And
1f00: 20 73 6f 20 66 6f 72 74 68 20 75 6e 74 69 6c 20   so forth until 
1f10: 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 57 68  the length of Wh
1f20: 65 72 65 50 61 74 68 73 20 65 71 75 61 6c 73 20  erePaths equals 
1f30: 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  the.** number of
1f40: 20 6e 6f 64 65 73 20 69 6e 20 74 68 65 20 46 52   nodes in the FR
1f50: 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20  OM clause.  The 
1f60: 62 65 73 74 20 28 6c 6f 77 65 73 74 20 63 6f 73  best (lowest cos
1f70: 74 29 20 57 68 65 72 65 50 61 74 68 0a 2a 2a 20  t) WherePath.** 
1f80: 61 74 20 74 68 65 20 65 6e 64 20 69 73 20 74 68  at the end is th
1f90: 65 20 63 68 6f 6f 73 65 6e 20 71 75 65 72 79 20  e choosen query 
1fa0: 70 6c 61 6e 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  plan..*/.struct 
1fb0: 57 68 65 72 65 50 61 74 68 20 7b 0a 20 20 42 69  WherePath {.  Bi
1fc0: 74 6d 61 73 6b 20 6d 61 73 6b 4c 6f 6f 70 3b 20  tmask maskLoop; 
1fd0: 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f      /* Bitmask o
1fe0: 66 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20  f all WhereLoop 
1ff0: 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 69 73 20  objects in this 
2000: 70 61 74 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73  path */.  Bitmas
2010: 6b 20 72 65 76 4c 6f 6f 70 3b 20 20 20 20 20 20  k revLoop;      
2020: 2f 2a 20 61 4c 6f 6f 70 5b 5d 73 20 74 68 61 74  /* aLoop[]s that
2030: 20 73 68 6f 75 6c 64 20 62 65 20 72 65 76 65 72   should be rever
2040: 73 65 64 20 66 6f 72 20 4f 52 44 45 52 20 42 59  sed for ORDER BY
2050: 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 52 6f   */.  LogEst nRo
2060: 77 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  w;          /* E
2070: 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20  stimated number 
2080: 6f 66 20 72 6f 77 73 20 67 65 6e 65 72 61 74 65  of rows generate
2090: 64 20 62 79 20 74 68 69 73 20 70 61 74 68 20 2a  d by this path *
20a0: 2f 0a 20 20 4c 6f 67 45 73 74 20 72 43 6f 73 74  /.  LogEst rCost
20b0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74  ;         /* Tot
20c0: 61 6c 20 63 6f 73 74 20 6f 66 20 74 68 69 73 20  al cost of this 
20d0: 70 61 74 68 20 2a 2f 0a 20 20 75 38 20 69 73 4f  path */.  u8 isO
20e0: 72 64 65 72 65 64 3b 20 20 20 20 20 20 20 20 20  rdered;         
20f0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
2100: 70 61 74 68 20 73 61 74 69 73 66 69 65 73 20 4f  path satisfies O
2110: 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 75 38 20  RDER BY */.  u8 
2120: 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 3b 20  isOrderedValid; 
2130: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
2140: 65 20 69 73 4f 72 64 65 72 65 64 20 66 69 65 6c  e isOrdered fiel
2150: 64 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20  d is valid */.  
2160: 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 61 4c 6f 6f  WhereLoop **aLoo
2170: 70 3b 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f  p;    /* Array o
2180: 66 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  f WhereLoop obje
2190: 63 74 73 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67  cts implementing
21a0: 20 74 68 69 73 20 70 61 74 68 20 2a 2f 0a 7d 3b   this path */.};
21b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 71 75 65 72  ../*.** The quer
21c0: 79 20 67 65 6e 65 72 61 74 6f 72 20 75 73 65 73  y generator uses
21d0: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 69 6e 73   an array of ins
21e0: 74 61 6e 63 65 73 20 6f 66 20 74 68 69 73 20 73  tances of this s
21f0: 74 72 75 63 74 75 72 65 20 74 6f 0a 2a 2a 20 68  tructure to.** h
2200: 65 6c 70 20 69 74 20 61 6e 61 6c 79 7a 65 20 74  elp it analyze t
2210: 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  he subexpression
2220: 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
2230: 6c 61 75 73 65 2e 20 20 45 61 63 68 20 57 48 45  lause.  Each WHE
2240: 52 45 0a 2a 2a 20 63 6c 61 75 73 65 20 73 75 62  RE.** clause sub
2250: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65  expression is se
2260: 70 61 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65  parated from the
2270: 20 6f 74 68 65 72 73 20 62 79 20 41 4e 44 20 6f   others by AND o
2280: 70 65 72 61 74 6f 72 73 2c 0a 2a 2a 20 75 73 75  perators,.** usu
2290: 61 6c 6c 79 2c 20 6f 72 20 73 6f 6d 65 74 69 6d  ally, or sometim
22a0: 65 73 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  es subexpression
22b0: 73 20 73 65 70 61 72 61 74 65 64 20 62 79 20 4f  s separated by O
22c0: 52 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 57 68 65  R..**.** All Whe
22d0: 72 65 54 65 72 6d 73 20 61 72 65 20 63 6f 6c 6c  reTerms are coll
22e0: 65 63 74 65 64 20 69 6e 74 6f 20 61 20 73 69 6e  ected into a sin
22f0: 67 6c 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  gle WhereClause 
2300: 73 74 72 75 63 74 75 72 65 2e 20 20 0a 2a 2a 20  structure.  .** 
2310: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 64  The following id
2320: 65 6e 74 69 74 79 20 68 6f 6c 64 73 3a 0a 2a 2a  entity holds:.**
2330: 0a 2a 2a 20 20 20 20 20 20 20 20 57 68 65 72 65  .**        Where
2340: 54 65 72 6d 2e 70 57 43 2d 3e 61 5b 57 68 65 72  Term.pWC->a[Wher
2350: 65 54 65 72 6d 2e 69 64 78 5d 20 3d 3d 20 57 68  eTerm.idx] == Wh
2360: 65 72 65 54 65 72 6d 0a 2a 2a 0a 2a 2a 20 57 68  ereTerm.**.** Wh
2370: 65 6e 20 61 20 74 65 72 6d 20 69 73 20 6f 66 20  en a term is of 
2380: 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
2390: 20 20 20 20 20 20 20 20 20 20 20 20 20 58 20 3c               X <
23a0: 6f 70 3e 20 3c 65 78 70 72 3e 0a 2a 2a 0a 2a 2a  op> <expr>.**.**
23b0: 20 77 68 65 72 65 20 58 20 69 73 20 61 20 63 6f   where X is a co
23c0: 6c 75 6d 6e 20 6e 61 6d 65 20 61 6e 64 20 3c 6f  lumn name and <o
23d0: 70 3e 20 69 73 20 6f 6e 65 20 6f 66 20 63 65 72  p> is one of cer
23e0: 74 61 69 6e 20 6f 70 65 72 61 74 6f 72 73 2c 0a  tain operators,.
23f0: 2a 2a 20 74 68 65 6e 20 57 68 65 72 65 54 65 72  ** then WhereTer
2400: 6d 2e 6c 65 66 74 43 75 72 73 6f 72 20 61 6e 64  m.leftCursor and
2410: 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 6c 65 66   WhereTerm.u.lef
2420: 74 43 6f 6c 75 6d 6e 20 72 65 63 6f 72 64 20 74  tColumn record t
2430: 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 6e 75 6d  he.** cursor num
2440: 62 65 72 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e  ber and column n
2450: 75 6d 62 65 72 20 66 6f 72 20 58 2e 20 20 57 68  umber for X.  Wh
2460: 65 72 65 54 65 72 6d 2e 65 4f 70 65 72 61 74 6f  ereTerm.eOperato
2470: 72 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65  r records.** the
2480: 20 3c 6f 70 3e 20 75 73 69 6e 67 20 61 20 62 69   <op> using a bi
2490: 74 6d 61 73 6b 20 65 6e 63 6f 64 69 6e 67 20 64  tmask encoding d
24a0: 65 66 69 6e 65 64 20 62 79 20 57 4f 5f 78 78 78  efined by WO_xxx
24b0: 20 62 65 6c 6f 77 2e 20 20 54 68 65 0a 2a 2a 20   below.  The.** 
24c0: 75 73 65 20 6f 66 20 61 20 62 69 74 6d 61 73 6b  use of a bitmask
24d0: 20 65 6e 63 6f 64 69 6e 67 20 66 6f 72 20 74 68   encoding for th
24e0: 65 20 6f 70 65 72 61 74 6f 72 20 61 6c 6c 6f 77  e operator allow
24f0: 73 20 75 73 20 74 6f 20 73 65 61 72 63 68 0a 2a  s us to search.*
2500: 2a 20 71 75 69 63 6b 6c 79 20 66 6f 72 20 74 65  * quickly for te
2510: 72 6d 73 20 74 68 61 74 20 6d 61 74 63 68 20 61  rms that match a
2520: 6e 79 20 6f 66 20 73 65 76 65 72 61 6c 20 64 69  ny of several di
2530: 66 66 65 72 65 6e 74 20 6f 70 65 72 61 74 6f 72  fferent operator
2540: 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 57 68 65 72 65  s..**.** A Where
2550: 54 65 72 6d 20 6d 69 67 68 74 20 61 6c 73 6f 20  Term might also 
2560: 62 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73  be two or more s
2570: 75 62 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65  ubterms connecte
2580: 64 20 62 79 20 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20  d by OR:.**.**  
2590: 20 20 20 20 20 20 20 28 74 31 2e 58 20 3c 6f 70         (t1.X <op
25a0: 3e 20 3c 65 78 70 72 3e 29 20 4f 52 20 28 74 31  > <expr>) OR (t1
25b0: 2e 59 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 29 20  .Y <op> <expr>) 
25c0: 4f 52 20 2e 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 49 6e  OR .....**.** In
25d0: 20 74 68 69 73 20 73 65 63 6f 6e 64 20 63 61 73   this second cas
25e0: 65 2c 20 77 74 46 6c 61 67 20 68 61 73 20 74 68  e, wtFlag has th
25f0: 65 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 62 69  e TERM_ORINFO bi
2600: 74 20 73 65 74 20 61 6e 64 20 65 4f 70 65 72 61  t set and eOpera
2610: 74 6f 72 3d 3d 57 4f 5f 4f 52 0a 2a 2a 20 61 6e  tor==WO_OR.** an
2620: 64 20 74 68 65 20 57 68 65 72 65 54 65 72 6d 2e  d the WhereTerm.
2630: 75 2e 70 4f 72 49 6e 66 6f 20 66 69 65 6c 64 20  u.pOrInfo field 
2640: 70 6f 69 6e 74 73 20 74 6f 20 61 75 78 69 6c 69  points to auxili
2650: 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ary information 
2660: 74 68 61 74 0a 2a 2a 20 69 73 20 63 6f 6c 6c 65  that.** is colle
2670: 63 74 65 64 20 61 62 6f 75 74 20 74 68 65 20 4f  cted about the O
2680: 52 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  R clause..**.** 
2690: 49 66 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65  If a term in the
26a0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 64 6f   WHERE clause do
26b0: 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 65 69 74  es not match eit
26c0: 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70  her of the two p
26d0: 72 65 76 69 6f 75 73 0a 2a 2a 20 63 61 74 65 67  revious.** categ
26e0: 6f 72 69 65 73 2c 20 74 68 65 6e 20 65 4f 70 65  ories, then eOpe
26f0: 72 61 74 6f 72 3d 3d 30 2e 20 20 54 68 65 20 57  rator==0.  The W
2700: 68 65 72 65 54 65 72 6d 2e 70 45 78 70 72 20 66  hereTerm.pExpr f
2710: 69 65 6c 64 20 69 73 20 73 74 69 6c 6c 20 73 65  ield is still se
2720: 74 0a 2a 2a 20 74 6f 20 74 68 65 20 6f 72 69 67  t.** to the orig
2730: 69 6e 61 6c 20 73 75 62 65 78 70 72 65 73 73 69  inal subexpressi
2740: 6f 6e 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 77  on content and w
2750: 74 46 6c 61 67 73 20 69 73 20 73 65 74 20 75 70  tFlags is set up
2760: 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79 0a 2a   appropriately.*
2770: 2a 20 62 75 74 20 6e 6f 20 6f 74 68 65 72 20 66  * but no other f
2780: 69 65 6c 64 73 20 69 6e 20 74 68 65 20 57 68 65  ields in the Whe
2790: 72 65 54 65 72 6d 20 6f 62 6a 65 63 74 20 61 72  reTerm object ar
27a0: 65 20 6d 65 61 6e 69 6e 67 66 75 6c 2e 0a 2a 2a  e meaningful..**
27b0: 0a 2a 2a 20 57 68 65 6e 20 65 4f 70 65 72 61 74  .** When eOperat
27c0: 6f 72 21 3d 30 2c 20 70 72 65 72 65 71 52 69 67  or!=0, prereqRig
27d0: 68 74 20 61 6e 64 20 70 72 65 72 65 71 41 6c 6c  ht and prereqAll
27e0: 20 72 65 63 6f 72 64 20 73 65 74 73 20 6f 66 20   record sets of 
27f0: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 2c 0a  cursor numbers,.
2800: 2a 2a 20 62 75 74 20 74 68 65 79 20 64 6f 20 73  ** but they do s
2810: 6f 20 69 6e 64 69 72 65 63 74 6c 79 2e 20 20 41  o indirectly.  A
2820: 20 73 69 6e 67 6c 65 20 57 68 65 72 65 4d 61 73   single WhereMas
2830: 6b 53 65 74 20 73 74 72 75 63 74 75 72 65 20 74  kSet structure t
2840: 72 61 6e 73 6c 61 74 65 73 0a 2a 2a 20 63 75 72  ranslates.** cur
2850: 73 6f 72 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20  sor number into 
2860: 62 69 74 73 20 61 6e 64 20 74 68 65 20 74 72 61  bits and the tra
2870: 6e 73 6c 61 74 65 64 20 62 69 74 20 69 73 20 73  nslated bit is s
2880: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 70 72 65  tored in the pre
2890: 72 65 71 0a 2a 2a 20 66 69 65 6c 64 73 2e 20 20  req.** fields.  
28a0: 54 68 65 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20  The translation 
28b0: 69 73 20 75 73 65 64 20 69 6e 20 6f 72 64 65 72  is used in order
28c0: 20 74 6f 20 6d 61 78 69 6d 69 7a 65 20 74 68 65   to maximize the
28d0: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 62 69   number of.** bi
28e0: 74 73 20 74 68 61 74 20 77 69 6c 6c 20 66 69 74  ts that will fit
28f0: 20 69 6e 20 61 20 42 69 74 6d 61 73 6b 2e 20 20   in a Bitmask.  
2900: 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
2910: 6e 75 6d 62 65 72 73 20 6d 69 67 68 74 20 62 65  numbers might be
2920: 0a 2a 2a 20 73 70 72 65 61 64 20 6f 75 74 20 6f  .** spread out o
2930: 76 65 72 20 74 68 65 20 6e 6f 6e 2d 6e 65 67 61  ver the non-nega
2940: 74 69 76 65 20 69 6e 74 65 67 65 72 73 2e 20 20  tive integers.  
2950: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  For example, the
2960: 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65   cursor.** numbe
2970: 72 73 20 6d 69 67 68 74 20 62 65 20 33 2c 20 38  rs might be 3, 8
2980: 2c 20 39 2c 20 31 30 2c 20 32 30 2c 20 32 33 2c  , 9, 10, 20, 23,
2990: 20 34 31 2c 20 61 6e 64 20 34 35 2e 20 20 54 68   41, and 45.  Th
29a0: 65 20 57 68 65 72 65 4d 61 73 6b 53 65 74 0a 2a  e WhereMaskSet.*
29b0: 2a 20 74 72 61 6e 73 6c 61 74 65 73 20 74 68 65  * translates the
29c0: 73 65 20 73 70 61 72 73 65 20 63 75 72 73 6f 72  se sparse cursor
29d0: 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20 63 6f   numbers into co
29e0: 6e 73 65 63 75 74 69 76 65 20 69 6e 74 65 67 65  nsecutive intege
29f0: 72 73 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20  rs.** beginning 
2a00: 77 69 74 68 20 30 20 69 6e 20 6f 72 64 65 72 20  with 0 in order 
2a10: 74 6f 20 6d 61 6b 65 20 74 68 65 20 62 65 73 74  to make the best
2a20: 20 70 6f 73 73 69 62 6c 65 20 75 73 65 20 6f 66   possible use of
2a30: 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a   the available.*
2a40: 2a 20 62 69 74 73 20 69 6e 20 74 68 65 20 42 69  * bits in the Bi
2a50: 74 6d 61 73 6b 2e 20 20 53 6f 2c 20 69 6e 20 74  tmask.  So, in t
2a60: 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65  he example above
2a70: 2c 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  , the cursor num
2a80: 62 65 72 73 0a 2a 2a 20 77 6f 75 6c 64 20 62 65  bers.** would be
2a90: 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 69 6e 74   mapped into int
2aa0: 65 67 65 72 73 20 30 20 74 68 72 6f 75 67 68 20  egers 0 through 
2ab0: 37 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d  7..**.** The num
2ac0: 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20  ber of terms in 
2ad0: 61 20 6a 6f 69 6e 20 69 73 20 6c 69 6d 69 74 65  a join is limite
2ae0: 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20  d by the number 
2af0: 6f 66 20 62 69 74 73 0a 2a 2a 20 69 6e 20 70 72  of bits.** in pr
2b00: 65 72 65 71 52 69 67 68 74 20 61 6e 64 20 70 72  ereqRight and pr
2b10: 65 72 65 71 41 6c 6c 2e 20 20 54 68 65 20 64 65  ereqAll.  The de
2b20: 66 61 75 6c 74 20 69 73 20 36 34 20 62 69 74 73  fault is 64 bits
2b30: 2c 20 68 65 6e 63 65 20 53 51 4c 69 74 65 0a 2a  , hence SQLite.*
2b40: 2a 20 69 73 20 6f 6e 6c 79 20 61 62 6c 65 20 74  * is only able t
2b50: 6f 20 70 72 6f 63 65 73 73 20 6a 6f 69 6e 73 20  o process joins 
2b60: 77 69 74 68 20 36 34 20 6f 72 20 66 65 77 65 72  with 64 or fewer
2b70: 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 72 75   tables..*/.stru
2b80: 63 74 20 57 68 65 72 65 54 65 72 6d 20 7b 0a 20  ct WhereTerm {. 
2b90: 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20 20 20   Expr *pExpr;   
2ba0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
2bb0: 74 65 72 20 74 6f 20 74 68 65 20 73 75 62 65 78  ter to the subex
2bc0: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73  pression that is
2bd0: 20 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20   this term */.  
2be0: 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20  int iParent;    
2bf0: 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62          /* Disab
2c00: 6c 65 20 70 57 43 2d 3e 61 5b 69 50 61 72 65 6e  le pWC->a[iParen
2c10: 74 5d 20 77 68 65 6e 20 74 68 69 73 20 74 65 72  t] when this ter
2c20: 6d 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  m disabled */.  
2c30: 69 6e 74 20 6c 65 66 74 43 75 72 73 6f 72 3b 20  int leftCursor; 
2c40: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
2c50: 72 20 6e 75 6d 62 65 72 20 6f 66 20 58 20 69 6e  r number of X in
2c60: 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22   "X <op> <expr>"
2c70: 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20   */.  union {.  
2c80: 20 20 69 6e 74 20 6c 65 66 74 43 6f 6c 75 6d 6e    int leftColumn
2c90: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c  ;         /* Col
2ca0: 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 58 20  umn number of X 
2cb0: 69 6e 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  in "X <op> <expr
2cc0: 3e 22 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 4f  >" */.    WhereO
2cd0: 72 49 6e 66 6f 20 2a 70 4f 72 49 6e 66 6f 3b 20  rInfo *pOrInfo; 
2ce0: 20 20 2f 2a 20 45 78 74 72 61 20 69 6e 66 6f 72    /* Extra infor
2cf0: 6d 61 74 69 6f 6e 20 69 66 20 28 65 4f 70 65 72  mation if (eOper
2d00: 61 74 6f 72 20 26 20 57 4f 5f 4f 52 29 21 3d 30  ator & WO_OR)!=0
2d10: 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 41 6e 64   */.    WhereAnd
2d20: 49 6e 66 6f 20 2a 70 41 6e 64 49 6e 66 6f 3b 20  Info *pAndInfo; 
2d30: 2f 2a 20 45 78 74 72 61 20 69 6e 66 6f 72 6d 61  /* Extra informa
2d40: 74 69 6f 6e 20 69 66 20 28 65 4f 70 65 72 61 74  tion if (eOperat
2d50: 6f 72 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20 2a  or& WO_AND)!=0 *
2d60: 2f 0a 20 20 7d 20 75 3b 0a 20 20 4c 6f 67 45 73  /.  } u;.  LogEs
2d70: 74 20 74 72 75 74 68 50 72 6f 62 3b 20 20 20 20  t truthProb;    
2d80: 20 20 20 2f 2a 20 50 72 6f 62 61 62 69 6c 69 74     /* Probabilit
2d90: 79 20 6f 66 20 74 72 75 74 68 20 66 6f 72 20 74  y of truth for t
2da0: 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  his expression *
2db0: 2f 0a 20 20 75 31 36 20 65 4f 70 65 72 61 74 6f  /.  u16 eOperato
2dc0: 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  r;          /* A
2dd0: 20 57 4f 5f 78 78 20 76 61 6c 75 65 20 64 65 73   WO_xx value des
2de0: 63 72 69 62 69 6e 67 20 3c 6f 70 3e 20 2a 2f 0a  cribing <op> */.
2df0: 20 20 75 38 20 77 74 46 6c 61 67 73 3b 20 20 20    u8 wtFlags;   
2e00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 45 52            /* TER
2e10: 4d 5f 78 78 78 20 62 69 74 20 66 6c 61 67 73 2e  M_xxx bit flags.
2e20: 20 20 53 65 65 20 62 65 6c 6f 77 20 2a 2f 0a 20    See below */. 
2e30: 20 75 38 20 6e 43 68 69 6c 64 3b 20 20 20 20 20   u8 nChild;     
2e40: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2e50: 65 72 20 6f 66 20 63 68 69 6c 64 72 65 6e 20 74  er of children t
2e60: 68 61 74 20 6d 75 73 74 20 64 69 73 61 62 6c 65  hat must disable
2e70: 20 75 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c   us */.  WhereCl
2e80: 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20  ause *pWC;      
2e90: 20 2f 2a 20 54 68 65 20 63 6c 61 75 73 65 20 74   /* The clause t
2ea0: 68 69 73 20 74 65 72 6d 20 69 73 20 70 61 72 74  his term is part
2eb0: 20 6f 66 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b   of */.  Bitmask
2ec0: 20 70 72 65 72 65 71 52 69 67 68 74 3b 20 20 20   prereqRight;   
2ed0: 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20 74   /* Bitmask of t
2ee0: 61 62 6c 65 73 20 75 73 65 64 20 62 79 20 70 45  ables used by pE
2ef0: 78 70 72 2d 3e 70 52 69 67 68 74 20 2a 2f 0a 20  xpr->pRight */. 
2f00: 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41   Bitmask prereqA
2f10: 6c 6c 3b 20 20 20 20 20 20 2f 2a 20 42 69 74 6d  ll;      /* Bitm
2f20: 61 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 72 65  ask of tables re
2f30: 66 65 72 65 6e 63 65 64 20 62 79 20 70 45 78 70  ferenced by pExp
2f40: 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  r */.};../*.** A
2f50: 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 6f 66  llowed values of
2f60: 20 57 68 65 72 65 54 65 72 6d 2e 77 74 46 6c 61   WhereTerm.wtFla
2f70: 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45  gs.*/.#define TE
2f80: 52 4d 5f 44 59 4e 41 4d 49 43 20 20 20 20 30 78  RM_DYNAMIC    0x
2f90: 30 31 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20  01   /* Need to 
2fa0: 63 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70 72  call sqlite3Expr
2fb0: 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72  Delete(db, pExpr
2fc0: 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52  ) */.#define TER
2fd0: 4d 5f 56 49 52 54 55 41 4c 20 20 20 20 30 78 30  M_VIRTUAL    0x0
2fe0: 32 20 20 20 2f 2a 20 41 64 64 65 64 20 62 79 20  2   /* Added by 
2ff0: 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 2e 20 20  the optimizer.  
3000: 44 6f 20 6e 6f 74 20 63 6f 64 65 20 2a 2f 0a 23  Do not code */.#
3010: 64 65 66 69 6e 65 20 54 45 52 4d 5f 43 4f 44 45  define TERM_CODE
3020: 44 20 20 20 20 20 20 30 78 30 34 20 20 20 2f 2a  D      0x04   /*
3030: 20 54 68 69 73 20 74 65 72 6d 20 69 73 20 61 6c   This term is al
3040: 72 65 61 64 79 20 63 6f 64 65 64 20 2a 2f 0a 23  ready coded */.#
3050: 64 65 66 69 6e 65 20 54 45 52 4d 5f 43 4f 50 49  define TERM_COPI
3060: 45 44 20 20 20 20 20 30 78 30 38 20 20 20 2f 2a  ED     0x08   /*
3070: 20 48 61 73 20 61 20 63 68 69 6c 64 20 2a 2f 0a   Has a child */.
3080: 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 4f 52 49  #define TERM_ORI
3090: 4e 46 4f 20 20 20 20 20 30 78 31 30 20 20 20 2f  NFO     0x10   /
30a0: 2a 20 4e 65 65 64 20 74 6f 20 66 72 65 65 20 74  * Need to free t
30b0: 68 65 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70  he WhereTerm.u.p
30c0: 4f 72 49 6e 66 6f 20 6f 62 6a 65 63 74 20 2a 2f  OrInfo object */
30d0: 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 41 4e  .#define TERM_AN
30e0: 44 49 4e 46 4f 20 20 20 20 30 78 32 30 20 20 20  DINFO    0x20   
30f0: 2f 2a 20 4e 65 65 64 20 74 6f 20 66 72 65 65 20  /* Need to free 
3100: 74 68 65 20 57 68 65 72 65 54 65 72 6d 2e 75 2e  the WhereTerm.u.
3110: 70 41 6e 64 49 6e 66 6f 20 6f 62 6a 20 2a 2f 0a  pAndInfo obj */.
3120: 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 4f 52 5f  #define TERM_OR_
3130: 4f 4b 20 20 20 20 20 20 30 78 34 30 20 20 20 2f  OK      0x40   /
3140: 2a 20 55 73 65 64 20 64 75 72 69 6e 67 20 4f 52  * Used during OR
3150: 2d 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69  -clause processi
3160: 6e 67 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ng */.#ifdef SQL
3170: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
3180: 5f 4f 52 5f 53 54 41 54 34 0a 23 20 20 64 65 66  _OR_STAT4.#  def
3190: 69 6e 65 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 20  ine TERM_VNULL  
31a0: 20 20 30 78 38 30 20 20 20 2f 2a 20 4d 61 6e 75    0x80   /* Manu
31b0: 66 61 63 74 75 72 65 64 20 78 3e 4e 55 4c 4c 20  factured x>NULL 
31c0: 6f 72 20 78 3c 3d 4e 55 4c 4c 20 74 65 72 6d 20  or x<=NULL term 
31d0: 2a 2f 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69  */.#else.#  defi
31e0: 6e 65 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 20 20  ne TERM_VNULL   
31f0: 20 30 78 30 30 20 20 20 2f 2a 20 44 69 73 61 62   0x00   /* Disab
3200: 6c 65 64 20 69 66 20 6e 6f 74 20 75 73 69 6e 67  led if not using
3210: 20 73 74 61 74 33 20 2a 2f 0a 23 65 6e 64 69 66   stat3 */.#endif
3220: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
3230: 6e 63 65 20 6f 66 20 74 68 65 20 57 68 65 72 65  nce of the Where
3240: 53 63 61 6e 20 6f 62 6a 65 63 74 20 69 73 20 75  Scan object is u
3250: 73 65 64 20 61 73 20 61 6e 20 69 74 65 72 61 74  sed as an iterat
3260: 6f 72 20 66 6f 72 20 6c 6f 63 61 74 69 6e 67 0a  or for locating.
3270: 2a 2a 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  ** terms in the 
3280: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
3290: 74 20 61 72 65 20 75 73 65 66 75 6c 20 74 6f 20  t are useful to 
32a0: 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65  the query planne
32b0: 72 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65  r..*/.struct Whe
32c0: 72 65 53 63 61 6e 20 7b 0a 20 20 57 68 65 72 65  reScan {.  Where
32d0: 43 6c 61 75 73 65 20 2a 70 4f 72 69 67 57 43 3b  Clause *pOrigWC;
32e0: 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61        /* Origina
32f0: 6c 2c 20 69 6e 6e 65 72 6d 6f 73 74 20 57 68 65  l, innermost Whe
3300: 72 65 43 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  reClause */.  Wh
3310: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20  ereClause *pWC; 
3320: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72           /* Wher
3330: 65 43 6c 61 75 73 65 20 63 75 72 72 65 6e 74 6c  eClause currentl
3340: 79 20 62 65 69 6e 67 20 73 63 61 6e 6e 65 64 20  y being scanned 
3350: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  */.  char *zColl
3360: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
3370: 2f 2a 20 52 65 71 75 69 72 65 64 20 63 6f 6c 6c  /* Required coll
3380: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2c 20  ating sequence, 
3390: 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 20  if not NULL */. 
33a0: 20 63 68 61 72 20 69 64 78 61 66 66 3b 20 20 20   char idxaff;   
33b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
33c0: 75 73 74 20 6d 61 74 63 68 20 74 68 69 73 20 61  ust match this a
33d0: 66 66 69 6e 69 74 79 2c 20 69 66 20 7a 43 6f 6c  ffinity, if zCol
33e0: 6c 4e 61 6d 65 21 3d 4e 55 4c 4c 20 2a 2f 0a 20  lName!=NULL */. 
33f0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6e   unsigned char n
3400: 45 71 75 69 76 3b 20 20 20 20 20 20 2f 2a 20 4e  Equiv;      /* N
3410: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
3420: 20 69 6e 20 61 45 71 75 69 76 5b 5d 20 2a 2f 0a   in aEquiv[] */.
3430: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
3440: 69 45 71 75 69 76 3b 20 20 20 20 20 20 2f 2a 20  iEquiv;      /* 
3450: 4e 65 78 74 20 75 6e 75 73 65 64 20 73 6c 6f 74  Next unused slot
3460: 20 69 6e 20 61 45 71 75 69 76 5b 5d 20 2a 2f 0a   in aEquiv[] */.
3470: 20 20 75 33 32 20 6f 70 4d 61 73 6b 3b 20 20 20    u32 opMask;   
3480: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3490: 41 63 63 65 70 74 61 62 6c 65 20 6f 70 65 72 61  Acceptable opera
34a0: 74 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6b 3b  tors */.  int k;
34b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34c0: 20 20 20 20 20 2f 2a 20 52 65 73 75 6d 65 20 73       /* Resume s
34d0: 63 61 6e 6e 69 6e 67 20 61 74 20 74 68 69 73 2d  canning at this-
34e0: 3e 70 57 43 2d 3e 61 5b 74 68 69 73 2d 3e 6b 5d  >pWC->a[this->k]
34f0: 20 2a 2f 0a 20 20 69 6e 74 20 61 45 71 75 69 76   */.  int aEquiv
3500: 5b 32 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20  [22];           
3510: 20 2f 2a 20 43 75 72 73 6f 72 2c 43 6f 6c 75 6d   /* Cursor,Colum
3520: 6e 20 70 61 69 72 73 20 66 6f 72 20 65 71 75 69  n pairs for equi
3530: 76 61 6c 65 6e 63 65 20 63 6c 61 73 73 65 73 20  valence classes 
3540: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  */.};../*.** An 
3550: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
3560: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
3570: 75 72 65 20 68 6f 6c 64 73 20 61 6c 6c 20 69 6e  ure holds all in
3580: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
3590: 61 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  a.** WHERE claus
35a0: 65 2e 20 20 4d 6f 73 74 6c 79 20 74 68 69 73 20  e.  Mostly this 
35b0: 69 73 20 61 20 63 6f 6e 74 61 69 6e 65 72 20 66  is a container f
35c0: 6f 72 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57  or one or more W
35d0: 68 65 72 65 54 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a  hereTerms..**.**
35e0: 20 45 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20   Explanation of 
35f0: 70 4f 75 74 65 72 3a 20 20 46 6f 72 20 61 20 57  pOuter:  For a W
3600: 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74  HERE clause of t
3610: 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20  he form.**.**   
3620: 20 20 20 20 20 20 20 20 61 20 41 4e 44 20 28 28          a AND ((
3630: 62 20 41 4e 44 20 63 29 20 4f 52 20 28 64 20 41  b AND c) OR (d A
3640: 4e 44 20 65 29 29 20 41 4e 44 20 66 0a 2a 2a 0a  ND e)) AND f.**.
3650: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 73 65 70  ** There are sep
3660: 61 72 61 74 65 20 57 68 65 72 65 43 6c 61 75 73  arate WhereClaus
3670: 65 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 74 68  e objects for th
3680: 65 20 77 68 6f 6c 65 20 63 6c 61 75 73 65 20 61  e whole clause a
3690: 6e 64 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 75  nd for.** the su
36a0: 62 63 6c 61 75 73 65 73 20 22 28 62 20 41 4e 44  bclauses "(b AND
36b0: 20 63 29 22 20 61 6e 64 20 22 28 64 20 41 4e 44   c)" and "(d AND
36c0: 20 65 29 22 2e 20 20 54 68 65 20 70 4f 75 74 65   e)".  The pOute
36d0: 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65 0a 2a  r field of the.*
36e0: 2a 20 73 75 62 63 6c 61 75 73 65 73 20 70 6f 69  * subclauses poi
36f0: 6e 74 73 20 74 6f 20 74 68 65 20 57 68 65 72 65  nts to the Where
3700: 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 20 66 6f  Clause object fo
3710: 72 20 74 68 65 20 77 68 6f 6c 65 20 63 6c 61 75  r the whole clau
3720: 73 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68  se..*/.struct Wh
3730: 65 72 65 43 6c 61 75 73 65 20 7b 0a 20 20 57 68  ereClause {.  Wh
3740: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
3750: 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20         /* WHERE 
3760: 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
3770: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
3780: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 75 74  hereClause *pOut
3790: 65 72 3b 20 20 20 20 20 2f 2a 20 4f 75 74 65 72  er;     /* Outer
37a0: 20 63 6f 6e 6a 75 6e 63 74 69 6f 6e 20 2a 2f 0a   conjunction */.
37b0: 20 20 75 38 20 6f 70 3b 20 20 20 20 20 20 20 20    u8 op;        
37c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
37d0: 6c 69 74 20 6f 70 65 72 61 74 6f 72 2e 20 20 54  lit operator.  T
37e0: 4b 5f 41 4e 44 20 6f 72 20 54 4b 5f 4f 52 20 2a  K_AND or TK_OR *
37f0: 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20 20  /.  int nTerm;  
3800: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3810: 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20  Number of terms 
3820: 2a 2f 0a 20 20 69 6e 74 20 6e 53 6c 6f 74 3b 20  */.  int nSlot; 
3830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3840: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
3850: 65 73 20 69 6e 20 61 5b 5d 20 2a 2f 0a 20 20 57  es in a[] */.  W
3860: 68 65 72 65 54 65 72 6d 20 2a 61 3b 20 20 20 20  hereTerm *a;    
3870: 20 20 20 20 20 20 20 20 2f 2a 20 45 61 63 68 20          /* Each 
3880: 61 5b 5d 20 64 65 73 63 72 69 62 65 73 20 61 20  a[] describes a 
3890: 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52  term of the WHER
38a0: 45 20 63 6c 75 61 73 65 20 2a 2f 0a 23 69 66 20  E cluase */.#if 
38b0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 53  defined(SQLITE_S
38c0: 4d 41 4c 4c 5f 53 54 41 43 4b 29 0a 20 20 57 68  MALL_STACK).  Wh
38d0: 65 72 65 54 65 72 6d 20 61 53 74 61 74 69 63 5b  ereTerm aStatic[
38e0: 31 5d 3b 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  1];    /* Initia
38f0: 6c 20 73 74 61 74 69 63 20 73 70 61 63 65 20 66  l static space f
3900: 6f 72 20 61 5b 5d 20 2a 2f 0a 23 65 6c 73 65 0a  or a[] */.#else.
3910: 20 20 57 68 65 72 65 54 65 72 6d 20 61 53 74 61    WhereTerm aSta
3920: 74 69 63 5b 38 5d 3b 20 20 20 20 2f 2a 20 49 6e  tic[8];    /* In
3930: 69 74 69 61 6c 20 73 74 61 74 69 63 20 73 70 61  itial static spa
3940: 63 65 20 66 6f 72 20 61 5b 5d 20 2a 2f 0a 23 65  ce for a[] */.#e
3950: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ndif.};../*.** A
3960: 20 57 68 65 72 65 54 65 72 6d 20 77 69 74 68 20   WhereTerm with 
3970: 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f 52  eOperator==WO_OR
3980: 20 68 61 73 20 69 74 73 20 75 2e 70 4f 72 49 6e   has its u.pOrIn
3990: 66 6f 20 70 6f 69 6e 74 65 72 20 73 65 74 20 74  fo pointer set t
39a0: 6f 0a 2a 2a 20 61 20 64 79 6e 61 6d 69 63 61 6c  o.** a dynamical
39b0: 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 73  ly allocated ins
39c0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
39d0: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
39e0: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72  ..*/.struct Wher
39f0: 65 4f 72 49 6e 66 6f 20 7b 0a 20 20 57 68 65 72  eOrInfo {.  Wher
3a00: 65 43 6c 61 75 73 65 20 77 63 3b 20 20 20 20 20  eClause wc;     
3a10: 20 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73       /* Decompos
3a20: 69 74 69 6f 6e 20 69 6e 74 6f 20 73 75 62 74 65  ition into subte
3a30: 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  rms */.  Bitmask
3a40: 20 69 6e 64 65 78 61 62 6c 65 3b 20 20 20 20 20   indexable;     
3a50: 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20    /* Bitmask of 
3a60: 61 6c 6c 20 69 6e 64 65 78 61 62 6c 65 20 74 61  all indexable ta
3a70: 62 6c 65 73 20 69 6e 20 74 68 65 20 63 6c 61 75  bles in the clau
3a80: 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  se */.};../*.** 
3a90: 41 20 57 68 65 72 65 54 65 72 6d 20 77 69 74 68  A WhereTerm with
3aa0: 20 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 41   eOperator==WO_A
3ab0: 4e 44 20 68 61 73 20 69 74 73 20 75 2e 70 41 6e  ND has its u.pAn
3ac0: 64 49 6e 66 6f 20 70 6f 69 6e 74 65 72 20 73 65  dInfo pointer se
3ad0: 74 20 74 6f 0a 2a 2a 20 61 20 64 79 6e 61 6d 69  t to.** a dynami
3ae0: 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  cally allocated 
3af0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
3b00: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
3b10: 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57  ure..*/.struct W
3b20: 68 65 72 65 41 6e 64 49 6e 66 6f 20 7b 0a 20 20  hereAndInfo {.  
3b30: 57 68 65 72 65 43 6c 61 75 73 65 20 77 63 3b 20  WhereClause wc; 
3b40: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
3b50: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 62 72  subexpression br
3b60: 6f 6b 65 6e 20 6f 75 74 20 2a 2f 0a 7d 3b 0a 0a  oken out */.};..
3b70: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
3b80: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
3b90: 6e 67 20 73 74 72 75 63 74 75 72 65 20 6b 65 65  ng structure kee
3ba0: 70 73 20 74 72 61 63 6b 20 6f 66 20 61 20 6d 61  ps track of a ma
3bb0: 70 70 69 6e 67 0a 2a 2a 20 62 65 74 77 65 65 6e  pping.** between
3bc0: 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
3bd0: 62 65 72 73 20 61 6e 64 20 62 69 74 73 20 6f 66  bers and bits of
3be0: 20 74 68 65 20 62 69 74 6d 61 73 6b 73 20 69 6e   the bitmasks in
3bf0: 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a   WhereTerm..**.*
3c00: 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f  * The VDBE curso
3c10: 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20 73 6d  r numbers are sm
3c20: 61 6c 6c 20 69 6e 74 65 67 65 72 73 20 63 6f 6e  all integers con
3c30: 74 61 69 6e 65 64 20 69 6e 20 0a 2a 2a 20 53 72  tained in .** Sr
3c40: 63 4c 69 73 74 5f 69 74 65 6d 2e 69 43 75 72 73  cList_item.iCurs
3c50: 6f 72 20 61 6e 64 20 45 78 70 72 2e 69 54 61 62  or and Expr.iTab
3c60: 6c 65 20 66 69 65 6c 64 73 2e 20 20 46 6f 72 20  le fields.  For 
3c70: 61 6e 79 20 67 69 76 65 6e 20 57 48 45 52 45 20  any given WHERE 
3c80: 0a 2a 2a 20 63 6c 61 75 73 65 2c 20 74 68 65 20  .** clause, the 
3c90: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 6d  cursor numbers m
3ca0: 69 67 68 74 20 6e 6f 74 20 62 65 67 69 6e 20 77  ight not begin w
3cb0: 69 74 68 20 30 20 61 6e 64 20 74 68 65 79 20 6d  ith 0 and they m
3cc0: 69 67 68 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20  ight.** contain 
3cd0: 67 61 70 73 20 69 6e 20 74 68 65 20 6e 75 6d 62  gaps in the numb
3ce0: 65 72 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 20  ering sequence. 
3cf0: 20 42 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20   But we want to 
3d00: 6d 61 6b 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20  make maximum.** 
3d10: 75 73 65 20 6f 66 20 74 68 65 20 62 69 74 73 20  use of the bits 
3d20: 69 6e 20 6f 75 72 20 62 69 74 6d 61 73 6b 73 2e  in our bitmasks.
3d30: 20 20 54 68 69 73 20 73 74 72 75 63 74 75 72 65    This structure
3d40: 20 70 72 6f 76 69 64 65 73 20 61 20 6d 61 70 70   provides a mapp
3d50: 69 6e 67 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  ing.** from the 
3d60: 73 70 61 72 73 65 20 63 75 72 73 6f 72 20 6e 75  sparse cursor nu
3d70: 6d 62 65 72 73 20 69 6e 74 6f 20 63 6f 6e 73 65  mbers into conse
3d80: 63 75 74 69 76 65 20 69 6e 74 65 67 65 72 73 20  cutive integers 
3d90: 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 77 69 74  beginning.** wit
3da0: 68 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 57 68  h 0..**.** If Wh
3db0: 65 72 65 4d 61 73 6b 53 65 74 2e 69 78 5b 41 5d  ereMaskSet.ix[A]
3dc0: 3d 3d 42 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ==B it means tha
3dd0: 74 20 54 68 65 20 41 2d 74 68 20 62 69 74 20 6f  t The A-th bit o
3de0: 66 20 61 20 42 69 74 6d 61 73 6b 0a 2a 2a 20 63  f a Bitmask.** c
3df0: 6f 72 72 65 73 70 6f 6e 64 73 20 56 44 42 45 20  orresponds VDBE 
3e00: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 42 2e  cursor number B.
3e10: 20 20 54 68 65 20 41 2d 74 68 20 62 69 74 20 6f    The A-th bit o
3e20: 66 20 61 20 62 69 74 6d 61 73 6b 20 69 73 20 31  f a bitmask is 1
3e30: 3c 3c 41 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65  <<A..**.** For e
3e40: 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 57  xample, if the W
3e50: 48 45 52 45 20 63 6c 61 75 73 65 20 65 78 70 72  HERE clause expr
3e60: 65 73 73 69 6f 6e 20 75 73 65 64 20 74 68 65 73  ession used thes
3e70: 65 20 56 44 42 45 0a 2a 2a 20 63 75 72 73 6f 72  e VDBE.** cursor
3e80: 73 3a 20 20 34 2c 20 35 2c 20 38 2c 20 32 39 2c  s:  4, 5, 8, 29,
3e90: 20 35 37 2c 20 37 33 2e 20 20 54 68 65 6e 20 74   57, 73.  Then t
3ea0: 68 65 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74  he  WhereMaskSet
3eb0: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 77 6f   structure.** wo
3ec0: 75 6c 64 20 6d 61 70 20 74 68 6f 73 65 20 63 75  uld map those cu
3ed0: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e 74  rsor numbers int
3ee0: 6f 20 62 69 74 73 20 30 20 74 68 72 6f 75 67 68  o bits 0 through
3ef0: 20 35 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74   5..**.** Note t
3f00: 68 61 74 20 74 68 65 20 6d 61 70 70 69 6e 67 20  hat the mapping 
3f10: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69  is not necessari
3f20: 6c 79 20 6f 72 64 65 72 65 64 2e 20 20 49 6e 20  ly ordered.  In 
3f30: 74 68 65 20 65 78 61 6d 70 6c 65 0a 2a 2a 20 61  the example.** a
3f40: 62 6f 76 65 2c 20 74 68 65 20 6d 61 70 70 69 6e  bove, the mappin
3f50: 67 20 6d 69 67 68 74 20 67 6f 20 6c 69 6b 65 20  g might go like 
3f60: 74 68 69 73 3a 20 20 34 2d 3e 33 2c 20 35 2d 3e  this:  4->3, 5->
3f70: 31 2c 20 38 2d 3e 32 2c 20 32 39 2d 3e 30 2c 0a  1, 8->2, 29->0,.
3f80: 2a 2a 20 35 37 2d 3e 35 2c 20 37 33 2d 3e 34 2e  ** 57->5, 73->4.
3f90: 20 20 4f 72 20 6f 6e 65 20 6f 66 20 37 31 39 20    Or one of 719 
3fa0: 6f 74 68 65 72 20 63 6f 6d 62 69 6e 61 74 69 6f  other combinatio
3fb0: 6e 73 20 6d 69 67 68 74 20 62 65 20 75 73 65 64  ns might be used
3fc0: 2e 20 49 74 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74  . It.** does not
3fd0: 20 72 65 61 6c 6c 79 20 6d 61 74 74 65 72 2e 20   really matter. 
3fe0: 20 57 68 61 74 20 69 73 20 69 6d 70 6f 72 74 61   What is importa
3ff0: 6e 74 20 69 73 20 74 68 61 74 20 73 70 61 72 73  nt is that spars
4000: 65 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62  e cursor.** numb
4010: 65 72 73 20 61 6c 6c 20 67 65 74 20 6d 61 70 70  ers all get mapp
4020: 65 64 20 69 6e 74 6f 20 62 69 74 20 6e 75 6d 62  ed into bit numb
4030: 65 72 73 20 74 68 61 74 20 62 65 67 69 6e 20 77  ers that begin w
4040: 69 74 68 20 30 20 61 6e 64 20 63 6f 6e 74 61 69  ith 0 and contai
4050: 6e 0a 2a 2a 20 6e 6f 20 67 61 70 73 2e 0a 2a 2f  n.** no gaps..*/
4060: 0a 73 74 72 75 63 74 20 57 68 65 72 65 4d 61 73  .struct WhereMas
4070: 6b 53 65 74 20 7b 0a 20 20 69 6e 74 20 6e 3b 20  kSet {.  int n; 
4080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4090: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
40a0: 20 6f 66 20 61 73 73 69 67 6e 65 64 20 63 75 72   of assigned cur
40b0: 73 6f 72 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  sor values */.  
40c0: 69 6e 74 20 69 78 5b 42 4d 53 5d 3b 20 20 20 20  int ix[BMS];    
40d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
40e0: 20 43 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64   Cursor assigned
40f0: 20 74 6f 20 65 61 63 68 20 62 69 74 20 2a 2f 0a   to each bit */.
4100: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6f  };../*.** This o
4110: 62 6a 65 63 74 20 69 73 20 61 20 63 6f 6e 76 65  bject is a conve
4120: 6e 69 65 6e 63 65 20 77 72 61 70 70 65 72 20 68  nience wrapper h
4130: 6f 6c 64 69 6e 67 20 61 6c 6c 20 69 6e 66 6f 72  olding all infor
4140: 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64 0a 2a 2a  mation needed.**
4150: 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 57 68   to construct Wh
4160: 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
4170: 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61 72  for a particular
4180: 20 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 72 75 63   query..*/.struc
4190: 74 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64  t WhereLoopBuild
41a0: 65 72 20 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  er {.  WhereInfo
41b0: 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20   *pWInfo;       
41c0: 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20   /* Information 
41d0: 61 62 6f 75 74 20 74 68 69 73 20 57 48 45 52 45  about this WHERE
41e0: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
41f0: 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20  e *pWC;         
4200: 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  /* WHERE clause 
4210: 74 65 72 6d 73 20 2a 2f 0a 20 20 45 78 70 72 4c  terms */.  ExprL
4220: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20  ist *pOrderBy;  
4230: 20 20 20 20 20 2f 2a 20 4f 52 44 45 52 20 42 59       /* ORDER BY
4240: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65   clause */.  Whe
4250: 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20  reLoop *pNew;   
4260: 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61         /* Templa
4270: 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a  te WhereLoop */.
4280: 20 20 57 68 65 72 65 4f 72 53 65 74 20 2a 70 4f    WhereOrSet *pO
4290: 72 53 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52  rSet;       /* R
42a0: 65 63 6f 72 64 20 62 65 73 74 20 6c 6f 6f 70 73  ecord best loops
42b0: 20 68 65 72 65 2c 20 69 66 20 6e 6f 74 20 4e 55   here, if not NU
42c0: 4c 4c 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  LL */.#ifdef SQL
42d0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
42e0: 5f 4f 52 5f 53 54 41 54 34 0a 20 20 55 6e 70 61  _OR_STAT4.  Unpa
42f0: 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 52 65 63  ckedRecord *pRec
4300: 3b 20 20 20 20 20 2f 2a 20 50 72 6f 62 65 20 66  ;     /* Probe f
4310: 6f 72 20 73 74 61 74 34 20 28 69 66 20 72 65 71  or stat4 (if req
4320: 75 69 72 65 64 29 20 2a 2f 0a 20 20 69 6e 74 20  uired) */.  int 
4330: 6e 52 65 63 56 61 6c 69 64 3b 20 20 20 20 20 20  nRecValid;      
4340: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4350: 6f 66 20 76 61 6c 69 64 20 66 69 65 6c 64 73 20  of valid fields 
4360: 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 52 65  currently in pRe
4370: 63 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  c */.#endif.};..
4380: 2f 2a 0a 2a 2a 20 54 68 65 20 57 48 45 52 45 20  /*.** The WHERE 
4390: 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
43a0: 67 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74 77  g routine has tw
43b0: 6f 20 68 61 6c 76 65 73 2e 20 20 54 68 65 0a 2a  o halves.  The.*
43c0: 2a 20 66 69 72 73 74 20 70 61 72 74 20 64 6f 65  * first part doe
43d0: 73 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  s the start of t
43e0: 68 65 20 57 48 45 52 45 20 6c 6f 6f 70 20 61 6e  he WHERE loop an
43f0: 64 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20  d the second.** 
4400: 68 61 6c 66 20 64 6f 65 73 20 74 68 65 20 74 61  half does the ta
4410: 69 6c 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  il of the WHERE 
4420: 6c 6f 6f 70 2e 20 20 41 6e 20 69 6e 73 74 61 6e  loop.  An instan
4430: 63 65 20 6f 66 0a 2a 2a 20 74 68 69 73 20 73 74  ce of.** this st
4440: 72 75 63 74 75 72 65 20 69 73 20 72 65 74 75 72  ructure is retur
4450: 6e 65 64 20 62 79 20 74 68 65 20 66 69 72 73 74  ned by the first
4460: 20 68 61 6c 66 20 61 6e 64 20 70 61 73 73 65 64   half and passed
4470: 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 73 65 63  .** into the sec
4480: 6f 6e 64 20 68 61 6c 66 20 74 6f 20 67 69 76 65  ond half to give
4490: 20 73 6f 6d 65 20 63 6f 6e 74 69 6e 75 69 74 79   some continuity
44a0: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ..**.** An insta
44b0: 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65  nce of this obje
44c0: 63 74 20 68 6f 6c 64 73 20 74 68 65 20 63 6f 6d  ct holds the com
44d0: 70 6c 65 74 65 20 73 74 61 74 65 20 6f 66 20 74  plete state of t
44e0: 68 65 20 71 75 65 72 79 0a 2a 2a 20 70 6c 61 6e  he query.** plan
44f0: 6e 65 72 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57  ner..*/.struct W
4500: 68 65 72 65 49 6e 66 6f 20 7b 0a 20 20 50 61 72  hereInfo {.  Par
4510: 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20  se *pParse;     
4520: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
4530: 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
4540: 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
4550: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
4560: 4c 69 73 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  List;        /* 
4570: 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69  List of tables i
4580: 6e 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20  n the join */.  
4590: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
45a0: 42 79 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  By;       /* The
45b0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
45c0: 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   or NULL */.  Ex
45d0: 70 72 4c 69 73 74 20 2a 70 52 65 73 75 6c 74 53  prList *pResultS
45e0: 65 74 3b 20 20 20 20 20 2f 2a 20 52 65 73 75 6c  et;     /* Resul
45f0: 74 20 73 65 74 2e 20 44 49 53 54 49 4e 43 54 20  t set. DISTINCT 
4600: 6f 70 65 72 61 74 65 73 20 6f 6e 20 74 68 65 73  operates on thes
4610: 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  e */.  WhereLoop
4620: 20 2a 70 4c 6f 6f 70 73 3b 20 20 20 20 20 20 20   *pLoops;       
4630: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20   /* List of all 
4640: 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
4650: 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 72  s */.  Bitmask r
4660: 65 76 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  evMask;         
4670: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f 52 44 45   /* Mask of ORDE
4680: 52 20 42 59 20 74 65 72 6d 73 20 74 68 61 74 20  R BY terms that 
4690: 6e 65 65 64 20 72 65 76 65 72 73 69 6e 67 20 2a  need reversing *
46a0: 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 52 6f 77 4f  /.  LogEst nRowO
46b0: 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ut;           /*
46c0: 20 45 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65   Estimated numbe
46d0: 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73  r of output rows
46e0: 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46   */.  u16 wctrlF
46f0: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
4700: 2f 2a 20 46 6c 61 67 73 20 6f 72 69 67 69 6e 61  /* Flags origina
4710: 6c 6c 79 20 70 61 73 73 65 64 20 74 6f 20 73 71  lly passed to sq
4720: 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
4730: 29 20 2a 2f 0a 20 20 75 38 20 62 4f 42 53 61 74  ) */.  u8 bOBSat
4740: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4750: 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 73 61 74   /* ORDER BY sat
4760: 69 73 66 69 65 64 20 62 79 20 69 6e 64 69 63 65  isfied by indice
4770: 73 20 2a 2f 0a 20 20 75 38 20 6f 6b 4f 6e 65 50  s */.  u8 okOneP
4780: 61 73 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ass;            
4790: 20 2f 2a 20 4f 6b 20 74 6f 20 75 73 65 20 6f 6e   /* Ok to use on
47a0: 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68 6d  e-pass algorithm
47b0: 20 66 6f 72 20 55 50 44 41 54 45 2f 44 45 4c 45   for UPDATE/DELE
47c0: 54 45 20 2a 2f 0a 20 20 75 38 20 75 6e 74 65 73  TE */.  u8 untes
47d0: 74 65 64 54 65 72 6d 73 3b 20 20 20 20 20 20 20  tedTerms;       
47e0: 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 20 57 48 45    /* Not all WHE
47f0: 52 45 20 74 65 72 6d 73 20 72 65 73 6f 6c 76 65  RE terms resolve
4800: 64 20 62 79 20 6f 75 74 65 72 20 6c 6f 6f 70 20  d by outer loop 
4810: 2a 2f 0a 20 20 75 38 20 65 44 69 73 74 69 6e 63  */.  u8 eDistinc
4820: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
4830: 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48 45  * One of the WHE
4840: 52 45 5f 44 49 53 54 49 4e 43 54 5f 2a 20 76 61  RE_DISTINCT_* va
4850: 6c 75 65 73 20 62 65 6c 6f 77 20 2a 2f 0a 20 20  lues below */.  
4860: 75 38 20 6e 4c 65 76 65 6c 3b 20 20 20 20 20 20  u8 nLevel;      
4870: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4880: 62 65 72 20 6f 66 20 6e 65 73 74 65 64 20 6c 6f  ber of nested lo
4890: 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 69 54 6f 70  op */.  int iTop
48a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
48b0: 20 20 2f 2a 20 54 68 65 20 76 65 72 79 20 62 65    /* The very be
48c0: 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 57  ginning of the W
48d0: 48 45 52 45 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69  HERE loop */.  i
48e0: 6e 74 20 69 43 6f 6e 74 69 6e 75 65 3b 20 20 20  nt iContinue;   
48f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
4900: 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75   here to continu
4910: 65 20 77 69 74 68 20 6e 65 78 74 20 72 65 63 6f  e with next reco
4920: 72 64 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65  rd */.  int iBre
4930: 61 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ak;             
4940: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
4950: 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74  o break out of t
4960: 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  he loop */.  int
4970: 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70   savedNQueryLoop
4980: 3b 20 20 20 20 20 20 2f 2a 20 70 50 61 72 73 65  ;      /* pParse
4990: 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 6f 75 74  ->nQueryLoop out
49a0: 73 69 64 65 20 74 68 65 20 57 48 45 52 45 20 6c  side the WHERE l
49b0: 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61  oop */.  WhereMa
49c0: 73 6b 53 65 74 20 73 4d 61 73 6b 53 65 74 3b 20  skSet sMaskSet; 
49d0: 20 20 20 2f 2a 20 4d 61 70 20 63 75 72 73 6f 72     /* Map cursor
49e0: 20 6e 75 6d 62 65 72 73 20 74 6f 20 62 69 74 6d   numbers to bitm
49f0: 61 73 6b 73 20 2a 2f 0a 20 20 57 68 65 72 65 43  asks */.  WhereC
4a00: 6c 61 75 73 65 20 73 57 43 3b 20 20 20 20 20 20  lause sWC;      
4a10: 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69      /* Decomposi
4a20: 74 69 6f 6e 20 6f 66 20 74 68 65 20 57 48 45 52  tion of the WHER
4a30: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  E clause */.  Wh
4a40: 65 72 65 4c 65 76 65 6c 20 61 5b 31 5d 3b 20 20  ereLevel a[1];  
4a50: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72          /* Infor
4a60: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 65 61 63  mation about eac
4a70: 68 20 6e 65 73 74 20 6c 6f 6f 70 20 69 6e 20 57  h nest loop in W
4a80: 48 45 52 45 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  HERE */.};../*.*
4a90: 2a 20 42 69 74 6d 61 73 6b 73 20 66 6f 72 20 74  * Bitmasks for t
4aa0: 68 65 20 6f 70 65 72 61 74 6f 72 73 20 6f 6e 20  he operators on 
4ab0: 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63 74  WhereTerm object
4ac0: 73 2e 20 20 54 68 65 73 65 20 61 72 65 20 61 6c  s.  These are al
4ad0: 6c 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20 74  l.** operators t
4ae0: 68 61 74 20 61 72 65 20 6f 66 20 69 6e 74 65 72  hat are of inter
4af0: 65 73 74 20 74 6f 20 74 68 65 20 71 75 65 72 79  est to the query
4b00: 20 70 6c 61 6e 6e 65 72 2e 20 20 41 6e 0a 2a 2a   planner.  An.**
4b10: 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69   OR-ed combinati
4b20: 6f 6e 20 6f 66 20 74 68 65 73 65 20 76 61 6c 75  on of these valu
4b30: 65 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 77  es can be used w
4b40: 68 65 6e 20 73 65 61 72 63 68 69 6e 67 20 66 6f  hen searching fo
4b50: 72 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61 72 20  r.** particular 
4b60: 57 68 65 72 65 54 65 72 6d 73 20 77 69 74 68 69  WhereTerms withi
4b70: 6e 20 61 20 57 68 65 72 65 43 6c 61 75 73 65 2e  n a WhereClause.
4b80: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f 49  .*/.#define WO_I
4b90: 4e 20 20 20 20 20 30 78 30 30 31 0a 23 64 65 66  N     0x001.#def
4ba0: 69 6e 65 20 57 4f 5f 45 51 20 20 20 20 20 30 78  ine WO_EQ     0x
4bb0: 30 30 32 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4c  002.#define WO_L
4bc0: 54 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54  T     (WO_EQ<<(T
4bd0: 4b 5f 4c 54 2d 54 4b 5f 45 51 29 29 0a 23 64 65  K_LT-TK_EQ)).#de
4be0: 66 69 6e 65 20 57 4f 5f 4c 45 20 20 20 20 20 28  fine WO_LE     (
4bf0: 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c 45 2d 54 4b  WO_EQ<<(TK_LE-TK
4c00: 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20 57 4f  _EQ)).#define WO
4c10: 5f 47 54 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c  _GT     (WO_EQ<<
4c20: 28 54 4b 5f 47 54 2d 54 4b 5f 45 51 29 29 0a 23  (TK_GT-TK_EQ)).#
4c30: 64 65 66 69 6e 65 20 57 4f 5f 47 45 20 20 20 20  define WO_GE    
4c40: 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47 45 2d   (WO_EQ<<(TK_GE-
4c50: 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20  TK_EQ)).#define 
4c60: 57 4f 5f 4d 41 54 43 48 20 20 30 78 30 34 30 0a  WO_MATCH  0x040.
4c70: 23 64 65 66 69 6e 65 20 57 4f 5f 49 53 4e 55 4c  #define WO_ISNUL
4c80: 4c 20 30 78 30 38 30 0a 23 64 65 66 69 6e 65 20  L 0x080.#define 
4c90: 57 4f 5f 4f 52 20 20 20 20 20 30 78 31 30 30 20  WO_OR     0x100 
4ca0: 20 20 20 20 20 20 2f 2a 20 54 77 6f 20 6f 72 20        /* Two or 
4cb0: 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65  more OR-connecte
4cc0: 64 20 74 65 72 6d 73 20 2a 2f 0a 23 64 65 66 69  d terms */.#defi
4cd0: 6e 65 20 57 4f 5f 41 4e 44 20 20 20 20 30 78 32  ne WO_AND    0x2
4ce0: 30 30 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20  00       /* Two 
4cf0: 6f 72 20 6d 6f 72 65 20 41 4e 44 2d 63 6f 6e 6e  or more AND-conn
4d00: 65 63 74 65 64 20 74 65 72 6d 73 20 2a 2f 0a 23  ected terms */.#
4d10: 64 65 66 69 6e 65 20 57 4f 5f 45 51 55 49 56 20  define WO_EQUIV 
4d20: 20 30 78 34 30 30 20 20 20 20 20 20 20 2f 2a 20   0x400       /* 
4d30: 4f 66 20 74 68 65 20 66 6f 72 6d 20 41 3d 3d 42  Of the form A==B
4d40: 2c 20 62 6f 74 68 20 63 6f 6c 75 6d 6e 73 20 2a  , both columns *
4d50: 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4e 4f 4f  /.#define WO_NOO
4d60: 50 20 20 20 30 78 38 30 30 20 20 20 20 20 20 20  P   0x800       
4d70: 2f 2a 20 54 68 69 73 20 74 65 72 6d 20 64 6f 65  /* This term doe
4d80: 73 20 6e 6f 74 20 72 65 73 74 72 69 63 74 20 73  s not restrict s
4d90: 65 61 72 63 68 20 73 70 61 63 65 20 2a 2f 0a 0a  earch space */..
4da0: 23 64 65 66 69 6e 65 20 57 4f 5f 41 4c 4c 20 20  #define WO_ALL  
4db0: 20 20 30 78 66 66 66 20 20 20 20 20 20 20 2f 2a    0xfff       /*
4dc0: 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 70 6f 73   Mask of all pos
4dd0: 73 69 62 6c 65 20 57 4f 5f 2a 20 76 61 6c 75 65  sible WO_* value
4de0: 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f  s */.#define WO_
4df0: 53 49 4e 47 4c 45 20 30 78 30 66 66 20 20 20 20  SINGLE 0x0ff    
4e00: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c     /* Mask of al
4e10: 6c 20 6e 6f 6e 2d 63 6f 6d 70 6f 75 6e 64 20 57  l non-compound W
4e20: 4f 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 0a 2f  O_* values */../
4e30: 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20 64  *.** These are d
4e40: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 62 69  efinitions of bi
4e50: 74 73 20 69 6e 20 74 68 65 20 57 68 65 72 65 4c  ts in the WhereL
4e60: 6f 6f 70 2e 77 73 46 6c 61 67 73 20 66 69 65 6c  oop.wsFlags fiel
4e70: 64 2e 0a 2a 2a 20 54 68 65 20 70 61 72 74 69 63  d..** The partic
4e80: 75 6c 61 72 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  ular combination
4e90: 20 6f 66 20 62 69 74 73 20 69 6e 20 65 61 63 68   of bits in each
4ea0: 20 57 68 65 72 65 4c 6f 6f 70 20 68 65 6c 70 20   WhereLoop help 
4eb0: 74 6f 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 20  to.** determine 
4ec0: 74 68 65 20 61 6c 67 6f 72 69 74 68 6d 20 74 68  the algorithm th
4ed0: 61 74 20 57 68 65 72 65 4c 6f 6f 70 20 72 65 70  at WhereLoop rep
4ee0: 72 65 73 65 6e 74 73 2e 0a 2a 2f 0a 23 64 65 66  resents..*/.#def
4ef0: 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  ine WHERE_COLUMN
4f00: 5f 45 51 20 20 20 20 30 78 30 30 30 30 30 30 30  _EQ    0x0000000
4f10: 31 20 20 2f 2a 20 78 3d 45 58 50 52 20 2a 2f 0a  1  /* x=EXPR */.
4f20: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43 4f  #define WHERE_CO
4f30: 4c 55 4d 4e 5f 52 41 4e 47 45 20 30 78 30 30 30  LUMN_RANGE 0x000
4f40: 30 30 30 30 32 20 20 2f 2a 20 78 3c 45 58 50 52  00002  /* x<EXPR
4f50: 20 61 6e 64 2f 6f 72 20 78 3e 45 58 50 52 20 2a   and/or x>EXPR *
4f60: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
4f70: 43 4f 4c 55 4d 4e 5f 49 4e 20 20 20 20 30 78 30  COLUMN_IN    0x0
4f80: 30 30 30 30 30 30 34 20 20 2f 2a 20 78 20 49 4e  0000004  /* x IN
4f90: 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66 69 6e   (...) */.#defin
4fa0: 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e  e WHERE_COLUMN_N
4fb0: 55 4c 4c 20 20 30 78 30 30 30 30 30 30 30 38 20  ULL  0x00000008 
4fc0: 20 2f 2a 20 78 20 49 53 20 4e 55 4c 4c 20 2a 2f   /* x IS NULL */
4fd0: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43  .#define WHERE_C
4fe0: 4f 4e 53 54 52 41 49 4e 54 20 20 20 30 78 30 30  ONSTRAINT   0x00
4ff0: 30 30 30 30 30 66 20 20 2f 2a 20 41 6e 79 20 6f  00000f  /* Any o
5000: 66 20 74 68 65 20 57 48 45 52 45 5f 43 4f 4c 55  f the WHERE_COLU
5010: 4d 4e 5f 78 78 78 20 76 61 6c 75 65 73 20 2a 2f  MN_xxx values */
5020: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 54  .#define WHERE_T
5030: 4f 50 5f 4c 49 4d 49 54 20 20 20 20 30 78 30 30  OP_LIMIT    0x00
5040: 30 30 30 30 31 30 20 20 2f 2a 20 78 3c 45 58 50  000010  /* x<EXP
5050: 52 20 6f 72 20 78 3c 3d 45 58 50 52 20 63 6f 6e  R or x<=EXPR con
5060: 73 74 72 61 69 6e 74 20 2a 2f 0a 23 64 65 66 69  straint */.#defi
5070: 6e 65 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d  ne WHERE_BTM_LIM
5080: 49 54 20 20 20 20 30 78 30 30 30 30 30 30 32 30  IT    0x00000020
5090: 20 20 2f 2a 20 78 3e 45 58 50 52 20 6f 72 20 78    /* x>EXPR or x
50a0: 3e 3d 45 58 50 52 20 63 6f 6e 73 74 72 61 69 6e  >=EXPR constrain
50b0: 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  t */.#define WHE
50c0: 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 20 20 20  RE_BOTH_LIMIT   
50d0: 30 78 30 30 30 30 30 30 33 30 20 20 2f 2a 20 42  0x00000030  /* B
50e0: 6f 74 68 20 78 3e 45 58 50 52 20 61 6e 64 20 78  oth x>EXPR and x
50f0: 3c 45 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65  <EXPR */.#define
5100: 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20   WHERE_IDX_ONLY 
5110: 20 20 20 20 30 78 30 30 30 30 30 30 34 30 20 20      0x00000040  
5120: 2f 2a 20 55 73 65 20 69 6e 64 65 78 20 6f 6e 6c  /* Use index onl
5130: 79 20 2d 20 6f 6d 69 74 20 74 61 62 6c 65 20 2a  y - omit table *
5140: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
5150: 49 50 4b 20 20 20 20 20 20 20 20 20 20 30 78 30  IPK          0x0
5160: 30 30 30 30 31 30 30 20 20 2f 2a 20 78 20 69 73  0000100  /* x is
5170: 20 74 68 65 20 49 4e 54 45 47 45 52 20 50 52 49   the INTEGER PRI
5180: 4d 41 52 59 20 4b 45 59 20 2a 2f 0a 23 64 65 66  MARY KEY */.#def
5190: 69 6e 65 20 57 48 45 52 45 5f 49 4e 44 45 58 45  ine WHERE_INDEXE
51a0: 44 20 20 20 20 20 20 30 78 30 30 30 30 30 32 30  D      0x0000020
51b0: 30 20 20 2f 2a 20 57 68 65 72 65 4c 6f 6f 70 2e  0  /* WhereLoop.
51c0: 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 69  u.btree.pIndex i
51d0: 73 20 76 61 6c 69 64 20 2a 2f 0a 23 64 65 66 69  s valid */.#defi
51e0: 6e 65 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c  ne WHERE_VIRTUAL
51f0: 54 41 42 4c 45 20 30 78 30 30 30 30 30 34 30 30  TABLE 0x00000400
5200: 20 20 2f 2a 20 57 68 65 72 65 4c 6f 6f 70 2e 75    /* WhereLoop.u
5210: 2e 76 74 61 62 20 69 73 20 76 61 6c 69 64 20 2a  .vtab is valid *
5220: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
5230: 49 4e 5f 41 42 4c 45 20 20 20 20 20 20 30 78 30  IN_ABLE      0x0
5240: 30 30 30 30 38 30 30 20 20 2f 2a 20 41 62 6c 65  0000800  /* Able
5250: 20 74 6f 20 73 75 70 70 6f 72 74 20 61 6e 20 49   to support an I
5260: 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 23 64  N operator */.#d
5270: 65 66 69 6e 65 20 57 48 45 52 45 5f 4f 4e 45 52  efine WHERE_ONER
5280: 4f 57 20 20 20 20 20 20 20 30 78 30 30 30 30 31  OW       0x00001
5290: 30 30 30 20 20 2f 2a 20 53 65 6c 65 63 74 73 20  000  /* Selects 
52a0: 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  no more than one
52b0: 20 72 6f 77 20 2a 2f 0a 23 64 65 66 69 6e 65 20   row */.#define 
52c0: 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 20  WHERE_MULTI_OR  
52d0: 20 20 20 30 78 30 30 30 30 32 30 30 30 20 20 2f     0x00002000  /
52e0: 2a 20 4f 52 20 75 73 69 6e 67 20 6d 75 6c 74 69  * OR using multi
52f0: 70 6c 65 20 69 6e 64 69 63 65 73 20 2a 2f 0a 23  ple indices */.#
5300: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 41 55 54  define WHERE_AUT
5310: 4f 5f 49 4e 44 45 58 20 20 20 30 78 30 30 30 30  O_INDEX   0x0000
5320: 34 30 30 30 20 20 2f 2a 20 55 73 65 73 20 61 6e  4000  /* Uses an
5330: 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78   ephemeral index
5340: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72   */../*.** Retur
5350: 6e 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20  n the estimated 
5360: 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74  number of output
5370: 20 72 6f 77 73 20 66 72 6f 6d 20 61 20 57 48 45   rows from a WHE
5380: 52 45 20 63 6c 61 75 73 65 0a 2a 2f 0a 75 36 34  RE clause.*/.u64
5390: 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74   sqlite3WhereOut
53a0: 70 75 74 52 6f 77 43 6f 75 6e 74 28 57 68 65 72  putRowCount(Wher
53b0: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
53c0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
53d0: 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70 57 49 6e  LogEstToInt(pWIn
53e0: 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b 0a 7d 0a  fo->nRowOut);.}.
53f0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6f 6e  ./*.** Return on
5400: 65 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f 44  e of the WHERE_D
5410: 49 53 54 49 4e 43 54 5f 78 78 78 78 78 20 76 61  ISTINCT_xxxxx va
5420: 6c 75 65 73 20 74 6f 20 69 6e 64 69 63 61 74 65  lues to indicate
5430: 20 68 6f 77 20 74 68 69 73 0a 2a 2a 20 57 48 45   how this.** WHE
5440: 52 45 20 63 6c 61 75 73 65 20 72 65 74 75 72 6e  RE clause return
5450: 73 20 6f 75 74 70 75 74 73 20 66 6f 72 20 44 49  s outputs for DI
5460: 53 54 49 4e 43 54 20 70 72 6f 63 65 73 73 69 6e  STINCT processin
5470: 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
5480: 33 57 68 65 72 65 49 73 44 69 73 74 69 6e 63 74  3WhereIsDistinct
5490: 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
54a0: 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 57  fo){.  return pW
54b0: 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3b  Info->eDistinct;
54c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
54d0: 20 54 52 55 45 20 69 66 20 74 68 65 20 57 48 45   TRUE if the WHE
54e0: 52 45 20 63 6c 61 75 73 65 20 72 65 74 75 72 6e  RE clause return
54f0: 73 20 72 6f 77 73 20 69 6e 20 4f 52 44 45 52 20  s rows in ORDER 
5500: 42 59 20 6f 72 64 65 72 2e 0a 2a 2a 20 52 65 74  BY order..** Ret
5510: 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65  urn FALSE if the
5520: 20 6f 75 74 70 75 74 20 6e 65 65 64 73 20 74 6f   output needs to
5530: 20 62 65 20 73 6f 72 74 65 64 2e 0a 2a 2f 0a 69   be sorted..*/.i
5540: 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 49  nt sqlite3WhereI
5550: 73 4f 72 64 65 72 65 64 28 57 68 65 72 65 49 6e  sOrdered(WhereIn
5560: 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72  fo *pWInfo){.  r
5570: 65 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 62 4f  eturn pWInfo->bO
5580: 42 53 61 74 21 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  BSat!=0;.}../*.*
5590: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 44 42  * Return the VDB
55a0: 45 20 61 64 64 72 65 73 73 20 6f 72 20 6c 61 62  E address or lab
55b0: 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69 6e  el to jump to in
55c0: 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 74 69 6e   order to contin
55d0: 75 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  ue.** immediatel
55e0: 79 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20  y with the next 
55f0: 72 6f 77 20 6f 66 20 61 20 57 48 45 52 45 20 63  row of a WHERE c
5600: 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  lause..*/.int sq
5610: 6c 69 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e  lite3WhereContin
5620: 75 65 4c 61 62 65 6c 28 57 68 65 72 65 49 6e 66  ueLabel(WhereInf
5630: 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65  o *pWInfo){.  re
5640: 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 69 43 6f  turn pWInfo->iCo
5650: 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
5660: 20 52 65 74 75 72 6e 20 74 68 65 20 56 44 42 45   Return the VDBE
5670: 20 61 64 64 72 65 73 73 20 6f 72 20 6c 61 62 65   address or labe
5680: 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 69 6e 20  l to jump to in 
5690: 6f 72 64 65 72 20 74 6f 20 62 72 65 61 6b 0a 2a  order to break.*
56a0: 2a 20 6f 75 74 20 6f 66 20 61 20 57 48 45 52 45  * out of a WHERE
56b0: 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71   loop..*/.int sq
56c0: 6c 69 74 65 33 57 68 65 72 65 42 72 65 61 6b 4c  lite3WhereBreakL
56d0: 61 62 65 6c 28 57 68 65 72 65 49 6e 66 6f 20 2a  abel(WhereInfo *
56e0: 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72  pWInfo){.  retur
56f0: 6e 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b  n pWInfo->iBreak
5700: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
5710: 6e 20 54 52 55 45 20 69 66 20 61 6e 20 55 50 44  n TRUE if an UPD
5720: 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74  ATE or DELETE st
5730: 61 74 65 6d 65 6e 74 20 63 61 6e 20 6f 70 65 72  atement can oper
5740: 61 74 65 20 64 69 72 65 63 74 6c 79 20 6f 6e 0a  ate directly on.
5750: 2a 2a 20 74 68 65 20 72 6f 77 69 64 73 20 72 65  ** the rowids re
5760: 74 75 72 6e 65 64 20 62 79 20 61 20 57 48 45 52  turned by a WHER
5770: 45 20 63 6c 61 75 73 65 2e 20 20 52 65 74 75 72  E clause.  Retur
5780: 6e 20 46 41 4c 53 45 20 69 66 20 64 6f 69 6e 67  n FALSE if doing
5790: 20 61 6e 0a 2a 2a 20 55 50 44 41 54 45 20 6f 72   an.** UPDATE or
57a0: 20 44 45 4c 45 54 45 20 6d 69 67 68 74 20 63 68   DELETE might ch
57b0: 61 6e 67 65 20 73 75 62 73 65 71 75 65 6e 74 20  ange subsequent 
57c0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 72 65 73  WHERE clause res
57d0: 75 6c 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ults..*/.int sql
57e0: 69 74 65 33 57 68 65 72 65 4f 6b 4f 6e 65 50 61  ite3WhereOkOnePa
57f0: 73 73 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  ss(WhereInfo *pW
5800: 49 6e 66 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20  Info){.  return 
5810: 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73  pWInfo->okOnePas
5820: 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  s;.}../*.** Move
5830: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
5840: 70 53 72 63 20 69 6e 74 6f 20 70 44 65 73 74 0a  pSrc into pDest.
5850: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
5860: 68 65 72 65 4f 72 4d 6f 76 65 28 57 68 65 72 65  hereOrMove(Where
5870: 4f 72 53 65 74 20 2a 70 44 65 73 74 2c 20 57 68  OrSet *pDest, Wh
5880: 65 72 65 4f 72 53 65 74 20 2a 70 53 72 63 29 7b  ereOrSet *pSrc){
5890: 0a 20 20 70 44 65 73 74 2d 3e 6e 20 3d 20 70 53  .  pDest->n = pS
58a0: 72 63 2d 3e 6e 3b 0a 20 20 6d 65 6d 63 70 79 28  rc->n;.  memcpy(
58b0: 70 44 65 73 74 2d 3e 61 2c 20 70 53 72 63 2d 3e  pDest->a, pSrc->
58c0: 61 2c 20 70 44 65 73 74 2d 3e 6e 2a 73 69 7a 65  a, pDest->n*size
58d0: 6f 66 28 70 44 65 73 74 2d 3e 61 5b 30 5d 29 29  of(pDest->a[0]))
58e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  ;.}../*.** Try t
58f0: 6f 20 69 6e 73 65 72 74 20 61 20 6e 65 77 20 70  o insert a new p
5900: 72 65 72 65 71 75 69 73 69 74 65 2f 63 6f 73 74  rerequisite/cost
5910: 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20   entry into the 
5920: 57 68 65 72 65 4f 72 53 65 74 20 70 53 65 74 2e  WhereOrSet pSet.
5930: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 65  .**.** The new e
5940: 6e 74 72 79 20 6d 69 67 68 74 20 6f 76 65 72 77  ntry might overw
5950: 72 69 74 65 20 61 6e 20 65 78 69 73 74 69 6e 67  rite an existing
5960: 20 65 6e 74 72 79 2c 20 6f 72 20 69 74 20 6d 69   entry, or it mi
5970: 67 68 74 20 62 65 0a 2a 2a 20 61 70 70 65 6e 64  ght be.** append
5980: 65 64 2c 20 6f 72 20 69 74 20 6d 69 67 68 74 20  ed, or it might 
5990: 62 65 20 64 69 73 63 61 72 64 65 64 2e 20 20 44  be discarded.  D
59a0: 6f 20 77 68 61 74 65 76 65 72 20 69 73 20 74 68  o whatever is th
59b0: 65 20 72 69 67 68 74 20 74 68 69 6e 67 0a 2a 2a  e right thing.**
59c0: 20 73 6f 20 74 68 61 74 20 70 53 65 74 20 6b 65   so that pSet ke
59d0: 65 70 73 20 74 68 65 20 4e 5f 4f 52 5f 43 4f 53  eps the N_OR_COS
59e0: 54 20 62 65 73 74 20 65 6e 74 72 69 65 73 20 73  T best entries s
59f0: 65 65 6e 20 73 6f 20 66 61 72 2e 0a 2a 2f 0a 73  een so far..*/.s
5a00: 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4f  tatic int whereO
5a10: 72 49 6e 73 65 72 74 28 0a 20 20 57 68 65 72 65  rInsert(.  Where
5a20: 4f 72 53 65 74 20 2a 70 53 65 74 2c 20 20 20 20  OrSet *pSet,    
5a30: 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4f 72    /* The WhereOr
5a40: 53 65 74 20 74 6f 20 62 65 20 75 70 64 61 74 65  Set to be update
5a50: 64 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70  d */.  Bitmask p
5a60: 72 65 72 65 71 2c 20 20 20 20 20 20 20 20 2f 2a  rereq,        /*
5a70: 20 50 72 65 72 65 71 75 69 73 69 74 65 73 20 6f   Prerequisites o
5a80: 66 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  f the new entry 
5a90: 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 52 75 6e  */.  LogEst rRun
5aa0: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ,           /* R
5ab0: 75 6e 2d 63 6f 73 74 20 6f 66 20 74 68 65 20 6e  un-cost of the n
5ac0: 65 77 20 65 6e 74 72 79 20 2a 2f 0a 20 20 4c 6f  ew entry */.  Lo
5ad0: 67 45 73 74 20 6e 4f 75 74 20 20 20 20 20 20 20  gEst nOut       
5ae0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
5af0: 66 20 6f 75 74 70 75 74 73 20 66 6f 72 20 74 68  f outputs for th
5b00: 65 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a 29  e new entry */.)
5b10: 7b 0a 20 20 75 31 36 20 69 3b 0a 20 20 57 68 65  {.  u16 i;.  Whe
5b20: 72 65 4f 72 43 6f 73 74 20 2a 70 3b 0a 20 20 66  reOrCost *p;.  f
5b30: 6f 72 28 69 3d 70 53 65 74 2d 3e 6e 2c 20 70 3d  or(i=pSet->n, p=
5b40: 70 53 65 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d  pSet->a; i>0; i-
5b50: 2d 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28  -, p++){.    if(
5b60: 20 72 52 75 6e 3c 3d 70 2d 3e 72 52 75 6e 20 26   rRun<=p->rRun &
5b70: 26 20 28 70 72 65 72 65 71 20 26 20 70 2d 3e 70  & (prereq & p->p
5b80: 72 65 72 65 71 29 3d 3d 70 72 65 72 65 71 20 29  rereq)==prereq )
5b90: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 77 68 65  {.      goto whe
5ba0: 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f 6e 65 3b  reOrInsert_done;
5bb0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
5bc0: 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20 26 26 20  ->rRun<=rRun && 
5bd0: 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70 72 65  (p->prereq & pre
5be0: 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20  req)==p->prereq 
5bf0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
5c00: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  0;.    }.  }.  i
5c10: 66 28 20 70 53 65 74 2d 3e 6e 3c 4e 5f 4f 52 5f  f( pSet->n<N_OR_
5c20: 43 4f 53 54 20 29 7b 0a 20 20 20 20 70 20 3d 20  COST ){.    p = 
5c30: 26 70 53 65 74 2d 3e 61 5b 70 53 65 74 2d 3e 6e  &pSet->a[pSet->n
5c40: 2b 2b 5d 3b 0a 20 20 20 20 70 2d 3e 6e 4f 75 74  ++];.    p->nOut
5c50: 20 3d 20 6e 4f 75 74 3b 0a 20 20 7d 65 6c 73 65   = nOut;.  }else
5c60: 7b 0a 20 20 20 20 70 20 3d 20 70 53 65 74 2d 3e  {.    p = pSet->
5c70: 61 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  a;.    for(i=1; 
5c80: 69 3c 70 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b  i<pSet->n; i++){
5c90: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 52  .      if( p->rR
5ca0: 75 6e 3e 70 53 65 74 2d 3e 61 5b 69 5d 2e 72 52  un>pSet->a[i].rR
5cb0: 75 6e 20 29 20 70 20 3d 20 70 53 65 74 2d 3e 61  un ) p = pSet->a
5cc0: 20 2b 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20   + i;.    }.    
5cd0: 69 66 28 20 70 2d 3e 72 52 75 6e 3c 3d 72 52 75  if( p->rRun<=rRu
5ce0: 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  n ) return 0;.  
5cf0: 7d 0a 77 68 65 72 65 4f 72 49 6e 73 65 72 74 5f  }.whereOrInsert_
5d00: 64 6f 6e 65 3a 0a 20 20 70 2d 3e 70 72 65 72 65  done:.  p->prere
5d10: 71 20 3d 20 70 72 65 72 65 71 3b 0a 20 20 70 2d  q = prereq;.  p-
5d20: 3e 72 52 75 6e 20 3d 20 72 52 75 6e 3b 0a 20 20  >rRun = rRun;.  
5d30: 69 66 28 20 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74  if( p->nOut>nOut
5d40: 20 29 20 70 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75   ) p->nOut = nOu
5d50: 74 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  t;.  return 1;.}
5d60: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
5d70: 7a 65 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65  ze a preallocate
5d80: 64 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  d WhereClause st
5d90: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
5da0: 69 63 20 76 6f 69 64 20 77 68 65 72 65 43 6c 61  ic void whereCla
5db0: 75 73 65 49 6e 69 74 28 0a 20 20 57 68 65 72 65  useInit(.  Where
5dc0: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
5dd0: 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65      /* The Where
5de0: 43 6c 61 75 73 65 20 74 6f 20 62 65 20 69 6e 69  Clause to be ini
5df0: 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 57 68  tialized */.  Wh
5e00: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20  ereInfo *pWInfo 
5e10: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
5e20: 45 52 45 20 70 72 6f 63 65 73 73 69 6e 67 20 63  ERE processing c
5e30: 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 70  ontext */.){.  p
5e40: 57 43 2d 3e 70 57 49 6e 66 6f 20 3d 20 70 57 49  WC->pWInfo = pWI
5e50: 6e 66 6f 3b 0a 20 20 70 57 43 2d 3e 70 4f 75 74  nfo;.  pWC->pOut
5e60: 65 72 20 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e  er = 0;.  pWC->n
5e70: 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 57 43 2d  Term = 0;.  pWC-
5e80: 3e 6e 53 6c 6f 74 20 3d 20 41 72 72 61 79 53 69  >nSlot = ArraySi
5e90: 7a 65 28 70 57 43 2d 3e 61 53 74 61 74 69 63 29  ze(pWC->aStatic)
5ea0: 3b 0a 20 20 70 57 43 2d 3e 61 20 3d 20 70 57 43  ;.  pWC->a = pWC
5eb0: 2d 3e 61 53 74 61 74 69 63 3b 0a 7d 0a 0a 2f 2a  ->aStatic;.}../*
5ec0: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
5ed0: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ce */.static voi
5ee0: 64 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65  d whereClauseCle
5ef0: 61 72 28 57 68 65 72 65 43 6c 61 75 73 65 2a 29  ar(WhereClause*)
5f00: 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  ;../*.** Dealloc
5f10: 61 74 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61  ate all memory a
5f20: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
5f30: 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 6f 62 6a   WhereOrInfo obj
5f40: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ect..*/.static v
5f50: 6f 69 64 20 77 68 65 72 65 4f 72 49 6e 66 6f 44  oid whereOrInfoD
5f60: 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
5f70: 62 2c 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a  b, WhereOrInfo *
5f80: 70 29 7b 0a 20 20 77 68 65 72 65 43 6c 61 75 73  p){.  whereClaus
5f90: 65 43 6c 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a  eClear(&p->wc);.
5fa0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
5fb0: 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
5fc0: 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20   Deallocate all 
5fd0: 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
5fe0: 64 20 77 69 74 68 20 61 20 57 68 65 72 65 41 6e  d with a WhereAn
5ff0: 64 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f  dInfo object..*/
6000: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
6010: 72 65 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28  reAndInfoDelete(
6020: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
6030: 72 65 41 6e 64 49 6e 66 6f 20 2a 70 29 7b 0a 20  reAndInfo *p){. 
6040: 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61   whereClauseClea
6050: 72 28 26 70 2d 3e 77 63 29 3b 0a 20 20 73 71 6c  r(&p->wc);.  sql
6060: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
6070: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c  );.}../*.** Deal
6080: 6c 6f 63 61 74 65 20 61 20 57 68 65 72 65 43 6c  locate a WhereCl
6090: 61 75 73 65 20 73 74 72 75 63 74 75 72 65 2e 20  ause structure. 
60a0: 20 54 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   The WhereClause
60b0: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 74   structure.** it
60c0: 73 65 6c 66 20 69 73 20 6e 6f 74 20 66 72 65 65  self is not free
60d0: 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  d.  This routine
60e0: 20 69 73 20 74 68 65 20 69 6e 76 65 72 73 65 20   is the inverse 
60f0: 6f 66 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e  of whereClauseIn
6100: 69 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  it()..*/.static 
6110: 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73 65  void whereClause
6120: 43 6c 65 61 72 28 57 68 65 72 65 43 6c 61 75 73  Clear(WhereClaus
6130: 65 20 2a 70 57 43 29 7b 0a 20 20 69 6e 74 20 69  e *pWC){.  int i
6140: 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 61  ;.  WhereTerm *a
6150: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
6160: 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70  = pWC->pWInfo->p
6170: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 66 6f 72  Parse->db;.  for
6180: 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 2c  (i=pWC->nTerm-1,
6190: 20 61 3d 70 57 43 2d 3e 61 3b 20 69 3e 3d 30 3b   a=pWC->a; i>=0;
61a0: 20 69 2d 2d 2c 20 61 2b 2b 29 7b 0a 20 20 20 20   i--, a++){.    
61b0: 69 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26  if( a->wtFlags &
61c0: 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b   TERM_DYNAMIC ){
61d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
61e0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e  prDelete(db, a->
61f0: 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pExpr);.    }.  
6200: 20 20 69 66 28 20 61 2d 3e 77 74 46 6c 61 67 73    if( a->wtFlags
6210: 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 29   & TERM_ORINFO )
6220: 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4f 72 49  {.      whereOrI
6230: 6e 66 6f 44 65 6c 65 74 65 28 64 62 2c 20 61 2d  nfoDelete(db, a-
6240: 3e 75 2e 70 4f 72 49 6e 66 6f 29 3b 0a 20 20 20  >u.pOrInfo);.   
6250: 20 7d 65 6c 73 65 20 69 66 28 20 61 2d 3e 77 74   }else if( a->wt
6260: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 41 4e 44  Flags & TERM_AND
6270: 49 4e 46 4f 20 29 7b 0a 20 20 20 20 20 20 77 68  INFO ){.      wh
6280: 65 72 65 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65  ereAndInfoDelete
6290: 28 64 62 2c 20 61 2d 3e 75 2e 70 41 6e 64 49 6e  (db, a->u.pAndIn
62a0: 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  fo);.    }.  }. 
62b0: 20 69 66 28 20 70 57 43 2d 3e 61 21 3d 70 57 43   if( pWC->a!=pWC
62c0: 2d 3e 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20  ->aStatic ){.   
62d0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
62e0: 62 2c 20 70 57 43 2d 3e 61 29 3b 0a 20 20 7d 0a  b, pWC->a);.  }.
62f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73  }../*.** Add a s
6300: 69 6e 67 6c 65 20 6e 65 77 20 57 68 65 72 65 54  ingle new WhereT
6310: 65 72 6d 20 65 6e 74 72 79 20 74 6f 20 74 68 65  erm entry to the
6320: 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f 62 6a   WhereClause obj
6330: 65 63 74 20 70 57 43 2e 0a 2a 2a 20 54 68 65 20  ect pWC..** The 
6340: 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20 6f 62  new WhereTerm ob
6350: 6a 65 63 74 20 69 73 20 63 6f 6e 73 74 72 75 63  ject is construc
6360: 74 65 64 20 66 72 6f 6d 20 45 78 70 72 20 70 20  ted from Expr p 
6370: 61 6e 64 20 77 69 74 68 20 77 74 46 6c 61 67 73  and with wtFlags
6380: 2e 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 69  ..** The index i
6390: 6e 20 70 57 43 2d 3e 61 5b 5d 20 6f 66 20 74 68  n pWC->a[] of th
63a0: 65 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20  e new WhereTerm 
63b0: 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73  is returned on s
63c0: 75 63 63 65 73 73 2e 0a 2a 2a 20 30 20 69 73 20  uccess..** 0 is 
63d0: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
63e0: 6e 65 77 20 57 68 65 72 65 54 65 72 6d 20 63 6f  new WhereTerm co
63f0: 75 6c 64 20 6e 6f 74 20 62 65 20 61 64 64 65 64  uld not be added
6400: 20 64 75 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79   due to a memory
6410: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  .** allocation e
6420: 72 72 6f 72 2e 20 20 54 68 65 20 6d 65 6d 6f 72  rror.  The memor
6430: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
6440: 6c 75 72 65 20 77 69 6c 6c 20 62 65 20 72 65 63  lure will be rec
6450: 6f 72 64 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20  orded in.** the 
6460: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
6470: 20 66 6c 61 67 20 73 6f 20 74 68 61 74 20 68 69   flag so that hi
6480: 67 68 65 72 2d 6c 65 76 65 6c 20 66 75 6e 63 74  gher-level funct
6490: 69 6f 6e 73 20 63 61 6e 20 64 65 74 65 63 74 20  ions can detect 
64a0: 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  it..**.** This r
64b0: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 69 6e 63 72  outine will incr
64c0: 65 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66  ease the size of
64d0: 20 74 68 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72   the pWC->a[] ar
64e0: 72 61 79 20 61 73 20 6e 65 63 65 73 73 61 72 79  ray as necessary
64f0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77  ..**.** If the w
6500: 74 46 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20  tFlags argument 
6510: 69 6e 63 6c 75 64 65 73 20 54 45 52 4d 5f 44 59  includes TERM_DY
6520: 4e 41 4d 49 43 2c 20 74 68 65 6e 20 72 65 73 70  NAMIC, then resp
6530: 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20 66 6f  onsibility.** fo
6540: 72 20 66 72 65 65 69 6e 67 20 74 68 65 20 65 78  r freeing the ex
6550: 70 72 65 73 73 69 6f 6e 20 70 20 69 73 20 61 73  pression p is as
6560: 73 75 6d 65 64 20 62 79 20 74 68 65 20 57 68 65  sumed by the Whe
6570: 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74 20  reClause object 
6580: 70 57 43 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20  pWC..** This is 
6590: 74 72 75 65 20 65 76 65 6e 20 69 66 20 74 68 69  true even if thi
65a0: 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 20  s routine fails 
65b0: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  to allocate a ne
65c0: 77 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a  w WhereTerm..**.
65d0: 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 20 54 68 69  ** WARNING:  Thi
65e0: 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
65f0: 72 65 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 73  reallocate the s
6600: 70 61 63 65 20 75 73 65 64 20 74 6f 20 73 74 6f  pace used to sto
6610: 72 65 0a 2a 2a 20 57 68 65 72 65 54 65 72 6d 73  re.** WhereTerms
6620: 2e 20 20 41 6c 6c 20 70 6f 69 6e 74 65 72 73 20  .  All pointers 
6630: 74 6f 20 57 68 65 72 65 54 65 72 6d 73 20 73 68  to WhereTerms sh
6640: 6f 75 6c 64 20 62 65 20 69 6e 76 61 6c 69 64 61  ould be invalida
6650: 74 65 64 20 61 66 74 65 72 0a 2a 2a 20 63 61 6c  ted after.** cal
6660: 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
6670: 65 2e 20 20 53 75 63 68 20 70 6f 69 6e 74 65 72  e.  Such pointer
6680: 73 20 6d 61 79 20 62 65 20 72 65 69 6e 69 74 69  s may be reiniti
6690: 61 6c 69 7a 65 64 20 62 79 20 72 65 66 65 72 65  alized by refere
66a0: 6e 63 69 6e 67 0a 2a 2a 20 74 68 65 20 70 57 43  ncing.** the pWC
66b0: 2d 3e 61 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a  ->a[] array..*/.
66c0: 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
66d0: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 57 68 65  ClauseInsert(Whe
66e0: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45  reClause *pWC, E
66f0: 78 70 72 20 2a 70 2c 20 75 38 20 77 74 46 6c 61  xpr *p, u8 wtFla
6700: 67 73 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d  gs){.  WhereTerm
6710: 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69   *pTerm;.  int i
6720: 64 78 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  dx;.  testcase( 
6730: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
6740: 49 52 54 55 41 4c 20 29 3b 0a 20 20 69 66 28 20  IRTUAL );.  if( 
6750: 70 57 43 2d 3e 6e 54 65 72 6d 3e 3d 70 57 43 2d  pWC->nTerm>=pWC-
6760: 3e 6e 53 6c 6f 74 20 29 7b 0a 20 20 20 20 57 68  >nSlot ){.    Wh
6770: 65 72 65 54 65 72 6d 20 2a 70 4f 6c 64 20 3d 20  ereTerm *pOld = 
6780: 70 57 43 2d 3e 61 3b 0a 20 20 20 20 73 71 6c 69  pWC->a;.    sqli
6790: 74 65 33 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70  te3 *db = pWC->p
67a0: 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64  WInfo->pParse->d
67b0: 62 3b 0a 20 20 20 20 70 57 43 2d 3e 61 20 3d 20  b;.    pWC->a = 
67c0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
67d0: 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 57  aw(db, sizeof(pW
67e0: 43 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 53  C->a[0])*pWC->nS
67f0: 6c 6f 74 2a 32 20 29 3b 0a 20 20 20 20 69 66 28  lot*2 );.    if(
6800: 20 70 57 43 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20   pWC->a==0 ){.  
6810: 20 20 20 20 69 66 28 20 77 74 46 6c 61 67 73 20      if( wtFlags 
6820: 26 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29  & TERM_DYNAMIC )
6830: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
6840: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
6850: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
6860: 20 20 70 57 43 2d 3e 61 20 3d 20 70 4f 6c 64 3b    pWC->a = pOld;
6870: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
6880: 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70  .    }.    memcp
6890: 79 28 70 57 43 2d 3e 61 2c 20 70 4f 6c 64 2c 20  y(pWC->a, pOld, 
68a0: 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d  sizeof(pWC->a[0]
68b0: 29 2a 70 57 43 2d 3e 6e 54 65 72 6d 29 3b 0a 20  )*pWC->nTerm);. 
68c0: 20 20 20 69 66 28 20 70 4f 6c 64 21 3d 70 57 43     if( pOld!=pWC
68d0: 2d 3e 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20  ->aStatic ){.   
68e0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
68f0: 28 64 62 2c 20 70 4f 6c 64 29 3b 0a 20 20 20 20  (db, pOld);.    
6900: 7d 0a 20 20 20 20 70 57 43 2d 3e 6e 53 6c 6f 74  }.    pWC->nSlot
6910: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
6920: 6f 63 53 69 7a 65 28 64 62 2c 20 70 57 43 2d 3e  ocSize(db, pWC->
6930: 61 29 2f 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61  a)/sizeof(pWC->a
6940: 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20 70 54 65 72  [0]);.  }.  pTer
6950: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 20  m = &pWC->a[idx 
6960: 3d 20 70 57 43 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b  = pWC->nTerm++];
6970: 0a 20 20 69 66 28 20 70 20 26 26 20 45 78 70 72  .  if( p && Expr
6980: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
6990: 50 5f 55 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a 20  P_Unlikely) ){. 
69a0: 20 20 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50     pTerm->truthP
69b0: 72 6f 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  rob = sqlite3Log
69c0: 45 73 74 28 70 2d 3e 69 54 61 62 6c 65 29 20 2d  Est(p->iTable) -
69d0: 20 39 39 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   99;.  }else{.  
69e0: 20 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72    pTerm->truthPr
69f0: 6f 62 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 70  ob = -1;.  }.  p
6a00: 54 65 72 6d 2d 3e 70 45 78 70 72 20 3d 20 73 71  Term->pExpr = sq
6a10: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
6a20: 6c 61 74 65 28 70 29 3b 0a 20 20 70 54 65 72 6d  late(p);.  pTerm
6a30: 2d 3e 77 74 46 6c 61 67 73 20 3d 20 77 74 46 6c  ->wtFlags = wtFl
6a40: 61 67 73 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 57  ags;.  pTerm->pW
6a50: 43 20 3d 20 70 57 43 3b 0a 20 20 70 54 65 72 6d  C = pWC;.  pTerm
6a60: 2d 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a  ->iParent = -1;.
6a70: 20 20 72 65 74 75 72 6e 20 69 64 78 3b 0a 7d 0a    return idx;.}.
6a80: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
6a90: 69 6e 65 20 69 64 65 6e 74 69 66 69 65 73 20 73  ine identifies s
6aa0: 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  ubexpressions in
6ab0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
6ac0: 65 20 77 68 65 72 65 0a 2a 2a 20 65 61 63 68 20  e where.** each 
6ad0: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73  subexpression is
6ae0: 20 73 65 70 61 72 61 74 65 64 20 62 79 20 74 68   separated by th
6af0: 65 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 20 6f  e AND operator o
6b00: 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  r some other.** 
6b10: 6f 70 65 72 61 74 6f 72 20 73 70 65 63 69 66 69  operator specifi
6b20: 65 64 20 69 6e 20 74 68 65 20 6f 70 20 70 61 72  ed in the op par
6b30: 61 6d 65 74 65 72 2e 20 20 54 68 65 20 57 68 65  ameter.  The Whe
6b40: 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75  reClause structu
6b50: 72 65 0a 2a 2a 20 69 73 20 66 69 6c 6c 65 64 20  re.** is filled 
6b60: 77 69 74 68 20 70 6f 69 6e 74 65 72 73 20 74 6f  with pointers to
6b70: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e   subexpressions.
6b80: 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a    For example:.*
6b90: 2a 0a 2a 2a 20 20 20 20 57 48 45 52 45 20 20 61  *.**    WHERE  a
6ba0: 3d 3d 27 68 65 6c 6c 6f 27 20 41 4e 44 20 63 6f  =='hello' AND co
6bb0: 61 6c 65 73 63 65 28 62 2c 31 31 29 3c 31 30 20  alesce(b,11)<10 
6bc0: 41 4e 44 20 28 63 2b 31 32 21 3d 64 20 4f 52 20  AND (c+12!=d OR 
6bd0: 63 3d 3d 32 32 29 0a 2a 2a 20 20 20 20 20 20 20  c==22).**       
6be0: 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20      \________/  
6bf0: 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
6c00: 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f  ___/     \______
6c10: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20  __________/.**  
6c20: 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 30            slot[0
6c30: 5d 20 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f  ]            slo
6c40: 74 5b 31 5d 20 20 20 20 20 20 20 20 20 20 20 20  t[1]            
6c50: 20 20 20 73 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a     slot[2].**.**
6c60: 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 57 48   The original WH
6c70: 45 52 45 20 63 6c 61 75 73 65 20 69 6e 20 70 45  ERE clause in pE
6c80: 78 70 72 20 69 73 20 75 6e 61 6c 74 65 72 65 64  xpr is unaltered
6c90: 2e 20 20 41 6c 6c 20 74 68 69 73 20 72 6f 75 74  .  All this rout
6ca0: 69 6e 65 0a 2a 2a 20 64 6f 65 73 20 69 73 20 6d  ine.** does is m
6cb0: 61 6b 65 20 73 6c 6f 74 5b 5d 20 65 6e 74 72 69  ake slot[] entri
6cc0: 65 73 20 70 6f 69 6e 74 20 74 6f 20 73 75 62 73  es point to subs
6cd0: 74 72 75 63 74 75 72 65 20 77 69 74 68 69 6e 20  tructure within 
6ce0: 70 45 78 70 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  pExpr..**.** In 
6cf0: 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e  the previous sen
6d00: 74 65 6e 63 65 20 61 6e 64 20 69 6e 20 74 68 65  tence and in the
6d10: 20 64 69 61 67 72 61 6d 2c 20 22 73 6c 6f 74 5b   diagram, "slot[
6d20: 5d 22 20 72 65 66 65 72 73 20 74 6f 0a 2a 2a 20  ]" refers to.** 
6d30: 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 2e  the WhereClause.
6d40: 61 5b 5d 20 61 72 72 61 79 2e 20 20 54 68 65 20  a[] array.  The 
6d50: 73 6c 6f 74 5b 5d 20 61 72 72 61 79 20 67 72 6f  slot[] array gro
6d60: 77 73 20 61 73 20 6e 65 65 64 65 64 20 74 6f 20  ws as needed to 
6d70: 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 6c 6c 20 74  contain.** all t
6d80: 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52  erms of the WHER
6d90: 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61  E clause..*/.sta
6da0: 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 53 70  tic void whereSp
6db0: 6c 69 74 28 57 68 65 72 65 43 6c 61 75 73 65 20  lit(WhereClause 
6dc0: 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 45 78 70  *pWC, Expr *pExp
6dd0: 72 2c 20 75 38 20 6f 70 29 7b 0a 20 20 70 57 43  r, u8 op){.  pWC
6de0: 2d 3e 6f 70 20 3d 20 6f 70 3b 0a 20 20 69 66 28  ->op = op;.  if(
6df0: 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
6e00: 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  rn;.  if( pExpr-
6e10: 3e 6f 70 21 3d 6f 70 20 29 7b 0a 20 20 20 20 77  >op!=op ){.    w
6e20: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
6e30: 28 70 57 43 2c 20 70 45 78 70 72 2c 20 30 29 3b  (pWC, pExpr, 0);
6e40: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68  .  }else{.    wh
6e50: 65 72 65 53 70 6c 69 74 28 70 57 43 2c 20 70 45  ereSplit(pWC, pE
6e60: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 6f 70 29 3b  xpr->pLeft, op);
6e70: 0a 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28  .    whereSplit(
6e80: 70 57 43 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  pWC, pExpr->pRig
6e90: 68 74 2c 20 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  ht, op);.  }.}..
6ea0: 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
6eb0: 20 61 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20   a WhereMaskSet 
6ec0: 6f 62 6a 65 63 74 0a 2a 2f 0a 23 64 65 66 69 6e  object.*/.#defin
6ed0: 65 20 69 6e 69 74 4d 61 73 6b 53 65 74 28 50 29  e initMaskSet(P)
6ee0: 20 20 28 50 29 2d 3e 6e 3d 30 0a 0a 2f 2a 0a 2a    (P)->n=0../*.*
6ef0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 62 69 74  * Return the bit
6f00: 6d 61 73 6b 20 66 6f 72 20 74 68 65 20 67 69 76  mask for the giv
6f10: 65 6e 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  en cursor number
6f20: 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 0a 2a  .  Return 0 if.*
6f30: 2a 20 69 43 75 72 73 6f 72 20 69 73 20 6e 6f 74  * iCursor is not
6f40: 20 69 6e 20 74 68 65 20 73 65 74 2e 0a 2a 2f 0a   in the set..*/.
6f50: 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 67  static Bitmask g
6f60: 65 74 4d 61 73 6b 28 57 68 65 72 65 4d 61 73 6b  etMask(WhereMask
6f70: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69  Set *pMaskSet, i
6f80: 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20 69  nt iCursor){.  i
6f90: 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
6fa0: 70 4d 61 73 6b 53 65 74 2d 3e 6e 3c 3d 28 69 6e  pMaskSet->n<=(in
6fb0: 74 29 73 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b  t)sizeof(Bitmask
6fc0: 29 2a 38 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  )*8 );.  for(i=0
6fd0: 3b 20 69 3c 70 4d 61 73 6b 53 65 74 2d 3e 6e 3b  ; i<pMaskSet->n;
6fe0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
6ff0: 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 69 5d 3d 3d  MaskSet->ix[i]==
7000: 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20  iCursor ){.     
7010: 20 72 65 74 75 72 6e 20 4d 41 53 4b 42 49 54 28   return MASKBIT(
7020: 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  i);.    }.  }.  
7030: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
7040: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
7050: 6d 61 73 6b 20 66 6f 72 20 63 75 72 73 6f 72 20  mask for cursor 
7060: 69 43 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  iCursor..**.** T
7070: 68 65 72 65 20 69 73 20 6f 6e 65 20 63 75 72 73  here is one curs
7080: 6f 72 20 70 65 72 20 74 61 62 6c 65 20 69 6e 20  or per table in 
7090: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
70a0: 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a    The number of.
70b0: 2a 2a 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  ** tables in the
70c0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20   FROM clause is 
70d0: 6c 69 6d 69 74 65 64 20 62 79 20 61 20 74 65 73  limited by a tes
70e0: 74 20 65 61 72 6c 79 20 69 6e 20 74 68 65 0a 2a  t early in the.*
70f0: 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  * sqlite3WhereBe
7100: 67 69 6e 28 29 20 72 6f 75 74 69 6e 65 2e 20 20  gin() routine.  
7110: 53 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  So we know that 
7120: 74 68 65 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78  the pMaskSet->ix
7130: 5b 5d 0a 2a 2a 20 61 72 72 61 79 20 77 69 6c 6c  [].** array will
7140: 20 6e 65 76 65 72 20 6f 76 65 72 66 6c 6f 77 2e   never overflow.
7150: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7160: 63 72 65 61 74 65 4d 61 73 6b 28 57 68 65 72 65  createMask(Where
7170: 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
7180: 74 2c 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b  t, int iCursor){
7190: 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61 73 6b  .  assert( pMask
71a0: 53 65 74 2d 3e 6e 20 3c 20 41 72 72 61 79 53 69  Set->n < ArraySi
71b0: 7a 65 28 70 4d 61 73 6b 53 65 74 2d 3e 69 78 29  ze(pMaskSet->ix)
71c0: 20 29 3b 0a 20 20 70 4d 61 73 6b 53 65 74 2d 3e   );.  pMaskSet->
71d0: 69 78 5b 70 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b  ix[pMaskSet->n++
71e0: 5d 20 3d 20 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a  ] = iCursor;.}..
71f0: 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74  /*.** These rout
7200: 69 6e 65 73 20 77 61 6c 6b 20 28 72 65 63 75 72  ines walk (recur
7210: 73 69 76 65 6c 79 29 20 61 6e 20 65 78 70 72 65  sively) an expre
7220: 73 73 69 6f 6e 20 74 72 65 65 20 61 6e 64 20 67  ssion tree and g
7230: 65 6e 65 72 61 74 65 0a 2a 2a 20 61 20 62 69 74  enerate.** a bit
7240: 6d 61 73 6b 20 69 6e 64 69 63 61 74 69 6e 67 20  mask indicating 
7250: 77 68 69 63 68 20 74 61 62 6c 65 73 20 61 72 65  which tables are
7260: 20 75 73 65 64 20 69 6e 20 74 68 61 74 20 65 78   used in that ex
7270: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 72 65 65  pression.** tree
7280: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d  ..*/.static Bitm
7290: 61 73 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c  ask exprListTabl
72a0: 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b  eUsage(WhereMask
72b0: 53 65 74 2a 2c 20 45 78 70 72 4c 69 73 74 2a 29  Set*, ExprList*)
72c0: 3b 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  ;.static Bitmask
72d0: 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65   exprSelectTable
72e0: 55 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53  Usage(WhereMaskS
72f0: 65 74 2a 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 73  et*, Select*);.s
7300: 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78  tatic Bitmask ex
7310: 70 72 54 61 62 6c 65 55 73 61 67 65 28 57 68 65  prTableUsage(Whe
7320: 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  reMaskSet *pMask
7330: 53 65 74 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20  Set, Expr *p){. 
7340: 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20   Bitmask mask = 
7350: 30 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  0;.  if( p==0 ) 
7360: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
7370: 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op==TK_COLUMN
7380: 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 3d 20 67   ){.    mask = g
7390: 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  etMask(pMaskSet,
73a0: 20 70 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20   p->iTable);.   
73b0: 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 20 20   return mask;.  
73c0: 7d 0a 20 20 6d 61 73 6b 20 3d 20 65 78 70 72 54  }.  mask = exprT
73d0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
73e0: 65 74 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a  et, p->pRight);.
73f0: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61    mask |= exprTa
7400: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
7410: 74 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  t, p->pLeft);.  
7420: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
7430: 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c  rty(p, EP_xIsSel
7440: 65 63 74 29 20 29 7b 0a 20 20 20 20 6d 61 73 6b  ect) ){.    mask
7450: 20 7c 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61   |= exprSelectTa
7460: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
7470: 74 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29  t, p->x.pSelect)
7480: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d  ;.  }else{.    m
7490: 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54  ask |= exprListT
74a0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
74b0: 65 74 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b  et, p->x.pList);
74c0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61  .  }.  return ma
74d0: 73 6b 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69 74  sk;.}.static Bit
74e0: 6d 61 73 6b 20 65 78 70 72 4c 69 73 74 54 61 62  mask exprListTab
74f0: 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73  leUsage(WhereMas
7500: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
7510: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
7520: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 42 69 74  {.  int i;.  Bit
7530: 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20  mask mask = 0;. 
7540: 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
7550: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
7560: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
7570: 0a 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  .      mask |= e
7580: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
7590: 61 73 6b 53 65 74 2c 20 70 4c 69 73 74 2d 3e 61  askSet, pList->a
75a0: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
75b0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d  }.  }.  return m
75c0: 61 73 6b 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69  ask;.}.static Bi
75d0: 74 6d 61 73 6b 20 65 78 70 72 53 65 6c 65 63 74  tmask exprSelect
75e0: 54 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65  TableUsage(Where
75f0: 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
7600: 74 2c 20 53 65 6c 65 63 74 20 2a 70 53 29 7b 0a  t, Select *pS){.
7610: 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d    Bitmask mask =
7620: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 20   0;.  while( pS 
7630: 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a  ){.    SrcList *
7640: 70 53 72 63 20 3d 20 70 53 2d 3e 70 53 72 63 3b  pSrc = pS->pSrc;
7650: 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70  .    mask |= exp
7660: 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28  rListTableUsage(
7670: 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 45  pMaskSet, pS->pE
7680: 4c 69 73 74 29 3b 0a 20 20 20 20 6d 61 73 6b 20  List);.    mask 
7690: 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65  |= exprListTable
76a0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
76b0: 70 53 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20  pS->pGroupBy);. 
76c0: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c     mask |= exprL
76d0: 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  istTableUsage(pM
76e0: 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 4f 72 64  askSet, pS->pOrd
76f0: 65 72 42 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20  erBy);.    mask 
7700: 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67  |= exprTableUsag
7710: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e  e(pMaskSet, pS->
7720: 70 57 68 65 72 65 29 3b 0a 20 20 20 20 6d 61 73  pWhere);.    mas
7730: 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73  k |= exprTableUs
7740: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53  age(pMaskSet, pS
7750: 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20  ->pHaving);.    
7760: 69 66 28 20 41 4c 57 41 59 53 28 70 53 72 63 21  if( ALWAYS(pSrc!
7770: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  =0) ){.      int
7780: 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   i;.      for(i=
7790: 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b  0; i<pSrc->nSrc;
77a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d   i++){.        m
77b0: 61 73 6b 20 7c 3d 20 65 78 70 72 53 65 6c 65 63  ask |= exprSelec
77c0: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
77d0: 6b 53 65 74 2c 20 70 53 72 63 2d 3e 61 5b 69 5d  kSet, pSrc->a[i]
77e0: 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  .pSelect);.     
77f0: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54     mask |= exprT
7800: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
7810: 65 74 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70  et, pSrc->a[i].p
7820: 4f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  On);.      }.   
7830: 20 7d 0a 20 20 20 20 70 53 20 3d 20 70 53 2d 3e   }.    pS = pS->
7840: 70 50 72 69 6f 72 3b 0a 20 20 7d 0a 20 20 72 65  pPrior;.  }.  re
7850: 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a  turn mask;.}../*
7860: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
7870: 69 66 20 74 68 65 20 67 69 76 65 6e 20 6f 70 65  if the given ope
7880: 72 61 74 6f 72 20 69 73 20 6f 6e 65 20 6f 66 20  rator is one of 
7890: 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20 74 68  the operators th
78a0: 61 74 20 69 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64  at is.** allowed
78b0: 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 61 62 6c   for an indexabl
78c0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
78d0: 65 72 6d 2e 20 20 54 68 65 20 61 6c 6c 6f 77 65  erm.  The allowe
78e0: 64 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65 0a  d operators are.
78f0: 2a 2a 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3e 22  ** "=", "<", ">"
7900: 2c 20 22 3c 3d 22 2c 20 22 3e 3d 22 2c 20 22 49  , "<=", ">=", "I
7910: 4e 22 2c 20 61 6e 64 20 22 49 53 20 4e 55 4c 4c  N", and "IS NULL
7920: 22 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ".*/.static int 
7930: 61 6c 6c 6f 77 65 64 4f 70 28 69 6e 74 20 6f 70  allowedOp(int op
7940: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f  ){.  assert( TK_
7950: 47 54 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 47  GT>TK_EQ && TK_G
7960: 54 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73  T<TK_GE );.  ass
7970: 65 72 74 28 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51  ert( TK_LT>TK_EQ
7980: 20 26 26 20 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20   && TK_LT<TK_GE 
7990: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f  );.  assert( TK_
79a0: 4c 45 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c  LE>TK_EQ && TK_L
79b0: 45 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73  E<TK_GE );.  ass
79c0: 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45  ert( TK_GE==TK_E
79d0: 51 2b 34 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  Q+4 );.  return 
79e0: 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70  op==TK_IN || (op
79f0: 3e 3d 54 4b 5f 45 51 20 26 26 20 6f 70 3c 3d 54  >=TK_EQ && op<=T
7a00: 4b 5f 47 45 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  K_GE) || op==TK_
7a10: 49 53 4e 55 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ISNULL;.}../*.**
7a20: 20 53 77 61 70 20 74 77 6f 20 6f 62 6a 65 63 74   Swap two object
7a30: 73 20 6f 66 20 74 79 70 65 20 54 59 50 45 2e 0a  s of type TYPE..
7a40: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 57 41 50 28  */.#define SWAP(
7a50: 54 59 50 45 2c 41 2c 42 29 20 7b 54 59 50 45 20  TYPE,A,B) {TYPE 
7a60: 74 3d 41 3b 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a  t=A; A=B; B=t;}.
7a70: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 75 74 65 20 61  ./*.** Commute a
7a80: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
7a90: 61 74 6f 72 2e 20 20 45 78 70 72 65 73 73 69 6f  ator.  Expressio
7aa0: 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  ns of the form "
7ab0: 58 20 6f 70 20 59 22 0a 2a 2a 20 61 72 65 20 63  X op Y".** are c
7ac0: 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 22 59  onverted into "Y
7ad0: 20 6f 70 20 58 22 2e 0a 2a 2a 0a 2a 2a 20 49 66   op X"..**.** If
7ae0: 20 6c 65 66 74 2f 72 69 67 68 74 20 70 72 65 63   left/right prec
7af0: 65 64 65 6e 63 65 20 72 75 6c 65 73 20 63 6f 6d  edence rules com
7b00: 65 20 69 6e 74 6f 20 70 6c 61 79 20 77 68 65 6e  e into play when
7b10: 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 74 68 65   determining the
7b20: 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  .** collating se
7b30: 71 75 65 6e 63 65 2c 20 74 68 65 6e 20 43 4f 4c  quence, then COL
7b40: 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 73 20 61  LATE operators a
7b50: 72 65 20 61 64 6a 75 73 74 65 64 20 74 6f 20 65  re adjusted to e
7b60: 6e 73 75 72 65 0a 2a 2a 20 74 68 61 74 20 74 68  nsure.** that th
7b70: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
7b80: 65 6e 63 65 20 64 6f 65 73 20 6e 6f 74 20 63 68  ence does not ch
7b90: 61 6e 67 65 2e 20 20 46 6f 72 20 65 78 61 6d 70  ange.  For examp
7ba0: 6c 65 3a 0a 2a 2a 20 22 59 20 63 6f 6c 6c 61 74  le:.** "Y collat
7bb0: 65 20 4e 4f 43 41 53 45 20 6f 70 20 58 22 20 62  e NOCASE op X" b
7bc0: 65 63 6f 6d 65 73 20 22 58 20 6f 70 20 59 22 20  ecomes "X op Y" 
7bd0: 62 65 63 61 75 73 65 20 61 6e 79 20 63 6f 6c 6c  because any coll
7be0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6f  ation sequence o
7bf0: 6e 0a 2a 2a 20 74 68 65 20 6c 65 66 74 20 68 61  n.** the left ha
7c00: 6e 64 20 73 69 64 65 20 6f 66 20 61 20 63 6f 6d  nd side of a com
7c10: 70 61 72 69 73 6f 6e 20 6f 76 65 72 72 69 64 65  parison override
7c20: 73 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20  s any collation 
7c30: 73 65 71 75 65 6e 63 65 20 0a 2a 2a 20 61 74 74  sequence .** att
7c40: 61 63 68 65 64 20 74 6f 20 74 68 65 20 72 69 67  ached to the rig
7c50: 68 74 2e 20 46 6f 72 20 74 68 65 20 73 61 6d 65  ht. For the same
7c60: 20 72 65 61 73 6f 6e 20 74 68 65 20 45 50 5f 43   reason the EP_C
7c70: 6f 6c 6c 61 74 65 20 66 6c 61 67 0a 2a 2a 20 69  ollate flag.** i
7c80: 73 20 6e 6f 74 20 63 6f 6d 6d 75 74 65 64 2e 0a  s not commuted..
7c90: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
7ca0: 78 70 72 43 6f 6d 6d 75 74 65 28 50 61 72 73 65  xprCommute(Parse
7cb0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
7cc0: 70 45 78 70 72 29 7b 0a 20 20 75 31 36 20 65 78  pExpr){.  u16 ex
7cd0: 70 52 69 67 68 74 20 3d 20 28 70 45 78 70 72 2d  pRight = (pExpr-
7ce0: 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26  >pRight->flags &
7cf0: 20 45 50 5f 43 6f 6c 6c 61 74 65 29 3b 0a 20 20   EP_Collate);.  
7d00: 75 31 36 20 65 78 70 4c 65 66 74 20 3d 20 28 70  u16 expLeft = (p
7d10: 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61  Expr->pLeft->fla
7d20: 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29  gs & EP_Collate)
7d30: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6c 6c 6f  ;.  assert( allo
7d40: 77 65 64 4f 70 28 70 45 78 70 72 2d 3e 6f 70 29  wedOp(pExpr->op)
7d50: 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54   && pExpr->op!=T
7d60: 4b 5f 49 4e 20 29 3b 0a 20 20 69 66 28 20 65 78  K_IN );.  if( ex
7d70: 70 52 69 67 68 74 3d 3d 65 78 70 4c 65 66 74 20  pRight==expLeft 
7d80: 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72  ){.    /* Either
7d90: 20 58 20 61 6e 64 20 59 20 62 6f 74 68 20 68 61   X and Y both ha
7da0: 76 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61  ve COLLATE opera
7db0: 74 6f 72 20 6f 72 20 6e 65 69 74 68 65 72 20 64  tor or neither d
7dc0: 6f 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 78 70  o */.    if( exp
7dd0: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 2f  Right ){.      /
7de0: 2a 20 42 6f 74 68 20 58 20 61 6e 64 20 59 20 68  * Both X and Y h
7df0: 61 76 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72  ave COLLATE oper
7e00: 61 74 6f 72 73 2e 20 20 4d 61 6b 65 20 73 75 72  ators.  Make sur
7e10: 65 20 58 20 69 73 20 61 6c 77 61 79 73 0a 20 20  e X is always.  
7e20: 20 20 20 20 2a 2a 20 75 73 65 64 20 62 79 20 63      ** used by c
7e30: 6c 65 61 72 69 6e 67 20 74 68 65 20 45 50 5f 43  learing the EP_C
7e40: 6f 6c 6c 61 74 65 20 66 6c 61 67 20 66 72 6f 6d  ollate flag from
7e50: 20 59 2e 20 2a 2f 0a 20 20 20 20 20 20 70 45 78   Y. */.      pEx
7e60: 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67  pr->pRight->flag
7e70: 73 20 26 3d 20 7e 45 50 5f 43 6f 6c 6c 61 74 65  s &= ~EP_Collate
7e80: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
7e90: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
7ea0: 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  eq(pParse, pExpr
7eb0: 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20  ->pLeft)!=0 ){. 
7ec0: 20 20 20 20 20 2f 2a 20 4e 65 69 74 68 65 72 20       /* Neither 
7ed0: 58 20 6e 6f 72 20 59 20 68 61 76 65 20 43 4f 4c  X nor Y have COL
7ee0: 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 73 2c 20  LATE operators, 
7ef0: 62 75 74 20 58 20 68 61 73 20 61 20 6e 6f 6e 2d  but X has a non-
7f00: 64 65 66 61 75 6c 74 0a 20 20 20 20 20 20 2a 2a  default.      **
7f10: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
7f20: 6e 63 65 2e 20 20 53 6f 20 61 64 64 20 74 68 65  nce.  So add the
7f30: 20 45 50 5f 43 6f 6c 6c 61 74 65 20 6d 61 72 6b   EP_Collate mark
7f40: 65 72 20 6f 6e 20 58 20 74 6f 20 63 61 75 73 65  er on X to cause
7f50: 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 74 6f 20  .      ** it to 
7f60: 62 65 20 73 65 61 72 63 68 65 64 20 66 69 72 73  be searched firs
7f70: 74 2e 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70  t. */.      pExp
7f80: 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20  r->pLeft->flags 
7f90: 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 65 3b 0a 20  |= EP_Collate;. 
7fa0: 20 20 20 7d 0a 20 20 7d 0a 20 20 53 57 41 50 28     }.  }.  SWAP(
7fb0: 45 78 70 72 2a 2c 70 45 78 70 72 2d 3e 70 52 69  Expr*,pExpr->pRi
7fc0: 67 68 74 2c 70 45 78 70 72 2d 3e 70 4c 65 66 74  ght,pExpr->pLeft
7fd0: 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  );.  if( pExpr->
7fe0: 6f 70 3e 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20  op>=TK_GT ){.   
7ff0: 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d   assert( TK_LT==
8000: 54 4b 5f 47 54 2b 32 20 29 3b 0a 20 20 20 20 61  TK_GT+2 );.    a
8010: 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b  ssert( TK_GE==TK
8020: 5f 4c 45 2b 32 20 29 3b 0a 20 20 20 20 61 73 73  _LE+2 );.    ass
8030: 65 72 74 28 20 54 4b 5f 47 54 3e 54 4b 5f 45 51  ert( TK_GT>TK_EQ
8040: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
8050: 54 4b 5f 47 54 3c 54 4b 5f 4c 45 20 29 3b 0a 20  TK_GT<TK_LE );. 
8060: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
8070: 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 26 26 20 70  ->op>=TK_GT && p
8080: 45 78 70 72 2d 3e 6f 70 3c 3d 54 4b 5f 47 45 20  Expr->op<=TK_GE 
8090: 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  );.    pExpr->op
80a0: 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2d 54   = ((pExpr->op-T
80b0: 4b 5f 47 54 29 5e 32 29 2b 54 4b 5f 47 54 3b 0a  K_GT)^2)+TK_GT;.
80c0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61    }.}../*.** Tra
80d0: 6e 73 6c 61 74 65 20 66 72 6f 6d 20 54 4b 5f 78  nslate from TK_x
80e0: 78 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 57 4f  x operator to WO
80f0: 5f 78 78 20 62 69 74 6d 61 73 6b 2e 0a 2a 2f 0a  _xx bitmask..*/.
8100: 73 74 61 74 69 63 20 75 31 36 20 6f 70 65 72 61  static u16 opera
8110: 74 6f 72 4d 61 73 6b 28 69 6e 74 20 6f 70 29 7b  torMask(int op){
8120: 0a 20 20 75 31 36 20 63 3b 0a 20 20 61 73 73 65  .  u16 c;.  asse
8130: 72 74 28 20 61 6c 6c 6f 77 65 64 4f 70 28 6f 70  rt( allowedOp(op
8140: 29 20 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  ) );.  if( op==T
8150: 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 63 20 3d 20  K_IN ){.    c = 
8160: 57 4f 5f 49 4e 3b 0a 20 20 7d 65 6c 73 65 20 69  WO_IN;.  }else i
8170: 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  f( op==TK_ISNULL
8180: 20 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49   ){.    c = WO_I
8190: 53 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  SNULL;.  }else{.
81a0: 20 20 20 20 61 73 73 65 72 74 28 20 28 57 4f 5f      assert( (WO_
81b0: 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29 29 20  EQ<<(op-TK_EQ)) 
81c0: 3c 20 30 78 37 66 66 66 20 29 3b 0a 20 20 20 20  < 0x7fff );.    
81d0: 63 20 3d 20 28 75 31 36 29 28 57 4f 5f 45 51 3c  c = (u16)(WO_EQ<
81e0: 3c 28 6f 70 2d 54 4b 5f 45 51 29 29 3b 0a 20 20  <(op-TK_EQ));.  
81f0: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d  }.  assert( op!=
8200: 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 63 3d 3d  TK_ISNULL || c==
8210: 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 61  WO_ISNULL );.  a
8220: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49 4e  ssert( op!=TK_IN
8230: 20 7c 7c 20 63 3d 3d 57 4f 5f 49 4e 20 29 3b 0a   || c==WO_IN );.
8240: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
8250: 5f 45 51 20 7c 7c 20 63 3d 3d 57 4f 5f 45 51 20  _EQ || c==WO_EQ 
8260: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
8270: 3d 54 4b 5f 4c 54 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_LT || c==WO_
8280: 4c 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  LT );.  assert( 
8290: 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 63 3d 3d  op!=TK_LE || c==
82a0: 57 4f 5f 4c 45 20 29 3b 0a 20 20 61 73 73 65 72  WO_LE );.  asser
82b0: 74 28 20 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20  t( op!=TK_GT || 
82c0: 63 3d 3d 57 4f 5f 47 54 20 29 3b 0a 20 20 61 73  c==WO_GT );.  as
82d0: 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 47 45 20  sert( op!=TK_GE 
82e0: 7c 7c 20 63 3d 3d 57 4f 5f 47 45 20 29 3b 0a 20  || c==WO_GE );. 
82f0: 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a   return c;.}../*
8300: 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 6f 20 74  .** Advance to t
8310: 68 65 20 6e 65 78 74 20 57 68 65 72 65 54 65 72  he next WhereTer
8320: 6d 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 61  m that matches a
8330: 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
8340: 63 72 69 74 65 72 69 61 0a 2a 2a 20 65 73 74 61  criteria.** esta
8350: 62 6c 69 73 68 65 64 20 77 68 65 6e 20 74 68 65  blished when the
8360: 20 70 53 63 61 6e 20 6f 62 6a 65 63 74 20 77 61   pScan object wa
8370: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79  s initialized by
8380: 20 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28 29   whereScanInit()
8390: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c  ..** Return NULL
83a0: 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   if there are no
83b0: 20 6d 6f 72 65 20 6d 61 74 63 68 69 6e 67 20 57   more matching W
83c0: 68 65 72 65 54 65 72 6d 73 2e 0a 2a 2f 0a 73 74  hereTerms..*/.st
83d0: 61 74 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a  atic WhereTerm *
83e0: 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28 57 68  whereScanNext(Wh
83f0: 65 72 65 53 63 61 6e 20 2a 70 53 63 61 6e 29 7b  ereScan *pScan){
8400: 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20  .  int iCur;    
8410: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
8420: 75 72 73 6f 72 20 6f 6e 20 74 68 65 20 4c 48 53  ursor on the LHS
8430: 20 6f 66 20 74 68 65 20 74 65 72 6d 20 2a 2f 0a   of the term */.
8440: 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20    int iColumn;  
8450: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
8460: 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 4c 48 53 20  lumn on the LHS 
8470: 6f 66 20 74 68 65 20 74 65 72 6d 2e 20 20 2d 31  of the term.  -1
8480: 20 66 6f 72 20 49 50 4b 20 2a 2f 0a 20 20 45 78   for IPK */.  Ex
8490: 70 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20  pr *pX;         
84a0: 20 20 20 2f 2a 20 41 6e 20 65 78 70 72 65 73 73     /* An express
84b0: 69 6f 6e 20 62 65 69 6e 67 20 74 65 73 74 65 64  ion being tested
84c0: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
84d0: 65 20 2a 70 57 43 3b 20 20 20 20 2f 2a 20 53 68  e *pWC;    /* Sh
84e0: 6f 72 74 68 61 6e 64 20 66 6f 72 20 70 53 63 61  orthand for pSca
84f0: 6e 2d 3e 70 57 43 20 2a 2f 0a 20 20 57 68 65 72  n->pWC */.  Wher
8500: 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
8510: 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 62 65 69   /* The term bei
8520: 6e 67 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 69  ng tested */.  i
8530: 6e 74 20 6b 20 3d 20 70 53 63 61 6e 2d 3e 6b 3b  nt k = pScan->k;
8540: 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20      /* Where to 
8550: 73 74 61 72 74 20 73 63 61 6e 6e 69 6e 67 20 2a  start scanning *
8560: 2f 0a 0a 20 20 77 68 69 6c 65 28 20 70 53 63 61  /..  while( pSca
8570: 6e 2d 3e 69 45 71 75 69 76 3c 3d 70 53 63 61 6e  n->iEquiv<=pScan
8580: 2d 3e 6e 45 71 75 69 76 20 29 7b 0a 20 20 20 20  ->nEquiv ){.    
8590: 69 43 75 72 20 3d 20 70 53 63 61 6e 2d 3e 61 45  iCur = pScan->aE
85a0: 71 75 69 76 5b 70 53 63 61 6e 2d 3e 69 45 71 75  quiv[pScan->iEqu
85b0: 69 76 2d 32 5d 3b 0a 20 20 20 20 69 43 6f 6c 75  iv-2];.    iColu
85c0: 6d 6e 20 3d 20 70 53 63 61 6e 2d 3e 61 45 71 75  mn = pScan->aEqu
85d0: 69 76 5b 70 53 63 61 6e 2d 3e 69 45 71 75 69 76  iv[pScan->iEquiv
85e0: 2d 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  -1];.    while( 
85f0: 28 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70 57  (pWC = pScan->pW
8600: 43 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  C)!=0 ){.      f
8610: 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2b  or(pTerm=pWC->a+
8620: 6b 3b 20 6b 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b  k; k<pWC->nTerm;
8630: 20 6b 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   k++, pTerm++){.
8640: 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72          if( pTer
8650: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  m->leftCursor==i
8660: 43 75 72 0a 20 20 20 20 20 20 20 20 20 26 26 20  Cur.         && 
8670: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
8680: 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20  umn==iColumn.   
8690: 20 20 20 20 20 20 26 26 20 28 70 53 63 61 6e 2d        && (pScan-
86a0: 3e 69 45 71 75 69 76 3c 3d 32 20 7c 7c 20 21 45  >iEquiv<=2 || !E
86b0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
86c0: 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f  Term->pExpr, EP_
86d0: 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 20 20 20  FromJoin)).     
86e0: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
86f0: 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
8700: 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 55 49 56  rator & WO_EQUIV
8710: 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )!=0.           
8720: 26 26 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76  && pScan->nEquiv
8730: 3c 41 72 72 61 79 53 69 7a 65 28 70 53 63 61 6e  <ArraySize(pScan
8740: 2d 3e 61 45 71 75 69 76 29 0a 20 20 20 20 20 20  ->aEquiv).      
8750: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
8760: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
8770: 20 20 20 20 20 20 70 58 20 3d 20 73 71 6c 69 74        pX = sqlit
8780: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
8790: 65 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  e(pTerm->pExpr->
87a0: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20  pRight);.       
87b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58 2d       assert( pX-
87c0: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
87d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
87e0: 72 28 6a 3d 30 3b 20 6a 3c 70 53 63 61 6e 2d 3e  r(j=0; j<pScan->
87f0: 6e 45 71 75 69 76 3b 20 6a 2b 3d 32 29 7b 0a 20  nEquiv; j+=2){. 
8800: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
8810: 20 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a   pScan->aEquiv[j
8820: 5d 3d 3d 70 58 2d 3e 69 54 61 62 6c 65 0a 20 20  ]==pX->iTable.  
8830: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
8840: 70 53 63 61 6e 2d 3e 61 45 71 75 69 76 5b 6a 2b  pScan->aEquiv[j+
8850: 31 5d 3d 3d 70 58 2d 3e 69 43 6f 6c 75 6d 6e 20  1]==pX->iColumn 
8860: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
8870: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8880: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8890: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
88a0: 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 53 63        if( j==pSc
88b0: 61 6e 2d 3e 6e 45 71 75 69 76 20 29 7b 0a 20 20  an->nEquiv ){.  
88c0: 20 20 20 20 20 20 20 20 20 20 20 20 70 53 63 61              pSca
88d0: 6e 2d 3e 61 45 71 75 69 76 5b 6a 5d 20 3d 20 70  n->aEquiv[j] = p
88e0: 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  X->iTable;.     
88f0: 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e           pScan->
8900: 61 45 71 75 69 76 5b 6a 2b 31 5d 20 3d 20 70 58  aEquiv[j+1] = pX
8910: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
8920: 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e           pScan->
8930: 6e 45 71 75 69 76 20 2b 3d 20 32 3b 0a 20 20 20  nEquiv += 2;.   
8940: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
8950: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
8960: 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
8970: 65 72 61 74 6f 72 20 26 20 70 53 63 61 6e 2d 3e  erator & pScan->
8980: 6f 70 4d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20  opMask)!=0 ){.  
8990: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 65 72            /* Ver
89a0: 69 66 79 20 74 68 65 20 61 66 66 69 6e 69 74 79  ify the affinity
89b0: 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73   and collating s
89c0: 65 71 75 65 6e 63 65 20 6d 61 74 63 68 20 2a 2f  equence match */
89d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
89e0: 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d   pScan->zCollNam
89f0: 65 20 26 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70  e && (pTerm->eOp
8a00: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55  erator & WO_ISNU
8a10: 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LL)==0 ){.      
8a20: 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20          CollSeq 
8a30: 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  *pColl;.        
8a40: 20 20 20 20 20 20 50 61 72 73 65 20 2a 70 50 61        Parse *pPa
8a50: 72 73 65 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66  rse = pWC->pWInf
8a60: 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20  o->pParse;.     
8a70: 20 20 20 20 20 20 20 20 20 70 58 20 3d 20 70 54           pX = pT
8a80: 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
8a90: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 73            if( !s
8aa0: 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e  qlite3IndexAffin
8ab0: 69 74 79 4f 6b 28 70 58 2c 20 70 53 63 61 6e 2d  ityOk(pX, pScan-
8ac0: 3e 69 64 78 61 66 66 29 20 29 7b 0a 20 20 20 20  >idxaff) ){.    
8ad0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
8ae0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
8af0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
8b00: 20 20 20 20 61 73 73 65 72 74 28 70 58 2d 3e 70      assert(pX->p
8b10: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Left);.         
8b20: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
8b30: 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72  ite3BinaryCompar
8b40: 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
8b50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b80: 20 20 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58     pX->pLeft, pX
8b90: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
8ba0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f           if( pCo
8bb0: 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20  ll==0 ) pColl = 
8bc0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c  pParse->db->pDfl
8bd0: 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20  tColl;.         
8be0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
8bf0: 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a  StrICmp(pColl->z
8c00: 4e 61 6d 65 2c 20 70 53 63 61 6e 2d 3e 7a 43 6f  Name, pScan->zCo
8c10: 6c 6c 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20  llName) ){.     
8c20: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
8c30: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
8c40: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
8c50: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
8c60: 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
8c70: 61 74 6f 72 20 26 20 57 4f 5f 45 51 29 21 3d 30  ator & WO_EQ)!=0
8c80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
8c90: 20 28 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45   (pX = pTerm->pE
8ca0: 78 70 72 2d 3e 70 52 69 67 68 74 29 2d 3e 6f 70  xpr->pRight)->op
8cb0: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20  ==TK_COLUMN.    
8cc0: 20 20 20 20 20 20 20 20 20 26 26 20 70 58 2d 3e           && pX->
8cd0: 69 54 61 62 6c 65 3d 3d 70 53 63 61 6e 2d 3e 61  iTable==pScan->a
8ce0: 45 71 75 69 76 5b 30 5d 0a 20 20 20 20 20 20 20  Equiv[0].       
8cf0: 20 20 20 20 20 20 26 26 20 70 58 2d 3e 69 43 6f        && pX->iCo
8d00: 6c 75 6d 6e 3d 3d 70 53 63 61 6e 2d 3e 61 45 71  lumn==pScan->aEq
8d10: 75 69 76 5b 31 5d 0a 20 20 20 20 20 20 20 20 20  uiv[1].         
8d20: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
8d30: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
8d40: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8d50: 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 6b          pScan->k
8d60: 20 3d 20 6b 2b 31 3b 0a 20 20 20 20 20 20 20 20   = k+1;.        
8d70: 20 20 20 20 72 65 74 75 72 6e 20 70 54 65 72 6d      return pTerm
8d80: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
8d90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
8da0: 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 70 57 43        pScan->pWC
8db0: 20 3d 20 70 53 63 61 6e 2d 3e 70 57 43 2d 3e 70   = pScan->pWC->p
8dc0: 4f 75 74 65 72 3b 0a 20 20 20 20 20 20 6b 20 3d  Outer;.      k =
8dd0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53   0;.    }.    pS
8de0: 63 61 6e 2d 3e 70 57 43 20 3d 20 70 53 63 61 6e  can->pWC = pScan
8df0: 2d 3e 70 4f 72 69 67 57 43 3b 0a 20 20 20 20 6b  ->pOrigWC;.    k
8e00: 20 3d 20 30 3b 0a 20 20 20 20 70 53 63 61 6e 2d   = 0;.    pScan-
8e10: 3e 69 45 71 75 69 76 20 2b 3d 20 32 3b 0a 20 20  >iEquiv += 2;.  
8e20: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
8e30: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
8e40: 65 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  e a WHERE clause
8e50: 20 73 63 61 6e 6e 65 72 20 6f 62 6a 65 63 74 2e   scanner object.
8e60: 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
8e70: 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 66 69 72  er to the.** fir
8e80: 73 74 20 6d 61 74 63 68 2e 20 20 52 65 74 75 72  st match.  Retur
8e90: 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20  n NULL if there 
8ea0: 61 72 65 20 6e 6f 20 6d 61 74 63 68 65 73 2e 0a  are no matches..
8eb0: 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 61 6e 6e 65  **.** The scanne
8ec0: 72 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68  r will be search
8ed0: 69 6e 67 20 74 68 65 20 57 48 45 52 45 20 63 6c  ing the WHERE cl
8ee0: 61 75 73 65 20 70 57 43 2e 20 20 49 74 20 77 69  ause pWC.  It wi
8ef0: 6c 6c 20 6c 6f 6f 6b 0a 2a 2a 20 66 6f 72 20 74  ll look.** for t
8f00: 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  erms of the form
8f10: 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22   "X <op> <expr>"
8f20: 20 77 68 65 72 65 20 58 20 69 73 20 63 6f 6c 75   where X is colu
8f30: 6d 6e 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61  mn iColumn of ta
8f40: 62 6c 65 0a 2a 2a 20 69 43 75 72 2e 20 20 54 68  ble.** iCur.  Th
8f50: 65 20 3c 6f 70 3e 20 6d 75 73 74 20 62 65 20 6f  e <op> must be o
8f60: 6e 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74  ne of the operat
8f70: 6f 72 73 20 64 65 73 63 72 69 62 65 64 20 62 79  ors described by
8f80: 20 6f 70 4d 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49   opMask..**.** I
8f90: 66 20 74 68 65 20 73 65 61 72 63 68 20 69 73 20  f the search is 
8fa0: 66 6f 72 20 58 20 61 6e 64 20 74 68 65 20 57 48  for X and the WH
8fb0: 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74 61  ERE clause conta
8fc0: 69 6e 73 20 74 65 72 6d 73 20 6f 66 20 74 68 65  ins terms of the
8fd0: 0a 2a 2a 20 66 6f 72 6d 20 58 3d 59 20 74 68 65  .** form X=Y the
8fe0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  n this routine m
8ff0: 69 67 68 74 20 61 6c 73 6f 20 72 65 74 75 72 6e  ight also return
9000: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f   terms of the fo
9010: 72 6d 0a 2a 2a 20 22 59 20 3c 6f 70 3e 20 3c 65  rm.** "Y <op> <e
9020: 78 70 72 3e 22 2e 20 20 54 68 65 20 6e 75 6d 62  xpr>".  The numb
9030: 65 72 20 6f 66 20 6c 65 76 65 6c 73 20 6f 66 20  er of levels of 
9040: 74 72 61 6e 73 69 74 69 76 69 74 79 20 69 73 20  transitivity is 
9050: 6c 69 6d 69 74 65 64 2c 0a 2a 2a 20 62 75 74 20  limited,.** but 
9060: 69 73 20 65 6e 6f 75 67 68 20 74 6f 20 68 61 6e  is enough to han
9070: 64 6c 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e 6c  dle most commonl
9080: 79 20 6f 63 63 75 72 72 69 6e 67 20 53 51 4c 20  y occurring SQL 
9090: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a  statements..**.*
90a0: 2a 20 49 66 20 58 20 69 73 20 6e 6f 74 20 74 68  * If X is not th
90b0: 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  e INTEGER PRIMAR
90c0: 59 20 4b 45 59 20 74 68 65 6e 20 58 20 6d 75 73  Y KEY then X mus
90d0: 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20  t be compatible 
90e0: 77 69 74 68 0a 2a 2a 20 69 6e 64 65 78 20 70 49  with.** index pI
90f0: 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68  dx..*/.static Wh
9100: 65 72 65 54 65 72 6d 20 2a 77 68 65 72 65 53 63  ereTerm *whereSc
9110: 61 6e 49 6e 69 74 28 0a 20 20 57 68 65 72 65 53  anInit(.  WhereS
9120: 63 61 6e 20 2a 70 53 63 61 6e 2c 20 20 20 20 20  can *pScan,     
9130: 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 53 63    /* The WhereSc
9140: 61 6e 20 6f 62 6a 65 63 74 20 62 65 69 6e 67 20  an object being 
9150: 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20  initialized */. 
9160: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
9170: 43 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  C,       /* The 
9180: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
9190: 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20  be scanned */.  
91a0: 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20 20  int iCur,       
91b0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
91c0: 72 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f  r to scan for */
91d0: 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20  .  int iColumn, 
91e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
91f0: 6c 75 6d 6e 20 74 6f 20 73 63 61 6e 20 66 6f 72  lumn to scan for
9200: 20 2a 2f 0a 20 20 75 33 32 20 6f 70 4d 61 73 6b   */.  u32 opMask
9210: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
9220: 20 4f 70 65 72 61 74 6f 72 28 73 29 20 74 6f 20   Operator(s) to 
9230: 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20 49 6e  scan for */.  In
9240: 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20  dex *pIdx       
9250: 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65        /* Must be
9260: 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
9270: 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 29   this index */.)
9280: 7b 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 2f 2a  {.  int j;..  /*
9290: 20 6d 65 6d 73 65 74 28 70 53 63 61 6e 2c 20 30   memset(pScan, 0
92a0: 2c 20 73 69 7a 65 6f 66 28 2a 70 53 63 61 6e 29  , sizeof(*pScan)
92b0: 29 3b 20 2a 2f 0a 20 20 70 53 63 61 6e 2d 3e 70  ); */.  pScan->p
92c0: 4f 72 69 67 57 43 20 3d 20 70 57 43 3b 0a 20 20  OrigWC = pWC;.  
92d0: 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70 57 43  pScan->pWC = pWC
92e0: 3b 0a 20 20 69 66 28 20 70 49 64 78 20 26 26 20  ;.  if( pIdx && 
92f0: 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20  iColumn>=0 ){.  
9300: 20 20 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 20    pScan->idxaff 
9310: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
9320: 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66  aCol[iColumn].af
9330: 66 69 6e 69 74 79 3b 0a 20 20 20 20 66 6f 72 28  finity;.    for(
9340: 6a 3d 30 3b 20 70 49 64 78 2d 3e 61 69 43 6f 6c  j=0; pIdx->aiCol
9350: 75 6d 6e 5b 6a 5d 21 3d 69 43 6f 6c 75 6d 6e 3b  umn[j]!=iColumn;
9360: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
9370: 20 4e 45 56 45 52 28 6a 3e 3d 70 49 64 78 2d 3e   NEVER(j>=pIdx->
9380: 6e 43 6f 6c 75 6d 6e 29 20 29 20 72 65 74 75 72  nColumn) ) retur
9390: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  n 0;.    }.    p
93a0: 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20  Scan->zCollName 
93b0: 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a  = pIdx->azColl[j
93c0: 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ];.  }else{.    
93d0: 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 20 3d 20  pScan->idxaff = 
93e0: 30 3b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 7a 43  0;.    pScan->zC
93f0: 6f 6c 6c 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d  ollName = 0;.  }
9400: 0a 20 20 70 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b  .  pScan->opMask
9410: 20 3d 20 6f 70 4d 61 73 6b 3b 0a 20 20 70 53 63   = opMask;.  pSc
9420: 61 6e 2d 3e 6b 20 3d 20 30 3b 0a 20 20 70 53 63  an->k = 0;.  pSc
9430: 61 6e 2d 3e 61 45 71 75 69 76 5b 30 5d 20 3d 20  an->aEquiv[0] = 
9440: 69 43 75 72 3b 0a 20 20 70 53 63 61 6e 2d 3e 61  iCur;.  pScan->a
9450: 45 71 75 69 76 5b 31 5d 20 3d 20 69 43 6f 6c 75  Equiv[1] = iColu
9460: 6d 6e 3b 0a 20 20 70 53 63 61 6e 2d 3e 6e 45 71  mn;.  pScan->nEq
9470: 75 69 76 20 3d 20 32 3b 0a 20 20 70 53 63 61 6e  uiv = 2;.  pScan
9480: 2d 3e 69 45 71 75 69 76 20 3d 20 32 3b 0a 20 20  ->iEquiv = 2;.  
9490: 72 65 74 75 72 6e 20 77 68 65 72 65 53 63 61 6e  return whereScan
94a0: 4e 65 78 74 28 70 53 63 61 6e 29 3b 0a 7d 0a 0a  Next(pScan);.}..
94b0: 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72  /*.** Search for
94c0: 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57   a term in the W
94d0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
94e0: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   is of the form 
94f0: 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a  "X <op> <expr>".
9500: 2a 2a 20 77 68 65 72 65 20 58 20 69 73 20 61 20  ** where X is a 
9510: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
9520: 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c   iColumn of tabl
9530: 65 20 69 43 75 72 20 61 6e 64 20 3c 6f 70 3e 20  e iCur and <op> 
9540: 69 73 20 6f 6e 65 20 6f 66 0a 2a 2a 20 74 68 65  is one of.** the
9550: 20 57 4f 5f 78 78 20 6f 70 65 72 61 74 6f 72 20   WO_xx operator 
9560: 63 6f 64 65 73 20 73 70 65 63 69 66 69 65 64 20  codes specified 
9570: 62 79 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65  by the op parame
9580: 74 65 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ter..** Return a
9590: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
95a0: 74 65 72 6d 2e 20 20 52 65 74 75 72 6e 20 30 20  term.  Return 0 
95b0: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a  if not found..**
95c0: 0a 2a 2a 20 54 68 65 20 74 65 72 6d 20 72 65 74  .** The term ret
95d0: 75 72 6e 65 64 20 6d 69 67 68 74 20 62 79 20 59  urned might by Y
95e0: 3d 3c 65 78 70 72 3e 20 69 66 20 74 68 65 72 65  =<expr> if there
95f0: 20 69 73 20 61 6e 6f 74 68 65 72 20 63 6f 6e 73   is another cons
9600: 74 72 61 69 6e 74 20 69 6e 0a 2a 2a 20 74 68 65  traint in.** the
9610: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
9620: 61 74 20 73 70 65 63 69 66 69 65 73 20 74 68 61  at specifies tha
9630: 74 20 58 3d 59 2e 20 20 41 6e 79 20 73 75 63 68  t X=Y.  Any such
9640: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 69 6c   constraints wil
9650: 6c 20 62 65 0a 2a 2a 20 69 64 65 6e 74 69 66 69  l be.** identifi
9660: 65 64 20 62 79 20 74 68 65 20 57 4f 5f 45 51 55  ed by the WO_EQU
9670: 49 56 20 62 69 74 20 69 6e 20 74 68 65 20 70 54  IV bit in the pT
9680: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 66  erm->eOperator f
9690: 69 65 6c 64 2e 20 20 54 68 65 0a 2a 2a 20 61 45  ield.  The.** aE
96a0: 71 75 69 76 5b 5d 20 61 72 72 61 79 20 68 6f 6c  quiv[] array hol
96b0: 64 73 20 58 20 61 6e 64 20 61 6c 6c 20 69 74 73  ds X and all its
96c0: 20 65 71 75 69 76 61 6c 65 6e 74 73 2c 20 77 69   equivalents, wi
96d0: 74 68 20 65 61 63 68 20 53 51 4c 20 76 61 72 69  th each SQL vari
96e0: 61 62 6c 65 0a 2a 2a 20 74 61 6b 69 6e 67 20 75  able.** taking u
96f0: 70 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20 61  p two slots in a
9700: 45 71 75 69 76 5b 5d 2e 20 20 54 68 65 20 66 69  Equiv[].  The fi
9710: 72 73 74 20 73 6c 6f 74 20 69 73 20 66 6f 72 20  rst slot is for 
9720: 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
9730: 72 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 65 63  r.** and the sec
9740: 6f 6e 64 20 69 73 20 66 6f 72 20 74 68 65 20 63  ond is for the c
9750: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 2e 20 20 54  olumn number.  T
9760: 68 65 72 65 20 61 72 65 20 32 32 20 73 6c 6f 74  here are 22 slot
9770: 73 20 69 6e 20 61 45 71 75 69 76 5b 5d 0a 2a 2a  s in aEquiv[].**
9780: 20 73 6f 20 74 68 61 74 20 6d 65 61 6e 73 20 77   so that means w
9790: 65 20 63 61 6e 20 6c 6f 6f 6b 20 66 6f 72 20 58  e can look for X
97a0: 20 70 6c 75 73 20 75 70 20 74 6f 20 31 30 20 6f   plus up to 10 o
97b0: 74 68 65 72 20 65 71 75 69 76 61 6c 65 6e 74 20  ther equivalent 
97c0: 76 61 6c 75 65 73 2e 0a 2a 2a 20 48 65 6e 63 65  values..** Hence
97d0: 20 61 20 73 65 61 72 63 68 20 66 6f 72 20 58 20   a search for X 
97e0: 77 69 6c 6c 20 72 65 74 75 72 6e 20 3c 65 78 70  will return <exp
97f0: 72 3e 20 69 66 20 58 3d 41 31 20 61 6e 64 20 41  r> if X=A1 and A
9800: 31 3d 41 32 20 61 6e 64 20 41 32 3d 41 33 0a 2a  1=A2 and A2=A3.*
9810: 2a 20 61 6e 64 20 2e 2e 2e 20 61 6e 64 20 41 39  * and ... and A9
9820: 3d 41 31 30 20 61 6e 64 20 41 31 30 3d 3c 65 78  =A10 and A10=<ex
9830: 70 72 3e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  pr>..**.** If th
9840: 65 72 65 20 61 72 65 20 6d 75 6c 74 69 70 6c 65  ere are multiple
9850: 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48   terms in the WH
9860: 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ERE clause of th
9870: 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c  e form "X <op> <
9880: 65 78 70 72 3e 22 0a 2a 2a 20 74 68 65 6e 20 74  expr>".** then t
9890: 72 79 20 66 6f 72 20 74 68 65 20 6f 6e 65 20 77  ry for the one w
98a0: 69 74 68 20 6e 6f 20 64 65 70 65 6e 64 65 6e 63  ith no dependenc
98b0: 69 65 73 20 6f 6e 20 3c 65 78 70 72 3e 20 2d 20  ies on <expr> - 
98c0: 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20 77  in other words w
98d0: 68 65 72 65 0a 2a 2a 20 3c 65 78 70 72 3e 20 69  here.** <expr> i
98e0: 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70  s a constant exp
98f0: 72 65 73 73 69 6f 6e 20 6f 66 20 73 6f 6d 65 20  ression of some 
9900: 6b 69 6e 64 2e 20 20 4f 6e 6c 79 20 72 65 74 75  kind.  Only retu
9910: 72 6e 20 65 6e 74 72 69 65 73 20 6f 66 0a 2a 2a  rn entries of.**
9920: 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70   the form "X <op
9930: 3e 20 59 22 20 77 68 65 72 65 20 59 20 69 73 20  > Y" where Y is 
9940: 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 6e 6f 74  a column in anot
9950: 68 65 72 20 74 61 62 6c 65 20 69 66 20 6e 6f 20  her table if no 
9960: 74 65 72 6d 73 20 6f 66 0a 2a 2a 20 74 68 65 20  terms of.** the 
9970: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 63 6f  form "X <op> <co
9980: 6e 73 74 2d 65 78 70 72 3e 22 20 65 78 69 73 74  nst-expr>" exist
9990: 2e 20 20 20 49 66 20 6e 6f 20 74 65 72 6d 73 20  .   If no terms 
99a0: 77 69 74 68 20 61 20 63 6f 6e 73 74 61 6e 74 20  with a constant 
99b0: 52 48 53 0a 2a 2a 20 65 78 69 73 74 2c 20 74 72  RHS.** exist, tr
99c0: 79 20 74 6f 20 72 65 74 75 72 6e 20 61 20 74 65  y to return a te
99d0: 72 6d 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  rm that does not
99e0: 20 75 73 65 20 57 4f 5f 45 51 55 49 56 2e 0a 2a   use WO_EQUIV..*
99f0: 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 54 65  /.static WhereTe
9a00: 72 6d 20 2a 66 69 6e 64 54 65 72 6d 28 0a 20 20  rm *findTerm(.  
9a10: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
9a20: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45  ,     /* The WHE
9a30: 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20  RE clause to be 
9a40: 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 69 6e  searched */.  in
9a50: 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20  t iCur,         
9a60: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
9a70: 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20  mber of LHS */. 
9a80: 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20   int iColumn,   
9a90: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
9aa0: 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a   number of LHS *
9ab0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
9ac0: 65 61 64 79 2c 20 20 20 20 20 2f 2a 20 52 48 53  eady,     /* RHS
9ad0: 20 6d 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61   must not overla
9ae0: 70 20 77 69 74 68 20 74 68 69 73 20 6d 61 73 6b  p with this mask
9af0: 20 2a 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20 20   */.  u32 op,   
9b00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
9b10: 61 73 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61 6c  ask of WO_xx val
9b20: 75 65 73 20 64 65 73 63 72 69 62 69 6e 67 20 6f  ues describing o
9b30: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e 64  perator */.  Ind
9b40: 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20  ex *pIdx        
9b50: 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f     /* Must be co
9b60: 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68  mpatible with th
9b70: 69 73 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74  is index, if not
9b80: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68   NULL */.){.  Wh
9b90: 65 72 65 54 65 72 6d 20 2a 70 52 65 73 75 6c 74  ereTerm *pResult
9ba0: 20 3d 20 30 3b 0a 20 20 57 68 65 72 65 54 65 72   = 0;.  WhereTer
9bb0: 6d 20 2a 70 3b 0a 20 20 57 68 65 72 65 53 63 61  m *p;.  WhereSca
9bc0: 6e 20 73 63 61 6e 3b 0a 0a 20 20 70 20 3d 20 77  n scan;..  p = w
9bd0: 68 65 72 65 53 63 61 6e 49 6e 69 74 28 26 73 63  hereScanInit(&sc
9be0: 61 6e 2c 20 70 57 43 2c 20 69 43 75 72 2c 20 69  an, pWC, iCur, i
9bf0: 43 6f 6c 75 6d 6e 2c 20 6f 70 2c 20 70 49 64 78  Column, op, pIdx
9c00: 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  );.  while( p ){
9c10: 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65  .    if( (p->pre
9c20: 72 65 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65  reqRight & notRe
9c30: 61 64 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ady)==0 ){.     
9c40: 20 69 66 28 20 70 2d 3e 70 72 65 72 65 71 52 69   if( p->prereqRi
9c50: 67 68 74 3d 3d 30 20 26 26 20 28 70 2d 3e 65 4f  ght==0 && (p->eO
9c60: 70 65 72 61 74 6f 72 26 57 4f 5f 45 51 29 21 3d  perator&WO_EQ)!=
9c70: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
9c80: 75 72 6e 20 70 3b 0a 20 20 20 20 20 20 7d 0a 20  urn p;.      }. 
9c90: 20 20 20 20 20 69 66 28 20 70 52 65 73 75 6c 74       if( pResult
9ca0: 3d 3d 30 20 29 20 70 52 65 73 75 6c 74 20 3d 20  ==0 ) pResult = 
9cb0: 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d  p;.    }.    p =
9cc0: 20 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28 26   whereScanNext(&
9cd0: 73 63 61 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74  scan);.  }.  ret
9ce0: 75 72 6e 20 70 52 65 73 75 6c 74 3b 0a 7d 0a 0a  urn pResult;.}..
9cf0: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
9d00: 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76  ence */.static v
9d10: 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 28  oid exprAnalyze(
9d20: 53 72 63 4c 69 73 74 2a 2c 20 57 68 65 72 65 43  SrcList*, WhereC
9d30: 6c 61 75 73 65 2a 2c 20 69 6e 74 29 3b 0a 0a 2f  lause*, int);../
9d40: 2a 0a 2a 2a 20 43 61 6c 6c 20 65 78 70 72 41 6e  *.** Call exprAn
9d50: 61 6c 79 7a 65 20 6f 6e 20 61 6c 6c 20 74 65 72  alyze on all ter
9d60: 6d 73 20 69 6e 20 61 20 57 48 45 52 45 20 63 6c  ms in a WHERE cl
9d70: 61 75 73 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69  ause.  .*/.stati
9d80: 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79  c void exprAnaly
9d90: 7a 65 41 6c 6c 28 0a 20 20 53 72 63 4c 69 73 74  zeAll(.  SrcList
9da0: 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20   *pTabList,     
9db0: 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    /* the FROM cl
9dc0: 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  ause */.  WhereC
9dd0: 6c 61 75 73 65 20 2a 70 57 43 20 20 20 20 20 20  lause *pWC      
9de0: 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20     /* the WHERE 
9df0: 63 6c 61 75 73 65 20 74 6f 20 62 65 20 61 6e 61  clause to be ana
9e00: 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e  lyzed */.){.  in
9e10: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43  t i;.  for(i=pWC
9e20: 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b  ->nTerm-1; i>=0;
9e30: 20 69 2d 2d 29 7b 0a 20 20 20 20 65 78 70 72 41   i--){.    exprA
9e40: 6e 61 6c 79 7a 65 28 70 54 61 62 4c 69 73 74 2c  nalyze(pTabList,
9e50: 20 70 57 43 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a   pWC, i);.  }.}.
9e60: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9e70: 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49  OMIT_LIKE_OPTIMI
9e80: 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68 65  ZATION./*.** Che
9e90: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
9ea0: 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
9eb0: 6e 20 69 73 20 61 20 4c 49 4b 45 20 6f 72 20 47  n is a LIKE or G
9ec0: 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 74 68 61  LOB operator tha
9ed0: 74 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 70 74 69  t.** can be opti
9ee0: 6d 69 7a 65 64 20 75 73 69 6e 67 20 69 6e 65 71  mized using ineq
9ef0: 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
9f00: 74 73 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  ts.  Return TRUE
9f10: 20 69 66 20 69 74 20 69 73 0a 2a 2a 20 73 6f 20   if it is.** so 
9f20: 61 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74  and false if not
9f30: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72  ..**.** In order
9f40: 20 66 6f 72 20 74 68 65 20 6f 70 65 72 61 74 6f   for the operato
9f50: 72 20 74 6f 20 62 65 20 6f 70 74 69 6d 69 7a 69  r to be optimizi
9f60: 62 6c 65 2c 20 74 68 65 20 52 48 53 20 6d 75 73  ble, the RHS mus
9f70: 74 20 62 65 20 61 20 73 74 72 69 6e 67 0a 2a 2a  t be a string.**
9f80: 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20 64 6f   literal that do
9f90: 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74  es not begin wit
9fa0: 68 20 61 20 77 69 6c 64 63 61 72 64 2e 20 20 0a  h a wildcard.  .
9fb0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  */.static int is
9fc0: 4c 69 6b 65 4f 72 47 6c 6f 62 28 0a 20 20 50 61  LikeOrGlob(.  Pa
9fd0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
9fe0: 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
9ff0: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
a000: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
a010: 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a   *pExpr,      /*
a020: 20 54 65 73 74 20 74 68 69 73 20 65 78 70 72 65   Test this expre
a030: 73 73 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20  ssion */.  Expr 
a040: 2a 2a 70 70 50 72 65 66 69 78 2c 20 20 2f 2a 20  **ppPrefix,  /* 
a050: 50 6f 69 6e 74 65 72 20 74 6f 20 54 4b 5f 53 54  Pointer to TK_ST
a060: 52 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 20  RING expression 
a070: 77 69 74 68 20 70 61 74 74 65 72 6e 20 70 72 65  with pattern pre
a080: 66 69 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69  fix */.  int *pi
a090: 73 43 6f 6d 70 6c 65 74 65 2c 20 2f 2a 20 54 72  sComplete, /* Tr
a0a0: 75 65 20 69 66 20 74 68 65 20 6f 6e 6c 79 20 77  ue if the only w
a0b0: 69 6c 64 63 61 72 64 20 69 73 20 25 20 69 6e 20  ildcard is % in 
a0c0: 74 68 65 20 6c 61 73 74 20 63 68 61 72 61 63 74  the last charact
a0d0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 6f  er */.  int *pno
a0e0: 43 61 73 65 20 20 20 20 20 20 2f 2a 20 54 72 75  Case      /* Tru
a0f0: 65 20 69 66 20 75 70 70 65 72 63 61 73 65 20 69  e if uppercase i
a100: 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
a110: 6c 6f 77 65 72 63 61 73 65 20 2a 2f 0a 29 7b 0a  lowercase */.){.
a120: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
a130: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
a140: 53 74 72 69 6e 67 20 6f 6e 20 52 48 53 20 6f 66  String on RHS of
a150: 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a   LIKE operator *
a160: 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74  /.  Expr *pRight
a170: 2c 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 2f  , *pLeft;      /
a180: 2a 20 52 69 67 68 74 20 61 6e 64 20 6c 65 66 74  * Right and left
a190: 20 73 69 7a 65 20 6f 66 20 4c 49 4b 45 20 6f 70   size of LIKE op
a1a0: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72  erator */.  Expr
a1b0: 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20  List *pList;    
a1c0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
a1d0: 66 20 6f 70 65 72 61 6e 64 73 20 74 6f 20 74 68  f operands to th
a1e0: 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20  e LIKE operator 
a1f0: 2a 2f 0a 20 20 69 6e 74 20 63 3b 20 20 20 20 20  */.  int c;     
a200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a210: 2f 2a 20 4f 6e 65 20 63 68 61 72 61 63 74 65 72  /* One character
a220: 20 69 6e 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e 74   in z[] */.  int
a230: 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20   cnt;           
a240: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
a250: 72 20 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63 61 72  r of non-wildcar
a260: 64 20 70 72 65 66 69 78 20 63 68 61 72 61 63 74  d prefix charact
a270: 65 72 73 20 2a 2f 0a 20 20 63 68 61 72 20 77 63  ers */.  char wc
a280: 5b 33 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  [3];            
a290: 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20      /* Wildcard 
a2a0: 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20  characters */.  
a2b0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
a2c0: 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61  arse->db;  /* Da
a2d0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
a2e0: 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  n */.  sqlite3_v
a2f0: 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 0a  alue *pVal = 0;.
a300: 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20    int op;       
a310: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a320: 4f 70 63 6f 64 65 20 6f 66 20 70 52 69 67 68 74  Opcode of pRight
a330: 20 2a 2f 0a 0a 20 20 69 66 28 20 21 73 71 6c 69   */..  if( !sqli
a340: 74 65 33 49 73 4c 69 6b 65 46 75 6e 63 74 69 6f  te3IsLikeFunctio
a350: 6e 28 64 62 2c 20 70 45 78 70 72 2c 20 70 6e 6f  n(db, pExpr, pno
a360: 43 61 73 65 2c 20 77 63 29 20 29 7b 0a 20 20 20  Case, wc) ){.   
a370: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23   return 0;.  }.#
a380: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 42 43  ifdef SQLITE_EBC
a390: 44 49 43 0a 20 20 69 66 28 20 2a 70 6e 6f 43 61  DIC.  if( *pnoCa
a3a0: 73 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23  se ) return 0;.#
a3b0: 65 6e 64 69 66 0a 20 20 70 4c 69 73 74 20 3d 20  endif.  pList = 
a3c0: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
a3d0: 20 20 70 4c 65 66 74 20 3d 20 70 4c 69 73 74 2d    pLeft = pList-
a3e0: 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 69  >a[1].pExpr;.  i
a3f0: 66 28 20 70 4c 65 66 74 2d 3e 6f 70 21 3d 54 4b  f( pLeft->op!=TK
a400: 5f 43 4f 4c 55 4d 4e 20 0a 20 20 20 7c 7c 20 73  _COLUMN .   || s
a410: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
a420: 74 79 28 70 4c 65 66 74 29 21 3d 53 51 4c 49 54  ty(pLeft)!=SQLIT
a430: 45 5f 41 46 46 5f 54 45 58 54 20 0a 20 20 20 7c  E_AFF_TEXT .   |
a440: 7c 20 49 73 56 69 72 74 75 61 6c 28 70 4c 65 66  | IsVirtual(pLef
a450: 74 2d 3e 70 54 61 62 29 0a 20 20 29 7b 0a 20 20  t->pTab).  ){.  
a460: 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 32 30 36    /* IMP: R-0206
a470: 35 2d 34 39 34 36 35 20 54 68 65 20 6c 65 66 74  5-49465 The left
a480: 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68  -hand side of th
a490: 65 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20 6f  e LIKE or GLOB o
a4a0: 70 65 72 61 74 6f 72 20 6d 75 73 74 0a 20 20 20  perator must.   
a4b0: 20 2a 2a 20 62 65 20 74 68 65 20 6e 61 6d 65 20   ** be the name 
a4c0: 6f 66 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f  of an indexed co
a4d0: 6c 75 6d 6e 20 77 69 74 68 20 54 45 58 54 20 61  lumn with TEXT a
a4e0: 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20  ffinity. */.    
a4f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
a500: 61 73 73 65 72 74 28 20 70 4c 65 66 74 2d 3e 69  assert( pLeft->i
a510: 43 6f 6c 75 6d 6e 21 3d 28 2d 31 29 20 29 3b 20  Column!=(-1) ); 
a520: 2f 2a 20 42 65 63 61 75 73 65 20 49 50 4b 20 6e  /* Because IPK n
a530: 65 76 65 72 20 68 61 73 20 41 46 46 5f 54 45 58  ever has AFF_TEX
a540: 54 20 2a 2f 0a 0a 20 20 70 52 69 67 68 74 20 3d  T */..  pRight =
a550: 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78   pList->a[0].pEx
a560: 70 72 3b 0a 20 20 6f 70 20 3d 20 70 52 69 67 68  pr;.  op = pRigh
a570: 74 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d  t->op;.  if( op=
a580: 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 7b 0a  =TK_REGISTER ){.
a590: 20 20 20 20 6f 70 20 3d 20 70 52 69 67 68 74 2d      op = pRight-
a5a0: 3e 6f 70 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20  >op2;.  }.  if( 
a5b0: 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20  op==TK_VARIABLE 
a5c0: 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 70 52 65  ){.    Vdbe *pRe
a5d0: 70 72 65 70 61 72 65 20 3d 20 70 50 61 72 73 65  prepare = pParse
a5e0: 2d 3e 70 52 65 70 72 65 70 61 72 65 3b 0a 20 20  ->pReprepare;.  
a5f0: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 52 69    int iCol = pRi
a600: 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  ght->iColumn;.  
a610: 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33    pVal = sqlite3
a620: 56 64 62 65 47 65 74 42 6f 75 6e 64 56 61 6c 75  VdbeGetBoundValu
a630: 65 28 70 52 65 70 72 65 70 61 72 65 2c 20 69 43  e(pReprepare, iC
a640: 6f 6c 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ol, SQLITE_AFF_N
a650: 4f 4e 45 29 3b 0a 20 20 20 20 69 66 28 20 70 56  ONE);.    if( pV
a660: 61 6c 20 26 26 20 73 71 6c 69 74 65 33 5f 76 61  al && sqlite3_va
a670: 6c 75 65 5f 74 79 70 65 28 70 56 61 6c 29 3d 3d  lue_type(pVal)==
a680: 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20  SQLITE_TEXT ){. 
a690: 20 20 20 20 20 7a 20 3d 20 28 63 68 61 72 20 2a       z = (char *
a6a0: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
a6b0: 65 78 74 28 70 56 61 6c 29 3b 0a 20 20 20 20 7d  ext(pVal);.    }
a6c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
a6d0: 53 65 74 56 61 72 6d 61 73 6b 28 70 50 61 72 73  SetVarmask(pPars
a6e0: 65 2d 3e 70 56 64 62 65 2c 20 69 43 6f 6c 29 3b  e->pVdbe, iCol);
a6f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52 69  .    assert( pRi
a700: 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49  ght->op==TK_VARI
a710: 41 42 4c 45 20 7c 7c 20 70 52 69 67 68 74 2d 3e  ABLE || pRight->
a720: 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
a730: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  );.  }else if( o
a740: 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a  p==TK_STRING ){.
a750: 20 20 20 20 7a 20 3d 20 70 52 69 67 68 74 2d 3e      z = pRight->
a760: 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 7d 0a 20 20  u.zToken;.  }.  
a770: 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 63 6e 74  if( z ){.    cnt
a780: 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 0;.    while(
a790: 20 28 63 3d 7a 5b 63 6e 74 5d 29 21 3d 30 20 26   (c=z[cnt])!=0 &
a7a0: 26 20 63 21 3d 77 63 5b 30 5d 20 26 26 20 63 21  & c!=wc[0] && c!
a7b0: 3d 77 63 5b 31 5d 20 26 26 20 63 21 3d 77 63 5b  =wc[1] && c!=wc[
a7c0: 32 5d 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b  2] ){.      cnt+
a7d0: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  +;.    }.    if(
a7e0: 20 63 6e 74 21 3d 30 20 26 26 20 32 35 35 21 3d   cnt!=0 && 255!=
a7f0: 28 75 38 29 7a 5b 63 6e 74 2d 31 5d 20 29 7b 0a  (u8)z[cnt-1] ){.
a800: 20 20 20 20 20 20 45 78 70 72 20 2a 70 50 72 65        Expr *pPre
a810: 66 69 78 3b 0a 20 20 20 20 20 20 2a 70 69 73 43  fix;.      *pisC
a820: 6f 6d 70 6c 65 74 65 20 3d 20 63 3d 3d 77 63 5b  omplete = c==wc[
a830: 30 5d 20 26 26 20 7a 5b 63 6e 74 2b 31 5d 3d 3d  0] && z[cnt+1]==
a840: 30 3b 0a 20 20 20 20 20 20 70 50 72 65 66 69 78  0;.      pPrefix
a850: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64   = sqlite3Expr(d
a860: 62 2c 20 54 4b 5f 53 54 52 49 4e 47 2c 20 7a 29  b, TK_STRING, z)
a870: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65  ;.      if( pPre
a880: 66 69 78 20 29 20 70 50 72 65 66 69 78 2d 3e 75  fix ) pPrefix->u
a890: 2e 7a 54 6f 6b 65 6e 5b 63 6e 74 5d 20 3d 20 30  .zToken[cnt] = 0
a8a0: 3b 0a 20 20 20 20 20 20 2a 70 70 50 72 65 66 69  ;.      *ppPrefi
a8b0: 78 20 3d 20 70 50 72 65 66 69 78 3b 0a 20 20 20  x = pPrefix;.   
a8c0: 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 56 41     if( op==TK_VA
a8d0: 52 49 41 42 4c 45 20 29 7b 0a 20 20 20 20 20 20  RIABLE ){.      
a8e0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
a8f0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 20  se->pVdbe;.     
a900: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
a910: 74 56 61 72 6d 61 73 6b 28 76 2c 20 70 52 69 67  tVarmask(v, pRig
a920: 68 74 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20  ht->iColumn);.  
a930: 20 20 20 20 20 20 69 66 28 20 2a 70 69 73 43 6f        if( *pisCo
a940: 6d 70 6c 65 74 65 20 26 26 20 70 52 69 67 68 74  mplete && pRight
a950: 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 20 29 7b  ->u.zToken[1] ){
a960: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
a970: 20 74 68 65 20 72 68 73 20 6f 66 20 74 68 65 20   the rhs of the 
a980: 4c 49 4b 45 20 65 78 70 72 65 73 73 69 6f 6e 20  LIKE expression 
a990: 69 73 20 61 20 76 61 72 69 61 62 6c 65 2c 20 61  is a variable, a
a9a0: 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20  nd the current. 
a9b0: 20 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75           ** valu
a9c0: 65 20 6f 66 20 74 68 65 20 76 61 72 69 61 62 6c  e of the variabl
a9d0: 65 20 6d 65 61 6e 73 20 74 68 65 72 65 20 69 73  e means there is
a9e0: 20 6e 6f 20 6e 65 65 64 20 74 6f 20 69 6e 76 6f   no need to invo
a9f0: 6b 65 20 74 68 65 20 4c 49 4b 45 0a 20 20 20 20  ke the LIKE.    
aa00: 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
aa10: 6e 2c 20 74 68 65 6e 20 6e 6f 20 4f 50 5f 56 61  n, then no OP_Va
aa20: 72 69 61 62 6c 65 20 77 69 6c 6c 20 62 65 20 61  riable will be a
aa30: 64 64 65 64 20 74 6f 20 74 68 65 20 70 72 6f 67  dded to the prog
aa40: 72 61 6d 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ram..          *
aa50: 2a 20 54 68 69 73 20 63 61 75 73 65 73 20 70 72  * This causes pr
aa60: 6f 62 6c 65 6d 73 20 66 6f 72 20 74 68 65 20 73  oblems for the s
aa70: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61  qlite3_bind_para
aa80: 6d 65 74 65 72 5f 6e 61 6d 65 28 29 0a 20 20 20  meter_name().   
aa90: 20 20 20 20 20 20 20 2a 2a 20 41 50 49 2e 20 54         ** API. T
aaa0: 6f 20 77 6f 72 6b 61 72 6f 75 6e 64 20 74 68 65  o workaround the
aab0: 6d 2c 20 61 64 64 20 61 20 64 75 6d 6d 79 20 4f  m, add a dummy O
aac0: 50 5f 56 61 72 69 61 62 6c 65 20 68 65 72 65 2e  P_Variable here.
aad0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 20 0a 20  .          */ . 
aae0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20           int r1 
aaf0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
ab00: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
ab10: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
ab20: 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
ab30: 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72 31 29  rse, pRight, r1)
ab40: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
ab50: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
ab60: 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  v, sqlite3VdbeCu
ab70: 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31 2c 20  rrentAddr(v)-1, 
ab80: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  0);.          sq
ab90: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
aba0: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
abb0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
abc0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
abd0: 20 20 20 20 7a 20 3d 20 30 3b 0a 20 20 20 20 7d      z = 0;.    }
abe0: 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56  .  }..  sqlite3V
abf0: 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a  alueFree(pVal);.
ac00: 20 20 72 65 74 75 72 6e 20 28 7a 21 3d 30 29 3b    return (z!=0);
ac10: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
ac20: 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50  ITE_OMIT_LIKE_OP
ac30: 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 0a  TIMIZATION */...
ac40: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ac50: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
ac60: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
ac70: 73 65 65 20 69 66 20 74 68 65 20 67 69 76 65 6e  see if the given
ac80: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f   expression is o
ac90: 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a  f the form.**.**
aca0: 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20           column 
acb0: 4d 41 54 43 48 20 65 78 70 72 0a 2a 2a 0a 2a 2a  MATCH expr.**.**
acc0: 20 49 66 20 69 74 20 69 73 20 74 68 65 6e 20 72   If it is then r
acd0: 65 74 75 72 6e 20 54 52 55 45 2e 20 20 49 66 20  eturn TRUE.  If 
ace0: 6e 6f 74 2c 20 72 65 74 75 72 6e 20 46 41 4c 53  not, return FALS
acf0: 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  E..*/.static int
ad00: 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e   isMatchOfColumn
ad10: 28 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20  (.  Expr *pExpr 
ad20: 20 20 20 20 20 2f 2a 20 54 65 73 74 20 74 68 69       /* Test thi
ad30: 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  s expression */.
ad40: 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
ad50: 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 45 78  List;..  if( pEx
ad60: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43 54  pr->op!=TK_FUNCT
ad70: 49 4f 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ION ){.    retur
ad80: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  n 0;.  }.  if( s
ad90: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 45  qlite3StrICmp(pE
ada0: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 6d  xpr->u.zToken,"m
adb0: 61 74 63 68 22 29 21 3d 30 20 29 7b 0a 20 20 20  atch")!=0 ){.   
adc0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
add0: 20 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e   pList = pExpr->
ade0: 78 2e 70 4c 69 73 74 3b 0a 20 20 69 66 28 20 70  x.pList;.  if( p
adf0: 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 32 20 29  List->nExpr!=2 )
ae00: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
ae10: 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d    }.  if( pList-
ae20: 3e 61 5b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 20  >a[1].pExpr->op 
ae30: 21 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  != TK_COLUMN ){.
ae40: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
ae50: 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
ae60: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
ae70: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
ae80: 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  LE */../*.** If 
ae90: 74 68 65 20 70 42 61 73 65 20 65 78 70 72 65 73  the pBase expres
aea0: 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65 64 20  sion originated 
aeb0: 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  in the ON or USI
aec0: 4e 47 20 63 6c 61 75 73 65 20 6f 66 0a 2a 2a 20  NG clause of.** 
aed0: 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 72 61  a join, then tra
aee0: 6e 73 66 65 72 20 74 68 65 20 61 70 70 72 6f 70  nsfer the approp
aef0: 72 69 61 74 65 20 6d 61 72 6b 69 6e 67 73 20 6f  riate markings o
af00: 76 65 72 20 74 6f 20 64 65 72 69 76 65 64 2e 0a  ver to derived..
af10: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  */.static void t
af20: 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69  ransferJoinMarki
af30: 6e 67 73 28 45 78 70 72 20 2a 70 44 65 72 69 76  ngs(Expr *pDeriv
af40: 65 64 2c 20 45 78 70 72 20 2a 70 42 61 73 65 29  ed, Expr *pBase)
af50: 7b 0a 20 20 69 66 28 20 70 44 65 72 69 76 65 64  {.  if( pDerived
af60: 20 29 7b 0a 20 20 20 20 70 44 65 72 69 76 65 64   ){.    pDerived
af70: 2d 3e 66 6c 61 67 73 20 7c 3d 20 70 42 61 73 65  ->flags |= pBase
af80: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 46 72 6f  ->flags & EP_Fro
af90: 6d 4a 6f 69 6e 3b 0a 20 20 20 20 70 44 65 72 69  mJoin;.    pDeri
afa0: 76 65 64 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54  ved->iRightJoinT
afb0: 61 62 6c 65 20 3d 20 70 42 61 73 65 2d 3e 69 52  able = pBase->iR
afc0: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a 20  ightJoinTable;. 
afd0: 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e   }.}..#if !defin
afe0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f  ed(SQLITE_OMIT_O
aff0: 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20  R_OPTIMIZATION) 
b000: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
b010: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
b020: 29 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20  )./*.** Analyze 
b030: 61 20 74 65 72 6d 20 74 68 61 74 20 63 6f 6e 73  a term that cons
b040: 69 73 74 73 20 6f 66 20 74 77 6f 20 6f 72 20 6d  ists of two or m
b050: 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64  ore OR-connected
b060: 0a 2a 2a 20 73 75 62 74 65 72 6d 73 2e 20 20 53  .** subterms.  S
b070: 6f 20 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  o in:.**.**     
b080: 2e 2e 2e 20 57 48 45 52 45 20 20 28 61 3d 35 29  ... WHERE  (a=5)
b090: 20 41 4e 44 20 28 62 3d 37 20 4f 52 20 63 3d 39   AND (b=7 OR c=9
b0a0: 20 4f 52 20 64 3d 31 33 29 20 41 4e 44 20 28 64   OR d=13) AND (d
b0b0: 3d 31 33 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  =13).**         
b0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0d0: 20 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e   ^^^^^^^^^^^^^^^
b0e0: 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ^^^^^.**.** This
b0f0: 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65   routine analyze
b100: 73 20 74 65 72 6d 73 20 73 75 63 68 20 61 73 20  s terms such as 
b110: 74 68 65 20 6d 69 64 64 6c 65 20 74 65 72 6d 20  the middle term 
b120: 69 6e 20 74 68 65 20 61 62 6f 76 65 20 65 78 61  in the above exa
b130: 6d 70 6c 65 2e 0a 2a 2a 20 41 20 57 68 65 72 65  mple..** A Where
b140: 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74 20 69 73  OrTerm object is
b150: 20 63 6f 6d 70 75 74 65 64 20 61 6e 64 20 61 74   computed and at
b160: 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 74 65  tached to the te
b170: 72 6d 20 75 6e 64 65 72 0a 2a 2a 20 61 6e 61 6c  rm under.** anal
b180: 79 73 69 73 2c 20 72 65 67 61 72 64 6c 65 73 73  ysis, regardless
b190: 20 6f 66 20 74 68 65 20 6f 75 74 63 6f 6d 65 20   of the outcome 
b1a0: 6f 66 20 74 68 65 20 61 6e 61 6c 79 73 69 73 2e  of the analysis.
b1b0: 20 20 48 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20 20    Hence:.**.**  
b1c0: 20 20 20 57 68 65 72 65 54 65 72 6d 2e 77 74 46     WhereTerm.wtF
b1d0: 6c 61 67 73 20 20 20 7c 3d 20 20 54 45 52 4d 5f  lags   |=  TERM_
b1e0: 4f 52 49 4e 46 4f 0a 2a 2a 20 20 20 20 20 57 68  ORINFO.**     Wh
b1f0: 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66  ereTerm.u.pOrInf
b200: 6f 20 20 3d 20 20 61 20 64 79 6e 61 6d 69 63 61  o  =  a dynamica
b210: 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 57 68  lly allocated Wh
b220: 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74  ereOrTerm object
b230: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 20  .**.** The term 
b240: 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 6d  being analyzed m
b250: 75 73 74 20 68 61 76 65 20 74 77 6f 20 6f 72 20  ust have two or 
b260: 6d 6f 72 65 20 6f 66 20 4f 52 2d 63 6f 6e 6e 65  more of OR-conne
b270: 63 74 65 64 20 73 75 62 74 65 72 6d 73 2e 0a 2a  cted subterms..*
b280: 2a 20 41 20 73 69 6e 67 6c 65 20 73 75 62 74 65  * A single subte
b290: 72 6d 20 6d 69 67 68 74 20 62 65 20 61 20 73 65  rm might be a se
b2a0: 74 20 6f 66 20 41 4e 44 2d 63 6f 6e 6e 65 63 74  t of AND-connect
b2b0: 65 64 20 73 75 62 2d 73 75 62 74 65 72 6d 73 2e  ed sub-subterms.
b2c0: 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 20 6f 66 20  .** Examples of 
b2d0: 74 65 72 6d 73 20 75 6e 64 65 72 20 61 6e 61 6c  terms under anal
b2e0: 79 73 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ysis:.**.**     
b2f0: 28 41 29 20 20 20 20 20 74 31 2e 78 3d 74 32 2e  (A)     t1.x=t2.
b300: 79 20 4f 52 20 74 31 2e 78 3d 74 32 2e 7a 20 4f  y OR t1.x=t2.z O
b310: 52 20 74 31 2e 79 3d 31 35 20 4f 52 20 74 31 2e  R t1.y=15 OR t1.
b320: 7a 3d 74 33 2e 61 2b 35 0a 2a 2a 20 20 20 20 20  z=t3.a+5.**     
b330: 28 42 29 20 20 20 20 20 78 3d 65 78 70 72 31 20  (B)     x=expr1 
b340: 4f 52 20 65 78 70 72 32 3d 78 20 4f 52 20 78 3d  OR expr2=x OR x=
b350: 65 78 70 72 33 0a 2a 2a 20 20 20 20 20 28 43 29  expr3.**     (C)
b360: 20 20 20 20 20 74 31 2e 78 3d 74 32 2e 79 20 4f       t1.x=t2.y O
b370: 52 20 28 74 31 2e 78 3d 74 32 2e 7a 20 41 4e 44  R (t1.x=t2.z AND
b380: 20 74 31 2e 79 3d 31 35 29 0a 2a 2a 20 20 20 20   t1.y=15).**    
b390: 20 28 44 29 20 20 20 20 20 78 3d 65 78 70 72 31   (D)     x=expr1
b3a0: 20 4f 52 20 28 79 3e 31 31 20 41 4e 44 20 79 3c   OR (y>11 AND y<
b3b0: 32 32 20 41 4e 44 20 7a 20 4c 49 4b 45 20 27 2a  22 AND z LIKE '*
b3c0: 68 65 6c 6c 6f 2a 27 29 0a 2a 2a 20 20 20 20 20  hello*').**     
b3d0: 28 45 29 20 20 20 20 20 28 70 2e 61 3d 31 20 41  (E)     (p.a=1 A
b3e0: 4e 44 20 71 2e 62 3d 32 20 41 4e 44 20 72 2e 63  ND q.b=2 AND r.c
b3f0: 3d 33 29 20 4f 52 20 28 70 2e 78 3d 34 20 41 4e  =3) OR (p.x=4 AN
b400: 44 20 71 2e 79 3d 35 20 41 4e 44 20 72 2e 7a 3d  D q.y=5 AND r.z=
b410: 36 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 31 3a  6).**.** CASE 1:
b420: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73 75  .**.** If all su
b430: 62 74 65 72 6d 73 20 61 72 65 20 6f 66 20 74 68  bterms are of th
b440: 65 20 66 6f 72 6d 20 54 2e 43 3d 65 78 70 72 20  e form T.C=expr 
b450: 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20  for some single 
b460: 63 6f 6c 75 6d 6e 20 6f 66 20 43 20 61 6e 64 0a  column of C and.
b470: 2a 2a 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  ** a single tabl
b480: 65 20 54 20 28 61 73 20 73 68 6f 77 6e 20 69 6e  e T (as shown in
b490: 20 65 78 61 6d 70 6c 65 20 42 20 61 62 6f 76 65   example B above
b4a0: 29 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  ) then create a 
b4b0: 6e 65 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74  new virtual.** t
b4c0: 65 72 6d 20 74 68 61 74 20 69 73 20 61 6e 20 65  erm that is an e
b4d0: 71 75 69 76 61 6c 65 6e 74 20 49 4e 20 65 78 70  quivalent IN exp
b4e0: 72 65 73 73 69 6f 6e 2e 20 20 49 6e 20 6f 74 68  ression.  In oth
b4f0: 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68 65  er words, if the
b500: 20 74 65 72 6d 0a 2a 2a 20 62 65 69 6e 67 20 61   term.** being a
b510: 6e 61 6c 79 7a 65 64 20 69 73 3a 0a 2a 2a 0a 2a  nalyzed is:.**.*
b520: 2a 20 20 20 20 20 20 78 20 3d 20 65 78 70 72 31  *      x = expr1
b530: 20 20 4f 52 20 20 65 78 70 72 32 20 3d 20 78 20    OR  expr2 = x 
b540: 20 4f 52 20 20 78 20 3d 20 65 78 70 72 33 0a 2a   OR  x = expr3.*
b550: 2a 0a 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65  *.** then create
b560: 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74   a new virtual t
b570: 65 72 6d 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  erm like this:.*
b580: 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28  *.**      x IN (
b590: 65 78 70 72 31 2c 65 78 70 72 32 2c 65 78 70 72  expr1,expr2,expr
b5a0: 33 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 32 3a  3).**.** CASE 2:
b5b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73 75  .**.** If all su
b5c0: 62 74 65 72 6d 73 20 61 72 65 20 69 6e 64 65 78  bterms are index
b5d0: 61 62 6c 65 20 62 79 20 61 20 73 69 6e 67 6c 65  able by a single
b5e0: 20 74 61 62 6c 65 20 54 2c 20 74 68 65 6e 20 73   table T, then s
b5f0: 65 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68 65  et.**.**     Whe
b600: 72 65 54 65 72 6d 2e 65 4f 70 65 72 61 74 6f 72  reTerm.eOperator
b610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 20                = 
b620: 20 57 4f 5f 4f 52 0a 2a 2a 20 20 20 20 20 57 68   WO_OR.**     Wh
b630: 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66  ereTerm.u.pOrInf
b640: 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 20 7c 3d  o->indexable  |=
b650: 20 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d    the cursor num
b660: 62 65 72 20 66 6f 72 20 74 61 62 6c 65 20 54 0a  ber for table T.
b670: 2a 2a 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d 20  **.** A subterm 
b680: 69 73 20 22 69 6e 64 65 78 61 62 6c 65 22 20 69  is "indexable" i
b690: 66 20 69 74 20 69 73 20 6f 66 20 74 68 65 20 66  f it is of the f
b6a0: 6f 72 6d 0a 2a 2a 20 22 54 2e 43 20 3c 6f 70 3e  orm.** "T.C <op>
b6b0: 20 3c 65 78 70 72 3e 22 20 77 68 65 72 65 20 43   <expr>" where C
b6c0: 20 69 73 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6f   is any column o
b6d0: 66 20 74 61 62 6c 65 20 54 20 61 6e 64 20 0a 2a  f table T and .*
b6e0: 2a 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66  * <op> is one of
b6f0: 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3c 3d 22 2c   "=", "<", "<=",
b700: 20 22 3e 22 2c 20 22 3e 3d 22 2c 20 22 49 53 20   ">", ">=", "IS 
b710: 4e 55 4c 4c 22 2c 20 6f 72 20 22 49 4e 22 2e 0a  NULL", or "IN"..
b720: 2a 2a 20 41 20 73 75 62 74 65 72 6d 20 69 73 20  ** A subterm is 
b730: 61 6c 73 6f 20 69 6e 64 65 78 61 62 6c 65 20 69  also indexable i
b740: 66 20 69 74 20 69 73 20 61 6e 20 41 4e 44 20 6f  f it is an AND o
b750: 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a  f two or more.**
b760: 20 73 75 62 73 75 62 74 65 72 6d 73 20 61 74 20   subsubterms at 
b770: 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 77 68 69  least one of whi
b780: 63 68 20 69 73 20 69 6e 64 65 78 61 62 6c 65 2e  ch is indexable.
b790: 20 20 49 6e 64 65 78 61 62 6c 65 20 41 4e 44 20    Indexable AND 
b7a0: 0a 2a 2a 20 73 75 62 74 65 72 6d 73 20 68 61 76  .** subterms hav
b7b0: 65 20 74 68 65 69 72 20 65 4f 70 65 72 61 74 6f  e their eOperato
b7c0: 72 20 73 65 74 20 74 6f 20 57 4f 5f 41 4e 44 20  r set to WO_AND 
b7d0: 61 6e 64 20 74 68 65 79 20 68 61 76 65 0a 2a 2a  and they have.**
b7e0: 20 75 2e 70 41 6e 64 49 6e 66 6f 20 73 65 74 20   u.pAndInfo set 
b7f0: 74 6f 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79  to a dynamically
b800: 20 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72 65   allocated Where
b810: 41 6e 64 54 65 72 6d 20 6f 62 6a 65 63 74 2e 0a  AndTerm object..
b820: 2a 2a 0a 2a 2a 20 46 72 6f 6d 20 61 6e 6f 74 68  **.** From anoth
b830: 65 72 20 70 6f 69 6e 74 20 6f 66 20 76 69 65 77  er point of view
b840: 2c 20 22 69 6e 64 65 78 61 62 6c 65 22 20 6d 65  , "indexable" me
b850: 61 6e 73 20 74 68 61 74 20 74 68 65 20 73 75 62  ans that the sub
b860: 74 65 72 6d 20 63 6f 75 6c 64 0a 2a 2a 20 70 6f  term could.** po
b870: 74 65 6e 74 69 61 6c 6c 79 20 62 65 20 75 73 65  tentially be use
b880: 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20  d with an index 
b890: 69 66 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  if an appropriat
b8a0: 65 20 69 6e 64 65 78 20 65 78 69 73 74 73 2e 0a  e index exists..
b8b0: 2a 2a 20 54 68 69 73 20 61 6e 61 6c 79 73 69 73  ** This analysis
b8c0: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 73 69 64   does not consid
b8d0: 65 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  er whether or no
b8e0: 74 20 74 68 65 20 69 6e 64 65 78 20 65 78 69 73  t the index exis
b8f0: 74 73 3b 20 74 68 61 74 0a 2a 2a 20 69 73 20 64  ts; that.** is d
b900: 65 63 69 64 65 64 20 65 6c 73 65 77 68 65 72 65  ecided elsewhere
b910: 2e 20 20 54 68 69 73 20 61 6e 61 6c 79 73 69 73  .  This analysis
b920: 20 6f 6e 6c 79 20 6c 6f 6f 6b 73 20 61 74 20 77   only looks at w
b930: 68 65 74 68 65 72 20 73 75 62 74 65 72 6d 73 0a  hether subterms.
b940: 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  ** appropriate f
b950: 6f 72 20 69 6e 64 65 78 69 6e 67 20 65 78 69 73  or indexing exis
b960: 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 65 78 61  t..**.** All exa
b970: 6d 70 6c 65 73 20 41 20 74 68 72 6f 75 67 68 20  mples A through 
b980: 45 20 61 62 6f 76 65 20 73 61 74 69 73 66 79 20  E above satisfy 
b990: 63 61 73 65 20 32 2e 20 20 42 75 74 20 69 66 20  case 2.  But if 
b9a0: 61 20 74 65 72 6d 0a 2a 2a 20 61 6c 73 6f 20 73  a term.** also s
b9b0: 74 61 74 69 73 66 69 65 73 20 63 61 73 65 20 31  tatisfies case 1
b9c0: 20 28 73 75 63 68 20 61 73 20 42 29 20 77 65 20   (such as B) we 
b9d0: 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 70  know that the op
b9e0: 74 69 6d 69 7a 65 72 20 77 69 6c 6c 0a 2a 2a 20  timizer will.** 
b9f0: 61 6c 77 61 79 73 20 70 72 65 66 65 72 20 63 61  always prefer ca
ba00: 73 65 20 31 2c 20 73 6f 20 69 6e 20 74 68 61 74  se 1, so in that
ba10: 20 63 61 73 65 20 77 65 20 70 72 65 74 65 6e 64   case we pretend
ba20: 20 74 68 61 74 20 63 61 73 65 20 32 20 69 73 20   that case 2 is 
ba30: 6e 6f 74 0a 2a 2a 20 73 61 74 69 73 66 69 65 64  not.** satisfied
ba40: 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 6d 69 67 68 74  ..**.** It might
ba50: 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61   be the case tha
ba60: 74 20 6d 75 6c 74 69 70 6c 65 20 74 61 62 6c 65  t multiple table
ba70: 73 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65 2e  s are indexable.
ba80: 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a    For example,.*
ba90: 2a 20 28 45 29 20 61 62 6f 76 65 20 69 73 20 69  * (E) above is i
baa0: 6e 64 65 78 61 62 6c 65 20 6f 6e 20 74 61 62 6c  ndexable on tabl
bab0: 65 73 20 50 2c 20 51 2c 20 61 6e 64 20 52 2e 0a  es P, Q, and R..
bac0: 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 74 68 61 74  **.** Terms that
bad0: 20 73 61 74 69 73 66 79 20 63 61 73 65 20 32 20   satisfy case 2 
bae0: 61 72 65 20 63 61 6e 64 69 64 61 74 65 73 20 66  are candidates f
baf0: 6f 72 20 6c 6f 6f 6b 75 70 20 62 79 20 75 73 69  or lookup by usi
bb00: 6e 67 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 69  ng.** separate i
bb10: 6e 64 69 63 65 73 20 74 6f 20 66 69 6e 64 20 72  ndices to find r
bb20: 6f 77 69 64 73 20 66 6f 72 20 65 61 63 68 20 73  owids for each s
bb30: 75 62 74 65 72 6d 20 61 6e 64 20 63 6f 6d 70 6f  ubterm and compo
bb40: 73 69 6e 67 0a 2a 2a 20 74 68 65 20 75 6e 69 6f  sing.** the unio
bb50: 6e 20 6f 66 20 61 6c 6c 20 72 6f 77 69 64 73 20  n of all rowids 
bb60: 75 73 69 6e 67 20 61 20 52 6f 77 53 65 74 20 6f  using a RowSet o
bb70: 62 6a 65 63 74 2e 20 20 54 68 69 73 20 69 73 20  bject.  This is 
bb80: 73 69 6d 69 6c 61 72 0a 2a 2a 20 74 6f 20 22 62  similar.** to "b
bb90: 69 74 6d 61 70 20 69 6e 64 69 63 65 73 22 20 69  itmap indices" i
bba0: 6e 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  n other database
bbb0: 20 65 6e 67 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20   engines..**.** 
bbc0: 4f 54 48 45 52 57 49 53 45 3a 0a 2a 2a 0a 2a 2a  OTHERWISE:.**.**
bbd0: 20 49 66 20 6e 65 69 74 68 65 72 20 63 61 73 65   If neither case
bbe0: 20 31 20 6e 6f 72 20 63 61 73 65 20 32 20 61 70   1 nor case 2 ap
bbf0: 70 6c 79 2c 20 74 68 65 6e 20 6c 65 61 76 65 20  ply, then leave 
bc00: 74 68 65 20 65 4f 70 65 72 61 74 6f 72 20 73 65  the eOperator se
bc10: 74 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 20 20 54  t to.** zero.  T
bc20: 68 69 73 20 74 65 72 6d 20 69 73 20 6e 6f 74 20  his term is not 
bc30: 75 73 65 66 75 6c 20 66 6f 72 20 73 65 61 72 63  useful for searc
bc40: 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  h..*/.static voi
bc50: 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72 54  d exprAnalyzeOrT
bc60: 65 72 6d 28 0a 20 20 53 72 63 4c 69 73 74 20 2a  erm(.  SrcList *
bc70: 70 53 72 63 2c 20 20 20 20 20 20 20 20 20 20 20  pSrc,           
bc80: 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   /* the FROM cla
bc90: 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  use */.  WhereCl
bca0: 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
bcb0: 20 20 20 2f 2a 20 74 68 65 20 63 6f 6d 70 6c 65     /* the comple
bcc0: 74 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  te WHERE clause 
bcd0: 2a 2f 0a 20 20 69 6e 74 20 69 64 78 54 65 72 6d  */.  int idxTerm
bce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bcf0: 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 4f  * Index of the O
bd00: 52 2d 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61  R-term to be ana
bd10: 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57 68  lyzed */.){.  Wh
bd20: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20  ereInfo *pWInfo 
bd30: 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 20 20  = pWC->pWInfo;  
bd40: 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63        /* WHERE c
bd50: 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
bd60: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61   context */.  Pa
bd70: 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
bd80: 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20 20  Info->pParse;   
bd90: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
bda0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c  context */.  sql
bdb0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
bdc0: 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20  e->db;          
bdd0: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
bde0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
bdf0: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
be00: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
be10: 65 72 6d 5d 3b 20 20 20 20 2f 2a 20 54 68 65 20  erm];    /* The 
be20: 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79  term to be analy
be30: 7a 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  zed */.  Expr *p
be40: 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45  Expr = pTerm->pE
be50: 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  xpr;            
be60: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
be70: 6f 6e 20 6f 66 20 74 68 65 20 74 65 72 6d 20 2a  on of the term *
be80: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
be90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bea0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
beb0: 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
bec0: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
bed0: 4f 72 57 63 3b 20 20 20 20 20 20 20 2f 2a 20 42  OrWc;       /* B
bee0: 72 65 61 6b 75 70 20 6f 66 20 70 54 65 72 6d 20  reakup of pTerm 
bef0: 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f  into subterms */
bf00: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f  .  WhereTerm *pO
bf10: 72 54 65 72 6d 3b 20 20 20 20 20 20 20 2f 2a 20  rTerm;       /* 
bf20: 41 20 53 75 62 2d 74 65 72 6d 20 77 69 74 68 69  A Sub-term withi
bf30: 6e 20 74 68 65 20 70 4f 72 57 63 20 2a 2f 0a 20  n the pOrWc */. 
bf40: 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70 4f   WhereOrInfo *pO
bf50: 72 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 41 64  rInfo;     /* Ad
bf60: 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
bf70: 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20  tion associated 
bf80: 77 69 74 68 20 70 54 65 72 6d 20 2a 2f 0a 20 20  with pTerm */.  
bf90: 42 69 74 6d 61 73 6b 20 63 68 6e 67 54 6f 49 4e  Bitmask chngToIN
bfa0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62  ;         /* Tab
bfb0: 6c 65 73 20 74 68 61 74 20 6d 69 67 68 74 20 73  les that might s
bfc0: 61 74 69 73 66 79 20 63 61 73 65 20 31 20 2a 2f  atisfy case 1 */
bfd0: 0a 20 20 42 69 74 6d 61 73 6b 20 69 6e 64 65 78  .  Bitmask index
bfe0: 61 62 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  able;        /* 
bff0: 54 61 62 6c 65 73 20 74 68 61 74 20 61 72 65 20  Tables that are 
c000: 69 6e 64 65 78 61 62 6c 65 2c 20 73 61 74 69 73  indexable, satis
c010: 66 79 69 6e 67 20 63 61 73 65 20 32 20 2a 2f 0a  fying case 2 */.
c020: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42 72 65 61 6b  .  /*.  ** Break
c030: 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 69   the OR clause i
c040: 6e 74 6f 20 69 74 73 20 73 65 70 61 72 61 74 65  nto its separate
c050: 20 73 75 62 74 65 72 6d 73 2e 20 20 54 68 65 20   subterms.  The 
c060: 73 75 62 74 65 72 6d 73 20 61 72 65 0a 20 20 2a  subterms are.  *
c070: 2a 20 73 74 6f 72 65 64 20 69 6e 20 61 20 57 68  * stored in a Wh
c080: 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74  ereClause struct
c090: 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 77  ure containing w
c0a0: 69 74 68 69 6e 20 74 68 65 20 57 68 65 72 65 4f  ithin the WhereO
c0b0: 72 49 6e 66 6f 0a 20 20 2a 2a 20 6f 62 6a 65 63  rInfo.  ** objec
c0c0: 74 20 74 68 61 74 20 69 73 20 61 74 74 61 63 68  t that is attach
c0d0: 65 64 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e  ed to the origin
c0e0: 61 6c 20 4f 52 20 63 6c 61 75 73 65 20 74 65 72  al OR clause ter
c0f0: 6d 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  m..  */.  assert
c100: 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  ( (pTerm->wtFlag
c110: 73 20 26 20 28 54 45 52 4d 5f 44 59 4e 41 4d 49  s & (TERM_DYNAMI
c120: 43 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 7c 54 45  C|TERM_ORINFO|TE
c130: 52 4d 5f 41 4e 44 49 4e 46 4f 29 29 3d 3d 30 20  RM_ANDINFO))==0 
c140: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
c150: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b  pr->op==TK_OR );
c160: 0a 20 20 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49  .  pTerm->u.pOrI
c170: 6e 66 6f 20 3d 20 70 4f 72 49 6e 66 6f 20 3d 20  nfo = pOrInfo = 
c180: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
c190: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  ero(db, sizeof(*
c1a0: 70 4f 72 49 6e 66 6f 29 29 3b 0a 20 20 69 66 28  pOrInfo));.  if(
c1b0: 20 70 4f 72 49 6e 66 6f 3d 3d 30 20 29 20 72 65   pOrInfo==0 ) re
c1c0: 74 75 72 6e 3b 0a 20 20 70 54 65 72 6d 2d 3e 77  turn;.  pTerm->w
c1d0: 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f  tFlags |= TERM_O
c1e0: 52 49 4e 46 4f 3b 0a 20 20 70 4f 72 57 63 20 3d  RINFO;.  pOrWc =
c1f0: 20 26 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20   &pOrInfo->wc;. 
c200: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74   whereClauseInit
c210: 28 70 4f 72 57 63 2c 20 70 57 49 6e 66 6f 29 3b  (pOrWc, pWInfo);
c220: 0a 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 4f  .  whereSplit(pO
c230: 72 57 63 2c 20 70 45 78 70 72 2c 20 54 4b 5f 4f  rWc, pExpr, TK_O
c240: 52 29 3b 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a  R);.  exprAnalyz
c250: 65 41 6c 6c 28 70 53 72 63 2c 20 70 4f 72 57 63  eAll(pSrc, pOrWc
c260: 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
c270: 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
c280: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  rn;.  assert( pO
c290: 72 57 63 2d 3e 6e 54 65 72 6d 3e 3d 32 20 29 3b  rWc->nTerm>=2 );
c2a0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6f 6d 70  ..  /*.  ** Comp
c2b0: 75 74 65 20 74 68 65 20 73 65 74 20 6f 66 20 74  ute the set of t
c2c0: 61 62 6c 65 73 20 74 68 61 74 20 6d 69 67 68 74  ables that might
c2d0: 20 73 61 74 69 73 66 79 20 63 61 73 65 73 20 31   satisfy cases 1
c2e0: 20 6f 72 20 32 2e 0a 20 20 2a 2f 0a 20 20 69 6e   or 2..  */.  in
c2f0: 64 65 78 61 62 6c 65 20 3d 20 7e 28 42 69 74 6d  dexable = ~(Bitm
c300: 61 73 6b 29 30 3b 0a 20 20 63 68 6e 67 54 6f 49  ask)0;.  chngToI
c310: 4e 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b  N = ~(Bitmask)0;
c320: 0a 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e  .  for(i=pOrWc->
c330: 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d  nTerm-1, pOrTerm
c340: 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 20  =pOrWc->a; i>=0 
c350: 26 26 20 69 6e 64 65 78 61 62 6c 65 3b 20 69 2d  && indexable; i-
c360: 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20  -, pOrTerm++){. 
c370: 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d     if( (pOrTerm-
c380: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
c390: 53 49 4e 47 4c 45 29 3d 3d 30 20 29 7b 0a 20 20  SINGLE)==0 ){.  
c3a0: 20 20 20 20 57 68 65 72 65 41 6e 64 49 6e 66 6f      WhereAndInfo
c3b0: 20 2a 70 41 6e 64 49 6e 66 6f 3b 0a 20 20 20 20   *pAndInfo;.    
c3c0: 20 20 61 73 73 65 72 74 28 20 28 70 4f 72 54 65    assert( (pOrTe
c3d0: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54  rm->wtFlags & (T
c3e0: 45 52 4d 5f 41 4e 44 49 4e 46 4f 7c 54 45 52 4d  ERM_ANDINFO|TERM
c3f0: 5f 4f 52 49 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a  _ORINFO))==0 );.
c400: 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 3d        chngToIN =
c410: 20 30 3b 0a 20 20 20 20 20 20 70 41 6e 64 49 6e   0;.      pAndIn
c420: 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  fo = sqlite3DbMa
c430: 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
c440: 6f 66 28 2a 70 41 6e 64 49 6e 66 6f 29 29 3b 0a  of(*pAndInfo));.
c450: 20 20 20 20 20 20 69 66 28 20 70 41 6e 64 49 6e        if( pAndIn
c460: 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68  fo ){.        Wh
c470: 65 72 65 43 6c 61 75 73 65 20 2a 70 41 6e 64 57  ereClause *pAndW
c480: 43 3b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65  C;.        Where
c490: 54 65 72 6d 20 2a 70 41 6e 64 54 65 72 6d 3b 0a  Term *pAndTerm;.
c4a0: 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20          int j;. 
c4b0: 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62         Bitmask b
c4c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4f   = 0;.        pO
c4d0: 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66  rTerm->u.pAndInf
c4e0: 6f 20 3d 20 70 41 6e 64 49 6e 66 6f 3b 0a 20 20  o = pAndInfo;.  
c4f0: 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77        pOrTerm->w
c500: 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 41  tFlags |= TERM_A
c510: 4e 44 49 4e 46 4f 3b 0a 20 20 20 20 20 20 20 20  NDINFO;.        
c520: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
c530: 6f 72 20 3d 20 57 4f 5f 41 4e 44 3b 0a 20 20 20  or = WO_AND;.   
c540: 20 20 20 20 20 70 41 6e 64 57 43 20 3d 20 26 70       pAndWC = &p
c550: 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20  AndInfo->wc;.   
c560: 20 20 20 20 20 77 68 65 72 65 43 6c 61 75 73 65       whereClause
c570: 49 6e 69 74 28 70 41 6e 64 57 43 2c 20 70 57 43  Init(pAndWC, pWC
c580: 2d 3e 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  ->pWInfo);.     
c590: 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 41     whereSplit(pA
c5a0: 6e 64 57 43 2c 20 70 4f 72 54 65 72 6d 2d 3e 70  ndWC, pOrTerm->p
c5b0: 45 78 70 72 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20  Expr, TK_AND);. 
c5c0: 20 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79         exprAnaly
c5d0: 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70 41 6e 64  zeAll(pSrc, pAnd
c5e0: 57 43 29 3b 0a 20 20 20 20 20 20 20 20 70 41 6e  WC);.        pAn
c5f0: 64 57 43 2d 3e 70 4f 75 74 65 72 20 3d 20 70 57  dWC->pOuter = pW
c600: 43 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  C;.        testc
c610: 61 73 65 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ase( db->mallocF
c620: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
c630: 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
c640: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
c650: 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 41 6e      for(j=0, pAn
c660: 64 54 65 72 6d 3d 70 41 6e 64 57 43 2d 3e 61 3b  dTerm=pAndWC->a;
c670: 20 6a 3c 70 41 6e 64 57 43 2d 3e 6e 54 65 72 6d   j<pAndWC->nTerm
c680: 3b 20 6a 2b 2b 2c 20 70 41 6e 64 54 65 72 6d 2b  ; j++, pAndTerm+
c690: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
c6a0: 61 73 73 65 72 74 28 20 70 41 6e 64 54 65 72 6d  assert( pAndTerm
c6b0: 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->pExpr );.     
c6c0: 20 20 20 20 20 20 20 69 66 28 20 61 6c 6c 6f 77         if( allow
c6d0: 65 64 4f 70 28 70 41 6e 64 54 65 72 6d 2d 3e 70  edOp(pAndTerm->p
c6e0: 45 78 70 72 2d 3e 6f 70 29 20 29 7b 0a 20 20 20  Expr->op) ){.   
c6f0: 20 20 20 20 20 20 20 20 20 20 20 62 20 7c 3d 20             b |= 
c700: 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d  getMask(&pWInfo-
c710: 3e 73 4d 61 73 6b 53 65 74 2c 20 70 41 6e 64 54  >sMaskSet, pAndT
c720: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29  erm->leftCursor)
c730: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
c740: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
c750: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 6e      }.        in
c760: 64 65 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20 20  dexable &= b;.  
c770: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
c780: 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46  if( pOrTerm->wtF
c790: 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50 49  lags & TERM_COPI
c7a0: 45 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53  ED ){.      /* S
c7b0: 6b 69 70 20 74 68 69 73 20 74 65 72 6d 20 66 6f  kip this term fo
c7c0: 72 20 6e 6f 77 2e 20 20 57 65 20 72 65 76 69 73  r now.  We revis
c7d0: 69 74 20 69 74 20 77 68 65 6e 20 77 65 20 70 72  it it when we pr
c7e0: 6f 63 65 73 73 20 74 68 65 0a 20 20 20 20 20 20  ocess the.      
c7f0: 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
c800: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 74 65   TERM_VIRTUAL te
c810: 72 6d 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b  rm */.    }else{
c820: 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62  .      Bitmask b
c830: 3b 0a 20 20 20 20 20 20 62 20 3d 20 67 65 74 4d  ;.      b = getM
c840: 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  ask(&pWInfo->sMa
c850: 73 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d 3e  skSet, pOrTerm->
c860: 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20  leftCursor);.   
c870: 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e     if( pOrTerm->
c880: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
c890: 49 52 54 55 41 4c 20 29 7b 0a 20 20 20 20 20 20  IRTUAL ){.      
c8a0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 74    WhereTerm *pOt
c8b0: 68 65 72 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b  her = &pOrWc->a[
c8c0: 70 4f 72 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74  pOrTerm->iParent
c8d0: 5d 3b 0a 20 20 20 20 20 20 20 20 62 20 7c 3d 20  ];.        b |= 
c8e0: 67 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d  getMask(&pWInfo-
c8f0: 3e 73 4d 61 73 6b 53 65 74 2c 20 70 4f 74 68 65  >sMaskSet, pOthe
c900: 72 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a  r->leftCursor);.
c910: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6e        }.      in
c920: 64 65 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20 20  dexable &= b;.  
c930: 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d      if( (pOrTerm
c940: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
c950: 5f 45 51 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  _EQ)==0 ){.     
c960: 20 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 30 3b     chngToIN = 0;
c970: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
c980: 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 26        chngToIN &
c990: 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = b;.      }.   
c9a0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a   }.  }..  /*.  *
c9b0: 2a 20 52 65 63 6f 72 64 20 74 68 65 20 73 65 74  * Record the set
c9c0: 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20   of tables that 
c9d0: 73 61 74 69 73 66 79 20 63 61 73 65 20 32 2e 20  satisfy case 2. 
c9e0: 20 54 68 65 20 73 65 74 20 6d 69 67 68 74 20 62   The set might b
c9f0: 65 0a 20 20 2a 2a 20 65 6d 70 74 79 2e 0a 20 20  e.  ** empty..  
ca00: 2a 2f 0a 20 20 70 4f 72 49 6e 66 6f 2d 3e 69 6e  */.  pOrInfo->in
ca10: 64 65 78 61 62 6c 65 20 3d 20 69 6e 64 65 78 61  dexable = indexa
ca20: 62 6c 65 3b 0a 20 20 70 54 65 72 6d 2d 3e 65 4f  ble;.  pTerm->eO
ca30: 70 65 72 61 74 6f 72 20 3d 20 69 6e 64 65 78 61  perator = indexa
ca40: 62 6c 65 3d 3d 30 20 3f 20 30 20 3a 20 57 4f 5f  ble==0 ? 0 : WO_
ca50: 4f 52 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 63  OR;..  /*.  ** c
ca60: 68 6e 67 54 6f 49 4e 20 68 6f 6c 64 73 20 61 20  hngToIN holds a 
ca70: 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68  set of tables th
ca80: 61 74 20 2a 6d 69 67 68 74 2a 20 73 61 74 69 73  at *might* satis
ca90: 66 79 20 63 61 73 65 20 31 2e 20 20 42 75 74 0a  fy case 1.  But.
caa0: 20 20 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20    ** we have to 
cab0: 64 6f 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e  do some addition
cac0: 61 6c 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 73  al checking to s
cad0: 65 65 20 69 66 20 63 61 73 65 20 31 20 72 65 61  ee if case 1 rea
cae0: 6c 6c 79 0a 20 20 2a 2a 20 69 73 20 73 61 74 69  lly.  ** is sati
caf0: 73 66 69 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  sfied..  **.  **
cb00: 20 63 68 6e 67 54 6f 49 4e 20 77 69 6c 6c 20 68   chngToIN will h
cb10: 6f 6c 64 20 65 69 74 68 65 72 20 30 2c 20 31 2c  old either 0, 1,
cb20: 20 6f 72 20 32 20 62 69 74 73 2e 20 20 54 68 65   or 2 bits.  The
cb30: 20 30 2d 62 69 74 20 63 61 73 65 20 6d 65 61 6e   0-bit case mean
cb40: 73 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 72  s.  ** that ther
cb50: 65 20 69 73 20 6e 6f 20 70 6f 73 73 69 62 69 6c  e is no possibil
cb60: 69 74 79 20 6f 66 20 74 72 61 6e 73 66 6f 72 6d  ity of transform
cb70: 69 6e 67 20 74 68 65 20 4f 52 20 63 6c 61 75 73  ing the OR claus
cb80: 65 20 69 6e 74 6f 20 61 6e 0a 20 20 2a 2a 20 49  e into an.  ** I
cb90: 4e 20 6f 70 65 72 61 74 6f 72 20 62 65 63 61 75  N operator becau
cba0: 73 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 74  se one or more t
cbb0: 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 20 63  erms in the OR c
cbc0: 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 0a 20 20  lause contain.  
cbd0: 2a 2a 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68  ** something oth
cbe0: 65 72 20 74 68 61 6e 20 3d 3d 20 6f 6e 20 61 20  er than == on a 
cbf0: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 73 69  column in the si
cc00: 6e 67 6c 65 20 74 61 62 6c 65 2e 20 20 54 68 65  ngle table.  The
cc10: 20 31 2d 62 69 74 0a 20 20 2a 2a 20 63 61 73 65   1-bit.  ** case
cc20: 20 6d 65 61 6e 73 20 74 68 61 74 20 65 76 65 72   means that ever
cc30: 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52  y term of the OR
cc40: 20 63 6c 61 75 73 65 20 69 73 20 6f 66 20 74 68   clause is of th
cc50: 65 20 66 6f 72 6d 0a 20 20 2a 2a 20 22 74 61 62  e form.  ** "tab
cc60: 6c 65 2e 63 6f 6c 75 6d 6e 3d 65 78 70 72 22 20  le.column=expr" 
cc70: 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20  for some single 
cc80: 74 61 62 6c 65 2e 20 20 54 68 65 20 6f 6e 65 20  table.  The one 
cc90: 62 69 74 20 74 68 61 74 20 69 73 20 73 65 74 0a  bit that is set.
cca0: 20 20 2a 2a 20 77 69 6c 6c 20 63 6f 72 72 65 73    ** will corres
ccb0: 70 6f 6e 64 20 74 6f 20 74 68 65 20 63 6f 6d 6d  pond to the comm
ccc0: 6f 6e 20 74 61 62 6c 65 2e 20 20 57 65 20 73 74  on table.  We st
ccd0: 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 65 63  ill need to chec
cce0: 6b 20 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20 73  k to make.  ** s
ccf0: 75 72 65 20 74 68 65 20 73 61 6d 65 20 63 6f 6c  ure the same col
cd00: 75 6d 6e 20 69 73 20 75 73 65 64 20 6f 6e 20 61  umn is used on a
cd10: 6c 6c 20 74 65 72 6d 73 2e 20 20 54 68 65 20 32  ll terms.  The 2
cd20: 2d 62 69 74 20 63 61 73 65 20 69 73 20 77 68 65  -bit case is whe
cd30: 6e 0a 20 20 2a 2a 20 74 68 65 20 61 6c 6c 20 74  n.  ** the all t
cd40: 65 72 6d 73 20 61 72 65 20 6f 66 20 74 68 65 20  erms are of the 
cd50: 66 6f 72 6d 20 22 74 61 62 6c 65 31 2e 63 6f 6c  form "table1.col
cd60: 75 6d 6e 3d 74 61 62 6c 65 32 2e 63 6f 6c 75 6d  umn=table2.colum
cd70: 6e 22 2e 20 20 49 74 0a 20 20 2a 2a 20 6d 69 67  n".  It.  ** mig
cd80: 68 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ht be possible t
cd90: 6f 20 66 6f 72 6d 20 61 6e 20 49 4e 20 6f 70 65  o form an IN ope
cda0: 72 61 74 6f 72 20 77 69 74 68 20 65 69 74 68 65  rator with eithe
cdb0: 72 20 74 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e 0a  r table1.column.
cdc0: 20 20 2a 2a 20 6f 72 20 74 61 62 6c 65 32 2e 63    ** or table2.c
cdd0: 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 4c 48 53  olumn as the LHS
cde0: 20 69 66 20 65 69 74 68 65 72 20 69 73 20 63 6f   if either is co
cdf0: 6d 6d 6f 6e 20 74 6f 20 65 76 65 72 79 20 74 65  mmon to every te
ce00: 72 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 4f  rm of.  ** the O
ce10: 52 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20  R clause..  **. 
ce20: 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 65   ** Note that te
ce30: 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  rms of the form 
ce40: 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 31 3d 74  "table.column1=t
ce50: 61 62 6c 65 2e 63 6f 6c 75 6d 6e 32 22 20 28 74  able.column2" (t
ce60: 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 74 61 62  he.  ** same tab
ce70: 6c 65 20 6f 6e 20 62 6f 74 68 20 73 69 7a 65 73  le on both sizes
ce80: 20 6f 66 20 74 68 65 20 3d 3d 29 20 63 61 6e 6e   of the ==) cann
ce90: 6f 74 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 2e  ot be optimized.
cea0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 68 6e 67  .  */.  if( chng
ceb0: 54 6f 49 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20  ToIN ){.    int 
cec0: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30  okToChngToIN = 0
ced0: 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  ;     /* True if
cee0: 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20   the conversion 
cef0: 74 6f 20 49 4e 20 69 73 20 76 61 6c 69 64 20 2a  to IN is valid *
cf00: 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 75 6d  /.    int iColum
cf10: 6e 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20  n = -1;         
cf20: 2f 2a 20 43 6f 6c 75 6d 6e 20 69 6e 64 65 78 20  /* Column index 
cf30: 6f 6e 20 6c 68 73 20 6f 66 20 49 4e 20 6f 70 65  on lhs of IN ope
cf40: 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 69 6e 74  rator */.    int
cf50: 20 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 20 20   iCursor = -1;  
cf60: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
cf70: 63 75 72 73 6f 72 20 63 6f 6d 6d 6f 6e 20 74 6f  cursor common to
cf80: 20 61 6c 6c 20 74 65 72 6d 73 20 2a 2f 0a 20 20   all terms */.  
cf90: 20 20 69 6e 74 20 6a 20 3d 20 30 3b 20 20 20 20    int j = 0;    
cfa0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
cfb0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a  oop counter */..
cfc0: 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f      /* Search fo
cfd0: 72 20 61 20 74 61 62 6c 65 20 61 6e 64 20 63 6f  r a table and co
cfe0: 6c 75 6d 6e 20 74 68 61 74 20 61 70 70 65 61 72  lumn that appear
cff0: 73 20 6f 6e 20 6f 6e 65 20 73 69 64 65 20 6f 72  s on one side or
d000: 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 74 68 65   the.    ** othe
d010: 72 20 6f 66 20 74 68 65 20 3d 3d 20 6f 70 65 72  r of the == oper
d020: 61 74 6f 72 20 69 6e 20 65 76 65 72 79 20 73 75  ator in every su
d030: 62 74 65 72 6d 2e 20 20 54 68 61 74 20 74 61 62  bterm.  That tab
d040: 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 0a 20 20  le and column.  
d050: 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 63    ** will be rec
d060: 6f 72 64 65 64 20 69 6e 20 69 43 75 72 73 6f 72  orded in iCursor
d070: 20 61 6e 64 20 69 43 6f 6c 75 6d 6e 2e 20 20 54   and iColumn.  T
d080: 68 65 72 65 20 6d 69 67 68 74 20 6e 6f 74 20 62  here might not b
d090: 65 20 61 6e 79 0a 20 20 20 20 2a 2a 20 73 75 63  e any.    ** suc
d0a0: 68 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75  h table and colu
d0b0: 6d 6e 2e 20 20 53 65 74 20 6f 6b 54 6f 43 68 6e  mn.  Set okToChn
d0c0: 67 54 6f 49 4e 20 69 66 20 61 6e 20 61 70 70 72  gToIN if an appr
d0d0: 6f 70 72 69 61 74 65 20 74 61 62 6c 65 0a 20 20  opriate table.  
d0e0: 20 20 2a 2a 20 61 6e 64 20 63 6f 6c 75 6d 6e 20    ** and column 
d0f0: 69 73 20 66 6f 75 6e 64 20 62 75 74 20 6c 65 61  is found but lea
d100: 76 65 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20  ve okToChngToIN 
d110: 66 61 6c 73 65 20 69 66 20 6e 6f 74 20 66 6f 75  false if not fou
d120: 6e 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  nd..    */.    f
d130: 6f 72 28 6a 3d 30 3b 20 6a 3c 32 20 26 26 20 21  or(j=0; j<2 && !
d140: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 6a 2b  okToChngToIN; j+
d150: 2b 29 7b 0a 20 20 20 20 20 20 70 4f 72 54 65 72  +){.      pOrTer
d160: 6d 20 3d 20 70 4f 72 57 63 2d 3e 61 3b 0a 20 20  m = pOrWc->a;.  
d170: 20 20 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d      for(i=pOrWc-
d180: 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20  >nTerm-1; i>=0; 
d190: 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b  i--, pOrTerm++){
d1a0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
d1b0: 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61   pOrTerm->eOpera
d1c0: 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20  tor & WO_EQ );. 
d1d0: 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e         pOrTerm->
d1e0: 77 74 46 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d  wtFlags &= ~TERM
d1f0: 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  _OR_OK;.        
d200: 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  if( pOrTerm->lef
d210: 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72  tCursor==iCursor
d220: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
d230: 20 54 68 69 73 20 69 73 20 74 68 65 20 32 2d 62   This is the 2-b
d240: 69 74 20 63 61 73 65 20 61 6e 64 20 77 65 20 61  it case and we a
d250: 72 65 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64  re on the second
d260: 20 69 74 65 72 61 74 69 6f 6e 20 61 6e 64 0a 20   iteration and. 
d270: 20 20 20 20 20 20 20 20 20 2a 2a 20 63 75 72 72           ** curr
d280: 65 6e 74 20 74 65 72 6d 20 69 73 20 66 72 6f 6d  ent term is from
d290: 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72 61   the first itera
d2a0: 74 69 6f 6e 2e 20 20 53 6f 20 73 6b 69 70 20 74  tion.  So skip t
d2b0: 68 69 73 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20  his term. */.   
d2c0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a         assert( j
d2d0: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==1 );.         
d2e0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
d2f0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
d300: 20 28 63 68 6e 67 54 6f 49 4e 20 26 20 67 65 74   (chngToIN & get
d310: 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  Mask(&pWInfo->sM
d320: 61 73 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d  askSet, pOrTerm-
d330: 3e 6c 65 66 74 43 75 72 73 6f 72 29 29 3d 3d 30  >leftCursor))==0
d340: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
d350: 20 54 68 69 73 20 74 65 72 6d 20 6d 75 73 74 20   This term must 
d360: 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 74  be of the form t
d370: 31 2e 61 3d 3d 74 32 2e 62 20 77 68 65 72 65 20  1.a==t2.b where 
d380: 74 32 20 69 73 20 69 6e 20 74 68 65 0a 20 20 20  t2 is in the.   
d390: 20 20 20 20 20 20 20 2a 2a 20 63 68 6e 67 54 6f         ** chngTo
d3a0: 49 4e 20 73 65 74 20 62 75 74 20 74 31 20 69 73  IN set but t1 is
d3b0: 20 6e 6f 74 2e 20 20 54 68 69 73 20 74 65 72 6d   not.  This term
d3c0: 20 77 69 6c 6c 20 62 65 20 65 69 74 68 65 72 20   will be either 
d3d0: 70 72 65 63 65 65 64 65 64 0a 20 20 20 20 20 20  preceeded.      
d3e0: 20 20 20 20 2a 2a 20 6f 72 20 66 6f 6c 6c 77 65      ** or follwe
d3f0: 64 20 62 79 20 61 6e 20 69 6e 76 65 72 74 65 64  d by an inverted
d400: 20 63 6f 70 79 20 28 74 32 2e 62 3d 3d 74 31 2e   copy (t2.b==t1.
d410: 61 29 2e 20 20 53 6b 69 70 20 74 68 69 73 20 74  a).  Skip this t
d420: 65 72 6d 20 0a 20 20 20 20 20 20 20 20 20 20 2a  erm .          *
d430: 2a 20 61 6e 64 20 75 73 65 20 69 74 73 20 69 6e  * and use its in
d440: 76 65 72 73 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20  version. */.    
d450: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
d460: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
d470: 20 26 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 29   & TERM_COPIED )
d480: 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
d490: 63 61 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77  case( pOrTerm->w
d4a0: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
d4b0: 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20 20  RTUAL );.       
d4c0: 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65     assert( pOrTe
d4d0: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54  rm->wtFlags & (T
d4e0: 45 52 4d 5f 43 4f 50 49 45 44 7c 54 45 52 4d 5f  ERM_COPIED|TERM_
d4f0: 56 49 52 54 55 41 4c 29 20 29 3b 0a 20 20 20 20  VIRTUAL) );.    
d500: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
d510: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d520: 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 4f 72 54    iColumn = pOrT
d530: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
d540: 6e 3b 0a 20 20 20 20 20 20 20 20 69 43 75 72 73  n;.        iCurs
d550: 6f 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 6c 65  or = pOrTerm->le
d560: 66 74 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  ftCursor;.      
d570: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
d580: 0a 20 20 20 20 20 20 69 66 28 20 69 3c 30 20 29  .      if( i<0 )
d590: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20  {.        /* No 
d5a0: 63 61 6e 64 69 64 61 74 65 20 74 61 62 6c 65 2b  candidate table+
d5b0: 63 6f 6c 75 6d 6e 20 77 61 73 20 66 6f 75 6e 64  column was found
d5c0: 2e 20 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79  .  This can only
d5d0: 20 6f 63 63 75 72 0a 20 20 20 20 20 20 20 20 2a   occur.        *
d5e0: 2a 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20  * on the second 
d5f0: 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  iteration */.   
d600: 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d       assert( j==
d610: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  1 );.        ass
d620: 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77  ert( IsPowerOfTw
d630: 6f 28 63 68 6e 67 54 6f 49 4e 29 20 29 3b 0a 20  o(chngToIN) );. 
d640: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 63         assert( c
d650: 68 6e 67 54 6f 49 4e 3d 3d 67 65 74 4d 61 73 6b  hngToIN==getMask
d660: 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53  (&pWInfo->sMaskS
d670: 65 74 2c 20 69 43 75 72 73 6f 72 29 20 29 3b 0a  et, iCursor) );.
d680: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
d690: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73       }.      tes
d6a0: 74 63 61 73 65 28 20 6a 3d 3d 31 20 29 3b 0a 0a  tcase( j==1 );..
d6b0: 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65        /* We have
d6c0: 20 66 6f 75 6e 64 20 61 20 63 61 6e 64 69 64 61   found a candida
d6d0: 74 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c  te table and col
d6e0: 75 6d 6e 2e 20 20 43 68 65 63 6b 20 74 6f 20 73  umn.  Check to s
d6f0: 65 65 20 69 66 20 74 68 61 74 0a 20 20 20 20 20  ee if that.     
d700: 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 63 6f   ** table and co
d710: 6c 75 6d 6e 20 69 73 20 63 6f 6d 6d 6f 6e 20 74  lumn is common t
d720: 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20  o every term in 
d730: 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 2a 2f  the OR clause */
d740: 0a 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54  .      okToChngT
d750: 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20 66  oIN = 1;.      f
d760: 6f 72 28 3b 20 69 3e 3d 30 20 26 26 20 6f 6b 54  or(; i>=0 && okT
d770: 6f 43 68 6e 67 54 6f 49 4e 3b 20 69 2d 2d 2c 20  oChngToIN; i--, 
d780: 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  pOrTerm++){.    
d790: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54      assert( pOrT
d7a0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
d7b0: 20 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20   WO_EQ );.      
d7c0: 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c    if( pOrTerm->l
d7d0: 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72 73  eftCursor!=iCurs
d7e0: 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  or ){.          
d7f0: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
d800: 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b   &= ~TERM_OR_OK;
d810: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
d820: 66 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65  f( pOrTerm->u.le
d830: 66 74 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d  ftColumn!=iColum
d840: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f  n ){.          o
d850: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b  kToChngToIN = 0;
d860: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
d870: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 61 66            int af
d880: 66 4c 65 66 74 2c 20 61 66 66 52 69 67 68 74 3b  fLeft, affRight;
d890: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
d8a0: 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
d8b0: 73 69 64 65 20 69 73 20 61 6c 73 6f 20 61 20 63  side is also a c
d8c0: 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 74 68 65 20  olumn, then the 
d8d0: 61 66 66 69 6e 69 74 69 65 73 0a 20 20 20 20 20  affinities.     
d8e0: 20 20 20 20 20 2a 2a 20 6f 66 20 62 6f 74 68 20       ** of both 
d8f0: 72 69 67 68 74 20 61 6e 64 20 6c 65 66 74 20 73  right and left s
d900: 69 64 65 73 20 6d 75 73 74 20 62 65 20 73 75 63  ides must be suc
d910: 68 20 74 68 61 74 20 6e 6f 20 74 79 70 65 0a 20  h that no type. 
d920: 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 76           ** conv
d930: 65 72 73 69 6f 6e 73 20 61 72 65 20 72 65 71 75  ersions are requ
d940: 69 72 65 64 20 6f 6e 20 74 68 65 20 72 69 67 68  ired on the righ
d950: 74 2e 20 20 28 54 69 63 6b 65 74 20 23 32 32 34  t.  (Ticket #224
d960: 39 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  9).          */.
d970: 20 20 20 20 20 20 20 20 20 20 61 66 66 52 69 67            affRig
d980: 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ht = sqlite3Expr
d990: 41 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72 6d  Affinity(pOrTerm
d9a0: 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  ->pExpr->pRight)
d9b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 4c  ;.          affL
d9c0: 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
d9d0: 72 41 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72  rAffinity(pOrTer
d9e0: 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  m->pExpr->pLeft)
d9f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
da00: 61 66 66 52 69 67 68 74 21 3d 30 20 26 26 20 61  affRight!=0 && a
da10: 66 66 52 69 67 68 74 21 3d 61 66 66 4c 65 66 74  ffRight!=affLeft
da20: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
da30: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30  okToChngToIN = 0
da40: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
da50: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e{.            p
da60: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
da70: 7c 3d 20 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20  |= TERM_OR_OK;. 
da80: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
da90: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
daa0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68   }..    /* At th
dab0: 69 73 20 70 6f 69 6e 74 2c 20 6f 6b 54 6f 43 68  is point, okToCh
dac0: 6e 67 54 6f 49 4e 20 69 73 20 74 72 75 65 20 69  ngToIN is true i
dad0: 66 20 6f 72 69 67 69 6e 61 6c 20 70 54 65 72 6d  f original pTerm
dae0: 20 73 61 74 69 73 66 69 65 73 0a 20 20 20 20 2a   satisfies.    *
daf0: 2a 20 63 61 73 65 20 31 2e 20 20 49 6e 20 74 68  * case 1.  In th
db00: 61 74 20 63 61 73 65 2c 20 63 6f 6e 73 74 72 75  at case, constru
db10: 63 74 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  ct a new virtual
db20: 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 0a 20   term that is . 
db30: 20 20 20 2a 2a 20 70 54 65 72 6d 20 63 6f 6e 76     ** pTerm conv
db40: 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 20 49 4e  erted into an IN
db50: 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a   operator..    *
db60: 2f 0a 20 20 20 20 69 66 28 20 6f 6b 54 6f 43 68  /.    if( okToCh
db70: 6e 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20 20 20  ngToIN ){.      
db80: 45 78 70 72 20 2a 70 44 75 70 3b 20 20 20 20 20  Expr *pDup;     
db90: 20 20 20 20 20 20 20 2f 2a 20 41 20 74 72 61 6e         /* A tran
dba0: 73 69 65 6e 74 20 64 75 70 6c 69 63 61 74 65 20  sient duplicate 
dbb0: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
dbc0: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
dbd0: 69 73 74 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68  ist = 0;   /* Th
dbe0: 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e RHS of the IN 
dbf0: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
dc00: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
dc10: 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  0;       /* The 
dc20: 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  LHS of the IN op
dc30: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  erator */.      
dc40: 45 78 70 72 20 2a 70 4e 65 77 3b 20 20 20 20 20  Expr *pNew;     
dc50: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
dc60: 6d 70 6c 65 74 65 20 49 4e 20 6f 70 65 72 61 74  mplete IN operat
dc70: 6f 72 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72  or */..      for
dc80: 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d  (i=pOrWc->nTerm-
dc90: 31 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63  1, pOrTerm=pOrWc
dca0: 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20  ->a; i>=0; i--, 
dcb0: 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  pOrTerm++){.    
dcc0: 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d      if( (pOrTerm
dcd0: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
dce0: 5f 4f 52 5f 4f 4b 29 3d 3d 30 20 29 20 63 6f 6e  _OR_OK)==0 ) con
dcf0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61  tinue;.        a
dd00: 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e  ssert( pOrTerm->
dd10: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45  eOperator & WO_E
dd20: 51 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Q );.        ass
dd30: 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65  ert( pOrTerm->le
dd40: 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f  ftCursor==iCurso
dd50: 72 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  r );.        ass
dd60: 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e  ert( pOrTerm->u.
dd70: 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c  leftColumn==iCol
dd80: 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 70  umn );.        p
dd90: 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Dup = sqlite3Exp
dda0: 72 44 75 70 28 64 62 2c 20 70 4f 72 54 65 72 6d  rDup(db, pOrTerm
ddb0: 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  ->pExpr->pRight,
ddc0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 69   0);.        pLi
ddd0: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
dde0: 4c 69 73 74 41 70 70 65 6e 64 28 70 57 49 6e 66  ListAppend(pWInf
ddf0: 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4c 69 73 74  o->pParse, pList
de00: 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20  , pDup);.       
de10: 20 70 4c 65 66 74 20 3d 20 70 4f 72 54 65 72 6d   pLeft = pOrTerm
de20: 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  ->pExpr->pLeft;.
de30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
de40: 73 65 72 74 28 20 70 4c 65 66 74 21 3d 30 20 29  sert( pLeft!=0 )
de50: 3b 0a 20 20 20 20 20 20 70 44 75 70 20 3d 20 73  ;.      pDup = s
de60: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
de70: 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20  , pLeft, 0);.   
de80: 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
de90: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
dea0: 4b 5f 49 4e 2c 20 70 44 75 70 2c 20 30 2c 20 30  K_IN, pDup, 0, 0
deb0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65  );.      if( pNe
dec0: 77 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  w ){.        int
ded0: 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 20   idxNew;.       
dee0: 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72   transferJoinMar
def0: 6b 69 6e 67 73 28 70 4e 65 77 2c 20 70 45 78 70  kings(pNew, pExp
df00: 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  r);.        asse
df10: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
df20: 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78 49  erty(pNew, EP_xI
df30: 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
df40: 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73      pNew->x.pLis
df50: 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 20  t = pList;.     
df60: 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72     idxNew = wher
df70: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
df80: 43 2c 20 70 4e 65 77 2c 20 54 45 52 4d 5f 56 49  C, pNew, TERM_VI
df90: 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d  RTUAL|TERM_DYNAM
dfa0: 49 43 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  IC);.        tes
dfb0: 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d 30  tcase( idxNew==0
dfc0: 20 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72   );.        expr
dfd0: 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57  Analyze(pSrc, pW
dfe0: 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20  C, idxNew);.    
dff0: 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
e000: 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20  ->a[idxTerm];.  
e010: 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78        pWC->a[idx
e020: 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69  New].iParent = i
e030: 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  dxTerm;.        
e040: 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20  pTerm->nChild = 
e050: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
e060: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
e070: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
e080: 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  , pList);.      
e090: 7d 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65  }.      pTerm->e
e0a0: 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4e 4f  Operator = WO_NO
e0b0: 4f 50 3b 20 20 2f 2a 20 63 61 73 65 20 31 20 74  OP;  /* case 1 t
e0c0: 72 75 6d 70 73 20 63 61 73 65 20 32 20 2a 2f 0a  rumps case 2 */.
e0d0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
e0e0: 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d  if /* !SQLITE_OM
e0f0: 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49  IT_OR_OPTIMIZATI
e100: 4f 4e 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d  ON && !SQLITE_OM
e110: 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
e120: 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74 20  /*.** The input 
e130: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
e140: 69 73 20 61 6e 20 57 68 65 72 65 54 65 72 6d 20  is an WhereTerm 
e150: 73 74 72 75 63 74 75 72 65 20 77 69 74 68 20 6f  structure with o
e160: 6e 6c 79 20 74 68 65 0a 2a 2a 20 22 70 45 78 70  nly the.** "pExp
e170: 72 22 20 66 69 65 6c 64 20 66 69 6c 6c 65 64 20  r" field filled 
e180: 69 6e 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66 20  in.  The job of 
e190: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
e1a0: 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65 0a 2a  to analyze the.*
e1b0: 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  * subexpression 
e1c0: 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6c 6c  and populate all
e1d0: 20 74 68 65 20 6f 74 68 65 72 20 66 69 65 6c 64   the other field
e1e0: 73 20 6f 66 20 74 68 65 20 57 68 65 72 65 54 65  s of the WhereTe
e1f0: 72 6d 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  rm.** structure.
e200: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
e210: 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74  pression is of t
e220: 68 65 20 66 6f 72 6d 20 22 3c 65 78 70 72 3e 20  he form "<expr> 
e230: 3c 6f 70 3e 20 58 22 20 69 74 20 67 65 74 73 20  <op> X" it gets 
e240: 63 6f 6d 6d 75 74 65 64 0a 2a 2a 20 74 6f 20 74  commuted.** to t
e250: 68 65 20 73 74 61 6e 64 61 72 64 20 66 6f 72 6d  he standard form
e260: 20 6f 66 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70   of "X <op> <exp
e270: 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  r>"..**.** If th
e280: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
e290: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c  of the form "X <
e2a0: 6f 70 3e 20 59 22 20 77 68 65 72 65 20 62 6f 74  op> Y" where bot
e2b0: 68 20 58 20 61 6e 64 20 59 20 61 72 65 0a 2a 2a  h X and Y are.**
e2c0: 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 74   columns, then t
e2d0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 65 78 70 72  he original expr
e2e0: 65 73 73 69 6f 6e 20 69 73 20 75 6e 63 68 61 6e  ession is unchan
e2f0: 67 65 64 20 61 6e 64 20 61 20 6e 65 77 20 76 69  ged and a new vi
e300: 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 6f 66  rtual.** term of
e310: 20 74 68 65 20 66 6f 72 6d 20 22 59 20 3c 6f 70   the form "Y <op
e320: 3e 20 58 22 20 69 73 20 61 64 64 65 64 20 74 6f  > X" is added to
e330: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
e340: 65 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79 7a 65  e and.** analyze
e350: 64 20 73 65 70 61 72 61 74 65 6c 79 2e 20 20 54  d separately.  T
e360: 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d  he original term
e370: 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20   is marked with 
e380: 54 45 52 4d 5f 43 4f 50 49 45 44 0a 2a 2a 20 61  TERM_COPIED.** a
e390: 6e 64 20 74 68 65 20 6e 65 77 20 74 65 72 6d 20  nd the new term 
e3a0: 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20 54  is marked with T
e3b0: 45 52 4d 5f 44 59 4e 41 4d 49 43 20 28 62 65 63  ERM_DYNAMIC (bec
e3c0: 61 75 73 65 20 69 74 27 73 20 70 45 78 70 72 0a  ause it's pExpr.
e3d0: 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66  ** needs to be f
e3e0: 72 65 65 64 20 77 69 74 68 20 74 68 65 20 57 68  reed with the Wh
e3f0: 65 72 65 43 6c 61 75 73 65 29 20 61 6e 64 20 54  ereClause) and T
e400: 45 52 4d 5f 56 49 52 54 55 41 4c 20 28 62 65 63  ERM_VIRTUAL (bec
e410: 61 75 73 65 20 69 74 0a 2a 2a 20 69 73 20 61 20  ause it.** is a 
e420: 63 6f 6d 6d 75 74 65 64 20 63 6f 70 79 20 6f 66  commuted copy of
e430: 20 61 20 70 72 69 6f 72 20 74 65 72 6d 2e 29 20   a prior term.) 
e440: 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65   The original te
e450: 72 6d 20 68 61 73 20 6e 43 68 69 6c 64 3d 31 0a  rm has nChild=1.
e460: 2a 2a 20 61 6e 64 20 74 68 65 20 63 6f 70 79 20  ** and the copy 
e470: 68 61 73 20 69 64 78 50 61 72 65 6e 74 20 73 65  has idxParent se
e480: 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  t to the index o
e490: 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74  f the original t
e4a0: 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  erm..*/.static v
e4b0: 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 28  oid exprAnalyze(
e4c0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
e4d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
e4e0: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
e4f0: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
e500: 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f   *pWC,         /
e510: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
e520: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 54  se */.  int idxT
e530: 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  erm             
e540: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
e550: 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61  e term to be ana
e560: 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57 68  lyzed */.){.  Wh
e570: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20  ereInfo *pWInfo 
e580: 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 20 2f  = pWC->pWInfo; /
e590: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70  * WHERE clause p
e5a0: 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 74 65 78  rocessing contex
e5b0: 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  t */.  WhereTerm
e5c0: 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
e5d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
e5e0: 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a  erm to be analyz
e5f0: 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73  ed */.  WhereMas
e600: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20  kSet *pMaskSet; 
e610: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
e620: 6f 66 20 74 61 62 6c 65 20 69 6e 64 65 78 20 6d  of table index m
e630: 61 73 6b 73 20 2a 2f 0a 20 20 45 78 70 72 20 2a  asks */.  Expr *
e640: 70 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20  pExpr;          
e650: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
e660: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20  e expression to 
e670: 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20  be analyzed */. 
e680: 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 4c   Bitmask prereqL
e690: 65 66 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  eft;            
e6a0: 20 20 2f 2a 20 50 72 65 72 65 71 75 65 73 69 74    /* Prerequesit
e6b0: 65 73 20 6f 66 20 74 68 65 20 70 45 78 70 72 2d  es of the pExpr-
e6c0: 3e 70 4c 65 66 74 20 2a 2f 0a 20 20 42 69 74 6d  >pLeft */.  Bitm
e6d0: 61 73 6b 20 70 72 65 72 65 71 41 6c 6c 3b 20 20  ask prereqAll;  
e6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e6f0: 50 72 65 72 65 71 75 65 73 69 74 65 73 20 6f 66  Prerequesites of
e700: 20 70 45 78 70 72 20 2a 2f 0a 20 20 42 69 74 6d   pExpr */.  Bitm
e710: 61 73 6b 20 65 78 74 72 61 52 69 67 68 74 20 3d  ask extraRight =
e720: 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
e730: 45 78 74 72 61 20 64 65 70 65 6e 64 65 6e 63 69  Extra dependenci
e740: 65 73 20 6f 6e 20 4c 45 46 54 20 4a 4f 49 4e 20  es on LEFT JOIN 
e750: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 53 74 72 31  */.  Expr *pStr1
e760: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
e770: 20 20 20 20 20 20 2f 2a 20 52 48 53 20 6f 66 20        /* RHS of 
e780: 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61 74  LIKE/GLOB operat
e790: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f  or */.  int isCo
e7a0: 6d 70 6c 65 74 65 20 3d 20 30 3b 20 20 20 20 20  mplete = 0;     
e7b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 48 53 20           /* RHS 
e7c0: 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 65 6e 64  of LIKE/GLOB end
e7d0: 73 20 77 69 74 68 20 77 69 6c 64 63 61 72 64 20  s with wildcard 
e7e0: 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 61 73 65 20  */.  int noCase 
e7f0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
e800: 20 20 20 20 20 20 2f 2a 20 4c 49 4b 45 2f 47 4c        /* LIKE/GL
e810: 4f 42 20 64 69 73 74 69 6e 67 75 69 73 68 65 73  OB distinguishes
e820: 20 63 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f   case */.  int o
e830: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
e840: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
e850: 6f 70 2d 6c 65 76 65 6c 20 6f 70 65 72 61 74 6f  op-level operato
e860: 72 2e 20 20 70 45 78 70 72 2d 3e 6f 70 20 2a 2f  r.  pExpr->op */
e870: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
e880: 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
e890: 65 3b 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63  e;  /* Parsing c
e8a0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69  ontext */.  sqli
e8b0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
e8c0: 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 2f 2a 20  ->db;        /* 
e8d0: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
e8e0: 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62  ion */..  if( db
e8f0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
e900: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
e910: 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43  }.  pTerm = &pWC
e920: 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20  ->a[idxTerm];.  
e930: 70 4d 61 73 6b 53 65 74 20 3d 20 26 70 57 49 6e  pMaskSet = &pWIn
e940: 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a 20 20  fo->sMaskSet;.  
e950: 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70  pExpr = pTerm->p
e960: 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20  Expr;.  assert( 
e970: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 53  pExpr->op!=TK_AS
e980: 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54   && pExpr->op!=T
e990: 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b 0a 20 20 70  K_COLLATE );.  p
e9a0: 72 65 72 65 71 4c 65 66 74 20 3d 20 65 78 70 72  rereqLeft = expr
e9b0: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
e9c0: 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  Set, pExpr->pLef
e9d0: 74 29 3b 0a 20 20 6f 70 20 3d 20 70 45 78 70 72  t);.  op = pExpr
e9e0: 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  ->op;.  if( op==
e9f0: 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 61 73 73  TK_IN ){.    ass
ea00: 65 72 74 28 20 70 45 78 70 72 2d 3e 70 52 69 67  ert( pExpr->pRig
ea10: 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ht==0 );.    if(
ea20: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
ea30: 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
ea40: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 70  lect) ){.      p
ea50: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
ea60: 74 20 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61  t = exprSelectTa
ea70: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
ea80: 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c  t, pExpr->x.pSel
ea90: 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ect);.    }else{
eaa0: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70 72  .      pTerm->pr
eab0: 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70 72  ereqRight = expr
eac0: 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70  ListTableUsage(p
ead0: 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e  MaskSet, pExpr->
eae0: 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a  x.pList);.    }.
eaf0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d    }else if( op==
eb00: 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20  TK_ISNULL ){.   
eb10: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
eb20: 67 68 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ght = 0;.  }else
eb30: 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65  {.    pTerm->pre
eb40: 72 65 71 52 69 67 68 74 20 3d 20 65 78 70 72 54  reqRight = exprT
eb50: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
eb60: 65 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  et, pExpr->pRigh
eb70: 74 29 3b 0a 20 20 7d 0a 20 20 70 72 65 72 65 71  t);.  }.  prereq
eb80: 41 6c 6c 20 3d 20 65 78 70 72 54 61 62 6c 65 55  All = exprTableU
eb90: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
eba0: 45 78 70 72 29 3b 0a 20 20 69 66 28 20 45 78 70  Expr);.  if( Exp
ebb0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
ebc0: 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
ebd0: 20 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20   ){.    Bitmask 
ebe0: 78 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73  x = getMask(pMas
ebf0: 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 52 69  kSet, pExpr->iRi
ec00: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 29 3b 0a 20  ghtJoinTable);. 
ec10: 20 20 20 70 72 65 72 65 71 41 6c 6c 20 7c 3d 20     prereqAll |= 
ec20: 78 3b 0a 20 20 20 20 65 78 74 72 61 52 69 67 68  x;.    extraRigh
ec30: 74 20 3d 20 78 2d 31 3b 20 20 2f 2a 20 4f 4e 20  t = x-1;  /* ON 
ec40: 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6d 61 79  clause terms may
ec50: 20 6e 6f 74 20 62 65 20 75 73 65 64 20 77 69 74   not be used wit
ec60: 68 20 61 6e 20 69 6e 64 65 78 0a 20 20 20 20 20  h an index.     
ec70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec80: 20 20 2a 2a 20 6f 6e 20 6c 65 66 74 20 74 61 62    ** on left tab
ec90: 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  le of a LEFT JOI
eca0: 4e 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31 35  N.  Ticket #3015
ecb0: 20 2a 2f 0a 20 20 7d 0a 20 20 70 54 65 72 6d 2d   */.  }.  pTerm-
ecc0: 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72 65  >prereqAll = pre
ecd0: 72 65 71 41 6c 6c 3b 0a 20 20 70 54 65 72 6d 2d  reqAll;.  pTerm-
ece0: 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 2d 31  >leftCursor = -1
ecf0: 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72 65  ;.  pTerm->iPare
ed00: 6e 74 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d  nt = -1;.  pTerm
ed10: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 30 3b  ->eOperator = 0;
ed20: 0a 20 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f 70  .  if( allowedOp
ed30: 28 6f 70 29 20 29 7b 0a 20 20 20 20 45 78 70 72  (op) ){.    Expr
ed40: 20 2a 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65   *pLeft = sqlite
ed50: 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
ed60: 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a  (pExpr->pLeft);.
ed70: 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
ed80: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
ed90: 69 70 43 6f 6c 6c 61 74 65 28 70 45 78 70 72 2d  ipCollate(pExpr-
eda0: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 75 31  >pRight);.    u1
edb0: 36 20 6f 70 4d 61 73 6b 20 3d 20 28 70 54 65 72  6 opMask = (pTer
edc0: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  m->prereqRight &
edd0: 20 70 72 65 72 65 71 4c 65 66 74 29 3d 3d 30 20   prereqLeft)==0 
ede0: 3f 20 57 4f 5f 41 4c 4c 20 3a 20 57 4f 5f 45 51  ? WO_ALL : WO_EQ
edf0: 55 49 56 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  UIV;.    if( pLe
ee00: 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  ft->op==TK_COLUM
ee10: 4e 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d  N ){.      pTerm
ee20: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70  ->leftCursor = p
ee30: 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Left->iTable;.  
ee40: 20 20 20 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66      pTerm->u.lef
ee50: 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d  tColumn = pLeft-
ee60: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
ee70: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
ee80: 20 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28   = operatorMask(
ee90: 6f 70 29 20 26 20 6f 70 4d 61 73 6b 3b 0a 20 20  op) & opMask;.  
eea0: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 52 69 67    }.    if( pRig
eeb0: 68 74 20 26 26 20 70 52 69 67 68 74 2d 3e 6f 70  ht && pRight->op
eec0: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  ==TK_COLUMN ){. 
eed0: 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
eee0: 70 4e 65 77 3b 0a 20 20 20 20 20 20 45 78 70 72  pNew;.      Expr
eef0: 20 2a 70 44 75 70 3b 0a 20 20 20 20 20 20 75 31   *pDup;.      u1
ef00: 36 20 65 45 78 74 72 61 4f 70 20 3d 20 30 3b 20  6 eExtraOp = 0; 
ef10: 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
ef20: 62 69 74 73 20 66 6f 72 20 70 4e 65 77 2d 3e 65  bits for pNew->e
ef30: 4f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  Operator */.    
ef40: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66    if( pTerm->lef
ef50: 74 43 75 72 73 6f 72 3e 3d 30 20 29 7b 0a 20 20  tCursor>=0 ){.  
ef60: 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77        int idxNew
ef70: 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20 3d  ;.        pDup =
ef80: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
ef90: 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20  db, pExpr, 0);. 
efa0: 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d         if( db->m
efb0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
efc0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
efd0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
efe0: 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Dup);.          
eff0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
f000: 7d 0a 20 20 20 20 20 20 20 20 69 64 78 4e 65 77  }.        idxNew
f010: 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e   = whereClauseIn
f020: 73 65 72 74 28 70 57 43 2c 20 70 44 75 70 2c 20  sert(pWC, pDup, 
f030: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
f040: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
f050: 20 20 20 20 69 66 28 20 69 64 78 4e 65 77 3d 3d      if( idxNew==
f060: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
f070: 20 20 20 20 70 4e 65 77 20 3d 20 26 70 57 43 2d      pNew = &pWC-
f080: 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20  >a[idxNew];.    
f090: 20 20 20 20 70 4e 65 77 2d 3e 69 50 61 72 65 6e      pNew->iParen
f0a0: 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
f0b0: 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
f0c0: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
f0d0: 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43         pTerm->nC
f0e0: 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  hild = 1;.      
f0f0: 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73    pTerm->wtFlags
f100: 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b   |= TERM_COPIED;
f110: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78  .        if( pEx
f120: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 0a 20 20  pr->op==TK_EQ.  
f130: 20 20 20 20 20 20 20 26 26 20 21 45 78 70 72 48         && !ExprH
f140: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
f150: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20  , EP_FromJoin). 
f160: 20 20 20 20 20 20 20 20 26 26 20 4f 70 74 69 6d          && Optim
f170: 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64  izationEnabled(d
f180: 62 2c 20 53 51 4c 49 54 45 5f 54 72 61 6e 73 69  b, SQLITE_Transi
f190: 74 69 76 65 29 0a 20 20 20 20 20 20 20 20 29 7b  tive).        ){
f1a0: 0a 20 20 20 20 20 20 20 20 20 20 70 54 65 72 6d  .          pTerm
f1b0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 7c 3d 20 57  ->eOperator |= W
f1c0: 4f 5f 45 51 55 49 56 3b 0a 20 20 20 20 20 20 20  O_EQUIV;.       
f1d0: 20 20 20 65 45 78 74 72 61 4f 70 20 3d 20 57 4f     eExtraOp = WO
f1e0: 5f 45 51 55 49 56 3b 0a 20 20 20 20 20 20 20 20  _EQUIV;.        
f1f0: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
f200: 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 70 45         pDup = pE
f210: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  xpr;.        pNe
f220: 77 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  w = pTerm;.     
f230: 20 7d 0a 20 20 20 20 20 20 65 78 70 72 43 6f 6d   }.      exprCom
f240: 6d 75 74 65 28 70 50 61 72 73 65 2c 20 70 44 75  mute(pParse, pDu
f250: 70 29 3b 0a 20 20 20 20 20 20 70 4c 65 66 74 20  p);.      pLeft 
f260: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
f270: 70 43 6f 6c 6c 61 74 65 28 70 44 75 70 2d 3e 70  pCollate(pDup->p
f280: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 70 4e 65  Left);.      pNe
f290: 77 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20  w->leftCursor = 
f2a0: 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20  pLeft->iTable;. 
f2b0: 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 6c 65 66       pNew->u.lef
f2c0: 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d  tColumn = pLeft-
f2d0: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
f2e0: 74 65 73 74 63 61 73 65 28 20 28 70 72 65 72 65  testcase( (prere
f2f0: 71 4c 65 66 74 20 7c 20 65 78 74 72 61 52 69 67  qLeft | extraRig
f300: 68 74 29 20 21 3d 20 70 72 65 72 65 71 4c 65 66  ht) != prereqLef
f310: 74 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  t );.      pNew-
f320: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 70  >prereqRight = p
f330: 72 65 72 65 71 4c 65 66 74 20 7c 20 65 78 74 72  rereqLeft | extr
f340: 61 52 69 67 68 74 3b 0a 20 20 20 20 20 20 70 4e  aRight;.      pN
f350: 65 77 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20  ew->prereqAll = 
f360: 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 20  prereqAll;.     
f370: 20 70 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f 72   pNew->eOperator
f380: 20 3d 20 28 6f 70 65 72 61 74 6f 72 4d 61 73 6b   = (operatorMask
f390: 28 70 44 75 70 2d 3e 6f 70 29 20 2b 20 65 45 78  (pDup->op) + eEx
f3a0: 74 72 61 4f 70 29 20 26 20 6f 70 4d 61 73 6b 3b  traOp) & opMask;
f3b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 6e  .    }.  }..#ifn
f3c0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f3d0: 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41  BETWEEN_OPTIMIZA
f3e0: 54 49 4f 4e 0a 20 20 2f 2a 20 49 66 20 61 20 74  TION.  /* If a t
f3f0: 65 72 6d 20 69 73 20 74 68 65 20 42 45 54 57 45  erm is the BETWE
f400: 45 4e 20 6f 70 65 72 61 74 6f 72 2c 20 63 72 65  EN operator, cre
f410: 61 74 65 20 74 77 6f 20 6e 65 77 20 76 69 72 74  ate two new virt
f420: 75 61 6c 20 74 65 72 6d 73 0a 20 20 2a 2a 20 74  ual terms.  ** t
f430: 68 61 74 20 64 65 66 69 6e 65 20 74 68 65 20 72  hat define the r
f440: 61 6e 67 65 20 74 68 61 74 20 74 68 65 20 42 45  ange that the BE
f450: 54 57 45 45 4e 20 69 6d 70 6c 65 6d 65 6e 74 73  TWEEN implements
f460: 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  .  For example:.
f470: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 61    **.  **      a
f480: 20 42 45 54 57 45 45 4e 20 62 20 41 4e 44 20 63   BETWEEN b AND c
f490: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 63 6f  .  **.  ** is co
f4a0: 6e 76 65 72 74 65 64 20 69 6e 74 6f 3a 0a 20 20  nverted into:.  
f4b0: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 28 61 20  **.  **      (a 
f4c0: 42 45 54 57 45 45 4e 20 62 20 41 4e 44 20 63 29  BETWEEN b AND c)
f4d0: 20 41 4e 44 20 28 61 3e 3d 62 29 20 41 4e 44 20   AND (a>=b) AND 
f4e0: 28 61 3c 3d 63 29 0a 20 20 2a 2a 0a 20 20 2a 2a  (a<=c).  **.  **
f4f0: 20 54 68 65 20 74 77 6f 20 6e 65 77 20 74 65 72   The two new ter
f500: 6d 73 20 61 72 65 20 61 64 64 65 64 20 6f 6e 74  ms are added ont
f510: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
f520: 20 57 68 65 72 65 43 6c 61 75 73 65 20 6f 62 6a   WhereClause obj
f530: 65 63 74 2e 0a 20 20 2a 2a 20 54 68 65 20 6e 65  ect..  ** The ne
f540: 77 20 74 65 72 6d 73 20 61 72 65 20 22 64 79 6e  w terms are "dyn
f550: 61 6d 69 63 22 20 61 6e 64 20 61 72 65 20 63 68  amic" and are ch
f560: 69 6c 64 72 65 6e 20 6f 66 20 74 68 65 20 6f 72  ildren of the or
f570: 69 67 69 6e 61 6c 20 42 45 54 57 45 45 4e 0a 20  iginal BETWEEN. 
f580: 20 2a 2a 20 74 65 72 6d 2e 20 20 54 68 61 74 20   ** term.  That 
f590: 6d 65 61 6e 73 20 74 68 61 74 20 69 66 20 74 68  means that if th
f5a0: 65 20 42 45 54 57 45 45 4e 20 74 65 72 6d 20 69  e BETWEEN term i
f5b0: 73 20 63 6f 64 65 64 2c 20 74 68 65 20 63 68 69  s coded, the chi
f5c0: 6c 64 72 65 6e 20 61 72 65 0a 20 20 2a 2a 20 73  ldren are.  ** s
f5d0: 6b 69 70 70 65 64 2e 20 20 4f 72 2c 20 69 66 20  kipped.  Or, if 
f5e0: 74 68 65 20 63 68 69 6c 64 72 65 6e 20 61 72 65  the children are
f5f0: 20 73 61 74 69 73 66 69 65 64 20 62 79 20 61 6e   satisfied by an
f600: 20 69 6e 64 65 78 2c 20 74 68 65 20 6f 72 69 67   index, the orig
f610: 69 6e 61 6c 0a 20 20 2a 2a 20 42 45 54 57 45 45  inal.  ** BETWEE
f620: 4e 20 74 65 72 6d 20 69 73 20 73 6b 69 70 70 65  N term is skippe
f630: 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69  d..  */.  else i
f640: 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
f650: 5f 42 45 54 57 45 45 4e 20 26 26 20 70 57 43 2d  _BETWEEN && pWC-
f660: 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20  >op==TK_AND ){. 
f670: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
f680: 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st = pExpr->x.pL
f690: 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ist;.    int i;.
f6a0: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
f6b0: 20 75 38 20 6f 70 73 5b 5d 20 3d 20 7b 54 4b 5f   u8 ops[] = {TK_
f6c0: 47 45 2c 20 54 4b 5f 4c 45 7d 3b 0a 20 20 20 20  GE, TK_LE};.    
f6d0: 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
f6e0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
f6f0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 32 20  pList->nExpr==2 
f700: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
f710: 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<2; i++){.     
f720: 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b   Expr *pNewExpr;
f730: 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65  .      int idxNe
f740: 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 45 78 70  w;.      pNewExp
f750: 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
f760: 28 70 50 61 72 73 65 2c 20 6f 70 73 5b 69 5d 2c  (pParse, ops[i],
f770: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
f780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
f790: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
f7a0: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
f7b0: 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  0),.            
f7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7d0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
f7e0: 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  db, pList->a[i].
f7f0: 70 45 78 70 72 2c 20 30 29 2c 20 30 29 3b 0a 20  pExpr, 0), 0);. 
f800: 20 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69       transferJoi
f810: 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 45 78  nMarkings(pNewEx
f820: 70 72 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  pr, pExpr);.    
f830: 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65    idxNew = where
f840: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
f850: 2c 20 70 4e 65 77 45 78 70 72 2c 20 54 45 52 4d  , pNewExpr, TERM
f860: 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59  _VIRTUAL|TERM_DY
f870: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 74 65  NAMIC);.      te
f880: 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d  stcase( idxNew==
f890: 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 41  0 );.      exprA
f8a0: 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43  nalyze(pSrc, pWC
f8b0: 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20 20  , idxNew);.     
f8c0: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
f8d0: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20  [idxTerm];.     
f8e0: 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e   pWC->a[idxNew].
f8f0: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
f900: 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 65  m;.    }.    pTe
f910: 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b 0a  rm->nChild = 2;.
f920: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
f930: 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45  LITE_OMIT_BETWEE
f940: 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a  N_OPTIMIZATION *
f950: 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  /..#if !defined(
f960: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f  SQLITE_OMIT_OR_O
f970: 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26 20  PTIMIZATION) && 
f980: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
f990: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 20  OMIT_SUBQUERY). 
f9a0: 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74 65   /* Analyze a te
f9b0: 72 6d 20 74 68 61 74 20 69 73 20 63 6f 6d 70 6f  rm that is compo
f9c0: 73 65 64 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f  sed of two or mo
f9d0: 72 65 20 73 75 62 74 65 72 6d 73 20 63 6f 6e 6e  re subterms conn
f9e0: 65 63 74 65 64 20 62 79 0a 20 20 2a 2a 20 61 6e  ected by.  ** an
f9f0: 20 4f 52 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20   OR operator..  
fa00: 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45  */.  else if( pE
fa10: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29  xpr->op==TK_OR )
fa20: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57  {.    assert( pW
fa30: 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b  C->op==TK_AND );
fa40: 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65  .    exprAnalyze
fa50: 4f 72 54 65 72 6d 28 70 53 72 63 2c 20 70 57 43  OrTerm(pSrc, pWC
fa60: 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20 20 20 20  , idxTerm);.    
fa70: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
fa80: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 7d 0a 23 65  idxTerm];.  }.#e
fa90: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
faa0: 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54  MIT_OR_OPTIMIZAT
fab0: 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ION */..#ifndef 
fac0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45  SQLITE_OMIT_LIKE
fad0: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20  _OPTIMIZATION.  
fae0: 2f 2a 20 41 64 64 20 63 6f 6e 73 74 72 61 69 6e  /* Add constrain
faf0: 74 73 20 74 6f 20 72 65 64 75 63 65 20 74 68 65  ts to reduce the
fb00: 20 73 65 61 72 63 68 20 73 70 61 63 65 20 6f 6e   search space on
fb10: 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 0a   a LIKE or GLOB.
fb20: 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 20    ** operator.. 
fb30: 20 2a 2a 0a 20 20 2a 2a 20 41 20 6c 69 6b 65 20   **.  ** A like 
fb40: 70 61 74 74 65 72 6e 20 6f 66 20 74 68 65 20 66  pattern of the f
fb50: 6f 72 6d 20 22 78 20 4c 49 4b 45 20 27 61 62 63  orm "x LIKE 'abc
fb60: 25 27 22 20 69 73 20 63 68 61 6e 67 65 64 20 69  %'" is changed i
fb70: 6e 74 6f 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  nto constraints.
fb80: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
fb90: 20 20 20 78 3e 3d 27 61 62 63 27 20 41 4e 44 20     x>='abc' AND 
fba0: 78 3c 27 61 62 64 27 20 41 4e 44 20 78 20 4c 49  x<'abd' AND x LI
fbb0: 4b 45 20 27 61 62 63 25 27 0a 20 20 2a 2a 0a 20  KE 'abc%'.  **. 
fbc0: 20 2a 2a 20 54 68 65 20 6c 61 73 74 20 63 68 61   ** The last cha
fbd0: 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 70 72  racter of the pr
fbe0: 65 66 69 78 20 22 61 62 63 22 20 69 73 20 69 6e  efix "abc" is in
fbf0: 63 72 65 6d 65 6e 74 65 64 20 74 6f 20 66 6f 72  cremented to for
fc00: 6d 20 74 68 65 0a 20 20 2a 2a 20 74 65 72 6d 69  m the.  ** termi
fc10: 6e 61 74 69 6f 6e 20 63 6f 6e 64 69 74 69 6f 6e  nation condition
fc20: 20 22 61 62 64 22 2e 0a 20 20 2a 2f 0a 20 20 69   "abd"..  */.  i
fc30: 66 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41  f( pWC->op==TK_A
fc40: 4e 44 20 0a 20 20 20 26 26 20 69 73 4c 69 6b 65  ND .   && isLike
fc50: 4f 72 47 6c 6f 62 28 70 50 61 72 73 65 2c 20 70  OrGlob(pParse, p
fc60: 45 78 70 72 2c 20 26 70 53 74 72 31 2c 20 26 69  Expr, &pStr1, &i
fc70: 73 43 6f 6d 70 6c 65 74 65 2c 20 26 6e 6f 43 61  sComplete, &noCa
fc80: 73 65 29 0a 20 20 29 7b 0a 20 20 20 20 45 78 70  se).  ){.    Exp
fc90: 72 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20  r *pLeft;       
fca0: 2f 2a 20 4c 48 53 20 6f 66 20 4c 49 4b 45 2f 47  /* LHS of LIKE/G
fcb0: 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  LOB operator */.
fcc0: 20 20 20 20 45 78 70 72 20 2a 70 53 74 72 32 3b      Expr *pStr2;
fcd0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f         /* Copy o
fce0: 66 20 70 53 74 72 31 20 2d 20 52 48 53 20 6f 66  f pStr1 - RHS of
fcf0: 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72 61   LIKE/GLOB opera
fd00: 74 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 20  tor */.    Expr 
fd10: 2a 70 4e 65 77 45 78 70 72 31 3b 0a 20 20 20 20  *pNewExpr1;.    
fd20: 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 32 3b  Expr *pNewExpr2;
fd30: 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 31  .    int idxNew1
fd40: 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77  ;.    int idxNew
fd50: 32 3b 0a 20 20 20 20 54 6f 6b 65 6e 20 73 43 6f  2;.    Token sCo
fd60: 6c 6c 53 65 71 4e 61 6d 65 3b 20 20 2f 2a 20 4e  llSeqName;  /* N
fd70: 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6e 67  ame of collating
fd80: 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 20 20   sequence */..  
fd90: 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d    pLeft = pExpr-
fda0: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70  >x.pList->a[1].p
fdb0: 45 78 70 72 3b 0a 20 20 20 20 70 53 74 72 32 20  Expr;.    pStr2 
fdc0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
fdd0: 28 64 62 2c 20 70 53 74 72 31 2c 20 30 29 3b 0a  (db, pStr1, 0);.
fde0: 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c      if( !db->mal
fdf0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
fe00: 20 20 20 75 38 20 63 2c 20 2a 70 43 3b 20 20 20     u8 c, *pC;   
fe10: 20 20 20 20 2f 2a 20 4c 61 73 74 20 63 68 61 72      /* Last char
fe20: 61 63 74 65 72 20 62 65 66 6f 72 65 20 74 68 65  acter before the
fe30: 20 66 69 72 73 74 20 77 69 6c 64 63 61 72 64 20   first wildcard 
fe40: 2a 2f 0a 20 20 20 20 20 20 70 43 20 3d 20 28 75  */.      pC = (u
fe50: 38 2a 29 26 70 53 74 72 32 2d 3e 75 2e 7a 54 6f  8*)&pStr2->u.zTo
fe60: 6b 65 6e 5b 73 71 6c 69 74 65 33 53 74 72 6c 65  ken[sqlite3Strle
fe70: 6e 33 30 28 70 53 74 72 32 2d 3e 75 2e 7a 54 6f  n30(pStr2->u.zTo
fe80: 6b 65 6e 29 2d 31 5d 3b 0a 20 20 20 20 20 20 63  ken)-1];.      c
fe90: 20 3d 20 2a 70 43 3b 0a 20 20 20 20 20 20 69 66   = *pC;.      if
fea0: 28 20 6e 6f 43 61 73 65 20 29 7b 0a 20 20 20 20  ( noCase ){.    
feb0: 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
fec0: 20 69 73 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74   is to increment
fed0: 20 74 68 65 20 6c 61 73 74 20 63 68 61 72 61 63   the last charac
fee0: 74 65 72 20 62 65 66 6f 72 65 20 74 68 65 20 66  ter before the f
fef0: 69 72 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  irst.        ** 
ff00: 77 69 6c 64 63 61 72 64 2e 20 20 42 75 74 20 69  wildcard.  But i
ff10: 66 20 77 65 20 69 6e 63 72 65 6d 65 6e 74 20 27  f we increment '
ff20: 40 27 2c 20 74 68 61 74 20 77 69 6c 6c 20 70 75  @', that will pu
ff30: 73 68 20 69 74 20 69 6e 74 6f 20 74 68 65 0a 20  sh it into the. 
ff40: 20 20 20 20 20 20 20 2a 2a 20 61 6c 70 68 61 62         ** alphab
ff50: 65 74 69 63 20 72 61 6e 67 65 20 77 68 65 72 65  etic range where
ff60: 20 63 61 73 65 20 63 6f 6e 76 65 72 73 69 6f 6e   case conversion
ff70: 73 20 77 69 6c 6c 20 6d 65 73 73 20 75 70 20 74  s will mess up t
ff80: 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  he .        ** i
ff90: 6e 65 71 75 61 6c 69 74 79 2e 20 20 54 6f 20 61  nequality.  To a
ffa0: 76 6f 69 64 20 74 68 69 73 2c 20 6d 61 6b 65 20  void this, make 
ffb0: 73 75 72 65 20 74 6f 20 61 6c 73 6f 20 72 75 6e  sure to also run
ffc0: 20 74 68 65 20 66 75 6c 6c 0a 20 20 20 20 20 20   the full.      
ffd0: 20 20 2a 2a 20 4c 49 4b 45 20 6f 6e 20 61 6c 6c    ** LIKE on all
ffe0: 20 63 61 6e 64 69 64 61 74 65 20 65 78 70 72 65   candidate expre
fff0: 73 73 69 6f 6e 73 20 62 79 20 63 6c 65 61 72 69  ssions by cleari
10000 6e 67 20 74 68 65 20 69 73 43 6f 6d 70 6c 65 74  ng the isComplet
10010 65 20 66 6c 61 67 0a 20 20 20 20 20 20 20 20 2a  e flag.        *
10020 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d  /.        if( c=
10030 3d 27 41 27 2d 31 20 29 20 69 73 43 6f 6d 70 6c  ='A'-1 ) isCompl
10040 65 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ete = 0;.       
10050 20 63 20 3d 20 73 71 6c 69 74 65 33 55 70 70 65   c = sqlite3Uppe
10060 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a 20 20 20  rToLower[c];.   
10070 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 43 20 3d     }.      *pC =
10080 20 63 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20   c + 1;.    }.  
10090 20 20 73 43 6f 6c 6c 53 65 71 4e 61 6d 65 2e 7a    sCollSeqName.z
100a0 20 3d 20 6e 6f 43 61 73 65 20 3f 20 22 4e 4f 43   = noCase ? "NOC
100b0 41 53 45 22 20 3a 20 22 42 49 4e 41 52 59 22 3b  ASE" : "BINARY";
100c0 0a 20 20 20 20 73 43 6f 6c 6c 53 65 71 4e 61 6d  .    sCollSeqNam
100d0 65 2e 6e 20 3d 20 36 3b 0a 20 20 20 20 70 4e 65  e.n = 6;.    pNe
100e0 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65 33  wExpr1 = sqlite3
100f0 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66  ExprDup(db, pLef
10100 74 2c 20 30 29 3b 0a 20 20 20 20 70 4e 65 77 45  t, 0);.    pNewE
10110 78 70 72 31 20 3d 20 73 71 6c 69 74 65 33 50 45  xpr1 = sqlite3PE
10120 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 47  xpr(pParse, TK_G
10130 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 73  E, .           s
10140 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c  qlite3ExprAddCol
10150 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61 72 73 65  lateToken(pParse
10160 2c 70 4e 65 77 45 78 70 72 31 2c 26 73 43 6f 6c  ,pNewExpr1,&sCol
10170 6c 53 65 71 4e 61 6d 65 29 2c 0a 20 20 20 20 20  lSeqName),.     
10180 20 20 20 20 20 20 70 53 74 72 31 2c 20 30 29 3b        pStr1, 0);
10190 0a 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69  .    transferJoi
101a0 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 45 78  nMarkings(pNewEx
101b0 70 72 31 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  pr1, pExpr);.   
101c0 20 69 64 78 4e 65 77 31 20 3d 20 77 68 65 72 65   idxNew1 = where
101d0 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
101e0 2c 20 70 4e 65 77 45 78 70 72 31 2c 20 54 45 52  , pNewExpr1, TER
101f0 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
10200 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74 65 73  YNAMIC);.    tes
10210 74 63 61 73 65 28 20 69 64 78 4e 65 77 31 3d 3d  tcase( idxNew1==
10220 30 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61  0 );.    exprAna
10230 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20  lyze(pSrc, pWC, 
10240 69 64 78 4e 65 77 31 29 3b 0a 20 20 20 20 70 4e  idxNew1);.    pN
10250 65 77 45 78 70 72 32 20 3d 20 73 71 6c 69 74 65  ewExpr2 = sqlite
10260 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65  3ExprDup(db, pLe
10270 66 74 2c 20 30 29 3b 0a 20 20 20 20 70 4e 65 77  ft, 0);.    pNew
10280 45 78 70 72 32 20 3d 20 73 71 6c 69 74 65 33 50  Expr2 = sqlite3P
10290 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
102a0 4c 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73  LT,.           s
102b0 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c  qlite3ExprAddCol
102c0 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61 72 73 65  lateToken(pParse
102d0 2c 70 4e 65 77 45 78 70 72 32 2c 26 73 43 6f 6c  ,pNewExpr2,&sCol
102e0 6c 53 65 71 4e 61 6d 65 29 2c 0a 20 20 20 20 20  lSeqName),.     
102f0 20 20 20 20 20 20 70 53 74 72 32 2c 20 30 29 3b        pStr2, 0);
10300 0a 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69  .    transferJoi
10310 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 45 78  nMarkings(pNewEx
10320 70 72 32 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  pr2, pExpr);.   
10330 20 69 64 78 4e 65 77 32 20 3d 20 77 68 65 72 65   idxNew2 = where
10340 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
10350 2c 20 70 4e 65 77 45 78 70 72 32 2c 20 54 45 52  , pNewExpr2, TER
10360 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
10370 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74 65 73  YNAMIC);.    tes
10380 74 63 61 73 65 28 20 69 64 78 4e 65 77 32 3d 3d  tcase( idxNew2==
10390 30 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61  0 );.    exprAna
103a0 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20  lyze(pSrc, pWC, 
103b0 69 64 78 4e 65 77 32 29 3b 0a 20 20 20 20 70 54  idxNew2);.    pT
103c0 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
103d0 78 54 65 72 6d 5d 3b 0a 20 20 20 20 69 66 28 20  xTerm];.    if( 
103e0 69 73 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20 20  isComplete ){.  
103f0 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65      pWC->a[idxNe
10400 77 31 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64  w1].iParent = id
10410 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 57 43  xTerm;.      pWC
10420 2d 3e 61 5b 69 64 78 4e 65 77 32 5d 2e 69 50 61  ->a[idxNew2].iPa
10430 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a  rent = idxTerm;.
10440 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68        pTerm->nCh
10450 69 6c 64 20 3d 20 32 3b 0a 20 20 20 20 7d 0a 20  ild = 2;.    }. 
10460 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
10470 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50  ITE_OMIT_LIKE_OP
10480 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23  TIMIZATION */..#
10490 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
104a0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
104b0 20 20 2f 2a 20 41 64 64 20 61 20 57 4f 5f 4d 41    /* Add a WO_MA
104c0 54 43 48 20 61 75 78 69 6c 69 61 72 79 20 74 65  TCH auxiliary te
104d0 72 6d 20 74 6f 20 74 68 65 20 63 6f 6e 73 74 72  rm to the constr
104e0 61 69 6e 74 20 73 65 74 20 69 66 20 74 68 65 0a  aint set if the.
104f0 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 65 78 70    ** current exp
10500 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68  ression is of th
10510 65 20 66 6f 72 6d 3a 20 20 63 6f 6c 75 6d 6e 20  e form:  column 
10520 4d 41 54 43 48 20 65 78 70 72 2e 0a 20 20 2a 2a  MATCH expr..  **
10530 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
10540 6e 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  n is used by the
10550 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68   xBestIndex meth
10560 6f 64 73 20 6f 66 0a 20 20 2a 2a 20 76 69 72 74  ods of.  ** virt
10570 75 61 6c 20 74 61 62 6c 65 73 2e 20 20 54 68 65  ual tables.  The
10580 20 6e 61 74 69 76 65 20 71 75 65 72 79 20 6f 70   native query op
10590 74 69 6d 69 7a 65 72 20 64 6f 65 73 20 6e 6f 74  timizer does not
105a0 20 61 74 74 65 6d 70 74 0a 20 20 2a 2a 20 74 6f   attempt.  ** to
105b0 20 64 6f 20 61 6e 79 74 68 69 6e 67 20 77 69 74   do anything wit
105c0 68 20 4d 41 54 43 48 20 66 75 6e 63 74 69 6f 6e  h MATCH function
105d0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  s..  */.  if( is
105e0 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 70 45  MatchOfColumn(pE
105f0 78 70 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  xpr) ){.    int 
10600 69 64 78 4e 65 77 3b 0a 20 20 20 20 45 78 70 72  idxNew;.    Expr
10610 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74   *pRight, *pLeft
10620 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  ;.    WhereTerm 
10630 2a 70 4e 65 77 54 65 72 6d 3b 0a 20 20 20 20 42  *pNewTerm;.    B
10640 69 74 6d 61 73 6b 20 70 72 65 72 65 71 43 6f 6c  itmask prereqCol
10650 75 6d 6e 2c 20 70 72 65 72 65 71 45 78 70 72 3b  umn, prereqExpr;
10660 0a 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20 70  ..    pRight = p
10670 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  Expr->x.pList->a
10680 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70  [0].pExpr;.    p
10690 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  Left = pExpr->x.
106a0 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
106b0 72 3b 0a 20 20 20 20 70 72 65 72 65 71 45 78 70  r;.    prereqExp
106c0 72 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61  r = exprTableUsa
106d0 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 52 69  ge(pMaskSet, pRi
106e0 67 68 74 29 3b 0a 20 20 20 20 70 72 65 72 65 71  ght);.    prereq
106f0 43 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 54 61 62  Column = exprTab
10700 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
10710 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66  , pLeft);.    if
10720 28 20 28 70 72 65 72 65 71 45 78 70 72 20 26 20  ( (prereqExpr & 
10730 70 72 65 72 65 71 43 6f 6c 75 6d 6e 29 3d 3d 30  prereqColumn)==0
10740 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
10750 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20  pNewExpr;.      
10760 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74  pNewExpr = sqlit
10770 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
10780 54 4b 5f 4d 41 54 43 48 2c 20 0a 20 20 20 20 20  TK_MATCH, .     
10790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107a0 20 20 20 20 20 20 20 20 20 30 2c 20 73 71 6c 69           0, sqli
107b0 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
107c0 52 69 67 68 74 2c 20 30 29 2c 20 30 29 3b 0a 20  Right, 0), 0);. 
107d0 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68       idxNew = wh
107e0 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
107f0 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 20 54  pWC, pNewExpr, T
10800 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
10810 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
10820 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65   testcase( idxNe
10830 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e  w==0 );.      pN
10840 65 77 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61  ewTerm = &pWC->a
10850 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20  [idxNew];.      
10860 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71  pNewTerm->prereq
10870 52 69 67 68 74 20 3d 20 70 72 65 72 65 71 45 78  Right = prereqEx
10880 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  pr;.      pNewTe
10890 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d  rm->leftCursor =
108a0 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a   pLeft->iTable;.
108b0 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
108c0 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70  u.leftColumn = p
108d0 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Left->iColumn;. 
108e0 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65       pNewTerm->e
108f0 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4d 41  Operator = WO_MA
10900 54 43 48 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  TCH;.      pNewT
10910 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69  erm->iParent = i
10920 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54  dxTerm;.      pT
10930 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
10940 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54  xTerm];.      pT
10950 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b  erm->nChild = 1;
10960 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74  .      pTerm->wt
10970 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
10980 50 49 45 44 3b 0a 20 20 20 20 20 20 70 4e 65 77  PIED;.      pNew
10990 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
109a0 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41  = pTerm->prereqA
109b0 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ll;.    }.  }.#e
109c0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
109d0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
109e0 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
109f0 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
10a00 4f 52 5f 53 54 41 54 34 0a 20 20 2f 2a 20 57 68  OR_STAT4.  /* Wh
10a10 65 6e 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20  en sqlite_stat3 
10a20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 20 69  histogram data i
10a30 73 20 61 76 61 69 6c 61 62 6c 65 20 61 6e 20 6f  s available an o
10a40 70 65 72 61 74 6f 72 20 6f 66 20 74 68 65 0a 20  perator of the. 
10a50 20 2a 2a 20 66 6f 72 6d 20 22 78 20 49 53 20 4e   ** form "x IS N
10a60 4f 54 20 4e 55 4c 4c 22 20 63 61 6e 20 73 6f 6d  OT NULL" can som
10a70 65 74 69 6d 65 73 20 62 65 20 65 76 61 6c 75 61  etimes be evalua
10a80 74 65 64 20 6d 6f 72 65 20 65 66 66 69 63 69 65  ted more efficie
10a90 6e 74 6c 79 0a 20 20 2a 2a 20 61 73 20 22 78 3e  ntly.  ** as "x>
10aa0 4e 55 4c 4c 22 20 69 66 20 78 20 69 73 20 6e 6f  NULL" if x is no
10ab0 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  t an INTEGER PRI
10ac0 4d 41 52 59 20 4b 45 59 2e 20 20 53 6f 20 63 6f  MARY KEY.  So co
10ad0 6e 73 74 72 75 63 74 20 61 0a 20 20 2a 2a 20 76  nstruct a.  ** v
10ae0 69 72 74 75 61 6c 20 74 65 72 6d 20 6f 66 20 74  irtual term of t
10af0 68 61 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a 0a 20  hat form..  **. 
10b00 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
10b10 65 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6d  e virtual term m
10b20 75 73 74 20 62 65 20 74 61 67 67 65 64 20 77 69  ust be tagged wi
10b30 74 68 20 54 45 52 4d 5f 56 4e 55 4c 4c 2e 20 20  th TERM_VNULL.  
10b40 54 68 69 73 0a 20 20 2a 2a 20 54 45 52 4d 5f 56  This.  ** TERM_V
10b50 4e 55 4c 4c 20 74 61 67 20 77 69 6c 6c 20 73 75  NULL tag will su
10b60 70 70 72 65 73 73 20 74 68 65 20 6e 6f 74 2d 6e  ppress the not-n
10b70 75 6c 6c 20 63 68 65 63 6b 20 61 74 20 74 68 65  ull check at the
10b80 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20   beginning.  ** 
10b90 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 57 69  of the loop.  Wi
10ba0 74 68 6f 75 74 20 74 68 65 20 54 45 52 4d 5f 56  thout the TERM_V
10bb0 4e 55 4c 4c 20 66 6c 61 67 2c 20 74 68 65 20 6e  NULL flag, the n
10bc0 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20 61 74  ot-null check at
10bd0 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 72 74 20  .  ** the start 
10be0 6f 66 20 74 68 65 20 6c 6f 6f 70 20 77 69 6c 6c  of the loop will
10bf0 20 70 72 65 76 65 6e 74 20 61 6e 79 20 72 65 73   prevent any res
10c00 75 6c 74 73 20 66 72 6f 6d 20 62 65 69 6e 67 20  ults from being 
10c10 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2f 0a 20  returned..  */. 
10c20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
10c30 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26 26  TK_NOTNULL.   &&
10c40 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f   pExpr->pLeft->o
10c50 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20  p==TK_COLUMN.   
10c60 26 26 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  && pExpr->pLeft-
10c70 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20 26  >iColumn>=0.   &
10c80 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  & OptimizationEn
10c90 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
10ca0 5f 53 74 61 74 33 29 0a 20 20 29 7b 0a 20 20 20  _Stat3).  ){.   
10cb0 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b   Expr *pNewExpr;
10cc0 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74  .    Expr *pLeft
10cd0 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
10ce0 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b  .    int idxNew;
10cf0 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
10d00 70 4e 65 77 54 65 72 6d 3b 0a 0a 20 20 20 20 70  pNewTerm;..    p
10d10 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65  NewExpr = sqlite
10d20 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
10d30 4b 5f 47 54 2c 0a 20 20 20 20 20 20 20 20 20 20  K_GT,.          
10d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d50 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
10d60 28 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 2c 0a  (db, pLeft, 0),.
10d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d80 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
10d90 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
10da0 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c 20   TK_NULL, 0, 0, 
10db0 30 29 2c 20 30 29 3b 0a 0a 20 20 20 20 69 64 78  0), 0);..    idx
10dc0 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73  New = whereClaus
10dd0 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65  eInsert(pWC, pNe
10de0 77 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  wExpr,.         
10df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e00 20 20 20 20 20 54 45 52 4d 5f 56 49 52 54 55 41       TERM_VIRTUA
10e10 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c 54  L|TERM_DYNAMIC|T
10e20 45 52 4d 5f 56 4e 55 4c 4c 29 3b 0a 20 20 20 20  ERM_VNULL);.    
10e30 69 66 28 20 69 64 78 4e 65 77 20 29 7b 0a 20 20  if( idxNew ){.  
10e40 20 20 20 20 70 4e 65 77 54 65 72 6d 20 3d 20 26      pNewTerm = &
10e50 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a  pWC->a[idxNew];.
10e60 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
10e70 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 30 3b  prereqRight = 0;
10e80 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
10e90 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c  >leftCursor = pL
10ea0 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  eft->iTable;.   
10eb0 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c     pNewTerm->u.l
10ec0 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66  eftColumn = pLef
10ed0 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  t->iColumn;.    
10ee0 20 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70 65    pNewTerm->eOpe
10ef0 72 61 74 6f 72 20 3d 20 57 4f 5f 47 54 3b 0a 20  rator = WO_GT;. 
10f00 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 69       pNewTerm->i
10f10 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
10f20 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
10f30 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
10f40 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e  ;.      pTerm->n
10f50 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20  Child = 1;.     
10f60 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
10f70 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a  |= TERM_COPIED;.
10f80 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
10f90 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 54 65 72  prereqAll = pTer
10fa0 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20  m->prereqAll;.  
10fb0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    }.  }.#endif /
10fc0 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
10fd0 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a  STAT3_OR_STAT4 *
10fe0 2f 0a 0a 20 20 2f 2a 20 50 72 65 76 65 6e 74 20  /..  /* Prevent 
10ff0 4f 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  ON clause terms 
11000 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 66  of a LEFT JOIN f
11010 72 6f 6d 20 62 65 69 6e 67 20 75 73 65 64 20 74  rom being used t
11020 6f 20 64 72 69 76 65 0a 20 20 2a 2a 20 61 6e 20  o drive.  ** an 
11030 69 6e 64 65 78 20 66 6f 72 20 74 61 62 6c 65 73  index for tables
11040 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
11050 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20  the join..  */. 
11060 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
11070 67 68 74 20 7c 3d 20 65 78 74 72 61 52 69 67 68  ght |= extraRigh
11080 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  t;.}../*.** This
11090 20 66 75 6e 63 74 69 6f 6e 20 73 65 61 72 63 68   function search
110a0 65 73 20 70 4c 69 73 74 20 66 6f 72 20 61 20 65  es pList for a e
110b0 6e 74 72 79 20 74 68 61 74 20 6d 61 74 63 68 65  ntry that matche
110c0 73 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f  s the iCol-th co
110d0 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 69 6e 64 65 78  lumn.** of index
110e0 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   pIdx..**.** If 
110f0 73 75 63 68 20 61 6e 20 65 78 70 72 65 73 73 69  such an expressi
11100 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20 69 74 73  on is found, its
11110 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 2d   index in pList-
11120 3e 61 5b 5d 20 69 73 20 72 65 74 75 72 6e 65 64  >a[] is returned
11130 2e 20 49 66 0a 2a 2a 20 6e 6f 20 65 78 70 72 65  . If.** no expre
11140 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20  ssion is found, 
11150 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  -1 is returned..
11160 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
11170 6e 64 49 6e 64 65 78 43 6f 6c 28 0a 20 20 50 61  ndIndexCol(.  Pa
11180 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
11190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
111a0 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
111b0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
111c0 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ist,            
111d0 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
111e0 6e 20 6c 69 73 74 20 74 6f 20 73 65 61 72 63 68  n list to search
111f0 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61 73 65 2c   */.  int iBase,
11200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11210 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
11220 66 6f 72 20 74 61 62 6c 65 20 61 73 73 6f 63 69  for table associ
11230 61 74 65 64 20 77 69 74 68 20 70 49 64 78 20 2a  ated with pIdx *
11240 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c  /.  Index *pIdx,
11250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11260 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20      /* Index to 
11270 6d 61 74 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20  match column of 
11280 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20 20 20  */.  int iCol   
11290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112a0 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6f       /* Column o
112b0 66 20 69 6e 64 65 78 20 74 6f 20 6d 61 74 63 68  f index to match
112c0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
112d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
112e0 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f  oll = pIdx->azCo
112f0 6c 6c 5b 69 43 6f 6c 5d 3b 0a 0a 20 20 66 6f 72  ll[iCol];..  for
11300 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
11310 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
11320 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65  Expr *p = sqlite
11330 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
11340 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  (pList->a[i].pEx
11350 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  pr);.    if( p->
11360 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20  op==TK_COLUMN.  
11370 20 20 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e     && p->iColumn
11380 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ==pIdx->aiColumn
11390 5b 69 43 6f 6c 5d 0a 20 20 20 20 20 26 26 20 70  [iCol].     && p
113a0 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 0a  ->iTable==iBase.
113b0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c      ){.      Col
113c0 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71  lSeq *pColl = sq
113d0 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
113e0 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e  (pParse, pList->
113f0 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
11400 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 43     if( ALWAYS(pC
11410 6f 6c 6c 29 20 26 26 20 30 3d 3d 73 71 6c 69 74  oll) && 0==sqlit
11420 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d  e3StrICmp(pColl-
11430 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29  >zName, zColl) )
11440 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
11450 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   i;.      }.    
11460 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
11470 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  -1;.}../*.** Ret
11480 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
11490 44 49 53 54 49 4e 43 54 20 65 78 70 72 65 73 73  DISTINCT express
114a0 69 6f 6e 2d 6c 69 73 74 20 70 61 73 73 65 64 20  ion-list passed 
114b0 61 73 20 74 68 65 20 74 68 69 72 64 20 61 72 67  as the third arg
114c0 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 72 65 64 75  ument.** is redu
114d0 6e 64 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 41 20 44  ndant..**.** A D
114e0 49 53 54 49 4e 43 54 20 6c 69 73 74 20 69 73 20  ISTINCT list is 
114f0 72 65 64 75 6e 64 61 6e 74 20 69 66 20 74 68 65  redundant if the
11500 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
11510 6e 73 20 73 6f 6d 65 20 73 75 62 73 65 74 20 6f  ns some subset o
11520 66 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61  f.** columns tha
11530 74 20 61 72 65 20 75 6e 69 71 75 65 20 61 6e 64  t are unique and
11540 20 6e 6f 6e 2d 6e 75 6c 6c 2e 0a 2a 2f 0a 73 74   non-null..*/.st
11550 61 74 69 63 20 69 6e 74 20 69 73 44 69 73 74 69  atic int isDisti
11560 6e 63 74 52 65 64 75 6e 64 61 6e 74 28 0a 20 20  nctRedundant(.  
11570 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
11580 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
11590 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
115a0 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
115b0 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  ist,        /* T
115c0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
115d0 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
115e0 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a  *pWC,         /*
115f0 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
11600 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
11610 2a 70 44 69 73 74 69 6e 63 74 20 20 20 20 20 20  *pDistinct      
11620 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73   /* The result s
11630 65 74 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f  et that needs to
11640 20 62 65 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a   be DISTINCT */.
11650 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
11660 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  ;.  Index *pIdx;
11670 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
11680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11690 20 20 20 0a 20 20 69 6e 74 20 69 42 61 73 65 3b     .  int iBase;
116a0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
116b0 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  is more than one
116c0 20 74 61 62 6c 65 20 6f 72 20 73 75 62 2d 73 65   table or sub-se
116d0 6c 65 63 74 20 69 6e 20 74 68 65 20 46 52 4f 4d  lect in the FROM
116e0 20 63 6c 61 75 73 65 20 6f 66 0a 20 20 2a 2a 20   clause of.  ** 
116f0 74 68 69 73 20 71 75 65 72 79 2c 20 74 68 65 6e  this query, then
11700 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20   it will not be 
11710 70 6f 73 73 69 62 6c 65 20 74 6f 20 73 68 6f 77  possible to show
11720 20 74 68 61 74 20 74 68 65 20 44 49 53 54 49 4e   that the DISTIN
11730 43 54 20 0a 20 20 2a 2a 20 63 6c 61 75 73 65 20  CT .  ** clause 
11740 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a 2f  is redundant. */
11750 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d  .  if( pTabList-
11760 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75 72  >nSrc!=1 ) retur
11770 6e 20 30 3b 0a 20 20 69 42 61 73 65 20 3d 20 70  n 0;.  iBase = p
11780 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43  TabList->a[0].iC
11790 75 72 73 6f 72 3b 0a 20 20 70 54 61 62 20 3d 20  ursor;.  pTab = 
117a0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  pTabList->a[0].p
117b0 54 61 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  Tab;..  /* If an
117c0 79 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  y of the express
117d0 69 6f 6e 73 20 69 73 20 61 6e 20 49 50 4b 20 63  ions is an IPK c
117e0 6f 6c 75 6d 6e 20 6f 6e 20 74 61 62 6c 65 20 69  olumn on table i
117f0 42 61 73 65 2c 20 74 68 65 6e 20 72 65 74 75 72  Base, then retur
11800 6e 20 0a 20 20 2a 2a 20 74 72 75 65 2e 20 4e 6f  n .  ** true. No
11810 74 65 3a 20 54 68 65 20 28 70 2d 3e 69 54 61 62  te: The (p->iTab
11820 6c 65 3d 3d 69 42 61 73 65 29 20 70 61 72 74 20  le==iBase) part 
11830 6f 66 20 74 68 69 73 20 74 65 73 74 20 6d 61 79  of this test may
11840 20 62 65 20 66 61 6c 73 65 20 69 66 20 74 68 65   be false if the
11850 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 53 45  .  ** current SE
11860 4c 45 43 54 20 69 73 20 61 20 63 6f 72 72 65 6c  LECT is a correl
11870 61 74 65 64 20 73 75 62 2d 71 75 65 72 79 2e 0a  ated sub-query..
11880 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
11890 69 3c 70 44 69 73 74 69 6e 63 74 2d 3e 6e 45 78  i<pDistinct->nEx
118a0 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
118b0 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 45  pr *p = sqlite3E
118c0 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
118d0 44 69 73 74 69 6e 63 74 2d 3e 61 5b 69 5d 2e 70  Distinct->a[i].p
118e0 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70  Expr);.    if( p
118f0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
11900 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42  && p->iTable==iB
11910 61 73 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d  ase && p->iColum
11920 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  n<0 ) return 1;.
11930 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74    }..  /* Loop t
11940 68 72 6f 75 67 68 20 61 6c 6c 20 69 6e 64 69 63  hrough all indic
11950 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2c  es on the table,
11960 20 63 68 65 63 6b 69 6e 67 20 65 61 63 68 20 74   checking each t
11970 6f 20 73 65 65 20 69 66 20 69 74 20 6d 61 6b 65  o see if it make
11980 73 0a 20 20 2a 2a 20 74 68 65 20 44 49 53 54 49  s.  ** the DISTI
11990 4e 43 54 20 71 75 61 6c 69 66 69 65 72 20 72 65  NCT qualifier re
119a0 64 75 6e 64 61 6e 74 2e 20 49 74 20 64 6f 65 73  dundant. It does
119b0 20 73 6f 20 69 66 3a 0a 20 20 2a 2a 0a 20 20 2a   so if:.  **.  *
119c0 2a 20 20 20 31 2e 20 54 68 65 20 69 6e 64 65 78  *   1. The index
119d0 20 69 73 20 69 74 73 65 6c 66 20 55 4e 49 51 55   is itself UNIQU
119e0 45 2c 20 61 6e 64 0a 20 20 2a 2a 0a 20 20 2a 2a  E, and.  **.  **
119f0 20 20 20 32 2e 20 41 6c 6c 20 6f 66 20 74 68 65     2. All of the
11a00 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
11a10 69 6e 64 65 78 20 61 72 65 20 65 69 74 68 65 72  index are either
11a20 20 70 61 72 74 20 6f 66 20 74 68 65 20 70 44 69   part of the pDi
11a30 73 74 69 6e 63 74 0a 20 20 2a 2a 20 20 20 20 20  stinct.  **     
11a40 20 6c 69 73 74 2c 20 6f 72 20 65 6c 73 65 20 74   list, or else t
11a50 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
11a60 63 6f 6e 74 61 69 6e 73 20 61 20 74 65 72 6d 20  contains a term 
11a70 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 63 6f 6c  of the form "col
11a80 3d 58 22 2c 0a 20 20 2a 2a 20 20 20 20 20 20 77  =X",.  **      w
11a90 68 65 72 65 20 58 20 69 73 20 61 20 63 6f 6e 73  here X is a cons
11aa0 74 61 6e 74 20 76 61 6c 75 65 2e 20 54 68 65 20  tant value. The 
11ab0 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
11ac0 63 65 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ces of the.  ** 
11ad0 20 20 20 20 20 63 6f 6d 70 61 72 69 73 6f 6e 20       comparison 
11ae0 61 6e 64 20 73 65 6c 65 63 74 2d 6c 69 73 74 20  and select-list 
11af0 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75 73 74  expressions must
11b00 20 6d 61 74 63 68 20 74 68 6f 73 65 20 6f 66 20   match those of 
11b10 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a  the index..  **.
11b20 20 20 2a 2a 20 20 20 33 2e 20 41 6c 6c 20 6f 66    **   3. All of
11b30 20 74 68 6f 73 65 20 69 6e 64 65 78 20 63 6f 6c   those index col
11b40 75 6d 6e 73 20 66 6f 72 20 77 68 69 63 68 20 74  umns for which t
11b50 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
11b60 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 20 20  does not.  **   
11b70 20 20 20 63 6f 6e 74 61 69 6e 20 61 20 22 63 6f     contain a "co
11b80 6c 3d 58 22 20 74 65 72 6d 20 61 72 65 20 73 75  l=X" term are su
11b90 62 6a 65 63 74 20 74 6f 20 61 20 4e 4f 54 20 4e  bject to a NOT N
11ba0 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a  ULL constraint..
11bb0 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78 3d    */.  for(pIdx=
11bc0 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
11bd0 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
11be0 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
11bf0 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  Idx->onError==OE
11c00 5f 4e 6f 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65  _None ) continue
11c10 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
11c20 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  <pIdx->nColumn; 
11c30 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
11c40 69 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43  iCol = pIdx->aiC
11c50 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20  olumn[i];.      
11c60 69 66 28 20 30 3d 3d 66 69 6e 64 54 65 72 6d 28  if( 0==findTerm(
11c70 70 57 43 2c 20 69 42 61 73 65 2c 20 69 43 6f 6c  pWC, iBase, iCol
11c80 2c 20 7e 28 42 69 74 6d 61 73 6b 29 30 2c 20 57  , ~(Bitmask)0, W
11c90 4f 5f 45 51 2c 20 70 49 64 78 29 20 29 7b 0a 20  O_EQ, pIdx) ){. 
11ca0 20 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 43         int iIdxC
11cb0 6f 6c 20 3d 20 66 69 6e 64 49 6e 64 65 78 43 6f  ol = findIndexCo
11cc0 6c 28 70 50 61 72 73 65 2c 20 70 44 69 73 74 69  l(pParse, pDisti
11cd0 6e 63 74 2c 20 69 42 61 73 65 2c 20 70 49 64 78  nct, iBase, pIdx
11ce0 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , i);.        if
11cf0 28 20 69 49 64 78 43 6f 6c 3c 30 20 7c 7c 20 70  ( iIdxCol<0 || p
11d00 54 61 62 2d 3e 61 43 6f 6c 5b 70 49 64 78 2d 3e  Tab->aCol[pIdx->
11d10 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 6e 6f 74  aiColumn[i]].not
11d20 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Null==0 ){.     
11d30 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11d40 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
11d50 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 70    }.    if( i==p
11d60 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a  Idx->nColumn ){.
11d70 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 6e        /* This in
11d80 64 65 78 20 69 6d 70 6c 69 65 73 20 74 68 61 74  dex implies that
11d90 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 71 75   the DISTINCT qu
11da0 61 6c 69 66 69 65 72 20 69 73 20 72 65 64 75 6e  alifier is redun
11db0 64 61 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72  dant. */.      r
11dc0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
11dd0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   }..  return 0;.
11de0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61  }.../*.** Estima
11df0 74 65 20 74 68 65 20 6c 6f 67 61 72 69 74 68 6d  te the logarithm
11e00 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 76 61   of the input va
11e10 6c 75 65 20 74 6f 20 62 61 73 65 20 32 2e 0a 2a  lue to base 2..*
11e20 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45 73 74 20  /.static LogEst 
11e30 65 73 74 4c 6f 67 28 4c 6f 67 45 73 74 20 4e 29  estLog(LogEst N)
11e40 7b 0a 20 20 4c 6f 67 45 73 74 20 78 20 3d 20 73  {.  LogEst x = s
11e50 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 4e 29 3b  qlite3LogEst(N);
11e60 0a 20 20 72 65 74 75 72 6e 20 78 3e 33 33 20 3f  .  return x>33 ?
11e70 20 78 20 2d 20 33 33 20 3a 20 30 3b 0a 7d 0a 0a   x - 33 : 0;.}..
11e80 2f 2a 0a 2a 2a 20 54 77 6f 20 72 6f 75 74 69 6e  /*.** Two routin
11e90 65 73 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20  es for printing 
11ea0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  the content of a
11eb0 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  n sqlite3_index_
11ec0 69 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72  info.** structur
11ed0 65 2e 20 20 55 73 65 64 20 66 6f 72 20 74 65 73  e.  Used for tes
11ee0 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69  ting and debuggi
11ef0 6e 67 20 6f 6e 6c 79 2e 20 20 49 66 20 6e 65 69  ng only.  If nei
11f00 74 68 65 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 54  ther.** SQLITE_T
11f10 45 53 54 20 6f 72 20 53 51 4c 49 54 45 5f 44 45  EST or SQLITE_DE
11f20 42 55 47 20 61 72 65 20 64 65 66 69 6e 65 64 2c  BUG are defined,
11f30 20 74 68 65 6e 20 74 68 65 73 65 20 72 6f 75 74   then these rout
11f40 69 6e 65 73 0a 2a 2a 20 61 72 65 20 6e 6f 2d 6f  ines.** are no-o
11f50 70 73 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69  ps..*/.#if !defi
11f60 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
11f70 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26 26  VIRTUALTABLE) &&
11f80 20 64 65 66 69 6e 65 64 28 57 48 45 52 45 54 52   defined(WHERETR
11f90 41 43 45 5f 45 4e 41 42 4c 45 44 29 0a 73 74 61  ACE_ENABLED).sta
11fa0 74 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49  tic void TRACE_I
11fb0 44 58 5f 49 4e 50 55 54 53 28 73 71 6c 69 74 65  DX_INPUTS(sqlite
11fc0 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29  3_index_info *p)
11fd0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
11fe0 20 21 73 71 6c 69 74 65 33 57 68 65 72 65 54 72   !sqlite3WhereTr
11ff0 61 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ace ) return;.  
12000 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
12010 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b  onstraint; i++){
12020 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
12030 67 50 72 69 6e 74 66 28 22 20 20 63 6f 6e 73 74  gPrintf("  const
12040 72 61 69 6e 74 5b 25 64 5d 3a 20 63 6f 6c 3d 25  raint[%d]: col=%
12050 64 20 74 65 72 6d 69 64 3d 25 64 20 6f 70 3d 25  d termid=%d op=%
12060 64 20 75 73 61 62 6c 65 64 3d 25 64 5c 6e 22 2c  d usabled=%d\n",
12070 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20  .       i,.     
12080 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
12090 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20  [i].iColumn,.   
120a0 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
120b0 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65  nt[i].iTermOffse
120c0 74 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  t,.       p->aCo
120d0 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 6f 70 2c 0a  nstraint[i].op,.
120e0 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
120f0 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 29  raint[i].usable)
12100 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
12110 20 69 3c 70 2d 3e 6e 4f 72 64 65 72 42 79 3b 20   i<p->nOrderBy; 
12120 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
12130 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
12140 6f 72 64 65 72 62 79 5b 25 64 5d 3a 20 63 6f 6c  orderby[%d]: col
12150 3d 25 64 20 64 65 73 63 3d 25 64 5c 6e 22 2c 0a  =%d desc=%d\n",.
12160 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20         i,.      
12170 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e   p->aOrderBy[i].
12180 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20  iColumn,.       
12190 70 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 64  p->aOrderBy[i].d
121a0 65 73 63 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  esc);.  }.}.stat
121b0 69 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44  ic void TRACE_ID
121c0 58 5f 4f 55 54 50 55 54 53 28 73 71 6c 69 74 65  X_OUTPUTS(sqlite
121d0 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29  3_index_info *p)
121e0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
121f0 20 21 73 71 6c 69 74 65 33 57 68 65 72 65 54 72   !sqlite3WhereTr
12200 61 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ace ) return;.  
12210 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
12220 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b  onstraint; i++){
12230 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
12240 67 50 72 69 6e 74 66 28 22 20 20 75 73 61 67 65  gPrintf("  usage
12250 5b 25 64 5d 3a 20 61 72 67 76 49 64 78 3d 25 64  [%d]: argvIdx=%d
12260 20 6f 6d 69 74 3d 25 64 5c 6e 22 2c 0a 20 20 20   omit=%d\n",.   
12270 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d      i,.       p-
12280 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
12290 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 2c 0a  e[i].argvIndex,.
122a0 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74         p->aConst
122b0 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 6f 6d  raintUsage[i].om
122c0 69 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  it);.  }.  sqlit
122d0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
122e0 20 69 64 78 4e 75 6d 3d 25 64 5c 6e 22 2c 20 70   idxNum=%d\n", p
122f0 2d 3e 69 64 78 4e 75 6d 29 3b 0a 20 20 73 71 6c  ->idxNum);.  sql
12300 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
12310 22 20 20 69 64 78 53 74 72 3d 25 73 5c 6e 22 2c  "  idxStr=%s\n",
12320 20 70 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 73   p->idxStr);.  s
12330 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
12340 66 28 22 20 20 6f 72 64 65 72 42 79 43 6f 6e 73  f("  orderByCons
12350 75 6d 65 64 3d 25 64 5c 6e 22 2c 20 70 2d 3e 6f  umed=%d\n", p->o
12360 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 29 3b  rderByConsumed);
12370 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
12380 72 69 6e 74 66 28 22 20 20 65 73 74 69 6d 61 74  rintf("  estimat
12390 65 64 43 6f 73 74 3d 25 67 5c 6e 22 2c 20 70 2d  edCost=%g\n", p-
123a0 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b  >estimatedCost);
123b0 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  .}.#else.#define
123c0 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54   TRACE_IDX_INPUT
123d0 53 28 41 29 0a 23 64 65 66 69 6e 65 20 54 52 41  S(A).#define TRA
123e0 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 41  CE_IDX_OUTPUTS(A
123f0 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  ).#endif..#ifnde
12400 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
12410 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a  TOMATIC_INDEX./*
12420 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
12430 69 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  if the WHERE cla
12440 75 73 65 20 74 65 72 6d 20 70 54 65 72 6d 20 69  use term pTerm i
12450 73 20 6f 66 20 61 20 66 6f 72 6d 20 77 68 65 72  s of a form wher
12460 65 20 69 74 0a 2a 2a 20 63 6f 75 6c 64 20 62 65  e it.** could be
12470 20 75 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e   used with an in
12480 64 65 78 20 74 6f 20 61 63 63 65 73 73 20 70 53  dex to access pS
12490 72 63 2c 20 61 73 73 75 6d 69 6e 67 20 61 6e 20  rc, assuming an 
124a0 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 69  appropriate.** i
124b0 6e 64 65 78 20 65 78 69 73 74 65 64 2e 0a 2a 2f  ndex existed..*/
124c0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 72 6d  .static int term
124d0 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 0a 20  CanDriveIndex(. 
124e0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
124f0 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
12500 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  /* WHERE clause 
12510 74 65 72 6d 20 74 6f 20 63 68 65 63 6b 20 2a 2f  term to check */
12520 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
12530 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 20  t_item *pSrc,   
12540 20 20 2f 2a 20 54 61 62 6c 65 20 77 65 20 61 72    /* Table we ar
12550 65 20 74 72 79 69 6e 67 20 74 6f 20 61 63 63 65  e trying to acce
12560 73 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ss */.  Bitmask 
12570 6e 6f 74 52 65 61 64 79 20 20 20 20 20 20 20 20  notReady        
12580 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73         /* Tables
12590 20 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20   in outer loops 
125a0 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 29  of the join */.)
125b0 7b 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20 20  {.  char aff;.  
125c0 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  if( pTerm->leftC
125d0 75 72 73 6f 72 21 3d 70 53 72 63 2d 3e 69 43 75  ursor!=pSrc->iCu
125e0 72 73 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b  rsor ) return 0;
125f0 0a 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65  .  if( (pTerm->e
12600 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51  Operator & WO_EQ
12610 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )==0 ) return 0;
12620 0a 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70  .  if( (pTerm->p
12630 72 65 72 65 71 52 69 67 68 74 20 26 20 6e 6f 74  rereqRight & not
12640 52 65 61 64 79 29 21 3d 30 20 29 20 72 65 74 75  Ready)!=0 ) retu
12650 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 54 65 72  rn 0;.  if( pTer
12660 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3c  m->u.leftColumn<
12670 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
12680 61 66 66 20 3d 20 70 53 72 63 2d 3e 70 54 61 62  aff = pSrc->pTab
12690 2d 3e 61 43 6f 6c 5b 70 54 65 72 6d 2d 3e 75 2e  ->aCol[pTerm->u.
126a0 6c 65 66 74 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69  leftColumn].affi
126b0 6e 69 74 79 3b 0a 20 20 69 66 28 20 21 73 71 6c  nity;.  if( !sql
126c0 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74  ite3IndexAffinit
126d0 79 4f 6b 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  yOk(pTerm->pExpr
126e0 2c 20 61 66 66 29 20 29 20 72 65 74 75 72 6e 20  , aff) ) return 
126f0 30 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  0;.  return 1;.}
12700 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65  .#endif...#ifnde
12710 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
12720 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a  TOMATIC_INDEX./*
12730 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
12740 65 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 74  e to construct t
12750 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  he Index object 
12760 66 6f 72 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  for an automatic
12770 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 6f   index.** and to
12780 20 73 65 74 20 75 70 20 74 68 65 20 57 68 65 72   set up the Wher
12790 65 4c 65 76 65 6c 20 6f 62 6a 65 63 74 20 70 4c  eLevel object pL
127a0 65 76 65 6c 20 73 6f 20 74 68 61 74 20 74 68 65  evel so that the
127b0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a   code generator.
127c0 2a 2a 20 6d 61 6b 65 73 20 75 73 65 20 6f 66 20  ** makes use of 
127d0 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e  the automatic in
127e0 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dex..*/.static v
127f0 6f 69 64 20 63 6f 6e 73 74 72 75 63 74 41 75 74  oid constructAut
12800 6f 6d 61 74 69 63 49 6e 64 65 78 28 0a 20 20 50  omaticIndex(.  P
12810 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
12820 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
12830 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
12840 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  t */.  WhereClau
12850 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20  se *pWC,        
12860 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
12870 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
12880 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
12890 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20 46  *pSrc,  /* The F
128a0 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
128b0 74 6f 20 67 65 74 20 74 68 65 20 6e 65 78 74 20  to get the next 
128c0 69 6e 64 65 78 20 2a 2f 0a 20 20 42 69 74 6d 61  index */.  Bitma
128d0 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20  sk notReady,    
128e0 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
128f0 66 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 61  f cursors that a
12900 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  re not available
12910 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   */.  WhereLevel
12920 20 2a 70 4c 65 76 65 6c 20 20 20 20 20 20 20 20   *pLevel        
12930 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 69    /* Write new i
12940 6e 64 65 78 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ndex here */.){.
12950 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 3b 20 20    int nColumn;  
12960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12970 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
12980 6e 73 20 69 6e 20 74 68 65 20 63 6f 6e 73 74 72  ns in the constr
12990 75 63 74 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20  ucted index */. 
129a0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
129b0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m;           /* 
129c0 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66  A single term of
129d0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
129e0 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  e */.  WhereTerm
129f0 20 2a 70 57 43 45 6e 64 3b 20 20 20 20 20 20 20   *pWCEnd;       
12a00 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57 43     /* End of pWC
12a10 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  ->a[] */.  int n
12a20 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  Byte;           
12a30 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f         /* Byte o
12a40 66 20 6d 65 6d 6f 72 79 20 6e 65 65 64 65 64 20  f memory needed 
12a50 66 6f 72 20 70 49 64 78 20 2a 2f 0a 20 20 49 6e  for pIdx */.  In
12a60 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
12a70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a            /* Obj
12a80 65 63 74 20 64 65 73 63 72 69 62 69 6e 67 20 74  ect describing t
12a90 68 65 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64  he transient ind
12aa0 65 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  ex */.  Vdbe *v;
12ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ac0 20 20 20 20 2f 2a 20 50 72 65 70 61 72 65 64 20      /* Prepared 
12ad0 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20  statement under 
12ae0 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
12af0 20 20 69 6e 74 20 61 64 64 72 49 6e 69 74 3b 20    int addrInit; 
12b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12b10 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
12b20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 62  initialization b
12b30 79 70 61 73 73 20 6a 75 6d 70 20 2a 2f 0a 20 20  ypass jump */.  
12b40 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 20 20  Table *pTable;  
12b50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
12b60 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 69  he table being i
12b70 6e 64 65 78 65 64 20 2a 2f 0a 20 20 4b 65 79 49  ndexed */.  KeyI
12b80 6e 66 6f 20 2a 70 4b 65 79 69 6e 66 6f 3b 20 20  nfo *pKeyinfo;  
12b90 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 20 69          /* Key i
12ba0 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
12bb0 68 65 20 69 6e 64 65 78 20 2a 2f 20 20 20 0a 20  he index */   . 
12bc0 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20   int addrTop;   
12bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12be0 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 64 65 78  Top of the index
12bf0 20 66 69 6c 6c 20 6c 6f 6f 70 20 2a 2f 0a 20 20   fill loop */.  
12c00 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 20 20  int regRecord;  
12c10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
12c20 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
12c30 61 6e 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20  an index record 
12c40 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
12c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c60 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63 6f 75 6e 74   /* Column count
12c70 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  er */.  int i;  
12c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c90 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
12ca0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 42  ter */.  int mxB
12cb0 69 74 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20  itCol;          
12cc0 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
12cd0 63 6f 6c 75 6d 6e 20 69 6e 20 70 53 72 63 2d 3e  column in pSrc->
12ce0 63 6f 6c 55 73 65 64 20 2a 2f 0a 20 20 43 6f 6c  colUsed */.  Col
12cf0 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20  lSeq *pColl;    
12d00 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c           /* Coll
12d10 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74  ating sequence t
12d20 6f 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f  o on a column */
12d30 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
12d40 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f  oop;           /
12d50 2a 20 54 68 65 20 4c 6f 6f 70 20 6f 62 6a 65 63  * The Loop objec
12d60 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69  t */.  Bitmask i
12d70 64 78 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20  dxCols;         
12d80 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20     /* Bitmap of 
12d90 63 6f 6c 75 6d 6e 73 20 75 73 65 64 20 66 6f 72  columns used for
12da0 20 69 6e 64 65 78 69 6e 67 20 2a 2f 0a 20 20 42   indexing */.  B
12db0 69 74 6d 61 73 6b 20 65 78 74 72 61 43 6f 6c 73  itmask extraCols
12dc0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69  ;          /* Bi
12dd0 74 6d 61 70 20 6f 66 20 61 64 64 69 74 69 6f 6e  tmap of addition
12de0 61 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  al columns */.  
12df0 75 38 20 73 65 6e 74 57 61 72 6e 69 6e 67 20 3d  u8 sentWarning =
12e00 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54   0;         /* T
12e10 72 75 65 20 69 66 20 61 20 77 61 72 6e 6e 69 6e  rue if a warnnin
12e20 67 20 68 61 73 20 62 65 65 6e 20 69 73 73 75 65  g has been issue
12e30 64 20 2a 2f 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  d */..  /* Gener
12e40 61 74 65 20 63 6f 64 65 20 74 6f 20 73 6b 69 70  ate code to skip
12e50 20 6f 76 65 72 20 74 68 65 20 63 72 65 61 74 69   over the creati
12e60 6f 6e 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  on and initializ
12e70 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a  ation of the.  *
12e80 2a 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65  * transient inde
12e90 78 20 6f 6e 20 32 6e 64 20 61 6e 64 20 73 75 62  x on 2nd and sub
12ea0 73 65 71 75 65 6e 74 20 69 74 65 72 61 74 69 6f  sequent iteratio
12eb0 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20  ns of the loop. 
12ec0 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  */.  v = pParse-
12ed0 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74  >pVdbe;.  assert
12ee0 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 64 64 72  ( v!=0 );.  addr
12ef0 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33 43 6f  Init = sqlite3Co
12f00 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 0a  deOnce(pParse);.
12f10 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20  .  /* Count the 
12f20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
12f30 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 61  s that will be a
12f40 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 64 65  dded to the inde
12f50 78 0a 20 20 2a 2a 20 61 6e 64 20 75 73 65 64 20  x.  ** and used 
12f60 74 6f 20 6d 61 74 63 68 20 57 48 45 52 45 20 63  to match WHERE c
12f70 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74  lause constraint
12f80 73 20 2a 2f 0a 20 20 6e 43 6f 6c 75 6d 6e 20 3d  s */.  nColumn =
12f90 20 30 3b 0a 20 20 70 54 61 62 6c 65 20 3d 20 70   0;.  pTable = p
12fa0 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 70 57 43  Src->pTab;.  pWC
12fb0 45 6e 64 20 3d 20 26 70 57 43 2d 3e 61 5b 70 57  End = &pWC->a[pW
12fc0 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 70 4c 6f  C->nTerm];.  pLo
12fd0 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c  op = pLevel->pWL
12fe0 6f 6f 70 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d  oop;.  idxCols =
12ff0 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d   0;.  for(pTerm=
13000 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57  pWC->a; pTerm<pW
13010 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a  CEnd; pTerm++){.
13020 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44      if( termCanD
13030 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c  riveIndex(pTerm,
13040 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29   pSrc, notReady)
13050 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43   ){.      int iC
13060 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65  ol = pTerm->u.le
13070 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  ftColumn;.      
13080 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20  Bitmask cMask = 
13090 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b  iCol>=BMS ? MASK
130a0 42 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d 41 53  BIT(BMS-1) : MAS
130b0 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20 20 20  KBIT(iCol);.    
130c0 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c    testcase( iCol
130d0 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 74  ==BMS );.      t
130e0 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42  estcase( iCol==B
130f0 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 69 66  MS-1 );.      if
13100 28 20 21 73 65 6e 74 57 61 72 6e 69 6e 67 20 29  ( !sentWarning )
13110 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
13120 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52  3_log(SQLITE_WAR
13130 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58 2c 0a  NING_AUTOINDEX,.
13140 20 20 20 20 20 20 20 20 20 20 20 20 22 61 75 74              "aut
13150 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 6f 6e 20  omatic index on 
13160 25 73 28 25 73 29 22 2c 20 70 54 61 62 6c 65 2d  %s(%s)", pTable-
13170 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
13180 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c      pTable->aCol
13190 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  [iCol].zName);. 
131a0 20 20 20 20 20 20 20 73 65 6e 74 57 61 72 6e 69         sentWarni
131b0 6e 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ng = 1;.      }.
131c0 20 20 20 20 20 20 69 66 28 20 28 69 64 78 43 6f        if( (idxCo
131d0 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29  ls & cMask)==0 )
131e0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 77 68  {.        if( wh
131f0 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 70 50  ereLoopResize(pP
13200 61 72 73 65 2d 3e 64 62 2c 20 70 4c 6f 6f 70 2c  arse->db, pLoop,
13210 20 6e 43 6f 6c 75 6d 6e 2b 31 29 20 29 20 72 65   nColumn+1) ) re
13220 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 70 4c  turn;.        pL
13230 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6e 43 6f 6c  oop->aLTerm[nCol
13240 75 6d 6e 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a  umn++] = pTerm;.
13250 20 20 20 20 20 20 20 20 69 64 78 43 6f 6c 73 20          idxCols 
13260 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20  |= cMask;.      
13270 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  }.    }.  }.  as
13280 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20  sert( nColumn>0 
13290 29 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  );.  pLoop->u.bt
132a0 72 65 65 2e 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d  ree.nEq = pLoop-
132b0 3e 6e 4c 54 65 72 6d 20 3d 20 6e 43 6f 6c 75 6d  >nLTerm = nColum
132c0 6e 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c  n;.  pLoop->wsFl
132d0 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55  ags = WHERE_COLU
132e0 4d 4e 5f 45 51 20 7c 20 57 48 45 52 45 5f 49 44  MN_EQ | WHERE_ID
132f0 58 5f 4f 4e 4c 59 20 7c 20 57 48 45 52 45 5f 49  X_ONLY | WHERE_I
13300 4e 44 45 58 45 44 0a 20 20 20 20 20 20 20 20 20  NDEXED.         
13310 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 57 48              | WH
13320 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 3b 0a  ERE_AUTO_INDEX;.
13330 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20  .  /* Count the 
13340 6e 75 6d 62 65 72 20 6f 66 20 61 64 64 69 74 69  number of additi
13350 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65  onal columns nee
13360 64 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 0a  ded to create a.
13370 20 20 2a 2a 20 63 6f 76 65 72 69 6e 67 20 69 6e    ** covering in
13380 64 65 78 2e 20 20 41 20 22 63 6f 76 65 72 69 6e  dex.  A "coverin
13390 67 20 69 6e 64 65 78 22 20 69 73 20 61 6e 20 69  g index" is an i
133a0 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69  ndex that contai
133b0 6e 73 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f 6c 75  ns all.  ** colu
133c0 6d 6e 73 20 74 68 61 74 20 61 72 65 20 6e 65 65  mns that are nee
133d0 64 65 64 20 62 79 20 74 68 65 20 71 75 65 72 79  ded by the query
133e0 2e 20 20 57 69 74 68 20 61 20 63 6f 76 65 72 69  .  With a coveri
133f0 6e 67 20 69 6e 64 65 78 2c 20 74 68 65 0a 20 20  ng index, the.  
13400 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c  ** original tabl
13410 65 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f  e never needs to
13420 20 62 65 20 61 63 63 65 73 73 65 64 2e 20 20 41   be accessed.  A
13430 75 74 6f 6d 61 74 69 63 20 69 6e 64 69 63 65 73  utomatic indices
13440 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20 61 20   must.  ** be a 
13450 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 62  covering index b
13460 65 63 61 75 73 65 20 74 68 65 20 69 6e 64 65 78  ecause the index
13470 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64   will not be upd
13480 61 74 65 64 20 69 66 20 74 68 65 0a 20 20 2a 2a  ated if the.  **
13490 20 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c 65 20   original table 
134a0 63 68 61 6e 67 65 73 20 61 6e 64 20 74 68 65 20  changes and the 
134b0 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c 65 20  index and table 
134c0 63 61 6e 6e 6f 74 20 62 6f 74 68 20 62 65 20 75  cannot both be u
134d0 73 65 64 0a 20 20 2a 2a 20 69 66 20 74 68 65 79  sed.  ** if they
134e0 20 67 6f 20 6f 75 74 20 6f 66 20 73 79 6e 63 2e   go out of sync.
134f0 0a 20 20 2a 2f 0a 20 20 65 78 74 72 61 43 6f 6c  .  */.  extraCol
13500 73 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65  s = pSrc->colUse
13510 64 20 26 20 28 7e 69 64 78 43 6f 6c 73 20 7c 20  d & (~idxCols | 
13520 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 29 3b  MASKBIT(BMS-1));
13530 0a 20 20 6d 78 42 69 74 43 6f 6c 20 3d 20 28 70  .  mxBitCol = (p
13540 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3e 3d 20 42  Table->nCol >= B
13550 4d 53 2d 31 29 20 3f 20 42 4d 53 2d 31 20 3a 20  MS-1) ? BMS-1 : 
13560 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 0a 20 20  pTable->nCol;.  
13570 74 65 73 74 63 61 73 65 28 20 70 54 61 62 6c 65  testcase( pTable
13580 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b  ->nCol==BMS-1 );
13590 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61  .  testcase( pTa
135a0 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 32  ble->nCol==BMS-2
135b0 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
135c0 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b  <mxBitCol; i++){
135d0 0a 20 20 20 20 69 66 28 20 65 78 74 72 61 43 6f  .    if( extraCo
135e0 6c 73 20 26 20 4d 41 53 4b 42 49 54 28 69 29 20  ls & MASKBIT(i) 
135f0 29 20 6e 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 7d  ) nColumn++;.  }
13600 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c  .  if( pSrc->col
13610 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54 28 42  Used & MASKBIT(B
13620 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20 6e 43 6f  MS-1) ){.    nCo
13630 6c 75 6d 6e 20 2b 3d 20 70 54 61 62 6c 65 2d 3e  lumn += pTable->
13640 6e 43 6f 6c 20 2d 20 42 4d 53 20 2b 20 31 3b 0a  nCol - BMS + 1;.
13650 20 20 7d 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46    }.  pLoop->wsF
13660 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f  lags |= WHERE_CO
13670 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52 45 5f  LUMN_EQ | WHERE_
13680 49 44 58 5f 4f 4e 4c 59 3b 0a 0a 20 20 2f 2a 20  IDX_ONLY;..  /* 
13690 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49 6e  Construct the In
136a0 64 65 78 20 6f 62 6a 65 63 74 20 74 6f 20 64 65  dex object to de
136b0 73 63 72 69 62 65 20 74 68 69 73 20 69 6e 64 65  scribe this inde
136c0 78 20 2a 2f 0a 20 20 6e 42 79 74 65 20 3d 20 73  x */.  nByte = s
136d0 69 7a 65 6f 66 28 49 6e 64 65 78 29 3b 0a 20 20  izeof(Index);.  
136e0 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75 6d 6e  nByte += nColumn
136f0 2a 73 69 7a 65 6f 66 28 69 6e 74 29 3b 20 20 20  *sizeof(int);   
13700 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c    /* Index.aiCol
13710 75 6d 6e 20 2a 2f 0a 20 20 6e 42 79 74 65 20 2b  umn */.  nByte +
13720 3d 20 6e 43 6f 6c 75 6d 6e 2a 73 69 7a 65 6f 66  = nColumn*sizeof
13730 28 63 68 61 72 2a 29 3b 20 20 20 2f 2a 20 49 6e  (char*);   /* In
13740 64 65 78 2e 61 7a 43 6f 6c 6c 20 2a 2f 0a 20 20  dex.azColl */.  
13750 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75 6d 6e  nByte += nColumn
13760 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13770 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f 72 74    /* Index.aSort
13780 4f 72 64 65 72 20 2a 2f 0a 20 20 70 49 64 78 20  Order */.  pIdx 
13790 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
137a0 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62  cZero(pParse->db
137b0 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20  , nByte);.  if( 
137c0 70 49 64 78 3d 3d 30 20 29 20 72 65 74 75 72 6e  pIdx==0 ) return
137d0 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  ;.  pLoop->u.btr
137e0 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64 78  ee.pIndex = pIdx
137f0 3b 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  ;.  pIdx->azColl
13800 20 3d 20 28 63 68 61 72 2a 2a 29 26 70 49 64 78   = (char**)&pIdx
13810 5b 31 5d 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43  [1];.  pIdx->aiC
13820 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 2a 29 26 70  olumn = (int*)&p
13830 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 43 6f 6c  Idx->azColl[nCol
13840 75 6d 6e 5d 3b 0a 20 20 70 49 64 78 2d 3e 61 53  umn];.  pIdx->aS
13850 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29  ortOrder = (u8*)
13860 26 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  &pIdx->aiColumn[
13870 6e 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 70 49 64 78  nColumn];.  pIdx
13880 2d 3e 7a 4e 61 6d 65 20 3d 20 22 61 75 74 6f 2d  ->zName = "auto-
13890 69 6e 64 65 78 22 3b 0a 20 20 70 49 64 78 2d 3e  index";.  pIdx->
138a0 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 43 6f 6c 75 6d  nColumn = nColum
138b0 6e 3b 0a 20 20 70 49 64 78 2d 3e 70 54 61 62 6c  n;.  pIdx->pTabl
138c0 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 6e 20  e = pTable;.  n 
138d0 3d 20 30 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d  = 0;.  idxCols =
138e0 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d   0;.  for(pTerm=
138f0 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57  pWC->a; pTerm<pW
13900 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a  CEnd; pTerm++){.
13910 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44      if( termCanD
13920 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c  riveIndex(pTerm,
13930 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29   pSrc, notReady)
13940 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43   ){.      int iC
13950 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65  ol = pTerm->u.le
13960 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  ftColumn;.      
13970 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20  Bitmask cMask = 
13980 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b  iCol>=BMS ? MASK
13990 42 49 54 28 42 4d 53 2d 31 29 20 3a 20 4d 41 53  BIT(BMS-1) : MAS
139a0 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20 20 20 20  KBIT(iCol);.    
139b0 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c    testcase( iCol
139c0 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20  ==BMS-1 );.     
139d0 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d   testcase( iCol=
139e0 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 69 66  =BMS );.      if
139f0 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63 4d 61  ( (idxCols & cMa
13a00 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
13a10 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65    Expr *pX = pTe
13a20 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
13a30 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d     idxCols |= cM
13a40 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70 49 64  ask;.        pId
13a50 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d  x->aiColumn[n] =
13a60 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
13a70 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 43  lumn;.        pC
13a80 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e  oll = sqlite3Bin
13a90 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
13aa0 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c  q(pParse, pX->pL
13ab0 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29  eft, pX->pRight)
13ac0 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e  ;.        pIdx->
13ad0 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 41 4c 57 41  azColl[n] = ALWA
13ae0 59 53 28 70 43 6f 6c 6c 29 20 3f 20 70 43 6f 6c  YS(pColl) ? pCol
13af0 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22 42 49 4e 41  l->zName : "BINA
13b00 52 59 22 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b  RY";.        n++
13b10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
13b20 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 75    }.  assert( (u
13b30 33 32 29 6e 3d 3d 70 4c 6f 6f 70 2d 3e 75 2e 62  32)n==pLoop->u.b
13b40 74 72 65 65 2e 6e 45 71 20 29 3b 0a 0a 20 20 2f  tree.nEq );..  /
13b50 2a 20 41 64 64 20 61 64 64 69 74 69 6f 6e 61 6c  * Add additional
13b60 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20   columns needed 
13b70 74 6f 20 6d 61 6b 65 20 74 68 65 20 61 75 74 6f  to make the auto
13b80 6d 61 74 69 63 20 69 6e 64 65 78 20 69 6e 74 6f  matic index into
13b90 0a 20 20 2a 2a 20 61 20 63 6f 76 65 72 69 6e 67  .  ** a covering
13ba0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 66 6f 72 28   index */.  for(
13bb0 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b  i=0; i<mxBitCol;
13bc0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 65   i++){.    if( e
13bd0 78 74 72 61 43 6f 6c 73 20 26 20 4d 41 53 4b 42  xtraCols & MASKB
13be0 49 54 28 69 29 20 29 7b 0a 20 20 20 20 20 20 70  IT(i) ){.      p
13bf0 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d  Idx->aiColumn[n]
13c00 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78   = i;.      pIdx
13c10 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42  ->azColl[n] = "B
13c20 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 6e 2b  INARY";.      n+
13c30 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  +;.    }.  }.  i
13c40 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64  f( pSrc->colUsed
13c50 20 26 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31   & MASKBIT(BMS-1
13c60 29 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 42  ) ){.    for(i=B
13c70 4d 53 2d 31 3b 20 69 3c 70 54 61 62 6c 65 2d 3e  MS-1; i<pTable->
13c80 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
13c90 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e    pIdx->aiColumn
13ca0 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 70  [n] = i;.      p
13cb0 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d  Idx->azColl[n] =
13cc0 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20   "BINARY";.     
13cd0 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   n++;.    }.  }.
13ce0 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 6e 43 6f    assert( n==nCo
13cf0 6c 75 6d 6e 20 29 3b 0a 0a 20 20 2f 2a 20 43 72  lumn );..  /* Cr
13d00 65 61 74 65 20 74 68 65 20 61 75 74 6f 6d 61 74  eate the automat
13d10 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20 20 70 4b  ic index */.  pK
13d20 65 79 69 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  eyinfo = sqlite3
13d30 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61  IndexKeyinfo(pPa
13d40 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 61 73  rse, pIdx);.  as
13d50 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 69 49  sert( pLevel->iI
13d60 64 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20 70 4c  dxCur>=0 );.  pL
13d70 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20  evel->iIdxCur = 
13d80 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
13d90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13da0 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 41 75  Op4(v, OP_OpenAu
13db0 74 6f 69 6e 64 65 78 2c 20 70 4c 65 76 65 6c 2d  toindex, pLevel-
13dc0 3e 69 49 64 78 43 75 72 2c 20 6e 43 6f 6c 75 6d  >iIdxCur, nColum
13dd0 6e 2b 31 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  n+1, 0,.        
13de0 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
13df0 72 2a 29 70 4b 65 79 69 6e 66 6f 2c 20 50 34 5f  r*)pKeyinfo, P4_
13e00 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
13e10 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ;.  VdbeComment(
13e20 28 76 2c 20 22 66 6f 72 20 25 73 22 2c 20 70 54  (v, "for %s", pT
13e30 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a  able->zName));..
13e40 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 61 75    /* Fill the au
13e50 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 77 69  tomatic index wi
13e60 74 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  th content */.  
13e70 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65  addrTop = sqlite
13e80 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
13e90 50 5f 52 65 77 69 6e 64 2c 20 70 4c 65 76 65 6c  P_Rewind, pLevel
13ea0 2d 3e 69 54 61 62 43 75 72 29 3b 0a 20 20 72 65  ->iTabCur);.  re
13eb0 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65  gRecord = sqlite
13ec0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
13ed0 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 65  se);.  sqlite3Ge
13ee0 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28 70  nerateIndexKey(p
13ef0 50 61 72 73 65 2c 20 70 49 64 78 2c 20 70 4c 65  Parse, pIdx, pLe
13f00 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20 72 65  vel->iTabCur, re
13f10 67 52 65 63 6f 72 64 2c 20 31 2c 20 30 29 3b 0a  gRecord, 1, 0);.
13f20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13f30 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
13f40 65 72 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ert, pLevel->iId
13f50 78 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64 29  xCur, regRecord)
13f60 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
13f70 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
13f80 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29  G_USESEEKRESULT)
13f90 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
13fa0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
13fb0 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  , pLevel->iTabCu
13fc0 72 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b 0a 20  r, addrTop+1);. 
13fd0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
13fe0 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 53  geP5(v, SQLITE_S
13ff0 54 4d 54 53 54 41 54 55 53 5f 41 55 54 4f 49 4e  TMTSTATUS_AUTOIN
14000 44 45 58 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  DEX);.  sqlite3V
14010 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
14020 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74  ddrTop);.  sqlit
14030 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
14040 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f  (pParse, regReco
14050 72 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a 75 6d  rd);.  .  /* Jum
14060 70 20 68 65 72 65 20 77 68 65 6e 20 73 6b 69 70  p here when skip
14070 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c  ping the initial
14080 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c  ization */.  sql
14090 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
140a0 28 76 2c 20 61 64 64 72 49 6e 69 74 29 3b 0a 7d  (v, addrInit);.}
140b0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
140c0 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
140d0 5f 49 4e 44 45 58 20 2a 2f 0a 0a 23 69 66 6e 64  _INDEX */..#ifnd
140e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
140f0 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a  IRTUALTABLE./*.*
14100 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 70  * Allocate and p
14110 6f 70 75 6c 61 74 65 20 61 6e 20 73 71 6c 69 74  opulate an sqlit
14120 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
14130 72 75 63 74 75 72 65 2e 20 49 74 20 69 73 20 74  ructure. It is t
14140 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62  he .** responsib
14150 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
14160 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c  ler to eventuall
14170 79 20 72 65 6c 65 61 73 65 20 74 68 65 20 73 74  y release the st
14180 72 75 63 74 75 72 65 0a 2a 2a 20 62 79 20 70 61  ructure.** by pa
14190 73 73 69 6e 67 20 74 68 65 20 70 6f 69 6e 74 65  ssing the pointe
141a0 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  r returned by th
141b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 73  is function to s
141c0 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a  qlite3_free()..*
141d0 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  /.static sqlite3
141e0 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 61 6c 6c  _index_info *all
141f0 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 0a  ocateIndexInfo(.
14200 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
14210 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
14220 70 57 43 2c 0a 20 20 73 74 72 75 63 74 20 53 72  pWC,.  struct Sr
14230 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
14240 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  ,.  ExprList *pO
14250 72 64 65 72 42 79 0a 29 7b 0a 20 20 69 6e 74 20  rderBy.){.  int 
14260 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54 65 72  i, j;.  int nTer
14270 6d 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  m;.  struct sqli
14280 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
14290 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a  aint *pIdxCons;.
142a0 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33    struct sqlite3
142b0 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 20 2a  _index_orderby *
142c0 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 73  pIdxOrderBy;.  s
142d0 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
142e0 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75  dex_constraint_u
142f0 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20  sage *pUsage;.  
14300 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
14310 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79  ;.  int nOrderBy
14320 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  ;.  sqlite3_inde
14330 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f  x_info *pIdxInfo
14340 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68  ;..  /* Count th
14350 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 73 73  e number of poss
14360 69 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75 73  ible WHERE claus
14370 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72 65  e constraints re
14380 66 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74 6f 20  ferring.  ** to 
14390 74 68 69 73 20 76 69 72 74 75 61 6c 20 74 61 62  this virtual tab
143a0 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 54  le */.  for(i=nT
143b0 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43  erm=0, pTerm=pWC
143c0 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72  ->a; i<pWC->nTer
143d0 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  m; i++, pTerm++)
143e0 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  {.    if( pTerm-
143f0 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70  >leftCursor != p
14400 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63  Src->iCursor ) c
14410 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73  ontinue;.    ass
14420 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77  ert( IsPowerOfTw
14430 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  o(pTerm->eOperat
14440 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56 29 20  or & ~WO_EQUIV) 
14450 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
14460 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
14470 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20  r & WO_IN );.   
14480 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
14490 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
144a0 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 69  _ISNULL );.    i
144b0 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
144c0 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c  tor & (WO_ISNULL
144d0 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
144e0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
144f0 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c  lags & TERM_VNUL
14500 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  L ) continue;.  
14510 20 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a    nTerm++;.  }..
14520 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 52 44 45    /* If the ORDE
14530 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f 6e 74  R BY clause cont
14540 61 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e  ains only column
14550 73 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  s in the current
14560 20 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74   .  ** virtual t
14570 61 62 6c 65 20 74 68 65 6e 20 61 6c 6c 6f 63 61  able then alloca
14580 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  te space for the
14590 20 61 4f 72 64 65 72 42 79 20 70 61 72 74 20 6f   aOrderBy part o
145a0 66 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74  f.  ** the sqlit
145b0 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
145c0 72 75 63 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20  ructure..  */.  
145d0 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  nOrderBy = 0;.  
145e0 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
145f0 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4f 72 64      int n = pOrd
14600 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  erBy->nExpr;.   
14610 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69   for(i=0; i<n; i
14620 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
14630 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42  *pExpr = pOrderB
14640 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
14650 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
14660 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  op!=TK_COLUMN ||
14670 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d   pExpr->iTable!=
14680 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20  pSrc->iCursor ) 
14690 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
146a0 20 69 66 28 20 69 3d 3d 6e 29 7b 0a 20 20 20 20   if( i==n){.    
146b0 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 6e 3b 0a    nOrderBy = n;.
146c0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
146d0 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c  Allocate the sql
146e0 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
146f0 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2f 0a 20  structure.  */. 
14700 20 70 49 64 78 49 6e 66 6f 20 3d 20 73 71 6c 69   pIdxInfo = sqli
14710 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
14720 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65  pParse->db, size
14730 6f 66 28 2a 70 49 64 78 49 6e 66 6f 29 0a 20 20  of(*pIdxInfo).  
14740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14750 20 20 20 20 20 20 20 20 20 2b 20 28 73 69 7a 65           + (size
14760 6f 66 28 2a 70 49 64 78 43 6f 6e 73 29 20 2b 20  of(*pIdxCons) + 
14770 73 69 7a 65 6f 66 28 2a 70 55 73 61 67 65 29 29  sizeof(*pUsage))
14780 2a 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 20 20  *nTerm.         
14790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147a0 20 20 2b 20 73 69 7a 65 6f 66 28 2a 70 49 64 78    + sizeof(*pIdx
147b0 4f 72 64 65 72 42 79 29 2a 6e 4f 72 64 65 72 42  OrderBy)*nOrderB
147c0 79 20 29 3b 0a 20 20 69 66 28 20 70 49 64 78 49  y );.  if( pIdxI
147d0 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  nfo==0 ){.    sq
147e0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
147f0 61 72 73 65 2c 20 22 6f 75 74 20 6f 66 20 6d 65  arse, "out of me
14800 6d 6f 72 79 22 29 3b 0a 20 20 20 20 72 65 74 75  mory");.    retu
14810 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 0;.  }..  /* 
14820 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73  Initialize the s
14830 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 73  tructure.  The s
14840 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
14850 6f 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  o structure cont
14860 61 69 6e 73 0a 20 20 2a 2a 20 6d 61 6e 79 20 66  ains.  ** many f
14870 69 65 6c 64 73 20 74 68 61 74 20 61 72 65 20 64  ields that are d
14880 65 63 6c 61 72 65 64 20 22 63 6f 6e 73 74 22 20  eclared "const" 
14890 74 6f 20 70 72 65 76 65 6e 74 20 78 42 65 73 74  to prevent xBest
148a0 49 6e 64 65 78 20 66 72 6f 6d 0a 20 20 2a 2a 20  Index from.  ** 
148b0 63 68 61 6e 67 69 6e 67 20 74 68 65 6d 2e 20 20  changing them.  
148c0 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20 73 6f  We have to do so
148d0 6d 65 20 66 75 6e 6b 79 20 63 61 73 74 69 6e 67  me funky casting
148e0 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a   in order to.  *
148f0 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 6f  * initialize tho
14900 73 65 20 66 69 65 6c 64 73 2e 0a 20 20 2a 2f 0a  se fields..  */.
14910 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 28 73 74    pIdxCons = (st
14920 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
14930 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 29 26  ex_constraint*)&
14940 70 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20 70  pIdxInfo[1];.  p
14950 49 64 78 4f 72 64 65 72 42 79 20 3d 20 28 73 74  IdxOrderBy = (st
14960 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
14970 65 78 5f 6f 72 64 65 72 62 79 2a 29 26 70 49 64  ex_orderby*)&pId
14980 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a 20 20  xCons[nTerm];.  
14990 70 55 73 61 67 65 20 3d 20 28 73 74 72 75 63 74  pUsage = (struct
149a0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
149b0 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a  onstraint_usage*
149c0 29 26 70 49 64 78 4f 72 64 65 72 42 79 5b 6e 4f  )&pIdxOrderBy[nO
149d0 72 64 65 72 42 79 5d 3b 0a 20 20 2a 28 69 6e 74  rderBy];.  *(int
149e0 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f  *)&pIdxInfo->nCo
149f0 6e 73 74 72 61 69 6e 74 20 3d 20 6e 54 65 72 6d  nstraint = nTerm
14a00 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78  ;.  *(int*)&pIdx
14a10 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d  Info->nOrderBy =
14a20 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73   nOrderBy;.  *(s
14a30 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
14a40 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a  dex_constraint**
14a50 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  )&pIdxInfo->aCon
14a60 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78 43 6f  straint = pIdxCo
14a70 6e 73 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73  ns;.  *(struct s
14a80 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64  qlite3_index_ord
14a90 65 72 62 79 2a 2a 29 26 70 49 64 78 49 6e 66 6f  erby**)&pIdxInfo
14aa0 2d 3e 61 4f 72 64 65 72 42 79 20 3d 20 70 49 64  ->aOrderBy = pId
14ab0 78 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73 74  xOrderBy;.  *(st
14ac0 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
14ad0 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73  ex_constraint_us
14ae0 61 67 65 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  age**)&pIdxInfo-
14af0 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
14b00 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e =.            
14b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b40 20 20 20 20 20 20 20 70 55 73 61 67 65 3b 0a 0a         pUsage;..
14b50 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65    for(i=j=0, pTe
14b60 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43  rm=pWC->a; i<pWC
14b70 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54  ->nTerm; i++, pT
14b80 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 75 38 20 6f  erm++){.    u8 o
14b90 70 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  p;.    if( pTerm
14ba0 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20  ->leftCursor != 
14bb0 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20  pSrc->iCursor ) 
14bc0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73  continue;.    as
14bd0 73 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54  sert( IsPowerOfT
14be0 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  wo(pTerm->eOpera
14bf0 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56 29  tor & ~WO_EQUIV)
14c00 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
14c10 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
14c20 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20  or & WO_IN );.  
14c30 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
14c40 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
14c50 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  O_ISNULL );.    
14c60 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
14c70 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55 4c  ator & (WO_ISNUL
14c80 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  L) ) continue;. 
14c90 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
14ca0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
14cb0 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  LL ) continue;. 
14cc0 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69     pIdxCons[j].i
14cd0 43 6f 6c 75 6d 6e 20 3d 20 70 54 65 72 6d 2d 3e  Column = pTerm->
14ce0 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20  u.leftColumn;.  
14cf0 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 54    pIdxCons[j].iT
14d00 65 72 6d 4f 66 66 73 65 74 20 3d 20 69 3b 0a 20  ermOffset = i;. 
14d10 20 20 20 6f 70 20 3d 20 28 75 38 29 70 54 65 72     op = (u8)pTer
14d20 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
14d30 4f 5f 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20 6f  O_ALL;.    if( o
14d40 70 3d 3d 57 4f 5f 49 4e 20 29 20 6f 70 20 3d 20  p==WO_IN ) op = 
14d50 57 4f 5f 45 51 3b 0a 20 20 20 20 70 49 64 78 43  WO_EQ;.    pIdxC
14d60 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 6f 70 3b 0a  ons[j].op = op;.
14d70 20 20 20 20 2f 2a 20 54 68 65 20 64 69 72 65 63      /* The direc
14d80 74 20 61 73 73 69 67 6e 6d 65 6e 74 20 69 6e 20  t assignment in 
14d90 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c 69 6e  the previous lin
14da0 65 20 69 73 20 70 6f 73 73 69 62 6c 65 20 6f 6e  e is possible on
14db0 6c 79 20 62 65 63 61 75 73 65 0a 20 20 20 20 2a  ly because.    *
14dc0 2a 20 74 68 65 20 57 4f 5f 20 61 6e 64 20 53 51  * the WO_ and SQ
14dd0 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
14de0 52 41 49 4e 54 5f 20 63 6f 64 65 73 20 61 72 65  RAINT_ codes are
14df0 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 54 68 65   identical.  The
14e00 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  .    ** followin
14e10 67 20 61 73 73 65 72 74 73 20 76 65 72 69 66 79  g asserts verify
14e20 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20   this fact. */. 
14e30 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 45 51     assert( WO_EQ
14e40 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
14e50 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20 29 3b 0a  ONSTRAINT_EQ );.
14e60 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4c      assert( WO_L
14e70 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  T==SQLITE_INDEX_
14e80 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54 20 29 3b  CONSTRAINT_LT );
14e90 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f  .    assert( WO_
14ea0 4c 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  LE==SQLITE_INDEX
14eb0 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 45 20 29  _CONSTRAINT_LE )
14ec0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f  ;.    assert( WO
14ed0 5f 47 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _GT==SQLITE_INDE
14ee0 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 54 20  X_CONSTRAINT_GT 
14ef0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57  );.    assert( W
14f00 4f 5f 47 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_GE==SQLITE_IND
14f10 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 45  EX_CONSTRAINT_GE
14f20 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
14f30 57 4f 5f 4d 41 54 43 48 3d 3d 53 51 4c 49 54 45  WO_MATCH==SQLITE
14f40 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
14f50 54 5f 4d 41 54 43 48 20 29 3b 0a 20 20 20 20 61  T_MATCH );.    a
14f60 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f  ssert( pTerm->eO
14f70 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 4e  perator & (WO_IN
14f80 7c 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f  |WO_EQ|WO_LT|WO_
14f90 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57  LE|WO_GT|WO_GE|W
14fa0 4f 5f 4d 41 54 43 48 29 20 29 3b 0a 20 20 20 20  O_MATCH) );.    
14fb0 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  j++;.  }.  for(i
14fc0 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20  =0; i<nOrderBy; 
14fd0 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
14fe0 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79  pExpr = pOrderBy
14ff0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
15000 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d    pIdxOrderBy[i]
15010 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72  .iColumn = pExpr
15020 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70  ->iColumn;.    p
15030 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65  IdxOrderBy[i].de
15040 73 63 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  sc = pOrderBy->a
15050 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  [i].sortOrder;. 
15060 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 49 64   }..  return pId
15070 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  xInfo;.}../*.** 
15080 54 68 65 20 74 61 62 6c 65 20 6f 62 6a 65 63 74  The table object
15090 20 72 65 66 65 72 65 6e 63 65 20 70 61 73 73 65   reference passe
150a0 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
150b0 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
150c0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73   function.** mus
150d0 74 20 72 65 70 72 65 73 65 6e 74 20 61 20 76 69  t represent a vi
150e0 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 54 68 69  rtual table. Thi
150f0 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b  s function invok
15100 65 73 20 74 68 65 20 78 42 65 73 74 49 6e 64 65  es the xBestInde
15110 78 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66  x().** method of
15120 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
15130 6c 65 20 77 69 74 68 20 74 68 65 20 73 71 6c 69  le with the sqli
15140 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 6f  te3_index_info o
15150 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20 63 6f  bject that.** co
15160 6d 65 73 20 69 6e 20 61 73 20 74 68 65 20 33 72  mes in as the 3r
15170 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
15180 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
15190 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
151a0 63 63 75 72 73 2c 20 70 50 61 72 73 65 20 69 73  ccurs, pParse is
151b0 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
151c0 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
151d0 20 61 6e 64 20 61 0a 2a 2a 20 6e 6f 6e 2d 7a 65   and a.** non-ze
151e0 72 6f 20 76 61 6c 75 65 20 69 73 20 72 65 74 75  ro value is retu
151f0 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
15200 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 20 61   0 is returned a
15210 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a  nd the output.**
15220 20 70 61 72 74 20 6f 66 20 74 68 65 20 73 71 6c   part of the sql
15230 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
15240 73 74 72 75 63 74 75 72 65 20 69 73 20 6c 65 66  structure is lef
15250 74 20 70 6f 70 75 6c 61 74 65 64 2e 0a 2a 2a 0a  t populated..**.
15260 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** Whether or no
15270 74 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65  t an error is re
15280 74 75 72 6e 65 64 2c 20 69 74 20 69 73 20 74 68  turned, it is th
15290 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
152a0 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65   of the.** calle
152b0 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20  r to eventually 
152c0 66 72 65 65 20 70 2d 3e 69 64 78 53 74 72 20 69  free p->idxStr i
152d0 66 20 70 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  f p->needToFreeI
152e0 64 78 53 74 72 20 69 6e 64 69 63 61 74 65 73 0a  dxStr indicates.
152f0 2a 2a 20 74 68 61 74 20 74 68 69 73 20 69 73 20  ** that this is 
15300 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61  required..*/.sta
15310 74 69 63 20 69 6e 74 20 76 74 61 62 42 65 73 74  tic int vtabBest
15320 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  Index(Parse *pPa
15330 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
15340 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  , sqlite3_index_
15350 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 73 71 6c 69  info *p){.  sqli
15360 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20  te3_vtab *pVtab 
15370 3d 20 73 71 6c 69 74 65 33 47 65 74 56 54 61 62  = sqlite3GetVTab
15380 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  le(pParse->db, p
15390 54 61 62 29 2d 3e 70 56 74 61 62 3b 0a 20 20 69  Tab)->pVtab;.  i
153a0 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  nt i;.  int rc;.
153b0 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50  .  TRACE_IDX_INP
153c0 55 54 53 28 70 29 3b 0a 20 20 72 63 20 3d 20 70  UTS(p);.  rc = p
153d0 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78  Vtab->pModule->x
153e0 42 65 73 74 49 6e 64 65 78 28 70 56 74 61 62 2c  BestIndex(pVtab,
153f0 20 70 29 3b 0a 20 20 54 52 41 43 45 5f 49 44 58   p);.  TRACE_IDX
15400 5f 4f 55 54 50 55 54 53 28 70 29 3b 0a 0a 20 20  _OUTPUTS(p);..  
15410 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
15420 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d  K ){.    if( rc=
15430 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b  =SQLITE_NOMEM ){
15440 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64  .      pParse->d
15450 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
15460 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 1;.    }else i
15470 66 28 20 21 70 56 74 61 62 2d 3e 7a 45 72 72 4d  f( !pVtab->zErrM
15480 73 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  sg ){.      sqli
15490 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
154a0 73 65 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65  se, "%s", sqlite
154b0 33 45 72 72 53 74 72 28 72 63 29 29 3b 0a 20 20  3ErrStr(rc));.  
154c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
154d0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
154e0 50 61 72 73 65 2c 20 22 25 73 22 2c 20 70 56 74  Parse, "%s", pVt
154f0 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ab->zErrMsg);.  
15500 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
15510 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e 7a 45  3_free(pVtab->zE
15520 72 72 4d 73 67 29 3b 0a 20 20 70 56 74 61 62 2d  rrMsg);.  pVtab-
15530 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 20  >zErrMsg = 0;.. 
15540 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
15550 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29  Constraint; i++)
15560 7b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 61 43  {.    if( !p->aC
15570 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61  onstraint[i].usa
15580 62 6c 65 20 26 26 20 70 2d 3e 61 43 6f 6e 73 74  ble && p->aConst
15590 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72  raintUsage[i].ar
155a0 67 76 49 6e 64 65 78 3e 30 20 29 7b 0a 20 20 20  gvIndex>0 ){.   
155b0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
155c0 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
155d0 20 20 20 20 20 20 22 74 61 62 6c 65 20 25 73 3a        "table %s:
155e0 20 78 42 65 73 74 49 6e 64 65 78 20 72 65 74 75   xBestIndex retu
155f0 72 6e 65 64 20 61 6e 20 69 6e 76 61 6c 69 64 20  rned an invalid 
15600 70 6c 61 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  plan", pTab->zNa
15610 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  me);.    }.  }..
15620 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d    return pParse-
15630 3e 6e 45 72 72 3b 0a 7d 0a 23 65 6e 64 69 66 20  >nErr;.}.#endif 
15640 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
15650 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
15660 41 42 4c 45 29 20 2a 2f 0a 0a 0a 23 69 66 64 65  ABLE) */...#ifde
15670 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
15680 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f  STAT3_OR_STAT4./
15690 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68  *.** Estimate th
156a0 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 61 20  e location of a 
156b0 70 61 72 74 69 63 75 6c 61 72 20 6b 65 79 20 61  particular key a
156c0 6d 6f 6e 67 20 61 6c 6c 20 6b 65 79 73 20 69 6e  mong all keys in
156d0 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20 20 53   an.** index.  S
156e0 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
156f0 20 69 6e 20 61 53 74 61 74 20 61 73 20 66 6f 6c   in aStat as fol
15700 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61  lows:.**.**    a
15710 53 74 61 74 5b 30 5d 20 20 20 20 20 20 45 73 74  Stat[0]      Est
15720 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  . number of rows
15730 20 6c 65 73 73 20 74 68 61 6e 20 70 56 61 6c 0a   less than pVal.
15740 2a 2a 20 20 20 20 61 53 74 61 74 5b 31 5d 20 20  **    aStat[1]  
15750 20 20 20 20 45 73 74 2e 20 6e 75 6d 62 65 72 20      Est. number 
15760 6f 66 20 72 6f 77 73 20 65 71 75 61 6c 20 74 6f  of rows equal to
15770 20 70 56 61 6c 0a 2a 2a 0a 2a 2a 20 52 65 74 75   pVal.**.** Retu
15780 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
15790 73 75 63 63 65 73 73 2e 0a 2a 2f 0a 73 74 61 74  success..*/.stat
157a0 69 63 20 76 6f 69 64 20 77 68 65 72 65 4b 65 79  ic void whereKey
157b0 53 74 61 74 73 28 0a 20 20 50 61 72 73 65 20 2a  Stats(.  Parse *
157c0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
157d0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
157e0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
157f0 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20   Index *pIdx,   
15800 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15810 49 6e 64 65 78 20 74 6f 20 63 6f 6e 73 69 64 65  Index to conside
15820 72 20 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a 20  r domain of */. 
15830 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
15840 2a 70 52 65 63 2c 20 20 20 20 20 20 20 2f 2a 20  *pRec,       /* 
15850 56 65 63 74 6f 72 20 6f 66 20 76 61 6c 75 65 73  Vector of values
15860 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 2a 2f 0a   to consider */.
15870 20 20 69 6e 74 20 72 6f 75 6e 64 55 70 2c 20 20    int roundUp,  
15880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15890 20 52 6f 75 6e 64 20 75 70 20 69 66 20 74 72 75   Round up if tru
158a0 65 2e 20 20 52 6f 75 6e 64 20 64 6f 77 6e 20 69  e.  Round down i
158b0 66 20 66 61 6c 73 65 20 2a 2f 0a 20 20 74 52 6f  f false */.  tRo
158c0 77 63 6e 74 20 2a 61 53 74 61 74 20 20 20 20 20  wcnt *aStat     
158d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
158e0 20 73 74 61 74 73 20 77 72 69 74 74 65 6e 20 68   stats written h
158f0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65  ere */.){.  Inde
15900 78 53 61 6d 70 6c 65 20 2a 61 53 61 6d 70 6c 65  xSample *aSample
15910 20 3d 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65   = pIdx->aSample
15920 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20  ;.  int iCol;   
15930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15940 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 65 71 75  /* Index of requ
15950 69 72 65 64 20 73 74 61 74 73 20 69 6e 20 61 6e  ired stats in an
15960 45 71 5b 5d 20 65 74 63 2e 20 2a 2f 0a 20 20 69  Eq[] etc. */.  i
15970 6e 74 20 69 4d 69 6e 20 3d 20 30 3b 20 20 20 20  nt iMin = 0;    
15980 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6d             /* Sm
15990 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20 6e 6f  allest sample no
159a0 74 20 79 65 74 20 74 65 73 74 65 64 20 2a 2f 0a  t yet tested */.
159b0 20 20 69 6e 74 20 69 20 3d 20 70 49 64 78 2d 3e    int i = pIdx->
159c0 6e 53 61 6d 70 6c 65 3b 20 20 20 20 20 20 2f 2a  nSample;      /*
159d0 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65   Smallest sample
159e0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6f 72 20   larger than or 
159f0 65 71 75 61 6c 20 74 6f 20 70 52 65 63 20 2a 2f  equal to pRec */
15a00 0a 20 20 69 6e 74 20 69 54 65 73 74 3b 20 20 20  .  int iTest;   
15a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15a20 2a 20 4e 65 78 74 20 73 61 6d 70 6c 65 20 74 6f  * Next sample to
15a30 20 74 65 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72   test */.  int r
15a40 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  es;             
15a50 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
15a60 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f   of comparison o
15a70 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 23 69 66  peration */..#if
15a80 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  ndef SQLITE_DEBU
15a90 47 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  G.  UNUSED_PARAM
15aa0 45 54 45 52 28 20 70 50 61 72 73 65 20 29 3b 0a  ETER( pParse );.
15ab0 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
15ac0 20 70 52 65 63 21 3d 30 20 7c 7c 20 70 50 61 72   pRec!=0 || pPar
15ad0 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
15ae0 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 52  iled );.  if( pR
15af0 65 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ec==0 ) return;.
15b00 20 20 69 43 6f 6c 20 3d 20 70 52 65 63 2d 3e 6e    iCol = pRec->n
15b10 46 69 65 6c 64 20 2d 20 31 3b 0a 20 20 61 73 73  Field - 1;.  ass
15b20 65 72 74 28 20 70 49 64 78 2d 3e 6e 53 61 6d 70  ert( pIdx->nSamp
15b30 6c 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  le>0 );.  assert
15b40 28 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3e 30  ( pRec->nField>0
15b50 20 26 26 20 69 43 6f 6c 3c 70 49 64 78 2d 3e 6e   && iCol<pIdx->n
15b60 53 61 6d 70 6c 65 43 6f 6c 20 29 3b 0a 20 20 64  SampleCol );.  d
15b70 6f 7b 0a 20 20 20 20 69 54 65 73 74 20 3d 20 28  o{.    iTest = (
15b80 69 4d 69 6e 2b 69 29 2f 32 3b 0a 20 20 20 20 72  iMin+i)/2;.    r
15b90 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  es = sqlite3Vdbe
15ba0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53  RecordCompare(aS
15bb0 61 6d 70 6c 65 5b 69 54 65 73 74 5d 2e 6e 2c 20  ample[iTest].n, 
15bc0 61 53 61 6d 70 6c 65 5b 69 54 65 73 74 5d 2e 70  aSample[iTest].p
15bd0 2c 20 70 52 65 63 29 3b 0a 20 20 20 20 69 66 28  , pRec);.    if(
15be0 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20   res<0 ){.      
15bf0 69 4d 69 6e 20 3d 20 69 54 65 73 74 2b 31 3b 0a  iMin = iTest+1;.
15c00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15c10 20 69 20 3d 20 69 54 65 73 74 3b 0a 20 20 20 20   i = iTest;.    
15c20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72 65 73 20  }.  }while( res 
15c30 26 26 20 69 4d 69 6e 3c 69 20 29 3b 0a 0a 23 69  && iMin<i );..#i
15c40 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
15c50 47 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  G.  /* The follo
15c60 77 69 6e 67 20 61 73 73 65 72 74 20 73 74 61 74  wing assert stat
15c70 65 6d 65 6e 74 73 20 63 68 65 63 6b 20 74 68 61  ements check tha
15c80 74 20 74 68 65 20 62 69 6e 61 72 79 20 73 65 61  t the binary sea
15c90 72 63 68 20 63 6f 64 65 0a 20 20 2a 2a 20 61 62  rch code.  ** ab
15ca0 6f 76 65 20 66 6f 75 6e 64 20 74 68 65 20 72 69  ove found the ri
15cb0 67 68 74 20 61 6e 73 77 65 72 2e 20 54 68 69 73  ght answer. This
15cc0 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 6e 6f   block serves no
15cd0 20 70 75 72 70 6f 73 65 20 6f 74 68 65 72 0a 20   purpose other. 
15ce0 20 2a 2a 20 74 68 61 6e 20 74 6f 20 69 6e 76 6f   ** than to invo
15cf0 6b 65 20 74 68 65 20 61 73 73 65 72 74 73 2e 20  ke the asserts. 
15d00 20 2a 2f 0a 20 20 69 66 28 20 72 65 73 3d 3d 30   */.  if( res==0
15d10 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 28 72   ){.    /* If (r
15d20 65 73 3d 3d 30 29 20 69 73 20 74 72 75 65 2c 20  es==0) is true, 
15d30 74 68 65 6e 20 73 61 6d 70 6c 65 20 24 69 20 6d  then sample $i m
15d40 75 73 74 20 62 65 20 65 71 75 61 6c 20 74 6f 20  ust be equal to 
15d50 70 52 65 63 20 2a 2f 0a 20 20 20 20 61 73 73 65  pRec */.    asse
15d60 72 74 28 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d  rt( i<pIdx->nSam
15d70 70 6c 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ple );.    asser
15d80 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 56 64 62  t( 0==sqlite3Vdb
15d90 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61  eRecordCompare(a
15da0 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61  Sample[i].n, aSa
15db0 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29  mple[i].p, pRec)
15dc0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61  .         || pPa
15dd0 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
15de0 61 69 6c 65 64 20 29 3b 0a 20 20 7d 65 6c 73 65  ailed );.  }else
15df0 7b 0a 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69  {.    /* Otherwi
15e00 73 65 2c 20 70 52 65 63 20 6d 75 73 74 20 62 65  se, pRec must be
15e10 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 73 61   smaller than sa
15e20 6d 70 6c 65 20 24 69 20 61 6e 64 20 6c 61 72 67  mple $i and larg
15e30 65 72 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 73  er than.    ** s
15e40 61 6d 70 6c 65 20 28 24 69 2d 31 29 2e 20 20 2a  ample ($i-1).  *
15e50 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3d  /.    assert( i=
15e60 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 0a  =pIdx->nSample .
15e70 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
15e80 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
15e90 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 5d 2e  pare(aSample[i].
15ea0 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c  n, aSample[i].p,
15eb0 20 70 52 65 63 29 3e 30 0a 20 20 20 20 20 20 20   pRec)>0.       
15ec0 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d    || pParse->db-
15ed0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
15ee0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d  .    assert( i==
15ef0 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71  0.         || sq
15f00 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
15f10 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69  ompare(aSample[i
15f20 2d 31 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69  -1].n, aSample[i
15f30 2d 31 5d 2e 70 2c 20 70 52 65 63 29 3c 30 0a 20  -1].p, pRec)<0. 
15f40 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73          || pPars
15f50 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
15f60 6c 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  led );.  }.#endi
15f70 66 20 2f 2a 20 69 66 64 65 66 20 53 51 4c 49 54  f /* ifdef SQLIT
15f80 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 20 20 2f 2a  E_DEBUG */..  /*
15f90 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
15fa0 61 53 61 6d 70 6c 65 5b 69 5d 20 69 73 20 74 68  aSample[i] is th
15fb0 65 20 66 69 72 73 74 20 73 61 6d 70 6c 65 20 74  e first sample t
15fc0 68 61 74 20 69 73 20 67 72 65 61 74 65 72 20 74  hat is greater t
15fd0 68 61 6e 0a 20 20 2a 2a 20 6f 72 20 65 71 75 61  han.  ** or equa
15fe0 6c 20 74 6f 20 70 56 61 6c 2e 20 20 4f 72 20 69  l to pVal.  Or i
15ff0 66 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70  f i==pIdx->nSamp
16000 6c 65 2c 20 74 68 65 6e 20 61 6c 6c 20 73 61 6d  le, then all sam
16010 70 6c 65 73 20 61 72 65 20 6c 65 73 73 0a 20 20  ples are less.  
16020 2a 2a 20 74 68 61 6e 20 70 56 61 6c 2e 20 20 49  ** than pVal.  I
16030 66 20 61 53 61 6d 70 6c 65 5b 69 5d 3d 3d 70 56  f aSample[i]==pV
16040 61 6c 2c 20 74 68 65 6e 20 72 65 73 3d 3d 30 2e  al, then res==0.
16050 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 73 3d  .  */.  if( res=
16060 3d 30 20 29 7b 0a 20 20 20 20 61 53 74 61 74 5b  =0 ){.    aStat[
16070 30 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  0] = aSample[i].
16080 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20  anLt[iCol];.    
16090 61 53 74 61 74 5b 31 5d 20 3d 20 61 53 61 6d 70  aStat[1] = aSamp
160a0 6c 65 5b 69 5d 2e 61 6e 45 71 5b 69 43 6f 6c 5d  le[i].anEq[iCol]
160b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74  ;.  }else{.    t
160c0 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72 2c 20 69  Rowcnt iLower, i
160d0 55 70 70 65 72 2c 20 69 47 61 70 3b 0a 20 20 20  Upper, iGap;.   
160e0 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20   if( i==0 ){.   
160f0 20 20 20 69 4c 6f 77 65 72 20 3d 20 30 3b 0a 20     iLower = 0;. 
16100 20 20 20 20 20 69 55 70 70 65 72 20 3d 20 61 53       iUpper = aS
16110 61 6d 70 6c 65 5b 30 5d 2e 61 6e 4c 74 5b 69 43  ample[0].anLt[iC
16120 6f 6c 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ol];.    }else{.
16130 20 20 20 20 20 20 69 55 70 70 65 72 20 3d 20 69        iUpper = i
16140 3e 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20  >=pIdx->nSample 
16150 3f 20 70 49 64 78 2d 3e 61 69 52 6f 77 45 73 74  ? pIdx->aiRowEst
16160 5b 30 5d 20 3a 20 61 53 61 6d 70 6c 65 5b 69 5d  [0] : aSample[i]
16170 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20  .anLt[iCol];.   
16180 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 53 61 6d     iLower = aSam
16190 70 6c 65 5b 69 2d 31 5d 2e 61 6e 45 71 5b 69 43  ple[i-1].anEq[iC
161a0 6f 6c 5d 20 2b 20 61 53 61 6d 70 6c 65 5b 69 2d  ol] + aSample[i-
161b0 31 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20  1].anLt[iCol];. 
161c0 20 20 20 7d 0a 20 20 20 20 61 53 74 61 74 5b 31     }.    aStat[1
161d0 5d 20 3d 20 28 70 49 64 78 2d 3e 6e 43 6f 6c 75  ] = (pIdx->nColu
161e0 6d 6e 3e 69 43 6f 6c 20 3f 20 70 49 64 78 2d 3e  mn>iCol ? pIdx->
161f0 61 41 76 67 45 71 5b 69 43 6f 6c 5d 20 3a 20 31  aAvgEq[iCol] : 1
16200 29 3b 0a 20 20 20 20 69 66 28 20 69 4c 6f 77 65  );.    if( iLowe
16210 72 3e 3d 69 55 70 70 65 72 20 29 7b 0a 20 20 20  r>=iUpper ){.   
16220 20 20 20 69 47 61 70 20 3d 20 30 3b 0a 20 20 20     iGap = 0;.   
16230 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47   }else{.      iG
16240 61 70 20 3d 20 69 55 70 70 65 72 20 2d 20 69 4c  ap = iUpper - iL
16250 6f 77 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ower;.    }.    
16260 69 66 28 20 72 6f 75 6e 64 55 70 20 29 7b 0a 20  if( roundUp ){. 
16270 20 20 20 20 20 69 47 61 70 20 3d 20 28 69 47 61       iGap = (iGa
16280 70 2a 32 29 2f 33 3b 0a 20 20 20 20 7d 65 6c 73  p*2)/3;.    }els
16290 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20  e{.      iGap = 
162a0 69 47 61 70 2f 33 3b 0a 20 20 20 20 7d 0a 20 20  iGap/3;.    }.  
162b0 20 20 61 53 74 61 74 5b 30 5d 20 3d 20 69 4c 6f    aStat[0] = iLo
162c0 77 65 72 20 2b 20 69 47 61 70 3b 0a 20 20 7d 0a  wer + iGap;.  }.
162d0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
162e0 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
162f0 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a  OR_STAT4 */../*.
16300 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
16310 20 69 73 20 75 73 65 64 20 74 6f 20 65 73 74 69   is used to esti
16320 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mate the number 
16330 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c  of rows that wil
16340 6c 20 62 65 20 76 69 73 69 74 65 64 0a 2a 2a 20  l be visited.** 
16350 62 79 20 73 63 61 6e 6e 69 6e 67 20 61 6e 20 69  by scanning an i
16360 6e 64 65 78 20 66 6f 72 20 61 20 72 61 6e 67 65  ndex for a range
16370 20 6f 66 20 76 61 6c 75 65 73 2e 20 54 68 65 20   of values. The 
16380 72 61 6e 67 65 20 6d 61 79 20 68 61 76 65 20 61  range may have a
16390 6e 20 75 70 70 65 72 0a 2a 2a 20 62 6f 75 6e 64  n upper.** bound
163a0 2c 20 61 20 6c 6f 77 65 72 20 62 6f 75 6e 64 2c  , a lower bound,
163b0 20 6f 72 20 62 6f 74 68 2e 20 54 68 65 20 57 48   or both. The WH
163c0 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
163d0 20 74 68 61 74 20 73 65 74 20 74 68 65 20 75 70   that set the up
163e0 70 65 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77 65 72  per.** and lower
163f0 20 62 6f 75 6e 64 73 20 61 72 65 20 72 65 70 72   bounds are repr
16400 65 73 65 6e 74 65 64 20 62 79 20 70 4c 6f 77 65  esented by pLowe
16410 72 20 61 6e 64 20 70 55 70 70 65 72 20 72 65 73  r and pUpper res
16420 70 65 63 74 69 76 65 6c 79 2e 20 46 6f 72 0a 2a  pectively. For.*
16430 2a 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d  * example, assum
16440 69 6e 67 20 74 68 61 74 20 69 6e 64 65 78 20 70  ing that index p
16450 20 69 73 20 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a   is on t1(a):.**
16460 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74  .**   ... FROM t
16470 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e  1 WHERE a > ? AN
16480 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20  D a < ? ....**  
16490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
164a0 20 20 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f    |_____|   |___
164b0 5f 5f 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  __|.**          
164c0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
164d0 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20         |.**     
164e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
164f0 70 4c 6f 77 65 72 20 20 20 20 70 55 70 70 65 72  pLower    pUpper
16500 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72  .**.** If either
16510 20 6f 66 20 74 68 65 20 75 70 70 65 72 20 6f 72   of the upper or
16520 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 69 73 20   lower bound is 
16530 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 74 68 65  not present, the
16540 6e 20 4e 55 4c 4c 20 69 73 20 70 61 73 73 65 64  n NULL is passed
16550 20 69 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f 66 20   in.** place of 
16560 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
16570 67 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a  g WhereTerm..**.
16580 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20  ** The value in 
16590 28 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d  (pBuilder->pNew-
165a0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29 20 69 73  >u.btree.nEq) is
165b0 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
165c0 65 20 69 6e 64 65 78 0a 2a 2a 20 63 6f 6c 75 6d  e index.** colum
165d0 6e 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65  n subject to the
165e0 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
165f0 74 2e 20 4f 72 2c 20 65 71 75 69 76 61 6c 65 6e  t. Or, equivalen
16600 74 6c 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20  tly, the number 
16610 6f 66 0a 2a 2a 20 65 71 75 61 6c 69 74 79 20 63  of.** equality c
16620 6f 6e 73 74 72 61 69 6e 74 73 20 6f 70 74 69 6d  onstraints optim
16630 69 7a 65 64 20 62 79 20 74 68 65 20 70 72 6f 70  ized by the prop
16640 6f 73 65 64 20 69 6e 64 65 78 20 73 63 61 6e 2e  osed index scan.
16650 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a   For example,.**
16660 20 61 73 73 75 6d 69 6e 67 20 69 6e 64 65 78 20   assuming index 
16670 70 20 69 73 20 6f 6e 20 74 31 28 61 2c 20 62 29  p is on t1(a, b)
16680 2c 20 61 6e 64 20 74 68 65 20 53 51 4c 20 71 75  , and the SQL qu
16690 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ery is:.**.**   
166a0 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52  ... FROM t1 WHER
166b0 45 20 61 20 3d 20 3f 20 41 4e 44 20 62 20 3e 20  E a = ? AND b > 
166c0 3f 20 41 4e 44 20 62 20 3c 20 3f 20 2e 2e 2e 0a  ? AND b < ? ....
166d0 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 69  **.** then nEq i
166e0 73 20 73 65 74 20 74 6f 20 31 20 28 61 73 20 74  s set to 1 (as t
166f0 68 65 20 72 61 6e 67 65 20 72 65 73 74 72 69 63  he range restric
16700 74 65 64 20 63 6f 6c 75 6d 6e 2c 20 62 2c 20 69  ted column, b, i
16710 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a  s the second .**
16720 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d   left-most colum
16730 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 29 2e  n of the index).
16740 20 4f 72 2c 20 69 66 20 74 68 65 20 71 75 65 72   Or, if the quer
16750 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e  y is:.**.**   ..
16760 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  . FROM t1 WHERE 
16770 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20  a > ? AND a < ? 
16780 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e  ....**.** then n
16790 45 71 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a  Eq is set to 0..
167a0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
167b0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
167c0 65 64 2c 20 2a 70 6e 4f 75 74 20 69 73 20 73 65  ed, *pnOut is se
167d0 74 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33  t to the sqlite3
167e0 4c 6f 67 45 73 74 28 29 20 6f 66 20 74 68 65 0a  LogEst() of the.
167f0 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ** number of row
16800 73 20 74 68 61 74 20 74 68 65 20 69 6e 64 65 78  s that the index
16810 20 73 63 61 6e 20 69 73 20 65 78 70 65 63 74 65   scan is expecte
16820 64 20 74 6f 20 76 69 73 69 74 20 77 69 74 68 6f  d to visit witho
16830 75 74 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 69  ut .** consideri
16840 6e 67 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e  ng the range con
16850 73 74 72 61 69 6e 74 73 2e 20 49 66 20 6e 45 71  straints. If nEq
16860 20 69 73 20 30 2c 20 74 68 69 73 20 69 73 20 74   is 0, this is t
16870 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a  he number of .**
16880 20 72 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 64   rows in the ind
16890 65 78 2e 20 41 73 73 75 6d 69 6e 67 20 6e 6f 20  ex. Assuming no 
168a0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70  error occurs, *p
168b0 6e 4f 75 74 20 69 73 20 61 64 6a 75 73 74 65 64  nOut is adjusted
168c0 20 28 72 65 64 75 63 65 64 29 0a 2a 2a 20 74 6f   (reduced).** to
168d0 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65   account for the
168e0 20 72 61 6e 67 65 20 63 6f 6e 74 72 61 69 6e 74   range contraint
168f0 73 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70  s pLower and pUp
16900 70 65 72 2e 0a 2a 2a 20 0a 2a 2a 20 49 6e 20 74  per..** .** In t
16910 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20 73 71  he absence of sq
16920 6c 69 74 65 5f 73 74 61 74 34 20 41 4e 41 4c 59  lite_stat4 ANALY
16930 5a 45 20 64 61 74 61 2c 20 6f 72 20 69 66 20 73  ZE data, or if s
16940 75 63 68 20 64 61 74 61 20 63 61 6e 6e 6f 74 20  uch data cannot 
16950 62 65 0a 2a 2a 20 75 73 65 64 2c 20 65 61 63 68  be.** used, each
16960 20 72 61 6e 67 65 20 69 6e 65 71 75 61 6c 69 74   range inequalit
16970 79 20 72 65 64 75 63 65 73 20 74 68 65 20 73 65  y reduces the se
16980 61 72 63 68 20 73 70 61 63 65 20 62 79 20 61 20  arch space by a 
16990 66 61 63 74 6f 72 20 6f 66 20 34 2e 20 0a 2a 2a  factor of 4. .**
169a0 20 48 65 6e 63 65 20 61 20 70 61 69 72 20 6f 66   Hence a pair of
169b0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 28 78 3e   constraints (x>
169c0 3f 20 41 4e 44 20 78 3c 3f 29 20 72 65 64 75 63  ? AND x<?) reduc
169d0 65 73 20 74 68 65 20 65 78 70 65 63 74 65 64 20  es the expected 
169e0 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 72 6f 77  number of.** row
169f0 73 20 76 69 73 69 74 65 64 20 62 79 20 61 20 66  s visited by a f
16a00 61 63 74 6f 72 20 6f 66 20 31 36 2e 0a 2a 2f 0a  actor of 16..*/.
16a10 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
16a20 52 61 6e 67 65 53 63 61 6e 45 73 74 28 0a 20 20  RangeScanEst(.  
16a30 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
16a40 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
16a50 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  & code generatin
16a60 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
16a70 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
16a80 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 57 68 65  *pBuilder,.  Whe
16a90 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20  reTerm *pLower, 
16aa0 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64    /* Lower bound
16ab0 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65   on the range. e
16ac0 78 3a 20 22 78 3e 31 32 33 22 20 4d 69 67 68 74  x: "x>123" Might
16ad0 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68   be NULL */.  Wh
16ae0 65 72 65 54 65 72 6d 20 2a 70 55 70 70 65 72 2c  ereTerm *pUpper,
16af0 20 20 20 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e     /* Upper boun
16b00 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65 2e 20  d on the range. 
16b10 65 78 3a 20 22 78 3c 34 35 35 22 20 4d 69 67 68  ex: "x<455" Migh
16b20 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57  t be NULL */.  W
16b30 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20  hereLoop *pLoop 
16b40 20 20 20 20 2f 2a 20 4d 6f 64 69 66 79 20 74 68      /* Modify th
16b50 65 20 2e 6e 4f 75 74 20 61 6e 64 20 6d 61 79 62  e .nOut and mayb
16b60 65 20 2e 72 52 75 6e 20 66 69 65 6c 64 73 20 2a  e .rRun fields *
16b70 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
16b80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
16b90 20 6e 4f 75 74 20 3d 20 70 4c 6f 6f 70 2d 3e 6e   nOut = pLoop->n
16ba0 4f 75 74 3b 0a 20 20 4c 6f 67 45 73 74 20 6e 4e  Out;.  LogEst nN
16bb0 65 77 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ew;..#ifdef SQLI
16bc0 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
16bd0 4f 52 5f 53 54 41 54 34 0a 20 20 49 6e 64 65 78  OR_STAT4.  Index
16be0 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62   *p = pLoop->u.b
16bf0 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69  tree.pIndex;.  i
16c00 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e  nt nEq = pLoop->
16c10 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 0a 20 20  u.btree.nEq;..  
16c20 69 66 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30  if( p->nSample>0
16c30 0a 20 20 20 26 26 20 6e 45 71 3d 3d 70 42 75 69  .   && nEq==pBui
16c40 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 0a  lder->nRecValid.
16c50 20 20 20 26 26 20 6e 45 71 3c 70 2d 3e 6e 53 61     && nEq<p->nSa
16c60 6d 70 6c 65 43 6f 6c 0a 20 20 20 26 26 20 4f 70  mpleCol.   && Op
16c70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
16c80 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51  d(pParse->db, SQ
16c90 4c 49 54 45 5f 53 74 61 74 33 29 20 0a 20 20 29  LITE_Stat3) .  )
16ca0 7b 0a 20 20 20 20 55 6e 70 61 63 6b 65 64 52 65  {.    UnpackedRe
16cb0 63 6f 72 64 20 2a 70 52 65 63 20 3d 20 70 42 75  cord *pRec = pBu
16cc0 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20 20  ilder->pRec;.   
16cd0 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b 0a 20   tRowcnt a[2];. 
16ce0 20 20 20 75 38 20 61 66 66 3b 0a 0a 20 20 20 20     u8 aff;..    
16cf0 2f 2a 20 56 61 72 69 61 62 6c 65 20 69 4c 6f 77  /* Variable iLow
16d00 65 72 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74  er will be set t
16d10 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 20 6f  o the estimate o
16d20 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
16d30 72 6f 77 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20  rows in .    ** 
16d40 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 61  the index that a
16d50 72 65 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  re less than the
16d60 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66 20   lower bound of 
16d70 74 68 65 20 72 61 6e 67 65 20 71 75 65 72 79 2e  the range query.
16d80 20 54 68 65 0a 20 20 20 20 2a 2a 20 6c 6f 77 65   The.    ** lowe
16d90 72 20 62 6f 75 6e 64 20 62 65 69 6e 67 20 74 68  r bound being th
16da0 65 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 20  e concatenation 
16db0 6f 66 20 24 50 20 61 6e 64 20 24 4c 2c 20 77 68  of $P and $L, wh
16dc0 65 72 65 20 24 50 20 69 73 20 74 68 65 0a 20 20  ere $P is the.  
16dd0 20 20 2a 2a 20 6b 65 79 2d 70 72 65 66 69 78 20    ** key-prefix 
16de0 66 6f 72 6d 65 64 20 62 79 20 74 68 65 20 6e 45  formed by the nE
16df0 71 20 76 61 6c 75 65 73 20 6d 61 74 63 68 65 64  q values matched
16e00 20 61 67 61 69 6e 73 74 20 74 68 65 20 6e 45 71   against the nEq
16e10 20 6c 65 66 74 2d 6d 6f 73 74 0a 20 20 20 20 2a   left-most.    *
16e20 2a 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  * columns of the
16e30 20 69 6e 64 65 78 2c 20 61 6e 64 20 24 4c 20 69   index, and $L i
16e40 73 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70  s the value in p
16e50 4c 6f 77 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20  Lower..    **.  
16e60 20 20 2a 2a 20 4f 72 2c 20 69 66 20 70 4c 6f 77    ** Or, if pLow
16e70 65 72 20 69 73 20 4e 55 4c 4c 20 6f 72 20 24 4c  er is NULL or $L
16e80 20 63 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61   cannot be extra
16e90 63 74 65 64 20 66 72 6f 6d 20 69 74 20 28 62 65  cted from it (be
16ea0 63 61 75 73 65 20 69 74 0a 20 20 20 20 2a 2a 20  cause it.    ** 
16eb0 69 73 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65 20  is not a simple 
16ec0 76 61 72 69 61 62 6c 65 20 6f 72 20 6c 69 74 65  variable or lite
16ed0 72 61 6c 20 76 61 6c 75 65 29 2c 20 74 68 65 20  ral value), the 
16ee0 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66 20 74  lower bound of t
16ef0 68 65 0a 20 20 20 20 2a 2a 20 72 61 6e 67 65 20  he.    ** range 
16f00 69 73 20 24 50 2e 20 44 75 65 20 74 6f 20 61 20  is $P. Due to a 
16f10 71 75 69 72 6b 20 69 6e 20 74 68 65 20 77 61 79  quirk in the way
16f20 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 29   whereKeyStats()
16f30 20 77 6f 72 6b 73 2c 20 65 76 65 6e 0a 20 20 20   works, even.   
16f40 20 2a 2a 20 69 66 20 24 4c 20 69 73 20 61 76 61   ** if $L is ava
16f50 69 6c 61 62 6c 65 2c 20 77 68 65 72 65 4b 65 79  ilable, whereKey
16f60 53 74 61 74 73 28 29 20 69 73 20 63 61 6c 6c 65  Stats() is calle
16f70 64 20 66 6f 72 20 62 6f 74 68 20 28 24 50 29 20  d for both ($P) 
16f80 61 6e 64 20 0a 20 20 20 20 2a 2a 20 28 24 50 3a  and .    ** ($P:
16f90 24 4c 29 20 61 6e 64 20 74 68 65 20 6c 61 72 67  $L) and the larg
16fa0 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 72 65  er of the two re
16fb0 74 75 72 6e 65 64 20 76 61 6c 75 65 73 20 75 73  turned values us
16fc0 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
16fd0 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20 69 55 70  * Similarly, iUp
16fe0 70 65 72 20 69 73 20 74 6f 20 62 65 20 73 65 74  per is to be set
16ff0 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65   to the estimate
17000 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
17010 66 20 72 6f 77 73 0a 20 20 20 20 2a 2a 20 6c 65  f rows.    ** le
17020 73 73 20 74 68 61 6e 20 74 68 65 20 75 70 70 65  ss than the uppe
17030 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65 20 72  r bound of the r
17040 61 6e 67 65 20 71 75 65 72 79 2e 20 57 68 65 72  ange query. Wher
17050 65 20 74 68 65 20 75 70 70 65 72 20 62 6f 75 6e  e the upper boun
17060 64 0a 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68  d.    ** is eith
17070 65 72 20 28 24 50 29 20 6f 72 20 28 24 50 3a 24  er ($P) or ($P:$
17080 55 29 2e 20 41 67 61 69 6e 2c 20 65 76 65 6e 20  U). Again, even 
17090 69 66 20 24 55 20 69 73 20 61 76 61 69 6c 61 62  if $U is availab
170a0 6c 65 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 0a  le, both values.
170b0 20 20 20 20 2a 2a 20 6f 66 20 69 55 70 70 65 72      ** of iUpper
170c0 20 61 72 65 20 72 65 71 75 65 73 74 65 64 20 6f   are requested o
170d0 66 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28  f whereKeyStats(
170e0 29 20 61 6e 64 20 74 68 65 20 73 6d 61 6c 6c 65  ) and the smalle
170f0 72 20 75 73 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  r used..    */. 
17100 20 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65     tRowcnt iLowe
17110 72 3b 0a 20 20 20 20 74 52 6f 77 63 6e 74 20 69  r;.    tRowcnt i
17120 55 70 70 65 72 3b 0a 0a 20 20 20 20 69 66 28 20  Upper;..    if( 
17130 6e 45 71 3d 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 20  nEq==p->nColumn 
17140 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  ){.      aff = S
17150 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
17160 52 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  R;.    }else{.  
17170 20 20 20 20 61 66 66 20 3d 20 70 2d 3e 70 54 61      aff = p->pTa
17180 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43  ble->aCol[p->aiC
17190 6f 6c 75 6d 6e 5b 6e 45 71 5d 5d 2e 61 66 66 69  olumn[nEq]].affi
171a0 6e 69 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nity;.    }.    
171b0 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 4c 6f  /* Determine iLo
171c0 77 65 72 20 61 6e 64 20 69 55 70 70 65 72 20 75  wer and iUpper u
171d0 73 69 6e 67 20 28 24 50 29 20 6f 6e 6c 79 2e 20  sing ($P) only. 
171e0 2a 2f 0a 20 20 20 20 69 66 28 20 6e 45 71 3d 3d  */.    if( nEq==
171f0 30 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65  0 ){.      iLowe
17200 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 55 70  r = 0;.      iUp
17210 70 65 72 20 3d 20 70 2d 3e 61 69 52 6f 77 45 73  per = p->aiRowEs
17220 74 5b 30 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  t[0];.    }else{
17230 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20  .      /* Note: 
17240 74 68 69 73 20 63 61 6c 6c 20 63 6f 75 6c 64 20  this call could 
17250 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 61 77 61  be optimized awa
17260 79 20 2d 20 73 69 6e 63 65 20 74 68 65 20 73 61  y - since the sa
17270 6d 65 20 76 61 6c 75 65 73 20 6d 75 73 74 20 0a  me values must .
17280 20 20 20 20 20 20 2a 2a 20 68 61 76 65 20 62 65        ** have be
17290 65 6e 20 72 65 71 75 65 73 74 65 64 20 77 68 65  en requested whe
172a0 6e 20 74 65 73 74 69 6e 67 20 6b 65 79 20 24 50  n testing key $P
172b0 20 69 6e 20 77 68 65 72 65 45 71 75 61 6c 53 63   in whereEqualSc
172c0 61 6e 45 73 74 28 29 2e 20 20 2a 2f 0a 20 20 20  anEst().  */.   
172d0 20 20 20 77 68 65 72 65 4b 65 79 53 74 61 74 73     whereKeyStats
172e0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63  (pParse, p, pRec
172f0 2c 20 30 2c 20 61 29 3b 0a 20 20 20 20 20 20 69  , 0, a);.      i
17300 4c 6f 77 65 72 20 3d 20 61 5b 30 5d 3b 0a 20 20  Lower = a[0];.  
17310 20 20 20 20 69 55 70 70 65 72 20 3d 20 61 5b 30      iUpper = a[0
17320 5d 20 2b 20 61 5b 31 5d 3b 0a 20 20 20 20 7d 0a  ] + a[1];.    }.
17330 0a 20 20 20 20 2f 2a 20 49 66 20 70 6f 73 73 69  .    /* If possi
17340 62 6c 65 2c 20 69 6d 70 72 6f 76 65 20 6f 6e 20  ble, improve on 
17350 74 68 65 20 69 4c 6f 77 65 72 20 65 73 74 69 6d  the iLower estim
17360 61 74 65 20 75 73 69 6e 67 20 28 24 50 3a 24 4c  ate using ($P:$L
17370 29 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c  ). */.    if( pL
17380 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20 69 6e  ower ){.      in
17390 74 20 62 4f 6b 3b 20 20 20 20 20 20 20 20 20 20  t bOk;          
173a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
173b0 65 20 69 66 20 76 61 6c 75 65 20 69 73 20 65 78  e if value is ex
173c0 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 45 78  tracted from pEx
173d0 70 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  pr */.      Expr
173e0 20 2a 70 45 78 70 72 20 3d 20 70 4c 6f 77 65 72   *pExpr = pLower
173f0 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  ->pExpr->pRight;
17400 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
17410 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f  pLower->eOperato
17420 72 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45  r & (WO_GT|WO_GE
17430 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  ))!=0 );.      r
17440 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34  c = sqlite3Stat4
17450 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28 70 50  ProbeSetValue(pP
17460 61 72 73 65 2c 20 70 2c 20 26 70 52 65 63 2c 20  arse, p, &pRec, 
17470 70 45 78 70 72 2c 20 61 66 66 2c 20 6e 45 71 2c  pExpr, aff, nEq,
17480 20 26 62 4f 6b 29 3b 0a 20 20 20 20 20 20 69 66   &bOk);.      if
17490 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
174a0 26 26 20 62 4f 6b 20 29 7b 0a 20 20 20 20 20 20  && bOk ){.      
174b0 20 20 74 52 6f 77 63 6e 74 20 69 4e 65 77 3b 0a    tRowcnt iNew;.
174c0 20 20 20 20 20 20 20 20 77 68 65 72 65 4b 65 79          whereKey
174d0 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c  Stats(pParse, p,
174e0 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20   pRec, 0, a);.  
174f0 20 20 20 20 20 20 69 4e 65 77 20 3d 20 61 5b 30        iNew = a[0
17500 5d 20 2b 20 28 28 70 4c 6f 77 65 72 2d 3e 65 4f  ] + ((pLower->eO
17510 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 54 29  perator & WO_GT)
17520 20 3f 20 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20   ? a[1] : 0);.  
17530 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 3e 69        if( iNew>i
17540 4c 6f 77 65 72 20 29 20 69 4c 6f 77 65 72 20 3d  Lower ) iLower =
17550 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 6e   iNew;.        n
17560 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20  Out--;.      }. 
17570 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
17580 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76  possible, improv
17590 65 20 6f 6e 20 74 68 65 20 69 55 70 70 65 72 20  e on the iUpper 
175a0 65 73 74 69 6d 61 74 65 20 75 73 69 6e 67 20 28  estimate using (
175b0 24 50 3a 24 55 29 2e 20 2a 2f 0a 20 20 20 20 69  $P:$U). */.    i
175c0 66 28 20 70 55 70 70 65 72 20 29 7b 0a 20 20 20  f( pUpper ){.   
175d0 20 20 20 69 6e 74 20 62 4f 6b 3b 20 20 20 20 20     int bOk;     
175e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
175f0 2a 20 54 72 75 65 20 69 66 20 76 61 6c 75 65 20  * True if value 
17600 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
17610 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20 20 20 20  m pExpr */.     
17620 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
17630 55 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52  Upper->pExpr->pR
17640 69 67 68 74 3b 0a 20 20 20 20 20 20 61 73 73 65  ight;.      asse
17650 72 74 28 20 28 70 55 70 70 65 72 2d 3e 65 4f 70  rt( (pUpper->eOp
17660 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c  erator & (WO_LT|
17670 57 4f 5f 4c 45 29 29 21 3d 30 20 29 3b 0a 20 20  WO_LE))!=0 );.  
17680 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
17690 53 74 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c  Stat4ProbeSetVal
176a0 75 65 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70  ue(pParse, p, &p
176b0 52 65 63 2c 20 70 45 78 70 72 2c 20 61 66 66 2c  Rec, pExpr, aff,
176c0 20 6e 45 71 2c 20 26 62 4f 6b 29 3b 0a 20 20 20   nEq, &bOk);.   
176d0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
176e0 45 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b 0a 20  E_OK && bOk ){. 
176f0 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69         tRowcnt i
17700 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 77 68 65  New;.        whe
17710 72 65 4b 65 79 53 74 61 74 73 28 70 50 61 72 73  reKeyStats(pPars
17720 65 2c 20 70 2c 20 70 52 65 63 2c 20 31 2c 20 61  e, p, pRec, 1, a
17730 29 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 77 20  );.        iNew 
17740 3d 20 61 5b 30 5d 20 2b 20 28 28 70 55 70 70 65  = a[0] + ((pUppe
17750 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  r->eOperator & W
17760 4f 5f 4c 45 29 20 3f 20 61 5b 31 5d 20 3a 20 30  O_LE) ? a[1] : 0
17770 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
17780 4e 65 77 3c 69 55 70 70 65 72 20 29 20 69 55 70  New<iUpper ) iUp
17790 70 65 72 20 3d 20 69 4e 65 77 3b 0a 20 20 20 20  per = iNew;.    
177a0 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20      nOut--;.    
177b0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70    }.    }..    p
177c0 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20  Builder->pRec = 
177d0 70 52 65 63 3b 0a 20 20 20 20 69 66 28 20 72 63  pRec;.    if( rc
177e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
177f0 20 20 20 20 20 69 66 28 20 69 55 70 70 65 72 3e       if( iUpper>
17800 69 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20  iLower ){.      
17810 20 20 6e 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    nNew = sqlite3
17820 4c 6f 67 45 73 74 28 69 55 70 70 65 72 20 2d 20  LogEst(iUpper - 
17830 69 4c 6f 77 65 72 29 3b 0a 20 20 20 20 20 20 7d  iLower);.      }
17840 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 4e  else{.        nN
17850 65 77 20 3d 20 31 30 3b 20 20 20 20 20 20 20 20  ew = 10;        
17860 61 73 73 65 72 74 28 20 31 30 3d 3d 73 71 6c 69  assert( 10==sqli
17870 74 65 33 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a  te3LogEst(2) );.
17880 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
17890 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 7b 0a 20  ( nNew<nOut ){. 
178a0 20 20 20 20 20 20 20 6e 4f 75 74 20 3d 20 6e 4e         nOut = nN
178b0 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ew;.      }.    
178c0 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20    pLoop->nOut = 
178d0 28 4c 6f 67 45 73 74 29 6e 4f 75 74 3b 0a 20 20  (LogEst)nOut;.  
178e0 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
178f0 78 31 30 2c 20 28 22 72 61 6e 67 65 20 73 63 61  x10, ("range sca
17900 6e 20 72 65 67 69 6f 6e 73 3a 20 25 75 2e 2e 25  n regions: %u..%
17910 75 20 20 65 73 74 3d 25 64 5c 6e 22 2c 0a 20 20  u  est=%d\n",.  
17920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17930 20 20 20 20 20 20 20 28 75 33 32 29 69 4c 6f 77         (u32)iLow
17940 65 72 2c 20 28 75 33 32 29 69 55 70 70 65 72 2c  er, (u32)iUpper,
17950 20 6e 4f 75 74 29 29 3b 0a 20 20 20 20 20 20 72   nOut));.      r
17960 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
17970 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65  .    }.  }.#else
17980 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
17990 54 45 52 28 70 50 61 72 73 65 29 3b 0a 20 20 55  TER(pParse);.  U
179a0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
179b0 70 42 75 69 6c 64 65 72 29 3b 0a 23 65 6e 64 69  pBuilder);.#endi
179c0 66 0a 20 20 61 73 73 65 72 74 28 20 70 4c 6f 77  f.  assert( pLow
179d0 65 72 20 7c 7c 20 70 55 70 70 65 72 20 29 3b 0a  er || pUpper );.
179e0 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 45 61    /* TUNING:  Ea
179f0 63 68 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  ch inequality co
17a00 6e 73 74 72 61 69 6e 74 20 72 65 64 75 63 65 73  nstraint reduces
17a10 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63   the search spac
17a20 65 20 34 2d 66 6f 6c 64 2e 0a 20 20 2a 2a 20 41  e 4-fold..  ** A
17a30 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f   BETWEEN operato
17a40 72 2c 20 74 68 65 72 65 66 6f 72 65 2c 20 72 65  r, therefore, re
17a50 64 75 63 65 73 20 74 68 65 20 73 65 61 72 63 68  duces the search
17a60 20 73 70 61 63 65 20 31 36 2d 66 6f 6c 64 20 2a   space 16-fold *
17a70 2f 0a 20 20 6e 4e 65 77 20 3d 20 6e 4f 75 74 3b  /.  nNew = nOut;
17a80 0a 20 20 69 66 28 20 70 4c 6f 77 65 72 20 26 26  .  if( pLower &&
17a90 20 28 70 4c 6f 77 65 72 2d 3e 77 74 46 6c 61 67   (pLower->wtFlag
17aa0 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d  s & TERM_VNULL)=
17ab0 3d 30 20 29 7b 0a 20 20 20 20 6e 4e 65 77 20 2d  =0 ){.    nNew -
17ac0 3d 20 32 30 3b 20 20 20 20 20 20 20 20 61 73 73  = 20;        ass
17ad0 65 72 74 28 20 32 30 3d 3d 73 71 6c 69 74 65 33  ert( 20==sqlite3
17ae0 4c 6f 67 45 73 74 28 34 29 20 29 3b 0a 20 20 20  LogEst(4) );.   
17af0 20 6e 4f 75 74 2d 2d 3b 0a 20 20 7d 0a 20 20 69   nOut--;.  }.  i
17b00 66 28 20 70 55 70 70 65 72 20 29 7b 0a 20 20 20  f( pUpper ){.   
17b10 20 6e 4e 65 77 20 2d 3d 20 32 30 3b 20 20 20 20   nNew -= 20;    
17b20 20 20 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d      assert( 20==
17b30 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 34 29  sqlite3LogEst(4)
17b40 20 29 3b 0a 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a   );.    nOut--;.
17b50 20 20 7d 0a 20 20 69 66 28 20 6e 4e 65 77 3c 31    }.  if( nNew<1
17b60 30 20 29 20 6e 4e 65 77 20 3d 20 31 30 3b 0a 20  0 ) nNew = 10;. 
17b70 20 69 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29   if( nNew<nOut )
17b80 20 6e 4f 75 74 20 3d 20 6e 4e 65 77 3b 0a 20 20   nOut = nNew;.  
17b90 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c  pLoop->nOut = (L
17ba0 6f 67 45 73 74 29 6e 4f 75 74 3b 0a 20 20 72 65  ogEst)nOut;.  re
17bb0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64  turn rc;.}..#ifd
17bc0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
17bd0 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
17be0 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74  /*.** Estimate t
17bf0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
17c00 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  s that will be r
17c10 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e  eturned based on
17c20 0a 2a 2a 20 61 6e 20 65 71 75 61 6c 69 74 79 20  .** an equality 
17c30 63 6f 6e 73 74 72 61 69 6e 74 20 78 3d 56 41 4c  constraint x=VAL
17c40 55 45 20 61 6e 64 20 77 68 65 72 65 20 74 68 61  UE and where tha
17c50 74 20 56 41 4c 55 45 20 6f 63 63 75 72 73 20 69  t VALUE occurs i
17c60 6e 0a 2a 2a 20 74 68 65 20 68 69 73 74 6f 67 72  n.** the histogr
17c70 61 6d 20 64 61 74 61 2e 20 20 54 68 69 73 20 6f  am data.  This o
17c80 6e 6c 79 20 77 6f 72 6b 73 20 77 68 65 6e 20 78  nly works when x
17c90 20 69 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73   is the left-mos
17ca0 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 61  t.** column of a
17cb0 6e 20 69 6e 64 65 78 20 61 6e 64 20 73 71 6c 69  n index and sqli
17cc0 74 65 5f 73 74 61 74 33 20 68 69 73 74 6f 67 72  te_stat3 histogr
17cd0 61 6d 20 64 61 74 61 20 69 73 20 61 76 61 69 6c  am data is avail
17ce0 61 62 6c 65 0a 2a 2a 20 66 6f 72 20 74 68 61 74  able.** for that
17cf0 20 69 6e 64 65 78 2e 20 20 57 68 65 6e 20 70 45   index.  When pE
17d00 78 70 72 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d  xpr==NULL that m
17d10 65 61 6e 73 20 74 68 65 20 63 6f 6e 73 74 72 61  eans the constra
17d20 69 6e 74 20 69 73 0a 2a 2a 20 22 78 20 49 53 20  int is.** "x IS 
17d30 4e 55 4c 4c 22 20 69 6e 73 74 65 61 64 20 6f 66  NULL" instead of
17d40 20 22 78 3d 56 41 4c 55 45 22 2e 0a 2a 2a 0a 2a   "x=VALUE"..**.*
17d50 2a 20 57 72 69 74 65 20 74 68 65 20 65 73 74 69  * Write the esti
17d60 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74 20  mated row count 
17d70 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20  into *pnRow and 
17d80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
17d90 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20  . .** If unable 
17da0 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d  to make an estim
17db0 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f  ate, leave *pnRo
17dc0 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20  w unchanged and 
17dd0 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65  return.** non-ze
17de0 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ro..**.** This r
17df0 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c 20  outine can fail 
17e00 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65 20  if it is unable 
17e10 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74  to load a collat
17e20 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20  ing sequence.** 
17e30 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 74 72  required for str
17e40 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20  ing comparison, 
17e50 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20  or if unable to 
17e60 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a  allocate memory.
17e70 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f 6e  ** for a UTF con
17e80 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65 64  version required
17e90 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e   for comparison.
17ea0 20 20 54 68 65 20 65 72 72 6f 72 20 69 73 20 73    The error is s
17eb0 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20  tored.** in the 
17ec0 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
17ed0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
17ee0 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73  whereEqualScanEs
17ef0 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
17f00 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
17f10 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65  sing & code gene
17f20 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
17f30 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  /.  WhereLoopBui
17f40 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a  lder *pBuilder,.
17f50 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
17f60 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
17f70 73 69 6f 6e 20 66 6f 72 20 56 41 4c 55 45 20 69  sion for VALUE i
17f80 6e 20 74 68 65 20 78 3d 56 41 4c 55 45 20 63 6f  n the x=VALUE co
17f90 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 74 52  nstraint */.  tR
17fa0 6f 77 63 6e 74 20 2a 70 6e 52 6f 77 20 20 20 20  owcnt *pnRow    
17fb0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
17fc0 72 65 76 69 73 65 64 20 72 6f 77 20 65 73 74 69  revised row esti
17fd0 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  mate here */.){.
17fe0 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 42 75    Index *p = pBu
17ff0 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62  ilder->pNew->u.b
18000 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69  tree.pIndex;.  i
18010 6e 74 20 6e 45 71 20 3d 20 70 42 75 69 6c 64 65  nt nEq = pBuilde
18020 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  r->pNew->u.btree
18030 2e 6e 45 71 3b 0a 20 20 55 6e 70 61 63 6b 65 64  .nEq;.  Unpacked
18040 52 65 63 6f 72 64 20 2a 70 52 65 63 20 3d 20 70  Record *pRec = p
18050 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20  Builder->pRec;. 
18060 20 75 38 20 61 66 66 3b 20 20 20 20 20 20 20 20   u8 aff;        
18070 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
18080 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 2a 2f  lumn affinity */
18090 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
180a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
180b0 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  Subfunction retu
180c0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74 52 6f  rn code */.  tRo
180d0 77 63 6e 74 20 61 5b 32 5d 3b 20 20 20 20 20 20  wcnt a[2];      
180e0 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 69 73         /* Statis
180f0 74 69 63 73 20 2a 2f 0a 20 20 69 6e 74 20 62 4f  tics */.  int bO
18100 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 45  k;..  assert( nE
18110 71 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  q>=1 );.  assert
18120 28 20 6e 45 71 3c 3d 28 70 2d 3e 6e 43 6f 6c 75  ( nEq<=(p->nColu
18130 6d 6e 2b 31 29 20 29 3b 0a 20 20 61 73 73 65 72  mn+1) );.  asser
18140 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30  t( p->aSample!=0
18150 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
18160 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20  >nSample>0 );.  
18170 61 73 73 65 72 74 28 20 70 42 75 69 6c 64 65 72  assert( pBuilder
18180 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 6e 45 71 20  ->nRecValid<nEq 
18190 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 76 61 6c 75  );..  /* If valu
181a0 65 73 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c  es are not avail
181b0 61 62 6c 65 20 66 6f 72 20 61 6c 6c 20 66 69 65  able for all fie
181c0 6c 64 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  lds of the index
181d0 20 74 6f 20 74 68 65 20 6c 65 66 74 0a 20 20 2a   to the left.  *
181e0 2a 20 6f 66 20 74 68 69 73 20 6f 6e 65 2c 20 6e  * of this one, n
181f0 6f 20 65 73 74 69 6d 61 74 65 20 63 61 6e 20 62  o estimate can b
18200 65 20 6d 61 64 65 2e 20 52 65 74 75 72 6e 20 53  e made. Return S
18210 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 2e 20  QLITE_NOTFOUND. 
18220 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65  */.  if( pBuilde
18230 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 28 6e 45  r->nRecValid<(nE
18240 71 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75  q-1) ){.    retu
18250 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  rn SQLITE_NOTFOU
18260 4e 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  ND;.  }..  /* Th
18270 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  is is an optimiz
18280 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 54 68 65 20  ation only. The 
18290 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 53  call to sqlite3S
182a0 74 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75  tat4ProbeSetValu
182b0 65 28 29 0a 20 20 2a 2a 20 62 65 6c 6f 77 20 77  e().  ** below w
182c0 6f 75 6c 64 20 72 65 74 75 72 6e 20 74 68 65 20  ould return the 
182d0 73 61 6d 65 20 76 61 6c 75 65 2e 20 20 2a 2f 0a  same value.  */.
182e0 20 20 69 66 28 20 6e 45 71 3e 70 2d 3e 6e 43 6f    if( nEq>p->nCo
182f0 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 2a 70 6e 52  lumn ){.    *pnR
18300 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  ow = 1;.    retu
18310 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
18320 7d 0a 0a 20 20 61 66 66 20 3d 20 70 2d 3e 70 54  }..  aff = p->pT
18330 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69  able->aCol[p->ai
18340 43 6f 6c 75 6d 6e 5b 6e 45 71 2d 31 5d 5d 2e 61  Column[nEq-1]].a
18350 66 66 69 6e 69 74 79 3b 0a 20 20 72 63 20 3d 20  ffinity;.  rc = 
18360 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62  sqlite3Stat4Prob
18370 65 53 65 74 56 61 6c 75 65 28 70 50 61 72 73 65  eSetValue(pParse
18380 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70  , p, &pRec, pExp
18390 72 2c 20 61 66 66 2c 20 6e 45 71 2d 31 2c 20 26  r, aff, nEq-1, &
183a0 62 4f 6b 29 3b 0a 20 20 70 42 75 69 6c 64 65 72  bOk);.  pBuilder
183b0 2d 3e 70 52 65 63 20 3d 20 70 52 65 63 3b 0a 20  ->pRec = pRec;. 
183c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
183d0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
183e0 20 20 69 66 28 20 62 4f 6b 3d 3d 30 20 29 20 72    if( bOk==0 ) r
183f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54  eturn SQLITE_NOT
18400 46 4f 55 4e 44 3b 0a 20 20 70 42 75 69 6c 64 65  FOUND;.  pBuilde
18410 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e  r->nRecValid = n
18420 45 71 3b 0a 0a 20 20 77 68 65 72 65 4b 65 79 53  Eq;..  whereKeyS
18430 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20  tats(pParse, p, 
18440 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 57  pRec, 0, a);.  W
18450 48 45 52 45 54 52 41 43 45 28 30 78 31 30 2c 28  HERETRACE(0x10,(
18460 22 65 71 75 61 6c 69 74 79 20 73 63 61 6e 20 72  "equality scan r
18470 65 67 69 6f 6e 73 3a 20 25 64 5c 6e 22 2c 20 28  egions: %d\n", (
18480 69 6e 74 29 61 5b 31 5d 29 29 3b 0a 20 20 2a 70  int)a[1]));.  *p
18490 6e 52 6f 77 20 3d 20 61 5b 31 5d 3b 0a 20 20 0a  nRow = a[1];.  .
184a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
184b0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
184c0 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
184d0 53 54 41 54 34 20 2a 2f 0a 0a 23 69 66 64 65 66  STAT4 */..#ifdef
184e0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
184f0 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a  TAT3_OR_STAT4./*
18500 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65  .** Estimate the
18510 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
18520 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74  that will be ret
18530 75 72 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a  urned based on.*
18540 2a 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69  * an IN constrai
18550 6e 74 20 77 68 65 72 65 20 74 68 65 20 72 69 67  nt where the rig
18560 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
18570 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a  the IN operator.
18580 2a 2a 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  ** is a list of 
18590 76 61 6c 75 65 73 2e 20 20 45 78 61 6d 70 6c 65  values.  Example
185a0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 57  :.**.**        W
185b0 48 45 52 45 20 78 20 49 4e 20 28 31 2c 32 2c 33  HERE x IN (1,2,3
185c0 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  ,4).**.** Write 
185d0 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f  the estimated ro
185e0 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e  w count into *pn
185f0 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53  Row and return S
18600 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66  QLITE_OK. .** If
18610 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20   unable to make 
18620 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61  an estimate, lea
18630 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e  ve *pnRow unchan
18640 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  ged and return.*
18650 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a  * non-zero..**.*
18660 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
18670 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69 73  an fail if it is
18680 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20   unable to load 
18690 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
186a0 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64  ence.** required
186b0 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70   for string comp
186c0 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e  arison, or if un
186d0 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  able to allocate
186e0 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61   memory.** for a
186f0 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20   UTF conversion 
18700 72 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d  required for com
18710 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72  parison.  The er
18720 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a  ror is stored.**
18730 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73   in the pParse s
18740 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
18750 74 69 63 20 69 6e 74 20 77 68 65 72 65 49 6e 53  tic int whereInS
18760 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20  canEst(.  Parse 
18770 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
18780 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65  * Parsing & code
18790 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
187a0 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  ext */.  WhereLo
187b0 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
187c0 64 65 72 2c 0a 20 20 45 78 70 72 4c 69 73 74 20  der,.  ExprList 
187d0 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 54  *pList,     /* T
187e0 68 65 20 76 61 6c 75 65 20 6c 69 73 74 20 6f 6e  he value list on
187f0 20 74 68 65 20 52 48 53 20 6f 66 20 22 78 20 49   the RHS of "x I
18800 4e 20 28 76 31 2c 76 32 2c 76 33 2c 2e 2e 2e 29  N (v1,v2,v3,...)
18810 22 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a  " */.  tRowcnt *
18820 70 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a 20 57  pnRow       /* W
18830 72 69 74 65 20 74 68 65 20 72 65 76 69 73 65 64  rite the revised
18840 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65   row estimate he
18850 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78  re */.){.  Index
18860 20 2a 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e   *p = pBuilder->
18870 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49  pNew->u.btree.pI
18880 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 52 65 63  ndex;.  int nRec
18890 56 61 6c 69 64 20 3d 20 70 42 75 69 6c 64 65 72  Valid = pBuilder
188a0 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 69  ->nRecValid;.  i
188b0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
188c0 4b 3b 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e  K;     /* Subfun
188d0 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64  ction return cod
188e0 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e  e */.  tRowcnt n
188f0 45 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Est;           /
18900 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * Number of rows
18910 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74 65   for a single te
18920 72 6d 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  rm */.  tRowcnt 
18930 6e 52 6f 77 45 73 74 20 3d 20 30 3b 20 20 20 20  nRowEst = 0;    
18940 2f 2a 20 4e 65 77 20 65 73 74 69 6d 61 74 65 20  /* New estimate 
18950 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
18960 20 72 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20 69   rows */.  int i
18970 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18980 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
18990 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  er */..  assert(
189a0 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29   p->aSample!=0 )
189b0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d  ;.  for(i=0; rc=
189c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
189d0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
189e0 2b 29 7b 0a 20 20 20 20 6e 45 73 74 20 3d 20 70  +){.    nEst = p
189f0 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b 0a 20  ->aiRowEst[0];. 
18a00 20 20 20 72 63 20 3d 20 77 68 65 72 65 45 71 75     rc = whereEqu
18a10 61 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73 65  alScanEst(pParse
18a20 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 4c 69 73  , pBuilder, pLis
18a30 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 26  t->a[i].pExpr, &
18a40 6e 45 73 74 29 3b 0a 20 20 20 20 6e 52 6f 77 45  nEst);.    nRowE
18a50 73 74 20 2b 3d 20 6e 45 73 74 3b 0a 20 20 20 20  st += nEst;.    
18a60 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
18a70 6c 69 64 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b  lid = nRecValid;
18a80 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
18a90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18aa0 20 69 66 28 20 6e 52 6f 77 45 73 74 20 3e 20 70   if( nRowEst > p
18ab0 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 20 29 20  ->aiRowEst[0] ) 
18ac0 6e 52 6f 77 45 73 74 20 3d 20 70 2d 3e 61 69 52  nRowEst = p->aiR
18ad0 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20 2a 70  owEst[0];.    *p
18ae0 6e 52 6f 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a  nRow = nRowEst;.
18af0 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
18b00 78 31 30 2c 28 22 49 4e 20 72 6f 77 20 65 73 74  x10,("IN row est
18b10 69 6d 61 74 65 3a 20 65 73 74 3d 25 67 5c 6e 22  imate: est=%g\n"
18b20 2c 20 6e 52 6f 77 45 73 74 29 29 3b 0a 20 20 7d  , nRowEst));.  }
18b30 0a 20 20 61 73 73 65 72 74 28 20 70 42 75 69 6c  .  assert( pBuil
18b40 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3d 3d  der->nRecValid==
18b50 6e 52 65 63 56 61 6c 69 64 20 29 3b 0a 20 20 72  nRecValid );.  r
18b60 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
18b70 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
18b80 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
18b90 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 69 73  T4 */../*.** Dis
18ba0 61 62 6c 65 20 61 20 74 65 72 6d 20 69 6e 20 74  able a term in t
18bb0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
18bc0 20 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74    Except, do not
18bd0 20 64 69 73 61 62 6c 65 20 74 68 65 20 74 65 72   disable the ter
18be0 6d 0a 2a 2a 20 69 66 20 69 74 20 63 6f 6e 74 72  m.** if it contr
18bf0 6f 6c 73 20 61 20 4c 45 46 54 20 4f 55 54 45 52  ols a LEFT OUTER
18c00 20 4a 4f 49 4e 20 61 6e 64 20 69 74 20 64 69 64   JOIN and it did
18c10 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65 20 69   not originate i
18c20 6e 20 74 68 65 20 4f 4e 0a 2a 2a 20 6f 72 20 55  n the ON.** or U
18c30 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 74  SING clause of t
18c40 68 61 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20  hat join..**.** 
18c50 43 6f 6e 73 69 64 65 72 20 74 68 65 20 74 65 72  Consider the ter
18c60 6d 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 6e 20 74  m t2.z='ok' in t
18c70 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65  he following que
18c80 72 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31  ries:.**.**   (1
18c90 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  )  SELECT * FROM
18ca0 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32   t1 LEFT JOIN t2
18cb0 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 57 48   ON t1.a=t2.x WH
18cc0 45 52 45 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a  ERE t2.z='ok'.**
18cd0 20 20 20 28 32 29 20 20 53 45 4c 45 43 54 20 2a     (2)  SELECT *
18ce0 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f   FROM t1 LEFT JO
18cf0 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32  IN t2 ON t1.a=t2
18d00 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27  .x AND t2.z='ok'
18d10 0a 2a 2a 20 20 20 28 33 29 20 20 53 45 4c 45 43  .**   (3)  SELEC
18d20 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 20  T * FROM t1, t2 
18d30 57 48 45 52 45 20 74 31 2e 61 3d 74 32 2e 78 20  WHERE t1.a=t2.x 
18d40 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a  AND t2.z='ok'.**
18d50 0a 2a 2a 20 54 68 65 20 74 32 2e 7a 3d 27 6f 6b  .** The t2.z='ok
18d60 27 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e  ' is disabled in
18d70 20 74 68 65 20 69 6e 20 28 32 29 20 62 65 63 61   the in (2) beca
18d80 75 73 65 20 69 74 20 6f 72 69 67 69 6e 61 74 65  use it originate
18d90 73 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 63  s.** in the ON c
18da0 6c 61 75 73 65 2e 20 20 54 68 65 20 74 65 72 6d  lause.  The term
18db0 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20   is disabled in 
18dc0 28 33 29 20 62 65 63 61 75 73 65 20 69 74 20 69  (3) because it i
18dd0 73 20 6e 6f 74 20 70 61 72 74 0a 2a 2a 20 6f 66  s not part.** of
18de0 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f   a LEFT OUTER JO
18df0 49 4e 2e 20 20 49 6e 20 28 31 29 2c 20 74 68 65  IN.  In (1), the
18e00 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 64 69 73   term is not dis
18e10 61 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 44 69 73  abled..**.** Dis
18e20 61 62 6c 69 6e 67 20 61 20 74 65 72 6d 20 63 61  abling a term ca
18e30 75 73 65 73 20 74 68 61 74 20 74 65 72 6d 20 74  uses that term t
18e40 6f 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64 20  o not be tested 
18e50 69 6e 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  in the inner loo
18e60 70 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e  p.** of the join
18e70 2e 20 20 44 69 73 61 62 6c 69 6e 67 20 69 73 20  .  Disabling is 
18e80 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  an optimization.
18e90 20 20 57 68 65 6e 20 74 65 72 6d 73 20 61 72 65    When terms are
18ea0 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 62 79   satisfied.** by
18eb0 20 69 6e 64 69 63 65 73 2c 20 77 65 20 64 69 73   indices, we dis
18ec0 61 62 6c 65 20 74 68 65 6d 20 74 6f 20 70 72 65  able them to pre
18ed0 76 65 6e 74 20 72 65 64 75 6e 64 61 6e 74 20 74  vent redundant t
18ee0 65 73 74 73 20 69 6e 20 74 68 65 20 69 6e 6e 65  ests in the inne
18ef0 72 0a 2a 2a 20 6c 6f 6f 70 2e 20 20 57 65 20 77  r.** loop.  We w
18f00 6f 75 6c 64 20 67 65 74 20 74 68 65 20 63 6f 72  ould get the cor
18f10 72 65 63 74 20 72 65 73 75 6c 74 73 20 69 66 20  rect results if 
18f20 6e 6f 74 68 69 6e 67 20 77 65 72 65 20 65 76 65  nothing were eve
18f30 72 20 64 69 73 61 62 6c 65 64 2c 0a 2a 2a 20 62  r disabled,.** b
18f40 75 74 20 6a 6f 69 6e 73 20 6d 69 67 68 74 20 72  ut joins might r
18f50 75 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77  un a little slow
18f60 65 72 2e 20 20 54 68 65 20 74 72 69 63 6b 20 69  er.  The trick i
18f70 73 20 74 6f 20 64 69 73 61 62 6c 65 20 61 73 20  s to disable as 
18f80 6d 75 63 68 0a 2a 2a 20 61 73 20 77 65 20 63 61  much.** as we ca
18f90 6e 20 77 69 74 68 6f 75 74 20 64 69 73 61 62 6c  n without disabl
18fa0 69 6e 67 20 74 6f 6f 20 6d 75 63 68 2e 20 20 49  ing too much.  I
18fb0 66 20 77 65 20 64 69 73 61 62 6c 65 64 20 69 6e  f we disabled in
18fc0 20 28 31 29 2c 20 77 65 27 64 20 67 65 74 0a 2a   (1), we'd get.*
18fd0 2a 20 74 68 65 20 77 72 6f 6e 67 20 61 6e 73 77  * the wrong answ
18fe0 65 72 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20  er.  See ticket 
18ff0 23 38 31 33 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  #813..*/.static 
19000 76 6f 69 64 20 64 69 73 61 62 6c 65 54 65 72 6d  void disableTerm
19010 28 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65  (WhereLevel *pLe
19020 76 65 6c 2c 20 57 68 65 72 65 54 65 72 6d 20 2a  vel, WhereTerm *
19030 70 54 65 72 6d 29 7b 0a 20 20 69 66 28 20 70 54  pTerm){.  if( pT
19040 65 72 6d 0a 20 20 20 20 20 20 26 26 20 28 70 54  erm.      && (pT
19050 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
19060 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 0a 20 20  ERM_CODED)==0.  
19070 20 20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e      && (pLevel->
19080 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c 7c 20  iLeftJoin==0 || 
19090 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
190a0 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50  pTerm->pExpr, EP
190b0 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 20 20  _FromJoin)).    
190c0 20 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 6e 6f    && (pLevel->no
190d0 74 52 65 61 64 79 20 26 20 70 54 65 72 6d 2d 3e  tReady & pTerm->
190e0 70 72 65 72 65 71 41 6c 6c 29 3d 3d 30 0a 20 20  prereqAll)==0.  
190f0 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77 74  ){.    pTerm->wt
19100 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
19110 44 45 44 3b 0a 20 20 20 20 69 66 28 20 70 54 65  DED;.    if( pTe
19120 72 6d 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20 29  rm->iParent>=0 )
19130 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  {.      WhereTer
19140 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 54 65  m *pOther = &pTe
19150 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54 65 72 6d  rm->pWC->a[pTerm
19160 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20  ->iParent];.    
19170 20 20 69 66 28 20 28 2d 2d 70 4f 74 68 65 72 2d    if( (--pOther-
19180 3e 6e 43 68 69 6c 64 29 3d 3d 30 20 29 7b 0a 20  >nChild)==0 ){. 
19190 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65         disableTe
191a0 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4f 74 68 65  rm(pLevel, pOthe
191b0 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
191c0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  }.  }.}../*.** C
191d0 6f 64 65 20 61 6e 20 4f 50 5f 41 66 66 69 6e 69  ode an OP_Affini
191e0 74 79 20 6f 70 63 6f 64 65 20 74 6f 20 61 70 70  ty opcode to app
191f0 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66  ly the column af
19200 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 7a 41  finity string zA
19210 66 66 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 20 72  ff.** to the n r
19220 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e  egisters startin
19230 67 20 61 74 20 62 61 73 65 2e 20 0a 2a 2a 0a 2a  g at base. .**.*
19240 2a 20 41 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  * As an optimiza
19250 74 69 6f 6e 2c 20 53 51 4c 49 54 45 5f 41 46 46  tion, SQLITE_AFF
19260 5f 4e 4f 4e 45 20 65 6e 74 72 69 65 73 20 28 77  _NONE entries (w
19270 68 69 63 68 20 61 72 65 20 6e 6f 2d 6f 70 73 29  hich are no-ops)
19280 20 61 74 20 74 68 65 0a 2a 2a 20 62 65 67 69 6e   at the.** begin
19290 6e 69 6e 67 20 61 6e 64 20 65 6e 64 20 6f 66 20  ning and end of 
192a0 7a 41 66 66 20 61 72 65 20 69 67 6e 6f 72 65 64  zAff are ignored
192b0 2e 20 20 49 66 20 61 6c 6c 20 65 6e 74 72 69 65  .  If all entrie
192c0 73 20 69 6e 20 7a 41 66 66 20 61 72 65 0a 2a 2a  s in zAff are.**
192d0 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
192e0 2c 20 74 68 65 6e 20 6e 6f 20 63 6f 64 65 20 67  , then no code g
192f0 65 74 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a  ets generated..*
19300 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
19310 65 20 6d 61 6b 65 73 20 69 74 73 20 6f 77 6e 20  e makes its own 
19320 63 6f 70 79 20 6f 66 20 7a 41 66 66 20 73 6f 20  copy of zAff so 
19330 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
19340 69 73 20 66 72 65 65 0a 2a 2a 20 74 6f 20 6d 6f  is free.** to mo
19350 64 69 66 79 20 7a 41 66 66 20 61 66 74 65 72 20  dify zAff after 
19360 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
19370 75 72 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  urns..*/.static 
19380 76 6f 69 64 20 63 6f 64 65 41 70 70 6c 79 41 66  void codeApplyAf
19390 66 69 6e 69 74 79 28 50 61 72 73 65 20 2a 70 50  finity(Parse *pP
193a0 61 72 73 65 2c 20 69 6e 74 20 62 61 73 65 2c 20  arse, int base, 
193b0 69 6e 74 20 6e 2c 20 63 68 61 72 20 2a 7a 41 66  int n, char *zAf
193c0 66 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  f){.  Vdbe *v = 
193d0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
193e0 20 69 66 28 20 7a 41 66 66 3d 3d 30 20 29 7b 0a   if( zAff==0 ){.
193f0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
19400 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
19410 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75  iled );.    retu
19420 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rn;.  }.  assert
19430 28 20 76 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  ( v!=0 );..  /* 
19440 41 64 6a 75 73 74 20 62 61 73 65 20 61 6e 64 20  Adjust base and 
19450 6e 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 53  n to skip over S
19460 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 65  QLITE_AFF_NONE e
19470 6e 74 72 69 65 73 20 61 74 20 74 68 65 20 62 65  ntries at the be
19480 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a 20 61 6e 64  ginning.  ** and
19490 20 65 6e 64 20 6f 66 20 74 68 65 20 61 66 66 69   end of the affi
194a0 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a 20 20 2a  nity string..  *
194b0 2f 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26  /.  while( n>0 &
194c0 26 20 7a 41 66 66 5b 30 5d 3d 3d 53 51 4c 49 54  & zAff[0]==SQLIT
194d0 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20  E_AFF_NONE ){.  
194e0 20 20 6e 2d 2d 3b 0a 20 20 20 20 62 61 73 65 2b    n--;.    base+
194f0 2b 3b 0a 20 20 20 20 7a 41 66 66 2b 2b 3b 0a 20  +;.    zAff++;. 
19500 20 7d 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31 20   }.  while( n>1 
19510 26 26 20 7a 41 66 66 5b 6e 2d 31 5d 3d 3d 53 51  && zAff[n-1]==SQ
19520 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b  LITE_AFF_NONE ){
19530 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20  .    n--;.  }.. 
19540 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 4f 50 5f   /* Code the OP_
19550 41 66 66 69 6e 69 74 79 20 6f 70 63 6f 64 65 20  Affinity opcode 
19560 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 74  if there is anyt
19570 68 69 6e 67 20 6c 65 66 74 20 74 6f 20 64 6f 2e  hing left to do.
19580 20 2a 2f 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b   */.  if( n>0 ){
19590 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
195a0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 66 66  AddOp2(v, OP_Aff
195b0 69 6e 69 74 79 2c 20 62 61 73 65 2c 20 6e 29 3b  inity, base, n);
195c0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
195d0 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20  ChangeP4(v, -1, 
195e0 7a 41 66 66 2c 20 6e 29 3b 0a 20 20 20 20 73 71  zAff, n);.    sq
195f0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
19600 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
19610 72 73 65 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20  rse, base, n);. 
19620 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   }.}.../*.** Gen
19630 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
19640 20 73 69 6e 67 6c 65 20 65 71 75 61 6c 69 74 79   single equality
19650 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45   term of the WHE
19660 52 45 20 63 6c 61 75 73 65 2e 20 20 41 6e 20 65  RE clause.  An e
19670 71 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72 6d 20  quality.** term 
19680 63 61 6e 20 62 65 20 65 69 74 68 65 72 20 58 3d  can be either X=
19690 65 78 70 72 20 6f 72 20 58 20 49 4e 20 28 2e 2e  expr or X IN (..
196a0 2e 29 2e 20 20 20 70 54 65 72 6d 20 69 73 20 74  .).   pTerm is t
196b0 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 0a 2a  he term to be .*
196c0 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  * coded..**.** T
196d0 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
196e0 20 66 6f 72 20 74 68 65 20 63 6f 6e 73 74 72 61   for the constra
196f0 69 6e 74 20 69 73 20 6c 65 66 74 20 69 6e 20 72  int is left in r
19700 65 67 69 73 74 65 72 20 69 52 65 67 2e 0a 2a 2a  egister iReg..**
19710 0a 2a 2a 20 46 6f 72 20 61 20 63 6f 6e 73 74 72  .** For a constr
19720 61 69 6e 74 20 6f 66 20 74 68 65 20 66 6f 72 6d  aint of the form
19730 20 58 3d 65 78 70 72 2c 20 74 68 65 20 65 78 70   X=expr, the exp
19740 72 65 73 73 69 6f 6e 20 69 73 20 65 76 61 6c 75  ression is evalu
19750 61 74 65 64 20 61 6e 64 20 69 74 73 0a 2a 2a 20  ated and its.** 
19760 72 65 73 75 6c 74 20 69 73 20 6c 65 66 74 20 6f  result is left o
19770 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 46 6f  n the stack.  Fo
19780 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66  r constraints of
19790 20 74 68 65 20 66 6f 72 6d 20 58 20 49 4e 20 28   the form X IN (
197a0 2e 2e 2e 29 0a 2a 2a 20 74 68 69 73 20 72 6f 75  ...).** this rou
197b0 74 69 6e 65 20 73 65 74 73 20 75 70 20 61 20 6c  tine sets up a l
197c0 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 69 74  oop that will it
197d0 65 72 61 74 65 20 6f 76 65 72 20 61 6c 6c 20 76  erate over all v
197e0 61 6c 75 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73  alues of X..*/.s
197f0 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 45 71  tatic int codeEq
19800 75 61 6c 69 74 79 54 65 72 6d 28 0a 20 20 50 61  ualityTerm(.  Pa
19810 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
19820 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
19830 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
19840 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
19850 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 6f 66    /* The term of
19860 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
19870 65 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  e to be coded */
19880 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
19890 4c 65 76 65 6c 2c 20 2f 2a 20 54 68 65 20 6c 65  Level, /* The le
198a0 76 65 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  vel of the FROM 
198b0 63 6c 61 75 73 65 20 77 65 20 61 72 65 20 77 6f  clause we are wo
198c0 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 69 6e  rking on */.  in
198d0 74 20 69 45 71 2c 20 20 20 20 20 20 20 20 20 20  t iEq,          
198e0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
198f0 65 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20  e equality term 
19900 77 69 74 68 69 6e 20 74 68 69 73 20 6c 65 76 65  within this leve
19910 6c 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c  l */.  int bRev,
19920 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
19930 75 65 20 66 6f 72 20 72 65 76 65 72 73 65 2d 6f  ue for reverse-o
19940 72 64 65 72 20 49 4e 20 6f 70 65 72 61 74 69 6f  rder IN operatio
19950 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 72  ns */.  int iTar
19960 67 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20 41  get         /* A
19970 74 74 65 6d 70 74 20 74 6f 20 6c 65 61 76 65 20  ttempt to leave 
19980 72 65 73 75 6c 74 73 20 69 6e 20 74 68 69 73 20  results in this 
19990 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20  register */.){. 
199a0 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72   Expr *pX = pTer
199b0 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 56 64 62 65  m->pExpr;.  Vdbe
199c0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
199d0 64 62 65 3b 0a 20 20 69 6e 74 20 69 52 65 67 3b  dbe;.  int iReg;
199e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
199f0 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
19a00 6c 64 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f  lding results */
19a10 0a 0a 20 20 61 73 73 65 72 74 28 20 69 54 61 72  ..  assert( iTar
19a20 67 65 74 3e 30 20 29 3b 0a 20 20 69 66 28 20 70  get>0 );.  if( p
19a30 58 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 7b 0a  X->op==TK_EQ ){.
19a40 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74      iReg = sqlit
19a50 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
19a60 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69  (pParse, pX->pRi
19a70 67 68 74 2c 20 69 54 61 72 67 65 74 29 3b 0a 20  ght, iTarget);. 
19a80 20 7d 65 6c 73 65 20 69 66 28 20 70 58 2d 3e 6f   }else if( pX->o
19a90 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a  p==TK_ISNULL ){.
19aa0 20 20 20 20 69 52 65 67 20 3d 20 69 54 61 72 67      iReg = iTarg
19ab0 65 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  et;.    sqlite3V
19ac0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
19ad0 4e 75 6c 6c 2c 20 30 2c 20 69 52 65 67 29 3b 0a  Null, 0, iReg);.
19ae0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
19af0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 7d  MIT_SUBQUERY.  }
19b00 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 65 54  else{.    int eT
19b10 79 70 65 3b 0a 20 20 20 20 69 6e 74 20 69 54 61  ype;.    int iTa
19b20 62 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 6e  b;.    struct In
19b30 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20 57  Loop *pIn;.    W
19b40 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20  hereLoop *pLoop 
19b50 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
19b60 3b 0a 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f  ;..    if( (pLoo
19b70 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
19b80 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
19b90 3d 3d 30 0a 20 20 20 20 20 20 26 26 20 70 4c 6f  ==0.      && pLo
19ba0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
19bb0 65 78 21 3d 30 0a 20 20 20 20 20 20 26 26 20 70  ex!=0.      && p
19bc0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
19bd0 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  ndex->aSortOrder
19be0 5b 69 45 71 5d 0a 20 20 20 20 29 7b 0a 20 20 20  [iEq].    ){.   
19bf0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 45 71     testcase( iEq
19c00 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
19c10 74 63 61 73 65 28 20 62 52 65 76 20 29 3b 0a 20  tcase( bRev );. 
19c20 20 20 20 20 20 62 52 65 76 20 3d 20 21 62 52 65       bRev = !bRe
19c30 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  v;.    }.    ass
19c40 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  ert( pX->op==TK_
19c50 49 4e 20 29 3b 0a 20 20 20 20 69 52 65 67 20 3d  IN );.    iReg =
19c60 20 69 54 61 72 67 65 74 3b 0a 20 20 20 20 65 54   iTarget;.    eT
19c70 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  ype = sqlite3Fin
19c80 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c  dInIndex(pParse,
19c90 20 70 58 2c 20 30 29 3b 0a 20 20 20 20 69 66 28   pX, 0);.    if(
19ca0 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58   eType==IN_INDEX
19cb0 5f 49 4e 44 45 58 5f 44 45 53 43 20 29 7b 0a 20  _INDEX_DESC ){. 
19cc0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 62       testcase( b
19cd0 52 65 76 20 29 3b 0a 20 20 20 20 20 20 62 52 65  Rev );.      bRe
19ce0 76 20 3d 20 21 62 52 65 76 3b 0a 20 20 20 20 7d  v = !bRev;.    }
19cf0 0a 20 20 20 20 69 54 61 62 20 3d 20 70 58 2d 3e  .    iTab = pX->
19d00 69 54 61 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69  iTable;.    sqli
19d10 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
19d20 20 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20   bRev ? OP_Last 
19d30 3a 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61  : OP_Rewind, iTa
19d40 62 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72  b, 0);.    asser
19d50 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  t( (pLoop->wsFla
19d60 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49  gs & WHERE_MULTI
19d70 5f 4f 52 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70  _OR)==0 );.    p
19d80 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  Loop->wsFlags |=
19d90 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 3b 0a   WHERE_IN_ABLE;.
19da0 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
19db0 75 2e 69 6e 2e 6e 49 6e 3d 3d 30 20 29 7b 0a 20  u.in.nIn==0 ){. 
19dc0 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64       pLevel->add
19dd0 72 4e 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64  rNxt = sqlite3Vd
19de0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
19df0 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c      }.    pLevel
19e00 2d 3e 75 2e 69 6e 2e 6e 49 6e 2b 2b 3b 0a 20 20  ->u.in.nIn++;.  
19e10 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61    pLevel->u.in.a
19e20 49 6e 4c 6f 6f 70 20 3d 0a 20 20 20 20 20 20 20  InLoop =.       
19e30 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
19e40 4f 72 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64  OrFree(pParse->d
19e50 62 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  b, pLevel->u.in.
19e60 61 49 6e 4c 6f 6f 70 2c 0a 20 20 20 20 20 20 20  aInLoop,.       
19e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e80 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c         sizeof(pL
19e90 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f  evel->u.in.aInLo
19ea0 6f 70 5b 30 5d 29 2a 70 4c 65 76 65 6c 2d 3e 75  op[0])*pLevel->u
19eb0 2e 69 6e 2e 6e 49 6e 29 3b 0a 20 20 20 20 70 49  .in.nIn);.    pI
19ec0 6e 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  n = pLevel->u.in
19ed0 2e 61 49 6e 4c 6f 6f 70 3b 0a 20 20 20 20 69 66  .aInLoop;.    if
19ee0 28 20 70 49 6e 20 29 7b 0a 20 20 20 20 20 20 70  ( pIn ){.      p
19ef0 49 6e 20 2b 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e  In += pLevel->u.
19f00 69 6e 2e 6e 49 6e 20 2d 20 31 3b 0a 20 20 20 20  in.nIn - 1;.    
19f10 20 20 70 49 6e 2d 3e 69 43 75 72 20 3d 20 69 54    pIn->iCur = iT
19f20 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54  ab;.      if( eT
19f30 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f  ype==IN_INDEX_RO
19f40 57 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70  WID ){.        p
19f50 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20  In->addrInTop = 
19f60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19f70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69  2(v, OP_Rowid, i
19f80 54 61 62 2c 20 69 52 65 67 29 3b 0a 20 20 20 20  Tab, iReg);.    
19f90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
19fa0 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20   pIn->addrInTop 
19fb0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
19fc0 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
19fd0 2c 20 69 54 61 62 2c 20 30 2c 20 69 52 65 67 29  , iTab, 0, iReg)
19fe0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19ff0 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 20  pIn->eEndLoopOp 
1a000 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76  = bRev ? OP_Prev
1a010 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20   : OP_Next;.    
1a020 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a030 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op1(v, OP_IsNull
1a040 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 7d 65 6c  , iReg);.    }el
1a050 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  se{.      pLevel
1a060 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 3d 20 30 3b 0a  ->u.in.nIn = 0;.
1a070 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
1a080 0a 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70  .  disableTerm(p
1a090 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20  Level, pTerm);. 
1a0a0 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a   return iReg;.}.
1a0b0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1a0c0 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65  code that will e
1a0d0 76 61 6c 75 61 74 65 20 61 6c 6c 20 3d 3d 20 61  valuate all == a
1a0e0 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74  nd IN constraint
1a0f0 73 20 66 6f 72 20 61 6e 0a 2a 2a 20 69 6e 64 65  s for an.** inde
1a100 78 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  x..**.** For exa
1a110 6d 70 6c 65 2c 20 63 6f 6e 73 69 64 65 72 20 74  mple, consider t
1a120 61 62 6c 65 20 74 31 28 61 2c 62 2c 63 2c 64 2c  able t1(a,b,c,d,
1a130 65 2c 66 29 20 77 69 74 68 20 69 6e 64 65 78 20  e,f) with index 
1a140 69 31 28 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53 75  i1(a,b,c)..** Su
1a150 70 70 6f 73 65 20 74 68 65 20 57 48 45 52 45 20  ppose the WHERE 
1a160 63 6c 61 75 73 65 20 69 73 20 74 68 69 73 3a 20  clause is this: 
1a170 20 61 3d 3d 35 20 41 4e 44 20 62 20 49 4e 20 28   a==5 AND b IN (
1a180 31 2c 32 2c 33 29 20 41 4e 44 20 63 3e 35 20 41  1,2,3) AND c>5 A
1a190 4e 44 20 63 3c 31 30 0a 2a 2a 20 54 68 65 20 69  ND c<10.** The i
1a1a0 6e 64 65 78 20 68 61 73 20 61 73 20 6d 61 6e 79  ndex has as many
1a1b0 20 61 73 20 74 68 72 65 65 20 65 71 75 61 6c 69   as three equali
1a1c0 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20  ty constraints, 
1a1d0 62 75 74 20 69 6e 20 74 68 69 73 0a 2a 2a 20 65  but in this.** e
1a1e0 78 61 6d 70 6c 65 2c 20 74 68 65 20 74 68 69 72  xample, the thir
1a1f0 64 20 22 63 22 20 76 61 6c 75 65 20 69 73 20 61  d "c" value is a
1a200 6e 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 53  n inequality.  S
1a210 6f 20 6f 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20 63  o only two .** c
1a220 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 63  onstraints are c
1a230 6f 64 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74  oded.  This rout
1a240 69 6e 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74  ine will generat
1a250 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61  e code to evalua
1a260 74 65 0a 2a 2a 20 61 3d 3d 35 20 61 6e 64 20 62  te.** a==5 and b
1a270 20 49 4e 20 28 31 2c 32 2c 33 29 2e 20 20 54 68   IN (1,2,3).  Th
1a280 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 73  e current values
1a290 20 66 6f 72 20 61 20 61 6e 64 20 62 20 77 69 6c   for a and b wil
1a2a0 6c 20 62 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69  l be stored.** i
1a2b0 6e 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72 65  n consecutive re
1a2c0 67 69 73 74 65 72 73 20 61 6e 64 20 74 68 65 20  gisters and the 
1a2d0 69 6e 64 65 78 20 6f 66 20 74 68 65 20 66 69 72  index of the fir
1a2e0 73 74 20 72 65 67 69 73 74 65 72 20 69 73 20 72  st register is r
1a2f0 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
1a300 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62  n the example ab
1a310 6f 76 65 20 6e 45 71 3d 3d 32 2e 20 20 42 75 74  ove nEq==2.  But
1a320 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
1a330 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 76   works for any v
1a340 61 6c 75 65 0a 2a 2a 20 6f 66 20 6e 45 71 20 69  alue.** of nEq i
1a350 6e 63 6c 75 64 69 6e 67 20 30 2e 20 20 49 66 20  ncluding 0.  If 
1a360 6e 45 71 3d 3d 30 2c 20 74 68 69 73 20 72 6f 75  nEq==0, this rou
1a370 74 69 6e 65 20 69 73 20 6e 65 61 72 6c 79 20 61  tine is nearly a
1a380 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20 6f   no-op..** The o
1a390 6e 6c 79 20 74 68 69 6e 67 20 69 74 20 64 6f 65  nly thing it doe
1a3a0 73 20 69 73 20 61 6c 6c 6f 63 61 74 65 20 74 68  s is allocate th
1a3b0 65 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 6d  e pLevel->iMem m
1a3c0 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 0a 2a  emory cell and.*
1a3d0 2a 20 63 6f 6d 70 75 74 65 20 74 68 65 20 61 66  * compute the af
1a3e0 66 69 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a 2a  finity string..*
1a3f0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1a400 65 20 61 6c 77 61 79 73 20 61 6c 6c 6f 63 61 74  e always allocat
1a410 65 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  es at least one 
1a420 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20  memory cell and 
1a430 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20 69  returns.** the i
1a440 6e 64 65 78 20 6f 66 20 74 68 61 74 20 6d 65 6d  ndex of that mem
1a450 6f 72 79 20 63 65 6c 6c 2e 20 54 68 65 20 63 6f  ory cell. The co
1a460 64 65 20 74 68 61 74 0a 2a 2a 20 63 61 6c 6c 73  de that.** calls
1a470 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
1a480 6c 6c 20 75 73 65 20 74 68 61 74 20 6d 65 6d 6f  ll use that memo
1a490 72 79 20 63 65 6c 6c 20 74 6f 20 73 74 6f 72 65  ry cell to store
1a4a0 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e   the termination
1a4b0 0a 2a 2a 20 6b 65 79 20 76 61 6c 75 65 20 6f 66  .** key value of
1a4c0 20 74 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20 6f   the loop.  If o
1a4d0 6e 65 20 6f 72 20 6d 6f 72 65 20 49 4e 20 6f 70  ne or more IN op
1a4e0 65 72 61 74 6f 72 73 20 61 70 70 65 61 72 2c 20  erators appear, 
1a4f0 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75  then.** this rou
1a500 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61  tine allocates a
1a510 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 45 71  n additional nEq
1a520 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f   memory cells fo
1a530 72 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75 73  r internal.** us
1a540 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20  e..**.** Before 
1a550 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 41 66  returning, *pzAf
1a560 66 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  f is set to poin
1a570 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  t to a buffer co
1a580 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 63 6f  ntaining a.** co
1a590 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  py of the column
1a5a0 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   affinity string
1a5b0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6c   of the index al
1a5c0 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 0a 2a 2a  located using.**
1a5d0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
1a5e0 28 29 2e 20 45 78 63 65 70 74 2c 20 65 6e 74 72  (). Except, entr
1a5f0 69 65 73 20 69 6e 20 74 68 65 20 63 6f 70 79 20  ies in the copy 
1a600 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20 61 73  of the string as
1a610 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68  sociated.** with
1a620 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
1a630 61 69 6e 74 73 20 74 68 61 74 20 75 73 65 20 4e  aints that use N
1a640 4f 4e 45 20 61 66 66 69 6e 69 74 79 20 61 72 65  ONE affinity are
1a650 20 73 65 74 20 74 6f 0a 2a 2a 20 53 51 4c 49 54   set to.** SQLIT
1a660 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 54 68 69 73  E_AFF_NONE. This
1a670 20 69 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68   is to deal with
1a680 20 53 51 4c 20 73 75 63 68 20 61 73 20 74 68 65   SQL such as the
1a690 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
1a6a0 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  *   CREATE TABLE
1a6b0 20 74 31 28 61 20 54 45 58 54 20 50 52 49 4d 41   t1(a TEXT PRIMA
1a6c0 52 59 20 4b 45 59 2c 20 62 29 3b 0a 2a 2a 20 20  RY KEY, b);.**  
1a6d0 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d   SELECT ... FROM
1a6e0 20 74 31 20 41 53 20 74 32 2c 20 74 31 20 57 48   t1 AS t2, t1 WH
1a6f0 45 52 45 20 74 31 2e 61 20 3d 20 74 32 2e 62 3b  ERE t1.a = t2.b;
1a700 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78  .**.** In the ex
1a710 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74 68 65  ample above, the
1a720 20 69 6e 64 65 78 20 6f 6e 20 74 31 28 61 29 20   index on t1(a) 
1a730 68 61 73 20 54 45 58 54 20 61 66 66 69 6e 69 74  has TEXT affinit
1a740 79 2e 20 42 75 74 20 73 69 6e 63 65 0a 2a 2a 20  y. But since.** 
1a750 74 68 65 20 72 69 67 68 74 20 68 61 6e 64 20 73  the right hand s
1a760 69 64 65 20 6f 66 20 74 68 65 20 65 71 75 61 6c  ide of the equal
1a770 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 28  ity constraint (
1a780 74 32 2e 62 29 20 68 61 73 20 4e 4f 4e 45 20 61  t2.b) has NONE a
1a790 66 66 69 6e 69 74 79 2c 0a 2a 2a 20 6e 6f 20 63  ffinity,.** no c
1a7a0 6f 6e 76 65 72 73 69 6f 6e 20 73 68 6f 75 6c 64  onversion should
1a7b0 20 62 65 20 61 74 74 65 6d 70 74 65 64 20 62 65   be attempted be
1a7c0 66 6f 72 65 20 75 73 69 6e 67 20 61 20 74 32 2e  fore using a t2.
1a7d0 62 20 76 61 6c 75 65 20 61 73 20 70 61 72 74 20  b value as part 
1a7e0 6f 66 0a 2a 2a 20 61 20 6b 65 79 20 74 6f 20 73  of.** a key to s
1a7f0 65 61 72 63 68 20 74 68 65 20 69 6e 64 65 78 2e  earch the index.
1a800 20 48 65 6e 63 65 20 74 68 65 20 66 69 72 73 74   Hence the first
1a810 20 62 79 74 65 20 69 6e 20 74 68 65 20 72 65 74   byte in the ret
1a820 75 72 6e 65 64 20 61 66 66 69 6e 69 74 79 0a 2a  urned affinity.*
1a830 2a 20 73 74 72 69 6e 67 20 69 6e 20 74 68 69 73  * string in this
1a840 20 65 78 61 6d 70 6c 65 20 77 6f 75 6c 64 20 62   example would b
1a850 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  e set to SQLITE_
1a860 41 46 46 5f 4e 4f 4e 45 2e 0a 2a 2f 0a 73 74 61  AFF_NONE..*/.sta
1a870 74 69 63 20 69 6e 74 20 63 6f 64 65 41 6c 6c 45  tic int codeAllE
1a880 71 75 61 6c 69 74 79 54 65 72 6d 73 28 0a 20 20  qualityTerms(.  
1a890 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
1a8a0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
1a8b0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
1a8c0 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
1a8d0 2c 20 20 20 2f 2a 20 57 68 69 63 68 20 6e 65 73  ,   /* Which nes
1a8e0 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20  ted loop of the 
1a8f0 46 52 4f 4d 20 77 65 20 61 72 65 20 63 6f 64 69  FROM we are codi
1a900 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76  ng */.  int bRev
1a910 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1a920 20 52 65 76 65 72 73 65 20 74 68 65 20 6f 72 64   Reverse the ord
1a930 65 72 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f  er of IN operato
1a940 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  rs */.  int nExt
1a950 72 61 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a  raReg,        /*
1a960 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61   Number of extra
1a970 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c   registers to al
1a980 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68 61 72  locate */.  char
1a990 20 2a 2a 70 7a 41 66 66 20 20 20 20 20 20 20 20   **pzAff        
1a9a0 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 74 6f    /* OUT: Set to
1a9b0 20 70 6f 69 6e 74 20 74 6f 20 61 66 66 69 6e 69   point to affini
1a9c0 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a  ty string */.){.
1a9d0 20 20 69 6e 74 20 6e 45 71 3b 20 20 20 20 20 20    int nEq;      
1a9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a9f0 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
1aa00 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72   == or IN constr
1aa10 61 69 6e 74 73 20 74 6f 20 63 6f 64 65 20 2a 2f  aints to code */
1aa20 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
1aa30 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20  rse->pVdbe;     
1aa40 20 2f 2a 20 54 68 65 20 76 6d 20 75 6e 64 65 72   /* The vm under
1aa50 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
1aa60 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20  .  Index *pIdx; 
1aa70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa80 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 62 65   /* The index be
1aa90 69 6e 67 20 75 73 65 64 20 66 6f 72 20 74 68 69  ing used for thi
1aaa0 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72  s loop */.  Wher
1aab0 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
1aac0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
1aad0 69 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74  ingle constraint
1aae0 20 74 65 72 6d 20 2a 2f 0a 20 20 57 68 65 72 65   term */.  Where
1aaf0 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20  Loop *pLoop;    
1ab00 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1ab10 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
1ab20 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20   */.  int j;    
1ab30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab40 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
1ab50 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ter */.  int reg
1ab60 42 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  Base;           
1ab70 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72         /* Base r
1ab80 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74  egister */.  int
1ab90 20 6e 52 65 67 3b 20 20 20 20 20 20 20 20 20 20   nReg;          
1aba0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1abb0 6d 62 65 72 20 6f 66 20 72 65 67 69 73 74 65 72  mber of register
1abc0 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  s to allocate */
1abd0 0a 20 20 63 68 61 72 20 2a 7a 41 66 66 3b 20 20  .  char *zAff;  
1abe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1abf0 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 73 74 72   /* Affinity str
1ac00 69 6e 67 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  ing to return */
1ac10 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d 6f 64 75  ..  /* This modu
1ac20 6c 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  le is only calle
1ac30 64 20 6f 6e 20 71 75 65 72 79 20 70 6c 61 6e 73  d on query plans
1ac40 20 74 68 61 74 20 75 73 65 20 61 6e 20 69 6e 64   that use an ind
1ac50 65 78 2e 20 2a 2f 0a 20 20 70 4c 6f 6f 70 20 3d  ex. */.  pLoop =
1ac60 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b   pLevel->pWLoop;
1ac70 0a 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f  .  assert( (pLoo
1ac80 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
1ac90 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
1aca0 3d 3d 30 20 29 3b 0a 20 20 6e 45 71 20 3d 20 70  ==0 );.  nEq = p
1acb0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
1acc0 71 3b 0a 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f  q;.  pIdx = pLoo
1acd0 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
1ace0 78 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  x;.  assert( pId
1acf0 78 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 46 69  x!=0 );..  /* Fi
1ad00 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
1ad10 79 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 77  y memory cells w
1ad20 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 68 65 6e  e will need then
1ad30 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 6d 2e 0a   allocate them..
1ad40 20 20 2a 2f 0a 20 20 72 65 67 42 61 73 65 20 3d    */.  regBase =
1ad50 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20   pParse->nMem + 
1ad60 31 3b 0a 20 20 6e 52 65 67 20 3d 20 70 4c 6f 6f  1;.  nReg = pLoo
1ad70 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 2b  p->u.btree.nEq +
1ad80 20 6e 45 78 74 72 61 52 65 67 3b 0a 20 20 70 50   nExtraReg;.  pP
1ad90 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52  arse->nMem += nR
1ada0 65 67 3b 0a 0a 20 20 7a 41 66 66 20 3d 20 73 71  eg;..  zAff = sq
1adb0 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 70 50  lite3DbStrDup(pP
1adc0 61 72 73 65 2d 3e 64 62 2c 20 73 71 6c 69 74 65  arse->db, sqlite
1add0 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74  3IndexAffinitySt
1ade0 72 28 76 2c 20 70 49 64 78 29 29 3b 0a 20 20 69  r(v, pIdx));.  i
1adf0 66 28 20 21 7a 41 66 66 20 29 7b 0a 20 20 20 20  f( !zAff ){.    
1ae00 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
1ae10 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
1ae20 7d 0a 0a 20 20 2f 2a 20 45 76 61 6c 75 61 74 65  }..  /* Evaluate
1ae30 20 74 68 65 20 65 71 75 61 6c 69 74 79 20 63 6f   the equality co
1ae40 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 20  nstraints.  */. 
1ae50 20 61 73 73 65 72 74 28 20 7a 41 66 66 3d 3d 30   assert( zAff==0
1ae60 20 7c 7c 20 28 69 6e 74 29 73 74 72 6c 65 6e 28   || (int)strlen(
1ae70 7a 41 66 66 29 3e 3d 6e 45 71 20 29 3b 0a 20 20  zAff)>=nEq );.  
1ae80 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 71 3b 20  for(j=0; j<nEq; 
1ae90 6a 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 31  j++){.    int r1
1aea0 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70 4c  ;.    pTerm = pL
1aeb0 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a  oop->aLTerm[j];.
1aec0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
1aed0 6d 21 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20 54  m!=0 );.    /* T
1aee0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 72 75  he following tru
1aef0 65 20 66 6f 72 20 69 6e 64 69 63 65 73 20 77 69  e for indices wi
1af00 74 68 20 72 65 64 75 6e 64 61 6e 74 20 63 6f 6c  th redundant col
1af10 75 6d 6e 73 2e 20 0a 20 20 20 20 2a 2a 20 45 78  umns. .    ** Ex
1af20 3a 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69  : CREATE INDEX i
1af30 31 20 4f 4e 20 74 31 28 61 2c 62 2c 61 29 3b 20  1 ON t1(a,b,a); 
1af40 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
1af50 20 57 48 45 52 45 20 61 3d 30 20 41 4e 44 20 62   WHERE a=0 AND b
1af60 3d 30 3b 20 2a 2f 0a 20 20 20 20 74 65 73 74 63  =0; */.    testc
1af70 61 73 65 28 20 28 70 54 65 72 6d 2d 3e 77 74 46  ase( (pTerm->wtF
1af80 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45  lags & TERM_CODE
1af90 44 29 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73  D)!=0 );.    tes
1afa0 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74  tcase( pTerm->wt
1afb0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
1afc0 54 55 41 4c 20 29 3b 0a 20 20 20 20 72 31 20 3d  TUAL );.    r1 =
1afd0 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72   codeEqualityTer
1afe0 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c  m(pParse, pTerm,
1aff0 20 70 4c 65 76 65 6c 2c 20 6a 2c 20 62 52 65 76   pLevel, j, bRev
1b000 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20  , regBase+j);.  
1b010 20 20 69 66 28 20 72 31 21 3d 72 65 67 42 61 73    if( r1!=regBas
1b020 65 2b 6a 20 29 7b 0a 20 20 20 20 20 20 69 66 28  e+j ){.      if(
1b030 20 6e 52 65 67 3d 3d 31 20 29 7b 0a 20 20 20 20   nReg==1 ){.    
1b040 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
1b050 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
1b060 2c 20 72 65 67 42 61 73 65 29 3b 0a 20 20 20 20  , regBase);.    
1b070 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 72 31      regBase = r1
1b080 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1b090 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1b0a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
1b0b0 43 6f 70 79 2c 20 72 31 2c 20 72 65 67 42 61 73  Copy, r1, regBas
1b0c0 65 2b 6a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  e+j);.      }.  
1b0d0 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65    }.    testcase
1b0e0 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
1b0f0 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  or & WO_ISNULL )
1b100 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1b110 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
1b120 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20   & WO_IN );.    
1b130 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
1b140 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 53 4e 55  rator & (WO_ISNU
1b150 4c 4c 7c 57 4f 5f 49 4e 29 29 3d 3d 30 20 29 7b  LL|WO_IN))==0 ){
1b160 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69  .      Expr *pRi
1b170 67 68 74 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  ght = pTerm->pEx
1b180 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
1b190 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1b1a0 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70  eIsNullJump(v, p
1b1b0 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6a  Right, regBase+j
1b1c0 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72  , pLevel->addrBr
1b1d0 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41  k);.      if( zA
1b1e0 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ff ){.        if
1b1f0 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  ( sqlite3Compare
1b200 41 66 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c  Affinity(pRight,
1b210 20 7a 41 66 66 5b 6a 5d 29 3d 3d 53 51 4c 49 54   zAff[j])==SQLIT
1b220 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20  E_AFF_NONE ){.  
1b230 20 20 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20          zAff[j] 
1b240 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
1b250 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
1b260 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1b270 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e  ExprNeedsNoAffin
1b280 69 74 79 43 68 61 6e 67 65 28 70 52 69 67 68 74  ityChange(pRight
1b290 2c 20 7a 41 66 66 5b 6a 5d 29 20 29 7b 0a 20 20  , zAff[j]) ){.  
1b2a0 20 20 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d 20          zAff[j] 
1b2b0 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
1b2c0 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
1b2d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1b2e0 20 2a 70 7a 41 66 66 20 3d 20 7a 41 66 66 3b 0a   *pzAff = zAff;.
1b2f0 20 20 72 65 74 75 72 6e 20 72 65 67 42 61 73 65    return regBase
1b300 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
1b310 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
1b320 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1b330 69 6e 65 20 69 73 20 61 20 68 65 6c 70 65 72 20  ine is a helper 
1b340 66 6f 72 20 65 78 70 6c 61 69 6e 49 6e 64 65 78  for explainIndex
1b350 52 61 6e 67 65 28 29 20 62 65 6c 6f 77 0a 2a 2a  Range() below.**
1b360 0a 2a 2a 20 70 53 74 72 20 68 6f 6c 64 73 20 74  .** pStr holds t
1b370 68 65 20 74 65 78 74 20 6f 66 20 61 6e 20 65 78  he text of an ex
1b380 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 77 65  pression that we
1b390 20 61 72 65 20 62 75 69 6c 64 69 6e 67 20 75 70   are building up
1b3a0 20 6f 6e 65 20 74 65 72 6d 0a 2a 2a 20 61 74 20   one term.** at 
1b3b0 61 20 74 69 6d 65 2e 20 20 54 68 69 73 20 72 6f  a time.  This ro
1b3c0 75 74 69 6e 65 20 61 64 64 73 20 61 20 6e 65 77  utine adds a new
1b3d0 20 74 65 72 6d 20 74 6f 20 74 68 65 20 65 6e 64   term to the end
1b3e0 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
1b3f0 6f 6e 2e 0a 2a 2a 20 54 65 72 6d 73 20 61 72 65  on..** Terms are
1b400 20 73 65 70 61 72 61 74 65 64 20 62 79 20 41 4e   separated by AN
1b410 44 20 73 6f 20 61 64 64 20 74 68 65 20 22 41 4e  D so add the "AN
1b420 44 22 20 74 65 78 74 20 66 6f 72 20 73 65 63 6f  D" text for seco
1b430 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e  nd and subsequen
1b440 74 0a 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c 79 2e  t.** terms only.
1b450 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1b460 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72  explainAppendTer
1b470 6d 28 0a 20 20 53 74 72 41 63 63 75 6d 20 2a 70  m(.  StrAccum *p
1b480 53 74 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Str,            
1b490 20 2f 2a 20 54 68 65 20 74 65 78 74 20 65 78 70   /* The text exp
1b4a0 72 65 73 73 69 6f 6e 20 62 65 69 6e 67 20 62 75  ression being bu
1b4b0 69 6c 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65  ilt */.  int iTe
1b4c0 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rm,             
1b4d0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1b4e0 20 74 68 69 73 20 74 65 72 6d 2e 20 20 46 69 72   this term.  Fir
1b4f0 73 74 20 69 73 20 7a 65 72 6f 20 2a 2f 0a 20 20  st is zero */.  
1b500 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
1b510 75 6d 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e  umn,        /* N
1b520 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ame of the colum
1b530 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  n */.  const cha
1b540 72 20 2a 7a 4f 70 20 20 20 20 20 20 20 20 20 20  r *zOp          
1b550 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
1b560 65 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 29 7b  e operator */.){
1b570 0a 20 20 69 66 28 20 69 54 65 72 6d 20 29 20 73  .  if( iTerm ) s
1b580 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
1b590 70 65 6e 64 28 70 53 74 72 2c 20 22 20 41 4e 44  pend(pStr, " AND
1b5a0 20 22 2c 20 35 29 3b 0a 20 20 73 71 6c 69 74 65   ", 5);.  sqlite
1b5b0 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28  3StrAccumAppend(
1b5c0 70 53 74 72 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 2d  pStr, zColumn, -
1b5d0 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72  1);.  sqlite3Str
1b5e0 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72  AccumAppend(pStr
1b5f0 2c 20 7a 4f 70 2c 20 31 29 3b 0a 20 20 73 71 6c  , zOp, 1);.  sql
1b600 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
1b610 6e 64 28 70 53 74 72 2c 20 22 3f 22 2c 20 31 29  nd(pStr, "?", 1)
1b620 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d  ;.}../*.** Argum
1b630 65 6e 74 20 70 4c 65 76 65 6c 20 64 65 73 63 72  ent pLevel descr
1b640 69 62 65 73 20 61 20 73 74 72 61 74 65 67 79 20  ibes a strategy 
1b650 66 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 61 62  for scanning tab
1b660 6c 65 20 70 54 61 62 2e 20 54 68 69 73 20 0a 2a  le pTab. This .*
1b670 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  * function retur
1b680 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
1b690 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20  a string buffer 
1b6a0 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 64 65 73  containing a des
1b6b0 63 72 69 70 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74  cription.** of t
1b6c0 68 65 20 73 75 62 73 65 74 20 6f 66 20 74 61 62  he subset of tab
1b6d0 6c 65 20 72 6f 77 73 20 73 63 61 6e 6e 65 64 20  le rows scanned 
1b6e0 62 79 20 74 68 65 20 73 74 72 61 74 65 67 79 20  by the strategy 
1b6f0 69 6e 20 74 68 65 20 66 6f 72 6d 20 6f 66 20 61  in the form of a
1b700 6e 0a 2a 2a 20 53 51 4c 20 65 78 70 72 65 73 73  n.** SQL express
1b710 69 6f 6e 2e 20 4f 72 2c 20 69 66 20 61 6c 6c 20  ion. Or, if all 
1b720 72 6f 77 73 20 61 72 65 20 73 63 61 6e 6e 65 64  rows are scanned
1b730 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  , NULL is return
1b740 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78  ed..**.** For ex
1b750 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 71 75  ample, if the qu
1b760 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c  ery:.**.**   SEL
1b770 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
1b780 45 52 45 20 61 3d 31 20 41 4e 44 20 62 3e 32 3b  ERE a=1 AND b>2;
1b790 0a 2a 2a 0a 2a 2a 20 69 73 20 72 75 6e 20 61 6e  .**.** is run an
1b7a0 64 20 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e  d there is an in
1b7b0 64 65 78 20 6f 6e 20 28 61 2c 20 62 29 2c 20 74  dex on (a, b), t
1b7c0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
1b7d0 6e 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20 73  n returns a.** s
1b7e0 74 72 69 6e 67 20 73 69 6d 69 6c 61 72 20 74 6f  tring similar to
1b7f0 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 61 3d 3f 20 41  :.**.**   "a=? A
1b800 4e 44 20 62 3e 3f 22 0a 2a 2a 0a 2a 2a 20 54 68  ND b>?".**.** Th
1b810 65 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74  e returned point
1b820 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 6d 65 6d  er points to mem
1b830 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
1b840 6d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  m sqlite3DbMallo
1b850 63 28 29 2e 0a 2a 2a 20 49 74 20 69 73 20 74 68  c()..** It is th
1b860 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
1b870 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
1b880 6f 20 66 72 65 65 20 74 68 65 20 62 75 66 66 65  o free the buffe
1b890 72 20 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20  r when it is.** 
1b8a0 6e 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72  no longer requir
1b8b0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ed..*/.static ch
1b8c0 61 72 20 2a 65 78 70 6c 61 69 6e 49 6e 64 65 78  ar *explainIndex
1b8d0 52 61 6e 67 65 28 73 71 6c 69 74 65 33 20 2a 64  Range(sqlite3 *d
1b8e0 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  b, WhereLoop *pL
1b8f0 6f 6f 70 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  oop, Table *pTab
1b900 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  ){.  Index *pInd
1b910 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  ex = pLoop->u.bt
1b920 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e  ree.pIndex;.  in
1b930 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 75  t nEq = pLoop->u
1b940 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 69 6e  .btree.nEq;.  in
1b950 74 20 69 2c 20 6a 3b 0a 20 20 43 6f 6c 75 6d 6e  t i, j;.  Column
1b960 20 2a 61 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61   *aCol = pTab->a
1b970 43 6f 6c 3b 0a 20 20 69 6e 74 20 2a 61 69 43 6f  Col;.  int *aiCo
1b980 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61  lumn = pIndex->a
1b990 69 43 6f 6c 75 6d 6e 3b 0a 20 20 53 74 72 41 63  iColumn;.  StrAc
1b9a0 63 75 6d 20 74 78 74 3b 0a 0a 20 20 69 66 28 20  cum txt;..  if( 
1b9b0 6e 45 71 3d 3d 30 20 26 26 20 28 70 4c 6f 6f 70  nEq==0 && (pLoop
1b9c0 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45  ->wsFlags & (WHE
1b9d0 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45  RE_BTM_LIMIT|WHE
1b9e0 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 3d 3d  RE_TOP_LIMIT))==
1b9f0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1ba00 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
1ba10 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26 74 78  StrAccumInit(&tx
1ba20 74 2c 20 30 2c 20 30 2c 20 53 51 4c 49 54 45 5f  t, 0, 0, SQLITE_
1ba30 4d 41 58 5f 4c 45 4e 47 54 48 29 3b 0a 20 20 74  MAX_LENGTH);.  t
1ba40 78 74 2e 64 62 20 3d 20 64 62 3b 0a 20 20 73 71  xt.db = db;.  sq
1ba50 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
1ba60 65 6e 64 28 26 74 78 74 2c 20 22 20 28 22 2c 20  end(&txt, " (", 
1ba70 32 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  2);.  for(i=0; i
1ba80 3c 6e 45 71 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <nEq; i++){.    
1ba90 63 68 61 72 20 2a 7a 20 3d 20 28 69 3d 3d 70 49  char *z = (i==pI
1baa0 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20  ndex->nColumn ) 
1bab0 3f 20 22 72 6f 77 69 64 22 20 3a 20 61 43 6f 6c  ? "rowid" : aCol
1bac0 5b 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 7a 4e  [aiColumn[i]].zN
1bad0 61 6d 65 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e  ame;.    explain
1bae0 41 70 70 65 6e 64 54 65 72 6d 28 26 74 78 74 2c  AppendTerm(&txt,
1baf0 20 69 2c 20 7a 2c 20 22 3d 22 29 3b 0a 20 20 7d   i, z, "=");.  }
1bb00 0a 0a 20 20 6a 20 3d 20 69 3b 0a 20 20 69 66 28  ..  j = i;.  if(
1bb10 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26   pLoop->wsFlags&
1bb20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20  WHERE_BTM_LIMIT 
1bb30 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d  ){.    char *z =
1bb40 20 28 6a 3d 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f   (j==pIndex->nCo
1bb50 6c 75 6d 6e 20 29 20 3f 20 22 72 6f 77 69 64 22  lumn ) ? "rowid"
1bb60 20 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e   : aCol[aiColumn
1bb70 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  [j]].zName;.    
1bb80 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72  explainAppendTer
1bb90 6d 28 26 74 78 74 2c 20 69 2b 2b 2c 20 7a 2c 20  m(&txt, i++, z, 
1bba0 22 3e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ">");.  }.  if( 
1bbb0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 26 57  pLoop->wsFlags&W
1bbc0 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29  HERE_TOP_LIMIT )
1bbd0 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20  {.    char *z = 
1bbe0 28 6a 3d 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c  (j==pIndex->nCol
1bbf0 75 6d 6e 20 29 20 3f 20 22 72 6f 77 69 64 22 20  umn ) ? "rowid" 
1bc00 3a 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b  : aCol[aiColumn[
1bc10 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 65  j]].zName;.    e
1bc20 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d  xplainAppendTerm
1bc30 28 26 74 78 74 2c 20 69 2c 20 7a 2c 20 22 3c 22  (&txt, i, z, "<"
1bc40 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1bc50 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26  StrAccumAppend(&
1bc60 74 78 74 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20  txt, ")", 1);.  
1bc70 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53 74  return sqlite3St
1bc80 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26 74 78  rAccumFinish(&tx
1bc90 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  t);.}../*.** Thi
1bca0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
1bcb0 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 63 75 72  no-op unless cur
1bcc0 72 65 6e 74 6c 79 20 70 72 6f 63 65 73 73 69 6e  rently processin
1bcd0 67 20 61 6e 20 45 58 50 4c 41 49 4e 20 51 55 45  g an EXPLAIN QUE
1bce0 52 59 20 50 4c 41 4e 0a 2a 2a 20 63 6f 6d 6d 61  RY PLAN.** comma
1bcf0 6e 64 2e 20 49 66 20 74 68 65 20 71 75 65 72 79  nd. If the query
1bd00 20 62 65 69 6e 67 20 63 6f 6d 70 69 6c 65 64 20   being compiled 
1bd10 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 20 51 55  is an EXPLAIN QU
1bd20 45 52 59 20 50 4c 41 4e 2c 20 61 20 73 69 6e 67  ERY PLAN, a sing
1bd30 6c 65 0a 2a 2a 20 72 65 63 6f 72 64 20 69 73 20  le.** record is 
1bd40 61 64 64 65 64 20 74 6f 20 74 68 65 20 6f 75 74  added to the out
1bd50 70 75 74 20 74 6f 20 64 65 73 63 72 69 62 65 20  put to describe 
1bd60 74 68 65 20 74 61 62 6c 65 20 73 63 61 6e 20 73  the table scan s
1bd70 74 72 61 74 65 67 79 20 69 6e 20 0a 2a 2a 20 70  trategy in .** p
1bd80 4c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  Level..*/.static
1bd90 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 4f 6e 65   void explainOne
1bda0 53 63 61 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  Scan(.  Parse *p
1bdb0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
1bdc0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
1bdd0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
1bde0 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
1bdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1be00 20 54 61 62 6c 65 20 6c 69 73 74 20 74 68 69 73   Table list this
1be10 20 6c 6f 6f 70 20 72 65 66 65 72 73 20 74 6f 20   loop refers to 
1be20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
1be30 2a 70 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20  *pLevel,        
1be40 20 20 20 20 20 2f 2a 20 53 63 61 6e 20 74 6f 20       /* Scan to 
1be50 77 72 69 74 65 20 4f 50 5f 45 78 70 6c 61 69 6e  write OP_Explain
1be60 20 6f 70 63 6f 64 65 20 66 6f 72 20 2a 2f 0a 20   opcode for */. 
1be70 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20   int iLevel,    
1be80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be90 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 6c   /* Value for "l
1bea0 65 76 65 6c 22 20 63 6f 6c 75 6d 6e 20 6f 66 20  evel" column of 
1beb0 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20  output */.  int 
1bec0 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20  iFrom,          
1bed0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
1bee0 61 6c 75 65 20 66 6f 72 20 22 66 72 6f 6d 22 20  alue for "from" 
1bef0 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74 70 75 74  column of output
1bf00 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46   */.  u16 wctrlF
1bf10 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
1bf20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70        /* Flags p
1bf30 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33  assed to sqlite3
1bf40 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a  WhereBegin() */.
1bf50 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ){.  if( pParse-
1bf60 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20  >explain==2 ){. 
1bf70 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
1bf80 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
1bf90 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  &pTabList->a[pLe
1bfa0 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20  vel->iFrom];.   
1bfb0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
1bfc0 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f  e->pVdbe;      /
1bfd0 2a 20 56 4d 20 62 65 69 6e 67 20 63 6f 6e 73 74  * VM being const
1bfe0 72 75 63 74 65 64 20 2a 2f 0a 20 20 20 20 73 71  ructed */.    sq
1bff0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
1c000 73 65 2d 3e 64 62 3b 20 20 20 20 20 2f 2a 20 44  se->db;     /* D
1c010 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
1c020 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67  /.    char *zMsg
1c030 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c040 20 20 20 20 2f 2a 20 54 65 78 74 20 74 6f 20 61      /* Text to a
1c050 64 64 20 74 6f 20 45 51 50 20 6f 75 74 70 75 74  dd to EQP output
1c060 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 20   */.    int iId 
1c070 3d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  = pParse->iSelec
1c080 74 49 64 3b 20 20 2f 2a 20 53 65 6c 65 63 74 20  tId;  /* Select 
1c090 69 64 20 28 6c 65 66 74 2d 6d 6f 73 74 20 6f 75  id (left-most ou
1c0a0 74 70 75 74 20 63 6f 6c 75 6d 6e 29 20 2a 2f 0a  tput column) */.
1c0b0 20 20 20 20 69 6e 74 20 69 73 53 65 61 72 63 68      int isSearch
1c0c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c0d0 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20    /* True for a 
1c0e0 53 45 41 52 43 48 2e 20 46 61 6c 73 65 20 66 6f  SEARCH. False fo
1c0f0 72 20 53 43 41 4e 2e 20 2a 2f 0a 20 20 20 20 57  r SCAN. */.    W
1c100 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b  hereLoop *pLoop;
1c110 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c120 54 68 65 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20  The controlling 
1c130 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
1c140 20 2a 2f 0a 20 20 20 20 75 33 32 20 66 6c 61 67   */.    u32 flag
1c150 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
1c160 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74        /* Flags t
1c170 68 61 74 20 64 65 73 63 72 69 62 65 20 74 68 69  hat describe thi
1c180 73 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20 70  s loop */..    p
1c190 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  Loop = pLevel->p
1c1a0 57 4c 6f 6f 70 3b 0a 20 20 20 20 66 6c 61 67 73  WLoop;.    flags
1c1b0 20 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67   = pLoop->wsFlag
1c1c0 73 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67  s;.    if( (flag
1c1d0 73 26 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52  s&WHERE_MULTI_OR
1c1e0 29 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73  ) || (wctrlFlags
1c1f0 26 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f  &WHERE_ONETABLE_
1c200 4f 4e 4c 59 29 20 29 20 72 65 74 75 72 6e 3b 0a  ONLY) ) return;.
1c210 0a 20 20 20 20 69 73 53 65 61 72 63 68 20 3d 20  .    isSearch = 
1c220 28 66 6c 61 67 73 26 28 57 48 45 52 45 5f 42 54  (flags&(WHERE_BT
1c230 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f  M_LIMIT|WHERE_TO
1c240 50 5f 4c 49 4d 49 54 29 29 21 3d 30 0a 20 20 20  P_LIMIT))!=0.   
1c250 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 66 6c           || ((fl
1c260 61 67 73 26 57 48 45 52 45 5f 56 49 52 54 55 41  ags&WHERE_VIRTUA
1c270 4c 54 41 42 4c 45 29 3d 3d 30 20 26 26 20 28 70  LTABLE)==0 && (p
1c280 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
1c290 71 3e 30 29 29 0a 20 20 20 20 20 20 20 20 20 20  q>0)).          
1c2a0 20 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73    || (wctrlFlags
1c2b0 26 28 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  &(WHERE_ORDERBY_
1c2c0 4d 49 4e 7c 57 48 45 52 45 5f 4f 52 44 45 52 42  MIN|WHERE_ORDERB
1c2d0 59 5f 4d 41 58 29 29 3b 0a 0a 20 20 20 20 7a 4d  Y_MAX));..    zM
1c2e0 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  sg = sqlite3MPri
1c2f0 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20 69 73  ntf(db, "%s", is
1c300 53 65 61 72 63 68 3f 22 53 45 41 52 43 48 22 3a  Search?"SEARCH":
1c310 22 53 43 41 4e 22 29 3b 0a 20 20 20 20 69 66 28  "SCAN");.    if(
1c320 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20   pItem->pSelect 
1c330 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  ){.      zMsg = 
1c340 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
1c350 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 53 55  db, zMsg, "%s SU
1c360 42 51 55 45 52 59 20 25 64 22 2c 20 7a 4d 73 67  BQUERY %d", zMsg
1c370 2c 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49  ,pItem->iSelectI
1c380 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  d);.    }else{. 
1c390 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
1c3a0 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
1c3b0 7a 4d 73 67 2c 20 22 25 73 20 54 41 42 4c 45 20  zMsg, "%s TABLE 
1c3c0 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49 74 65 6d  %s", zMsg, pItem
1c3d0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ->zName);.    }.
1c3e0 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  .    if( pItem->
1c3f0 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20  zAlias ){.      
1c400 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
1c410 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
1c420 20 22 25 73 20 41 53 20 25 73 22 2c 20 7a 4d 73   "%s AS %s", zMs
1c430 67 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  g, pItem->zAlias
1c440 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1c450 20 28 66 6c 61 67 73 20 26 20 28 57 48 45 52 45   (flags & (WHERE
1c460 5f 49 50 4b 7c 57 48 45 52 45 5f 56 49 52 54 55  _IPK|WHERE_VIRTU
1c470 41 4c 54 41 42 4c 45 29 29 3d 3d 30 0a 20 20 20  ALTABLE))==0.   
1c480 20 20 26 26 20 41 4c 57 41 59 53 28 70 4c 6f 6f    && ALWAYS(pLoo
1c490 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
1c4a0 78 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20  x!=0).    ){.   
1c4b0 20 20 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20     char *zWhere 
1c4c0 3d 20 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61  = explainIndexRa
1c4d0 6e 67 65 28 64 62 2c 20 70 4c 6f 6f 70 2c 20 70  nge(db, pLoop, p
1c4e0 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20  Item->pTab);.   
1c4f0 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
1c500 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
1c510 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  sg,.            
1c520 20 20 20 28 28 66 6c 61 67 73 20 26 20 57 48 45     ((flags & WHE
1c530 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 20 3f  RE_AUTO_INDEX) ?
1c540 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1c550 20 20 20 20 20 22 25 73 20 55 53 49 4e 47 20 41       "%s USING A
1c560 55 54 4f 4d 41 54 49 43 20 25 73 49 4e 44 45 58  UTOMATIC %sINDEX
1c570 25 2e 30 73 25 73 22 20 3a 0a 20 20 20 20 20 20  %.0s%s" :.      
1c580 20 20 20 20 20 20 20 20 20 20 20 20 20 22 25 73               "%s
1c590 20 55 53 49 4e 47 20 25 73 49 4e 44 45 58 20 25   USING %sINDEX %
1c5a0 73 25 73 22 29 2c 20 0a 20 20 20 20 20 20 20 20  s%s"), .        
1c5b0 20 20 20 20 20 20 20 7a 4d 73 67 2c 20 28 28 66         zMsg, ((f
1c5c0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
1c5d0 5f 4f 4e 4c 59 29 20 3f 20 22 43 4f 56 45 52 49  _ONLY) ? "COVERI
1c5e0 4e 47 20 22 20 3a 20 22 22 29 2c 0a 20 20 20 20  NG " : ""),.    
1c5f0 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70             pLoop
1c600 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
1c610 2d 3e 7a 4e 61 6d 65 2c 20 7a 57 68 65 72 65 29  ->zName, zWhere)
1c620 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
1c630 62 46 72 65 65 28 64 62 2c 20 7a 57 68 65 72 65  bFree(db, zWhere
1c640 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
1c650 20 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f   (flags & WHERE_
1c660 49 50 4b 29 21 3d 30 20 26 26 20 28 66 6c 61 67  IPK)!=0 && (flag
1c670 73 20 26 20 57 48 45 52 45 5f 43 4f 4e 53 54 52  s & WHERE_CONSTR
1c680 41 49 4e 54 29 21 3d 30 20 29 7b 0a 20 20 20 20  AINT)!=0 ){.    
1c690 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
1c6a0 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
1c6b0 67 2c 20 22 25 73 20 55 53 49 4e 47 20 49 4e 54  g, "%s USING INT
1c6c0 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
1c6d0 22 2c 20 7a 4d 73 67 29 3b 0a 0a 20 20 20 20 20  ", zMsg);..     
1c6e0 20 69 66 28 20 66 6c 61 67 73 26 28 57 48 45 52   if( flags&(WHER
1c6f0 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52  E_COLUMN_EQ|WHER
1c700 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 20 29 7b 0a  E_COLUMN_IN) ){.
1c710 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73          zMsg = s
1c720 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
1c730 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f  b, zMsg, "%s (ro
1c740 77 69 64 3d 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a  wid=?)", zMsg);.
1c750 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1c760 28 66 6c 61 67 73 26 57 48 45 52 45 5f 42 4f 54  (flags&WHERE_BOT
1c770 48 5f 4c 49 4d 49 54 29 3d 3d 57 48 45 52 45 5f  H_LIMIT)==WHERE_
1c780 42 4f 54 48 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  BOTH_LIMIT ){.  
1c790 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
1c7a0 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c  ite3MAppendf(db,
1c7b0 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69   zMsg, "%s (rowi
1c7c0 64 3e 3f 20 41 4e 44 20 72 6f 77 69 64 3c 3f 29  d>? AND rowid<?)
1c7d0 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20  ", zMsg);.      
1c7e0 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 26  }else if( flags&
1c7f0 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20  WHERE_BTM_LIMIT 
1c800 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20  ){.        zMsg 
1c810 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
1c820 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
1c830 28 72 6f 77 69 64 3e 3f 29 22 2c 20 7a 4d 73 67  (rowid>?)", zMsg
1c840 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
1c850 66 28 20 41 4c 57 41 59 53 28 66 6c 61 67 73 26  f( ALWAYS(flags&
1c860 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29  WHERE_TOP_LIMIT)
1c870 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67   ){.        zMsg
1c880 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
1c890 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
1c8a0 20 28 72 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d 73   (rowid<?)", zMs
1c8b0 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
1c8c0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
1c8d0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
1c8e0 4c 45 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20  LE.    else if( 
1c8f0 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  (flags & WHERE_V
1c900 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20  IRTUALTABLE)!=0 
1c910 29 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  ){.      zMsg = 
1c920 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
1c930 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 56 49  db, zMsg, "%s VI
1c940 52 54 55 41 4c 20 54 41 42 4c 45 20 49 4e 44 45  RTUAL TABLE INDE
1c950 58 20 25 64 3a 25 73 22 2c 20 7a 4d 73 67 2c 0a  X %d:%s", zMsg,.
1c960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c970 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e    pLoop->u.vtab.
1c980 69 64 78 4e 75 6d 2c 20 70 4c 6f 6f 70 2d 3e 75  idxNum, pLoop->u
1c990 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a 20  .vtab.idxStr);. 
1c9a0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1c9b0 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
1c9c0 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
1c9d0 20 22 25 73 22 2c 20 7a 4d 73 67 29 3b 0a 20 20   "%s", zMsg);.  
1c9e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1c9f0 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69  Op4(v, OP_Explai
1ca00 6e 2c 20 69 49 64 2c 20 69 4c 65 76 65 6c 2c 20  n, iId, iLevel, 
1ca10 69 46 72 6f 6d 2c 20 7a 4d 73 67 2c 20 50 34 5f  iFrom, zMsg, P4_
1ca20 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a  DYNAMIC);.  }.}.
1ca30 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 65  #else.# define e
1ca40 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 75 2c  xplainOneScan(u,
1ca50 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69  v,w,x,y,z).#endi
1ca60 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1ca70 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 0a 2f 2a  _EXPLAIN */.../*
1ca80 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1ca90 65 20 66 6f 72 20 74 68 65 20 73 74 61 72 74 20  e for the start 
1caa0 6f 66 20 74 68 65 20 69 4c 65 76 65 6c 2d 74 68  of the iLevel-th
1cab0 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20 57 48 45   loop in the WHE
1cac0 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20 69 6d 70  RE clause.** imp
1cad0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 65 73 63  lementation desc
1cae0 72 69 62 65 64 20 62 79 20 70 57 49 6e 66 6f 2e  ribed by pWInfo.
1caf0 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61  .*/.static Bitma
1cb00 73 6b 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74  sk codeOneLoopSt
1cb10 61 72 74 28 0a 20 20 57 68 65 72 65 49 6e 66 6f  art(.  WhereInfo
1cb20 20 2a 70 57 49 6e 66 6f 2c 20 20 20 2f 2a 20 43   *pWInfo,   /* C
1cb30 6f 6d 70 6c 65 74 65 20 69 6e 66 6f 72 6d 61 74  omplete informat
1cb40 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 57 48  ion about the WH
1cb50 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
1cb60 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20  int iLevel,     
1cb70 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 6c 65       /* Which le
1cb80 76 65 6c 20 6f 66 20 70 57 49 6e 66 6f 2d 3e 61  vel of pWInfo->a
1cb90 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 64  [] should be cod
1cba0 65 64 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ed */.  Bitmask 
1cbb0 6e 6f 74 52 65 61 64 79 20 20 20 20 20 2f 2a 20  notReady     /* 
1cbc0 57 68 69 63 68 20 74 61 62 6c 65 73 20 61 72 65  Which tables are
1cbd0 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c   currently avail
1cbe0 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  able */.){.  int
1cbf0 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20   j, k;          
1cc00 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
1cc10 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  rs */.  int iCur
1cc20 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1cc30 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
1cc40 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f  for the table */
1cc50 0a 20 20 69 6e 74 20 61 64 64 72 4e 78 74 3b 20  .  int addrNxt; 
1cc60 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65          /* Where
1cc70 20 74 6f 20 6a 75 6d 70 20 74 6f 20 63 6f 6e 74   to jump to cont
1cc80 69 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e 65  inue with the ne
1cc90 78 74 20 49 4e 20 63 61 73 65 20 2a 2f 0a 20 20  xt IN case */.  
1cca0 69 6e 74 20 6f 6d 69 74 54 61 62 6c 65 3b 20 20  int omitTable;  
1ccb0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1ccc0 77 65 20 75 73 65 20 74 68 65 20 69 6e 64 65 78  we use the index
1ccd0 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 62   only */.  int b
1cce0 52 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rev;            
1ccf0 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 6e 65  /* True if we ne
1cd00 65 64 20 74 6f 20 73 63 61 6e 20 69 6e 20 72 65  ed to scan in re
1cd10 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20  verse order */. 
1cd20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
1cd30 76 65 6c 3b 20 20 2f 2a 20 54 68 65 20 77 68 65  vel;  /* The whe
1cd40 72 65 20 6c 65 76 65 6c 20 74 6f 20 62 65 20 63  re level to be c
1cd50 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c  oded */.  WhereL
1cd60 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 2f  oop *pLoop;    /
1cd70 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  * The WhereLoop 
1cd80 6f 62 6a 65 63 74 20 62 65 69 6e 67 20 63 6f 64  object being cod
1cd90 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  ed */.  WhereCla
1cda0 75 73 65 20 2a 70 57 43 3b 20 20 20 20 2f 2a 20  use *pWC;    /* 
1cdb0 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 6f 66  Decomposition of
1cdc0 20 74 68 65 20 65 6e 74 69 72 65 20 57 48 45 52   the entire WHER
1cdd0 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  E clause */.  Wh
1cde0 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
1cdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ce00 20 41 20 57 48 45 52 45 20 63 6c 61 75 73 65 20   A WHERE clause 
1ce10 74 65 72 6d 20 2a 2f 0a 20 20 50 61 72 73 65 20  term */.  Parse 
1ce20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20  *pParse;        
1ce30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
1ce40 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
1ce50 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
1ce60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce70 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
1ce80 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64  nnection */.  Vd
1ce90 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
1cea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ceb0 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74   The prepared st
1cec0 6d 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  mt under constru
1ced0 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 73 74 72 75  ctions */.  stru
1cee0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1cef0 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20 46  *pTabItem;  /* F
1cf00 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
1cf10 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
1cf20 20 69 6e 74 20 61 64 64 72 42 72 6b 3b 20 20 20   int addrBrk;   
1cf30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf40 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
1cf50 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68   break out of th
1cf60 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  e loop */.  int 
1cf70 61 64 64 72 43 6f 6e 74 3b 20 20 20 20 20 20 20  addrCont;       
1cf80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
1cf90 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74  ump here to cont
1cfa0 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20 63  inue with next c
1cfb0 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  ycle */.  int iR
1cfc0 6f 77 69 64 52 65 67 20 3d 20 30 3b 20 20 20 20  owidReg = 0;    
1cfd0 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 69 73 20      /* Rowid is 
1cfe0 73 74 6f 72 65 64 20 69 6e 20 74 68 69 73 20 72  stored in this r
1cff0 65 67 69 73 74 65 72 2c 20 69 66 20 6e 6f 74 20  egister, if not 
1d000 7a 65 72 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 52  zero */.  int iR
1d010 65 6c 65 61 73 65 52 65 67 20 3d 20 30 3b 20 20  eleaseReg = 0;  
1d020 20 20 20 20 2f 2a 20 54 65 6d 70 20 72 65 67 69      /* Temp regi
1d030 73 74 65 72 20 74 6f 20 66 72 65 65 20 62 65 66  ster to free bef
1d040 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 2a 2f  ore returning */
1d050 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 49  ..  pParse = pWI
1d060 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 76  nfo->pParse;.  v
1d070 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
1d080 3b 0a 20 20 70 57 43 20 3d 20 26 70 57 49 6e 66  ;.  pWC = &pWInf
1d090 6f 2d 3e 73 57 43 3b 0a 20 20 64 62 20 3d 20 70  o->sWC;.  db = p
1d0a0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4c 65  Parse->db;.  pLe
1d0b0 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61  vel = &pWInfo->a
1d0c0 5b 69 4c 65 76 65 6c 5d 3b 0a 20 20 70 4c 6f 6f  [iLevel];.  pLoo
1d0d0 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f  p = pLevel->pWLo
1d0e0 6f 70 3b 0a 20 20 70 54 61 62 49 74 65 6d 20 3d  op;.  pTabItem =
1d0f0 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69   &pWInfo->pTabLi
1d100 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
1d110 72 6f 6d 5d 3b 0a 20 20 69 43 75 72 20 3d 20 70  rom];.  iCur = p
1d120 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
1d130 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52  ;.  pLevel->notR
1d140 65 61 64 79 20 3d 20 6e 6f 74 52 65 61 64 79 20  eady = notReady 
1d150 26 20 7e 67 65 74 4d 61 73 6b 28 26 70 57 49 6e  & ~getMask(&pWIn
1d160 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43  fo->sMaskSet, iC
1d170 75 72 29 3b 0a 20 20 62 52 65 76 20 3d 20 28 70  ur);.  bRev = (p
1d180 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 3e 3e  WInfo->revMask>>
1d190 69 4c 65 76 65 6c 29 26 31 3b 0a 20 20 6f 6d 69  iLevel)&1;.  omi
1d1a0 74 54 61 62 6c 65 20 3d 20 28 70 4c 6f 6f 70 2d  tTable = (pLoop-
1d1b0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
1d1c0 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d 30 20 0a 20  _IDX_ONLY)!=0 . 
1d1d0 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57            && (pW
1d1e0 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
1d1f0 20 26 20 57 48 45 52 45 5f 46 4f 52 43 45 5f 54   & WHERE_FORCE_T
1d200 41 42 4c 45 29 3d 3d 30 3b 0a 20 20 56 64 62 65  ABLE)==0;.  Vdbe
1d210 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
1d220 22 42 65 67 69 6e 20 4a 6f 69 6e 20 4c 6f 6f 70  "Begin Join Loop
1d230 20 25 64 22 2c 20 69 4c 65 76 65 6c 29 29 3b 0a   %d", iLevel));.
1d240 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 6c 61 62  .  /* Create lab
1d250 65 6c 73 20 66 6f 72 20 74 68 65 20 22 62 72 65  els for the "bre
1d260 61 6b 22 20 61 6e 64 20 22 63 6f 6e 74 69 6e 75  ak" and "continu
1d270 65 22 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 0a  e" instructions.
1d280 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 63 75 72    ** for the cur
1d290 72 65 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70  rent loop.  Jump
1d2a0 20 74 6f 20 61 64 64 72 42 72 6b 20 74 6f 20 62   to addrBrk to b
1d2b0 72 65 61 6b 20 6f 75 74 20 6f 66 20 61 20 6c 6f  reak out of a lo
1d2c0 6f 70 2e 0a 20 20 2a 2a 20 4a 75 6d 70 20 74 6f  op..  ** Jump to
1d2d0 20 63 6f 6e 74 20 74 6f 20 67 6f 20 69 6d 6d 65   cont to go imme
1d2e0 64 69 61 74 65 6c 79 20 74 6f 20 74 68 65 20 6e  diately to the n
1d2f0 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  ext iteration of
1d300 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 6f 70 2e 0a   the.  ** loop..
1d310 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74    **.  ** When t
1d320 68 65 72 65 20 69 73 20 61 6e 20 49 4e 20 6f 70  here is an IN op
1d330 65 72 61 74 6f 72 2c 20 77 65 20 61 6c 73 6f 20  erator, we also 
1d340 68 61 76 65 20 61 20 22 61 64 64 72 4e 78 74 22  have a "addrNxt"
1d350 20 6c 61 62 65 6c 20 74 68 61 74 0a 20 20 2a 2a   label that.  **
1d360 20 6d 65 61 6e 73 20 74 6f 20 63 6f 6e 74 69 6e   means to contin
1d370 75 65 20 77 69 74 68 20 74 68 65 20 6e 65 78 74  ue with the next
1d380 20 49 4e 20 76 61 6c 75 65 20 63 6f 6d 62 69 6e   IN value combin
1d390 61 74 69 6f 6e 2e 20 20 57 68 65 6e 0a 20 20 2a  ation.  When.  *
1d3a0 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 49  * there are no I
1d3b0 4e 20 6f 70 65 72 61 74 6f 72 73 20 69 6e 20 74  N operators in t
1d3c0 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20  he constraints, 
1d3d0 74 68 65 20 22 61 64 64 72 4e 78 74 22 20 6c 61  the "addrNxt" la
1d3e0 62 65 6c 0a 20 20 2a 2a 20 69 73 20 74 68 65 20  bel.  ** is the 
1d3f0 73 61 6d 65 20 61 73 20 22 61 64 64 72 42 72 6b  same as "addrBrk
1d400 22 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72 42 72  "..  */.  addrBr
1d410 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  k = pLevel->addr
1d420 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64  Brk = pLevel->ad
1d430 64 72 4e 78 74 20 3d 20 73 71 6c 69 74 65 33 56  drNxt = sqlite3V
1d440 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
1d450 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d 20 70 4c  .  addrCont = pL
1d460 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 20 3d  evel->addrCont =
1d470 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
1d480 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20  Label(v);..  /* 
1d490 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 72  If this is the r
1d4a0 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20  ight table of a 
1d4b0 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c  LEFT OUTER JOIN,
1d4c0 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 0a 20 20   allocate and.  
1d4d0 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** initialize a 
1d4e0 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61 74  memory cell that
1d4f0 20 72 65 63 6f 72 64 73 20 69 66 20 74 68 69 73   records if this
1d500 20 74 61 62 6c 65 20 6d 61 74 63 68 65 73 20 61   table matches a
1d510 6e 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74  ny.  ** row of t
1d520 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66  he left table of
1d530 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a   the join..  */.
1d540 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 46    if( pLevel->iF
1d550 72 6f 6d 3e 30 20 26 26 20 28 70 54 61 62 49 74  rom>0 && (pTabIt
1d560 65 6d 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 26  em[0].jointype &
1d570 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a   JT_LEFT)!=0 ){.
1d580 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66      pLevel->iLef
1d590 74 4a 6f 69 6e 20 3d 20 2b 2b 70 50 61 72 73 65  tJoin = ++pParse
1d5a0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
1d5b0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1d5c0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
1d5d0 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
1d5e0 6e 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  n);.    VdbeComm
1d5f0 65 6e 74 28 28 76 2c 20 22 69 6e 69 74 20 4c 45  ent((v, "init LE
1d600 46 54 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74 63 68  FT JOIN no-match
1d610 20 66 6c 61 67 22 29 29 3b 0a 20 20 7d 0a 0a 20   flag"));.  }.. 
1d620 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65   /* Special case
1d630 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75 73   of a FROM claus
1d640 65 20 73 75 62 71 75 65 72 79 20 69 6d 70 6c 65  e subquery imple
1d650 6d 65 6e 74 65 64 20 61 73 20 61 20 63 6f 2d 72  mented as a co-r
1d660 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 66 28 20  outine */.  if( 
1d670 70 54 61 62 49 74 65 6d 2d 3e 76 69 61 43 6f 72  pTabItem->viaCor
1d680 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 69 6e  outine ){.    in
1d690 74 20 72 65 67 59 69 65 6c 64 20 3d 20 70 54 61  t regYield = pTa
1d6a0 62 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  bItem->regReturn
1d6b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1d6c0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
1d6d0 74 65 67 65 72 2c 20 70 54 61 62 49 74 65 6d 2d  teger, pTabItem-
1d6e0 3e 61 64 64 72 46 69 6c 6c 53 75 62 2d 31 2c 20  >addrFillSub-1, 
1d6f0 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20 20 70  regYield);.    p
1d700 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 20 73 71 6c  Level->p2 =  sql
1d710 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
1d720 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 59  , OP_Yield, regY
1d730 69 65 6c 64 29 3b 0a 20 20 20 20 56 64 62 65 43  ield);.    VdbeC
1d740 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65 78 74  omment((v, "next
1d750 20 72 6f 77 20 6f 66 20 63 6f 2d 72 6f 75 74 69   row of co-routi
1d760 6e 65 20 25 73 22 2c 20 70 54 61 62 49 74 65 6d  ne %s", pTabItem
1d770 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ->pTab->zName));
1d780 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1d790 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c  AddOp2(v, OP_If,
1d7a0 20 72 65 67 59 69 65 6c 64 2b 31 2c 20 61 64 64   regYield+1, add
1d7b0 72 42 72 6b 29 3b 0a 20 20 20 20 70 4c 65 76 65  rBrk);.    pLeve
1d7c0 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 47 6f 74 6f 3b  l->op = OP_Goto;
1d7d0 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65  .  }else..#ifnde
1d7e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
1d7f0 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28  RTUALTABLE.  if(
1d800 20 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67    (pLoop->wsFlag
1d810 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
1d820 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20  LTABLE)!=0 ){.  
1d830 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 54 68    /* Case 1:  Th
1d840 65 20 74 61 62 6c 65 20 69 73 20 61 20 76 69 72  e table is a vir
1d850 74 75 61 6c 2d 74 61 62 6c 65 2e 20 20 55 73 65  tual-table.  Use
1d860 20 74 68 65 20 56 46 69 6c 74 65 72 20 61 6e 64   the VFilter and
1d870 20 56 4e 65 78 74 0a 20 20 20 20 2a 2a 20 20 20   VNext.    **   
1d880 20 20 20 20 20 20 20 74 6f 20 61 63 63 65 73 73         to access
1d890 20 74 68 65 20 64 61 74 61 2e 0a 20 20 20 20 2a   the data..    *
1d8a0 2f 0a 20 20 20 20 69 6e 74 20 69 52 65 67 3b 20  /.    int iReg; 
1d8b0 20 20 2f 2a 20 50 33 20 56 61 6c 75 65 20 66 6f    /* P3 Value fo
1d8c0 72 20 4f 50 5f 56 46 69 6c 74 65 72 20 2a 2f 0a  r OP_VFilter */.
1d8d0 20 20 20 20 69 6e 74 20 61 64 64 72 4e 6f 74 46      int addrNotF
1d8e0 6f 75 6e 64 3b 0a 20 20 20 20 69 6e 74 20 6e 43  ound;.    int nC
1d8f0 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 4c 6f 6f  onstraint = pLoo
1d900 70 2d 3e 6e 4c 54 65 72 6d 3b 0a 0a 20 20 20 20  p->nLTerm;..    
1d910 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1d920 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
1d930 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33    iReg = sqlite3
1d940 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
1d950 72 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  rse, nConstraint
1d960 2b 32 29 3b 0a 20 20 20 20 61 64 64 72 4e 6f 74  +2);.    addrNot
1d970 46 6f 75 6e 64 20 3d 20 70 4c 65 76 65 6c 2d 3e  Found = pLevel->
1d980 61 64 64 72 42 72 6b 3b 0a 20 20 20 20 66 6f 72  addrBrk;.    for
1d990 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e 73 74 72 61  (j=0; j<nConstra
1d9a0 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  int; j++){.     
1d9b0 20 69 6e 74 20 69 54 61 72 67 65 74 20 3d 20 69   int iTarget = i
1d9c0 52 65 67 2b 6a 2b 32 3b 0a 20 20 20 20 20 20 70  Reg+j+2;.      p
1d9d0 54 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c  Term = pLoop->aL
1d9e0 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 20 20 69  Term[j];.      i
1d9f0 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 63 6f  f( pTerm==0 ) co
1da00 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
1da10 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
1da20 6f 72 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20  or & WO_IN ){.  
1da30 20 20 20 20 20 20 63 6f 64 65 45 71 75 61 6c 69        codeEquali
1da40 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70  tyTerm(pParse, p
1da50 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 6a 2c  Term, pLevel, j,
1da60 20 62 52 65 76 2c 20 69 54 61 72 67 65 74 29 3b   bRev, iTarget);
1da70 0a 20 20 20 20 20 20 20 20 61 64 64 72 4e 6f 74  .        addrNot
1da80 46 6f 75 6e 64 20 3d 20 70 4c 65 76 65 6c 2d 3e  Found = pLevel->
1da90 61 64 64 72 4e 78 74 3b 0a 20 20 20 20 20 20 7d  addrNxt;.      }
1daa0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
1dab0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
1dac0 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78  arse, pTerm->pEx
1dad0 70 72 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 72  pr->pRight, iTar
1dae0 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  get);.      }.  
1daf0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
1db00 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1db10 49 6e 74 65 67 65 72 2c 20 70 4c 6f 6f 70 2d 3e  Integer, pLoop->
1db20 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 69  u.vtab.idxNum, i
1db30 52 65 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Reg);.    sqlite
1db40 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1db50 50 5f 49 6e 74 65 67 65 72 2c 20 6e 43 6f 6e 73  P_Integer, nCons
1db60 74 72 61 69 6e 74 2c 20 69 52 65 67 2b 31 29 3b  traint, iReg+1);
1db70 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1db80 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 46 69  AddOp4(v, OP_VFi
1db90 6c 74 65 72 2c 20 69 43 75 72 2c 20 61 64 64 72  lter, iCur, addr
1dba0 4e 6f 74 46 6f 75 6e 64 2c 20 69 52 65 67 2c 0a  NotFound, iReg,.
1dbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbc0 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76        pLoop->u.v
1dbd0 74 61 62 2e 69 64 78 53 74 72 2c 0a 20 20 20 20  tab.idxStr,.    
1dbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbf0 20 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61 62 2e    pLoop->u.vtab.
1dc00 6e 65 65 64 46 72 65 65 20 3f 20 50 34 5f 4d 50  needFree ? P4_MP
1dc10 52 49 4e 54 46 20 3a 20 50 34 5f 53 54 41 54 49  RINTF : P4_STATI
1dc20 43 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75  C);.    pLoop->u
1dc30 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d  .vtab.needFree =
1dc40 20 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b   0;.    for(j=0;
1dc50 20 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 20 26   j<nConstraint &
1dc60 26 20 6a 3c 31 36 3b 20 6a 2b 2b 29 7b 0a 20 20  & j<16; j++){.  
1dc70 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e      if( (pLoop->
1dc80 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 3e  u.vtab.omitMask>
1dc90 3e 6a 29 26 31 20 29 7b 0a 20 20 20 20 20 20 20  >j)&1 ){.       
1dca0 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
1dcb0 76 65 6c 2c 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  vel, pLoop->aLTe
1dcc0 72 6d 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  rm[j]);.      }.
1dcd0 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c      }.    pLevel
1dce0 2d 3e 6f 70 20 3d 20 4f 50 5f 56 4e 65 78 74 3b  ->op = OP_VNext;
1dcf0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20  .    pLevel->p1 
1dd00 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76  = iCur;.    pLev
1dd10 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33  el->p2 = sqlite3
1dd20 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
1dd30 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  v);.    sqlite3R
1dd40 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
1dd50 70 50 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 43  pParse, iReg, nC
1dd60 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20  onstraint+2);.  
1dd70 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1dd80 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20 31 29  hePop(pParse, 1)
1dd90 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
1dda0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
1ddb0 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
1ddc0 0a 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77  .  if( (pLoop->w
1ddd0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
1dde0 50 4b 29 21 3d 30 0a 20 20 20 26 26 20 28 70 4c  PK)!=0.   && (pL
1ddf0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28  oop->wsFlags & (
1de00 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c  WHERE_COLUMN_IN|
1de10 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29  WHERE_COLUMN_EQ)
1de20 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a  )!=0.  ){.    /*
1de30 20 43 61 73 65 20 32 3a 20 20 57 65 20 63 61 6e   Case 2:  We can
1de40 20 64 69 72 65 63 74 6c 79 20 72 65 66 65 72 65   directly refere
1de50 6e 63 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  nce a single row
1de60 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a   using an.    **
1de70 20 20 20 20 20 20 20 20 20 20 65 71 75 61 6c 69            equali
1de80 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67  ty comparison ag
1de90 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20  ainst the ROWID 
1dea0 66 69 65 6c 64 2e 20 20 4f 72 0a 20 20 20 20 2a  field.  Or.    *
1deb0 2a 20 20 20 20 20 20 20 20 20 20 77 65 20 72 65  *          we re
1dec0 66 65 72 65 6e 63 65 20 6d 75 6c 74 69 70 6c 65  ference multiple
1ded0 20 72 6f 77 73 20 75 73 69 6e 67 20 61 20 22 72   rows using a "r
1dee0 6f 77 69 64 20 49 4e 20 28 2e 2e 2e 29 22 0a 20  owid IN (...)". 
1def0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 63     **          c
1df00 6f 6e 73 74 72 75 63 74 2e 0a 20 20 20 20 2a 2f  onstruct..    */
1df10 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f  .    assert( pLo
1df20 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3d  op->u.btree.nEq=
1df30 3d 31 20 29 3b 0a 20 20 20 20 69 52 65 6c 65 61  =1 );.    iRelea
1df40 73 65 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47  seReg = sqlite3G
1df50 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
1df60 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70  );.    pTerm = p
1df70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 3b  Loop->aLTerm[0];
1df80 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
1df90 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  rm!=0 );.    ass
1dfa0 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70  ert( pTerm->pExp
1dfb0 72 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  r!=0 );.    asse
1dfc0 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30  rt( omitTable==0
1dfd0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
1dfe0 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
1dff0 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
1e000 29 3b 0a 20 20 20 20 69 52 6f 77 69 64 52 65 67  );.    iRowidReg
1e010 20 3d 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54   = codeEqualityT
1e020 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72  erm(pParse, pTer
1e030 6d 2c 20 70 4c 65 76 65 6c 2c 20 30 2c 20 62 52  m, pLevel, 0, bR
1e040 65 76 2c 20 69 52 65 6c 65 61 73 65 52 65 67 29  ev, iReleaseReg)
1e050 3b 0a 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20  ;.    addrNxt = 
1e060 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b  pLevel->addrNxt;
1e070 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1e080 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73  AddOp2(v, OP_Mus
1e090 74 42 65 49 6e 74 2c 20 69 52 6f 77 69 64 52 65  tBeInt, iRowidRe
1e0a0 67 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20  g, addrNxt);.   
1e0b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1e0c0 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73  p3(v, OP_NotExis
1e0d0 74 73 2c 20 69 43 75 72 2c 20 61 64 64 72 4e 78  ts, iCur, addrNx
1e0e0 74 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20  t, iRowidReg);. 
1e0f0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1e100 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
1e110 65 28 70 50 61 72 73 65 2c 20 69 52 6f 77 69 64  e(pParse, iRowid
1e120 52 65 67 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c  Reg, 1);.    sql
1e130 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f  ite3ExprCacheSto
1e140 72 65 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c  re(pParse, iCur,
1e150 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b   -1, iRowidReg);
1e160 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
1e170 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20  ((v, "pk"));.   
1e180 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
1e190 5f 4e 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 20 69  _Noop;.  }else i
1e1a0 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
1e1b0 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b 29 21  gs & WHERE_IPK)!
1e1c0 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  =0.         && (
1e1d0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
1e1e0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41   WHERE_COLUMN_RA
1e1f0 4e 47 45 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20  NGE)!=0.  ){.   
1e200 20 2f 2a 20 43 61 73 65 20 33 3a 20 20 57 65 20   /* Case 3:  We 
1e210 68 61 76 65 20 61 6e 20 69 6e 65 71 75 61 6c 69  have an inequali
1e220 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67  ty comparison ag
1e230 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20  ainst the ROWID 
1e240 66 69 65 6c 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  field..    */.  
1e250 20 20 69 6e 74 20 74 65 73 74 4f 70 20 3d 20 4f    int testOp = O
1e260 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20  P_Noop;.    int 
1e270 73 74 61 72 74 3b 0a 20 20 20 20 69 6e 74 20 6d  start;.    int m
1e280 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20 30 3b 0a  emEndValue = 0;.
1e290 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
1e2a0 53 74 61 72 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20  Start, *pEnd;.. 
1e2b0 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54     assert( omitT
1e2c0 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 6a  able==0 );.    j
1e2d0 20 3d 20 30 3b 0a 20 20 20 20 70 53 74 61 72 74   = 0;.    pStart
1e2e0 20 3d 20 70 45 6e 64 20 3d 20 30 3b 0a 20 20 20   = pEnd = 0;.   
1e2f0 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
1e300 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
1e310 4c 49 4d 49 54 20 29 20 70 53 74 61 72 74 20 3d  LIMIT ) pStart =
1e320 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
1e330 2b 2b 5d 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f  ++];.    if( pLo
1e340 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
1e350 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 20  ERE_TOP_LIMIT ) 
1e360 70 45 6e 64 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c  pEnd = pLoop->aL
1e370 54 65 72 6d 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 61  Term[j++];.    a
1e380 73 73 65 72 74 28 20 70 53 74 61 72 74 21 3d 30  ssert( pStart!=0
1e390 20 7c 7c 20 70 45 6e 64 21 3d 30 20 29 3b 0a 20   || pEnd!=0 );. 
1e3a0 20 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20     if( bRev ){. 
1e3b0 20 20 20 20 20 70 54 65 72 6d 20 3d 20 70 53 74       pTerm = pSt
1e3c0 61 72 74 3b 0a 20 20 20 20 20 20 70 53 74 61 72  art;.      pStar
1e3d0 74 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20  t = pEnd;.      
1e3e0 70 45 6e 64 20 3d 20 70 54 65 72 6d 3b 0a 20 20  pEnd = pTerm;.  
1e3f0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 74 61    }.    if( pSta
1e400 72 74 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  rt ){.      Expr
1e410 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20   *pX;           
1e420 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
1e430 69 6f 6e 20 74 68 61 74 20 64 65 66 69 6e 65 73  ion that defines
1e440 20 74 68 65 20 73 74 61 72 74 20 62 6f 75 6e 64   the start bound
1e450 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 31   */.      int r1
1e460 2c 20 72 54 65 6d 70 3b 20 20 20 20 20 20 20 20  , rTemp;        
1e470 2f 2a 20 52 65 67 69 73 74 65 72 73 20 66 6f 72  /* Registers for
1e480 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 74 61   holding the sta
1e490 72 74 20 62 6f 75 6e 64 61 72 79 20 2a 2f 0a 0a  rt boundary */..
1e4a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c        /* The fol
1e4b0 6c 6f 77 69 6e 67 20 63 6f 6e 73 74 61 6e 74 20  lowing constant 
1e4c0 6d 61 70 73 20 54 4b 5f 78 78 20 63 6f 64 65 73  maps TK_xx codes
1e4d0 20 69 6e 74 6f 20 63 6f 72 72 65 73 70 6f 6e 64   into correspond
1e4e0 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 73 65  ing .      ** se
1e4f0 65 6b 20 6f 70 63 6f 64 65 73 2e 20 20 49 74 20  ek opcodes.  It 
1e500 64 65 70 65 6e 64 73 20 6f 6e 20 61 20 70 61 72  depends on a par
1e510 74 69 63 75 6c 61 72 20 6f 72 64 65 72 69 6e 67  ticular ordering
1e520 20 6f 66 20 54 4b 5f 78 78 0a 20 20 20 20 20 20   of TK_xx.      
1e530 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75  */.      const u
1e540 38 20 61 4d 6f 76 65 4f 70 5b 5d 20 3d 20 7b 0a  8 aMoveOp[] = {.
1e550 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b             /* TK
1e560 5f 47 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47  _GT */  OP_SeekG
1e570 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,.           /*
1e580 20 54 4b 5f 4c 45 20 2a 2f 20 20 4f 50 5f 53 65   TK_LE */  OP_Se
1e590 65 6b 4c 65 2c 0a 20 20 20 20 20 20 20 20 20 20  ekLe,.          
1e5a0 20 2f 2a 20 54 4b 5f 4c 54 20 2a 2f 20 20 4f 50   /* TK_LT */  OP
1e5b0 5f 53 65 65 6b 4c 74 2c 0a 20 20 20 20 20 20 20  _SeekLt,.       
1e5c0 20 20 20 20 2f 2a 20 54 4b 5f 47 45 20 2a 2f 20      /* TK_GE */ 
1e5d0 20 4f 50 5f 53 65 65 6b 47 65 0a 20 20 20 20 20   OP_SeekGe.     
1e5e0 20 7d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   };.      assert
1e5f0 28 20 54 4b 5f 4c 45 3d 3d 54 4b 5f 47 54 2b 31  ( TK_LE==TK_GT+1
1e600 20 29 3b 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65   );      /* Make
1e610 20 73 75 72 65 20 74 68 65 20 6f 72 64 65 72 69   sure the orderi
1e620 6e 67 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  ng.. */.      as
1e630 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f  sert( TK_LT==TK_
1e640 47 54 2b 32 20 29 3b 20 20 20 20 20 20 2f 2a 20  GT+2 );      /* 
1e650 20 2e 2e 2e 20 6f 66 20 74 68 65 20 54 4b 5f 78   ... of the TK_x
1e660 78 20 76 61 6c 75 65 73 2e 2e 2e 20 2a 2f 0a 20  x values... */. 
1e670 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
1e680 47 45 3d 3d 54 4b 5f 47 54 2b 33 20 29 3b 20 20  GE==TK_GT+3 );  
1e690 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 69 73 20 63      /*  ... is c
1e6a0 6f 72 72 65 63 63 74 2e 20 2a 2f 0a 0a 20 20 20  orrecct. */..   
1e6b0 20 20 20 61 73 73 65 72 74 28 20 28 70 53 74 61     assert( (pSta
1e6c0 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rt->wtFlags & TE
1e6d0 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a  RM_VNULL)==0 );.
1e6e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e6f0 70 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20  pStart->wtFlags 
1e700 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
1e710 3b 0a 20 20 20 20 20 20 70 58 20 3d 20 70 53 74  ;.      pX = pSt
1e720 61 72 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  art->pExpr;.    
1e730 20 20 61 73 73 65 72 74 28 20 70 58 21 3d 30 20    assert( pX!=0 
1e740 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1e750 65 28 20 70 53 74 61 72 74 2d 3e 6c 65 66 74 43  e( pStart->leftC
1e760 75 72 73 6f 72 21 3d 69 43 75 72 20 29 3b 20 2f  ursor!=iCur ); /
1e770 2a 20 74 72 61 6e 73 69 74 69 76 65 20 63 6f 6e  * transitive con
1e780 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20  straints */.    
1e790 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1e7a0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1e7b0 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 26  e, pX->pRight, &
1e7c0 72 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71  rTemp);.      sq
1e7d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1e7e0 76 2c 20 61 4d 6f 76 65 4f 70 5b 70 58 2d 3e 6f  v, aMoveOp[pX->o
1e7f0 70 2d 54 4b 5f 47 54 5d 2c 20 69 43 75 72 2c 20  p-TK_GT], iCur, 
1e800 61 64 64 72 42 72 6b 2c 20 72 31 29 3b 0a 20 20  addrBrk, r1);.  
1e810 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
1e820 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20  (v, "pk"));.    
1e830 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1e840 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
1e850 28 70 50 61 72 73 65 2c 20 72 31 2c 20 31 29 3b  (pParse, r1, 1);
1e860 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
1e870 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1e880 72 73 65 2c 20 72 54 65 6d 70 29 3b 0a 20 20 20  rse, rTemp);.   
1e890 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70     disableTerm(p
1e8a0 4c 65 76 65 6c 2c 20 70 53 74 61 72 74 29 3b 0a  Level, pStart);.
1e8b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e8c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1e8d0 70 32 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f  p2(v, bRev ? OP_
1e8e0 4c 61 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64  Last : OP_Rewind
1e8f0 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 29  , iCur, addrBrk)
1e900 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1e910 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 45 78  pEnd ){.      Ex
1e920 70 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 70 58  pr *pX;.      pX
1e930 20 3d 20 70 45 6e 64 2d 3e 70 45 78 70 72 3b 0a   = pEnd->pExpr;.
1e940 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58        assert( pX
1e950 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
1e960 65 72 74 28 20 28 70 45 6e 64 2d 3e 77 74 46 6c  ert( (pEnd->wtFl
1e970 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
1e980 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  )==0 );.      te
1e990 73 74 63 61 73 65 28 20 70 45 6e 64 2d 3e 6c 65  stcase( pEnd->le
1e9a0 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72 20 29  ftCursor!=iCur )
1e9b0 3b 20 2f 2a 20 54 72 61 6e 73 69 74 69 76 65 20  ; /* Transitive 
1e9c0 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20  constraints */. 
1e9d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1e9e0 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  End->wtFlags & T
1e9f0 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20  ERM_VIRTUAL );. 
1ea00 20 20 20 20 20 6d 65 6d 45 6e 64 56 61 6c 75 65       memEndValue
1ea10 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1ea20 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  m;.      sqlite3
1ea30 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
1ea40 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 6d 65 6d   pX->pRight, mem
1ea50 45 6e 64 56 61 6c 75 65 29 3b 0a 20 20 20 20 20  EndValue);.     
1ea60 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f   if( pX->op==TK_
1ea70 4c 54 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b  LT || pX->op==TK
1ea80 5f 47 54 20 29 7b 0a 20 20 20 20 20 20 20 20 74  _GT ){.        t
1ea90 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f  estOp = bRev ? O
1eaa0 50 5f 4c 65 20 3a 20 4f 50 5f 47 65 3b 0a 20 20  P_Le : OP_Ge;.  
1eab0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1eac0 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76     testOp = bRev
1ead0 20 3f 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f 47 74   ? OP_Lt : OP_Gt
1eae0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1eaf0 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
1eb00 65 6c 2c 20 70 45 6e 64 29 3b 0a 20 20 20 20 7d  el, pEnd);.    }
1eb10 0a 20 20 20 20 73 74 61 72 74 20 3d 20 73 71 6c  .    start = sql
1eb20 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
1eb30 64 64 72 28 76 29 3b 0a 20 20 20 20 70 4c 65 76  ddr(v);.    pLev
1eb40 65 6c 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f 20  el->op = bRev ? 
1eb50 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78  OP_Prev : OP_Nex
1eb60 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  t;.    pLevel->p
1eb70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c  1 = iCur;.    pL
1eb80 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74  evel->p2 = start
1eb90 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
1eba0 65 76 65 6c 2d 3e 70 35 3d 3d 30 20 29 3b 0a 20  evel->p5==0 );. 
1ebb0 20 20 20 69 66 28 20 74 65 73 74 4f 70 21 3d 4f     if( testOp!=O
1ebc0 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  P_Noop ){.      
1ebd0 69 52 6f 77 69 64 52 65 67 20 3d 20 69 52 65 6c  iRowidReg = iRel
1ebe0 65 61 73 65 52 65 67 20 3d 20 73 71 6c 69 74 65  easeReg = sqlite
1ebf0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
1ec00 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
1ec10 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1ec20 4f 50 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c 20  OP_Rowid, iCur, 
1ec30 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20  iRowidReg);.    
1ec40 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1ec50 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20  heStore(pParse, 
1ec60 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64  iCur, -1, iRowid
1ec70 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Reg);.      sqli
1ec80 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1ec90 20 74 65 73 74 4f 70 2c 20 6d 65 6d 45 6e 64 56   testOp, memEndV
1eca0 61 6c 75 65 2c 20 61 64 64 72 42 72 6b 2c 20 69  alue, addrBrk, i
1ecb0 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20  RowidReg);.     
1ecc0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1ecd0 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 41  geP5(v, SQLITE_A
1ece0 46 46 5f 4e 55 4d 45 52 49 43 20 7c 20 53 51 4c  FF_NUMERIC | SQL
1ecf0 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
1ed00 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
1ed10 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
1ed20 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
1ed30 44 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65  D ){.    /* Case
1ed40 20 34 3a 20 41 20 73 63 61 6e 20 75 73 69 6e 67   4: A scan using
1ed50 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a   an index..    *
1ed60 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
1ed70 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
1ed80 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 7a 65  e may contain ze
1ed90 72 6f 20 6f 72 20 6d 6f 72 65 20 65 71 75 61 6c  ro or more equal
1eda0 69 74 79 20 0a 20 20 20 20 2a 2a 20 20 20 20 20  ity .    **     
1edb0 20 20 20 20 74 65 72 6d 73 20 28 22 3d 3d 22 20      terms ("==" 
1edc0 6f 72 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72  or "IN" operator
1edd0 73 29 20 74 68 61 74 20 72 65 66 65 72 20 74 6f  s) that refer to
1ede0 20 74 68 65 20 4e 0a 20 20 20 20 2a 2a 20 20 20   the N.    **   
1edf0 20 20 20 20 20 20 6c 65 66 74 2d 6d 6f 73 74 20        left-most 
1ee00 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69  columns of the i
1ee10 6e 64 65 78 2e 20 49 74 20 6d 61 79 20 61 6c 73  ndex. It may als
1ee20 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a 2a  o contain.    **
1ee30 20 20 20 20 20 20 20 20 20 69 6e 65 71 75 61 6c           inequal
1ee40 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ity constraints 
1ee50 28 3e 2c 20 3c 2c 20 3e 3d 20 6f 72 20 3c 3d 29  (>, <, >= or <=)
1ee60 20 6f 6e 20 74 68 65 20 69 6e 64 65 78 65 64 0a   on the indexed.
1ee70 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63      **         c
1ee80 6f 6c 75 6d 6e 20 74 68 61 74 20 69 6d 6d 65 64  olumn that immed
1ee90 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 20 74  iately follows t
1eea0 68 65 20 4e 20 65 71 75 61 6c 69 74 69 65 73 2e  he N equalities.
1eeb0 20 4f 6e 6c 79 20 0a 20 20 20 20 2a 2a 20 20 20   Only .    **   
1eec0 20 20 20 20 20 20 74 68 65 20 72 69 67 68 74 2d        the right-
1eed0 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 63 61 6e 20  most column can 
1eee0 62 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79  be an inequality
1eef0 20 2d 20 74 68 65 20 72 65 73 74 20 6d 75 73 74   - the rest must
1ef00 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1ef10 75 73 65 20 74 68 65 20 22 3d 3d 22 20 61 6e 64  use the "==" and
1ef20 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 2e   "IN" operators.
1ef30 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
1ef40 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 20 20 20   the .    **    
1ef50 20 20 20 20 20 69 6e 64 65 78 20 69 73 20 6f 6e       index is on
1ef60 20 28 78 2c 79 2c 7a 29 2c 20 74 68 65 6e 20 74   (x,y,z), then t
1ef70 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6c 61  he following cla
1ef80 75 73 65 73 20 61 72 65 20 61 6c 6c 20 0a 20 20  uses are all .  
1ef90 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6f 70 74    **         opt
1efa0 69 6d 69 7a 65 64 3a 0a 20 20 20 20 2a 2a 0a 20  imized:.    **. 
1efb0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
1efc0 20 78 3d 35 0a 20 20 20 20 2a 2a 20 20 20 20 20   x=5.    **     
1efd0 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79         x=5 AND y
1efe0 3d 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  =10.    **      
1eff0 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3c        x=5 AND y<
1f000 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  10.    **       
1f010 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3e 35       x=5 AND y>5
1f020 20 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a   AND y<10.    **
1f030 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20              x=5 
1f040 41 4e 44 20 79 3d 35 20 41 4e 44 20 7a 3c 3d 31  AND y=5 AND z<=1
1f050 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  0.    **.    ** 
1f060 20 20 20 20 20 20 20 20 54 68 65 20 7a 3c 31 30          The z<10
1f070 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 6c   term of the fol
1f080 6c 6f 77 69 6e 67 20 63 61 6e 6e 6f 74 20 62 65  lowing cannot be
1f090 20 75 73 65 64 2c 20 6f 6e 6c 79 0a 20 20 20 20   used, only.    
1f0a0 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 78  **         the x
1f0b0 3d 35 20 74 65 72 6d 3a 0a 20 20 20 20 2a 2a 0a  =5 term:.    **.
1f0c0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1f0d0 20 20 78 3d 35 20 41 4e 44 20 7a 3c 31 30 0a 20    x=5 AND z<10. 
1f0e0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1f0f0 20 20 20 20 20 4e 20 6d 61 79 20 62 65 20 7a 65       N may be ze
1f100 72 6f 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ro if there are 
1f110 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
1f120 72 61 69 6e 74 73 2e 0a 20 20 20 20 2a 2a 20 20  raints..    **  
1f130 20 20 20 20 20 20 20 49 66 20 74 68 65 72 65 20         If there 
1f140 61 72 65 20 6e 6f 20 69 6e 65 71 75 61 6c 69 74  are no inequalit
1f150 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74  y constraints, t
1f160 68 65 6e 20 4e 20 69 73 20 61 74 0a 20 20 20 20  hen N is at.    
1f170 2a 2a 20 20 20 20 20 20 20 20 20 6c 65 61 73 74  **         least
1f180 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20   one..    **.   
1f190 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 69 73   **         This
1f1a0 20 63 61 73 65 20 69 73 20 61 6c 73 6f 20 75 73   case is also us
1f1b0 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 61 72  ed when there ar
1f1c0 65 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  e no WHERE claus
1f1d0 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  e.    **        
1f1e0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 75 74   constraints but
1f1f0 20 61 6e 20 69 6e 64 65 78 20 69 73 20 73 65 6c   an index is sel
1f200 65 63 74 65 64 20 61 6e 79 77 61 79 2c 20 69 6e  ected anyway, in
1f210 20 6f 72 64 65 72 0a 20 20 20 20 2a 2a 20 20 20   order.    **   
1f220 20 20 20 20 20 20 74 6f 20 66 6f 72 63 65 20 74        to force t
1f230 68 65 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20  he output order 
1f240 74 6f 20 63 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e  to conform to an
1f250 20 4f 52 44 45 52 20 42 59 2e 0a 20 20 20 20 2a   ORDER BY..    *
1f260 2f 20 20 0a 20 20 20 20 73 74 61 74 69 63 20 63  /  .    static c
1f270 6f 6e 73 74 20 75 38 20 61 53 74 61 72 74 4f 70  onst u8 aStartOp
1f280 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 30 2c 0a  [] = {.      0,.
1f290 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 4f        0,.      O
1f2a0 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 20 20  P_Rewind,       
1f2b0 20 20 20 20 2f 2a 20 32 3a 20 28 21 73 74 61 72      /* 2: (!star
1f2c0 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26  t_constraints &&
1f2d0 20 73 74 61 72 74 45 71 20 26 26 20 20 21 62 52   startEq &&  !bR
1f2e0 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  ev) */.      OP_
1f2f0 4c 61 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  Last,           
1f300 20 20 2f 2a 20 33 3a 20 28 21 73 74 61 72 74 5f    /* 3: (!start_
1f310 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73  constraints && s
1f320 74 61 72 74 45 71 20 26 26 20 20 20 62 52 65 76  tartEq &&   bRev
1f330 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65  ) */.      OP_Se
1f340 65 6b 47 74 2c 20 20 20 20 20 20 20 20 20 20 20  ekGt,           
1f350 2f 2a 20 34 3a 20 28 73 74 61 72 74 5f 63 6f 6e  /* 4: (start_con
1f360 73 74 72 61 69 6e 74 73 20 20 26 26 20 21 73 74  straints  && !st
1f370 61 72 74 45 71 20 26 26 20 21 62 52 65 76 29 20  artEq && !bRev) 
1f380 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b  */.      OP_Seek
1f390 4c 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Lt,           /*
1f3a0 20 35 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74   5: (start_const
1f3b0 72 61 69 6e 74 73 20 20 26 26 20 21 73 74 61 72  raints  && !star
1f3c0 74 45 71 20 26 26 20 20 62 52 65 76 29 20 2a 2f  tEq &&  bRev) */
1f3d0 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 65  .      OP_SeekGe
1f3e0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 36  ,           /* 6
1f3f0 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61  : (start_constra
1f400 69 6e 74 73 20 20 26 26 20 20 73 74 61 72 74 45  ints  &&  startE
1f410 71 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20  q && !bRev) */. 
1f420 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c 65 20 20       OP_SeekLe  
1f430 20 20 20 20 20 20 20 20 20 20 2f 2a 20 37 3a 20            /* 7: 
1f440 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  (start_constrain
1f450 74 73 20 20 26 26 20 20 73 74 61 72 74 45 71 20  ts  &&  startEq 
1f460 26 26 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20  &&  bRev) */.   
1f470 20 7d 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63   };.    static c
1f480 6f 6e 73 74 20 75 38 20 61 45 6e 64 4f 70 5b 5d  onst u8 aEndOp[]
1f490 20 3d 20 7b 0a 20 20 20 20 20 20 4f 50 5f 4e 6f   = {.      OP_No
1f4a0 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
1f4b0 2f 2a 20 30 3a 20 28 21 65 6e 64 5f 63 6f 6e 73  /* 0: (!end_cons
1f4c0 74 72 61 69 6e 74 73 29 20 2a 2f 0a 20 20 20 20  traints) */.    
1f4d0 20 20 4f 50 5f 49 64 78 47 45 2c 20 20 20 20 20    OP_IdxGE,     
1f4e0 20 20 20 20 20 20 20 2f 2a 20 31 3a 20 28 65 6e         /* 1: (en
1f4f0 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26  d_constraints &&
1f500 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20   !bRev) */.     
1f510 20 4f 50 5f 49 64 78 4c 54 20 20 20 20 20 20 20   OP_IdxLT       
1f520 20 20 20 20 20 20 2f 2a 20 32 3a 20 28 65 6e 64        /* 2: (end
1f530 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20  _constraints && 
1f540 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a  bRev) */.    };.
1f550 20 20 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c      int nEq = pL
1f560 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  oop->u.btree.nEq
1f570 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  ;  /* Number of 
1f580 3d 3d 20 6f 72 20 49 4e 20 74 65 72 6d 73 20 2a  == or IN terms *
1f590 2f 0a 20 20 20 20 69 6e 74 20 69 73 4d 69 6e 51  /.    int isMinQ
1f5a0 75 65 72 79 20 3d 20 30 3b 20 20 20 20 20 20 20  uery = 0;       
1f5b0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
1f5c0 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20  is an optimized 
1f5d0 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 2e 2e 20  SELECT min(x).. 
1f5e0 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 42 61  */.    int regBa
1f5f0 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
1f600 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67 69      /* Base regi
1f610 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f 6e  ster holding con
1f620 73 74 72 61 69 6e 74 20 76 61 6c 75 65 73 20 2a  straint values *
1f630 2f 0a 20 20 20 20 69 6e 74 20 72 31 3b 20 20 20  /.    int r1;   
1f640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f650 20 20 20 2f 2a 20 54 65 6d 70 20 72 65 67 69 73     /* Temp regis
1f660 74 65 72 20 2a 2f 0a 20 20 20 20 57 68 65 72 65  ter */.    Where
1f670 54 65 72 6d 20 2a 70 52 61 6e 67 65 53 74 61 72  Term *pRangeStar
1f680 74 20 3d 20 30 3b 20 20 2f 2a 20 49 6e 65 71 75  t = 0;  /* Inequ
1f690 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
1f6a0 20 61 74 20 72 61 6e 67 65 20 73 74 61 72 74 20   at range start 
1f6b0 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  */.    WhereTerm
1f6c0 20 2a 70 52 61 6e 67 65 45 6e 64 20 3d 20 30 3b   *pRangeEnd = 0;
1f6d0 20 20 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74      /* Inequalit
1f6e0 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20  y constraint at 
1f6f0 72 61 6e 67 65 20 65 6e 64 20 2a 2f 0a 20 20 20  range end */.   
1f700 20 69 6e 74 20 73 74 61 72 74 45 71 3b 20 20 20   int startEq;   
1f710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f720 20 54 72 75 65 20 69 66 20 72 61 6e 67 65 20 73   True if range s
1f730 74 61 72 74 20 75 73 65 73 20 3d 3d 2c 20 3e 3d  tart uses ==, >=
1f740 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e   or <= */.    in
1f750 74 20 65 6e 64 45 71 3b 20 20 20 20 20 20 20 20  t endEq;        
1f760 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1f770 75 65 20 69 66 20 72 61 6e 67 65 20 65 6e 64 20  ue if range end 
1f780 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c  uses ==, >= or <
1f790 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74 61  = */.    int sta
1f7a0 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3b 20  rt_constraints; 
1f7b0 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f        /* Start o
1f7c0 66 20 72 61 6e 67 65 20 69 73 20 63 6f 6e 73 74  f range is const
1f7d0 72 61 69 6e 65 64 20 2a 2f 0a 20 20 20 20 69 6e  rained */.    in
1f7e0 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 20  t nConstraint;  
1f7f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1f800 6d 62 65 72 20 6f 66 20 63 6f 6e 73 74 72 61 69  mber of constrai
1f810 6e 74 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  nt terms */.    
1f820 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
1f830 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f840 54 68 65 20 69 6e 64 65 78 20 77 65 20 77 69 6c  The index we wil
1f850 6c 20 62 65 20 75 73 69 6e 67 20 2a 2f 0a 20 20  l be using */.  
1f860 20 20 69 6e 74 20 69 49 64 78 43 75 72 3b 20 20    int iIdxCur;  
1f870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f880 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f  * The VDBE curso
1f890 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20  r for the index 
1f8a0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45 78 74 72  */.    int nExtr
1f8b0 61 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20  aReg = 0;       
1f8c0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1f8d0 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72 73   extra registers
1f8e0 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 20 20 69   needed */.    i
1f8f0 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
1f900 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1f910 6e 73 74 72 75 63 74 69 6f 6e 20 6f 70 63 6f 64  nstruction opcod
1f920 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  e */.    char *z
1f930 53 74 61 72 74 41 66 66 3b 20 20 20 20 20 20 20  StartAff;       
1f940 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74        /* Affinit
1f950 79 20 66 6f 72 20 73 74 61 72 74 20 6f 66 20 72  y for start of r
1f960 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20  ange constraint 
1f970 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 6e  */.    char *zEn
1f980 64 41 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  dAff;           
1f990 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20      /* Affinity 
1f9a0 66 6f 72 20 65 6e 64 20 6f 66 20 72 61 6e 67 65  for end of range
1f9b0 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 0a   constraint */..
1f9c0 20 20 20 20 70 49 64 78 20 3d 20 70 4c 6f 6f 70      pIdx = pLoop
1f9d0 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
1f9e0 3b 0a 20 20 20 20 69 49 64 78 43 75 72 20 3d 20  ;.    iIdxCur = 
1f9f0 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b  pLevel->iIdxCur;
1fa00 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
1fa10 20 6c 6f 6f 70 20 73 61 74 69 73 66 69 65 73 20   loop satisfies 
1fa20 61 20 73 6f 72 74 20 6f 72 64 65 72 20 28 70 4f  a sort order (pO
1fa30 72 64 65 72 42 79 29 20 72 65 71 75 65 73 74 20  rderBy) request 
1fa40 74 68 61 74 20 0a 20 20 20 20 2a 2a 20 77 61 73  that .    ** was
1fa50 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
1fa60 66 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6d 70 6c  function to impl
1fa70 65 6d 65 6e 74 20 61 20 22 53 45 4c 45 43 54 20  ement a "SELECT 
1fa80 6d 69 6e 28 78 29 20 2e 2e 2e 22 20 0a 20 20 20  min(x) ..." .   
1fa90 20 2a 2a 20 71 75 65 72 79 2c 20 74 68 65 6e 20   ** query, then 
1faa0 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  the caller will 
1fab0 6f 6e 6c 79 20 61 6c 6c 6f 77 20 74 68 65 20 6c  only allow the l
1fac0 6f 6f 70 20 74 6f 20 72 75 6e 20 66 6f 72 0a 20  oop to run for. 
1fad0 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 69     ** a single i
1fae0 74 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 6d  teration. This m
1faf0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 66 69  eans that the fi
1fb00 72 73 74 20 72 6f 77 20 72 65 74 75 72 6e 65 64  rst row returned
1fb10 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 6e  .    ** should n
1fb20 6f 74 20 68 61 76 65 20 61 20 4e 55 4c 4c 20 76  ot have a NULL v
1fb30 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 27  alue stored in '
1fb40 78 27 2e 20 49 66 20 63 6f 6c 75 6d 6e 20 27 78  x'. If column 'x
1fb50 27 20 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20  ' is.    ** the 
1fb60 66 69 72 73 74 20 6f 6e 65 20 61 66 74 65 72 20  first one after 
1fb70 74 68 65 20 6e 45 71 20 65 71 75 61 6c 69 74 79  the nEq equality
1fb80 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20   constraints in 
1fb90 74 68 65 20 69 6e 64 65 78 2c 0a 20 20 20 20 2a  the index,.    *
1fba0 2a 20 74 68 69 73 20 72 65 71 75 69 72 65 73 20  * this requires 
1fbb0 73 6f 6d 65 20 73 70 65 63 69 61 6c 20 68 61 6e  some special han
1fbc0 64 6c 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20  dling..    */.  
1fbd0 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77    if( (pWInfo->w
1fbe0 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f  ctrlFlags&WHERE_
1fbf0 4f 52 44 45 52 42 59 5f 4d 49 4e 29 21 3d 30 0a  ORDERBY_MIN)!=0.
1fc00 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d       && (pWInfo-
1fc10 3e 62 4f 42 53 61 74 21 3d 30 29 0a 20 20 20 20  >bOBSat!=0).    
1fc20 20 26 26 20 28 70 49 64 78 2d 3e 6e 43 6f 6c 75   && (pIdx->nColu
1fc30 6d 6e 3e 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20  mn>nEq).    ){. 
1fc40 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20       /* assert( 
1fc50 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d  pOrderBy->nExpr=
1fc60 3d 31 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20 2f  =1 ); */.      /
1fc70 2a 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72  * assert( pOrder
1fc80 42 79 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e  By->a[0].pExpr->
1fc90 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61  iColumn==pIdx->a
1fca0 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 20 29 3b 20  iColumn[nEq] ); 
1fcb0 2a 2f 0a 20 20 20 20 20 20 69 73 4d 69 6e 51 75  */.      isMinQu
1fcc0 65 72 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 6e  ery = 1;.      n
1fcd0 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20  ExtraReg = 1;.  
1fce0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64    }..    /* Find
1fcf0 20 61 6e 79 20 69 6e 65 71 75 61 6c 69 74 79 20   any inequality 
1fd00 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73  constraint terms
1fd10 20 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 61   for the start a
1fd20 6e 64 20 65 6e 64 20 0a 20 20 20 20 2a 2a 20 6f  nd end .    ** o
1fd30 66 20 74 68 65 20 72 61 6e 67 65 2e 20 0a 20 20  f the range. .  
1fd40 20 20 2a 2f 0a 20 20 20 20 6a 20 3d 20 6e 45 71    */.    j = nEq
1fd50 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d  ;.    if( pLoop-
1fd60 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
1fd70 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  _BTM_LIMIT ){.  
1fd80 20 20 20 20 70 52 61 6e 67 65 53 74 61 72 74 20      pRangeStart 
1fd90 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  = pLoop->aLTerm[
1fda0 6a 2b 2b 5d 3b 0a 20 20 20 20 20 20 6e 45 78 74  j++];.      nExt
1fdb0 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d  raReg = 1;.    }
1fdc0 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  .    if( pLoop->
1fdd0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1fde0 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  TOP_LIMIT ){.   
1fdf0 20 20 20 70 52 61 6e 67 65 45 6e 64 20 3d 20 70     pRangeEnd = p
1fe00 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 2b 2b  Loop->aLTerm[j++
1fe10 5d 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52  ];.      nExtraR
1fe20 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  eg = 1;.    }.. 
1fe30 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
1fe40 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  ode to evaluate 
1fe50 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  all constraint t
1fe60 65 72 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f 72  erms using == or
1fe70 20 49 4e 0a 20 20 20 20 2a 2a 20 61 6e 64 20 73   IN.    ** and s
1fe80 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 73 20  tore the values 
1fe90 6f 66 20 74 68 6f 73 65 20 74 65 72 6d 73 20 69  of those terms i
1fea0 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65  n an array of re
1feb0 67 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 73  gisters.    ** s
1fec0 74 61 72 74 69 6e 67 20 61 74 20 72 65 67 42 61  tarting at regBa
1fed0 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  se..    */.    r
1fee0 65 67 42 61 73 65 20 3d 20 63 6f 64 65 41 6c 6c  egBase = codeAll
1fef0 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28 70 50  EqualityTerms(pP
1ff00 61 72 73 65 2c 70 4c 65 76 65 6c 2c 62 52 65 76  arse,pLevel,bRev
1ff10 2c 6e 45 78 74 72 61 52 65 67 2c 26 7a 53 74 61  ,nExtraReg,&zSta
1ff20 72 74 41 66 66 29 3b 0a 20 20 20 20 7a 45 6e 64  rtAff);.    zEnd
1ff30 41 66 66 20 3d 20 73 71 6c 69 74 65 33 44 62 53  Aff = sqlite3DbS
1ff40 74 72 44 75 70 28 64 62 2c 20 7a 53 74 61 72 74  trDup(db, zStart
1ff50 41 66 66 29 3b 0a 20 20 20 20 61 64 64 72 4e 78  Aff);.    addrNx
1ff60 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  t = pLevel->addr
1ff70 4e 78 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  Nxt;..    /* If 
1ff80 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 72  we are doing a r
1ff90 65 76 65 72 73 65 20 6f 72 64 65 72 20 73 63 61  everse order sca
1ffa0 6e 20 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69 6e  n on an ascendin
1ffb0 67 20 69 6e 64 65 78 2c 20 6f 72 0a 20 20 20 20  g index, or.    
1ffc0 2a 2a 20 61 20 66 6f 72 77 61 72 64 20 6f 72 64  ** a forward ord
1ffd0 65 72 20 73 63 61 6e 20 6f 6e 20 61 20 64 65 73  er scan on a des
1ffe0 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20 69  cending index, i
1fff0 6e 74 65 72 63 68 61 6e 67 65 20 74 68 65 20 0a  nterchange the .
20000 20 20 20 20 2a 2a 20 73 74 61 72 74 20 61 6e 64      ** start and
20010 20 65 6e 64 20 74 65 72 6d 73 20 28 70 52 61 6e   end terms (pRan
20020 67 65 53 74 61 72 74 20 61 6e 64 20 70 52 61 6e  geStart and pRan
20030 67 65 45 6e 64 29 2e 0a 20 20 20 20 2a 2f 0a 20  geEnd)..    */. 
20040 20 20 20 69 66 28 20 28 6e 45 71 3c 70 49 64 78     if( (nEq<pIdx
20050 2d 3e 6e 43 6f 6c 75 6d 6e 20 26 26 20 62 52 65  ->nColumn && bRe
20060 76 3d 3d 28 70 49 64 78 2d 3e 61 53 6f 72 74 4f  v==(pIdx->aSortO
20070 72 64 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54  rder[nEq]==SQLIT
20080 45 5f 53 4f 5f 41 53 43 29 29 0a 20 20 20 20 20  E_SO_ASC)).     
20090 7c 7c 20 28 62 52 65 76 20 26 26 20 70 49 64 78  || (bRev && pIdx
200a0 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 6e 45 71 29 0a  ->nColumn==nEq).
200b0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 53 57 41      ){.      SWA
200c0 50 28 57 68 65 72 65 54 65 72 6d 20 2a 2c 20 70  P(WhereTerm *, p
200d0 52 61 6e 67 65 45 6e 64 2c 20 70 52 61 6e 67 65  RangeEnd, pRange
200e0 53 74 61 72 74 29 3b 0a 20 20 20 20 7d 0a 0a 20  Start);.    }.. 
200f0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61     testcase( pRa
20100 6e 67 65 53 74 61 72 74 20 26 26 20 28 70 52 61  ngeStart && (pRa
20110 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61  ngeStart->eOpera
20120 74 6f 72 20 26 20 57 4f 5f 4c 45 29 21 3d 30 20  tor & WO_LE)!=0 
20130 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
20140 20 70 52 61 6e 67 65 53 74 61 72 74 20 26 26 20   pRangeStart && 
20150 28 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f  (pRangeStart->eO
20160 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 29  perator & WO_GE)
20170 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63  !=0 );.    testc
20180 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64 20 26  ase( pRangeEnd &
20190 26 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f  & (pRangeEnd->eO
201a0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 29  perator & WO_LE)
201b0 21 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63  !=0 );.    testc
201c0 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64 20 26  ase( pRangeEnd &
201d0 26 20 28 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f  & (pRangeEnd->eO
201e0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 29  perator & WO_GE)
201f0 21 3d 30 20 29 3b 0a 20 20 20 20 73 74 61 72 74  !=0 );.    start
20200 45 71 20 3d 20 21 70 52 61 6e 67 65 53 74 61 72  Eq = !pRangeStar
20210 74 20 7c 7c 20 70 52 61 6e 67 65 53 74 61 72 74  t || pRangeStart
20220 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
20230 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20  O_LE|WO_GE);.   
20240 20 65 6e 64 45 71 20 3d 20 20 20 21 70 52 61 6e   endEq =   !pRan
20250 67 65 45 6e 64 20 7c 7c 20 70 52 61 6e 67 65 45  geEnd || pRangeE
20260 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  nd->eOperator & 
20270 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20  (WO_LE|WO_GE);. 
20280 20 20 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61     start_constra
20290 69 6e 74 73 20 3d 20 70 52 61 6e 67 65 53 74 61  ints = pRangeSta
202a0 72 74 20 7c 7c 20 6e 45 71 3e 30 3b 0a 0a 20 20  rt || nEq>0;..  
202b0 20 20 2f 2a 20 53 65 65 6b 20 74 68 65 20 69 6e    /* Seek the in
202c0 64 65 78 20 63 75 72 73 6f 72 20 74 6f 20 74 68  dex cursor to th
202d0 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 72  e start of the r
202e0 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 6e 43 6f  ange. */.    nCo
202f0 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a  nstraint = nEq;.
20300 20 20 20 20 69 66 28 20 70 52 61 6e 67 65 53 74      if( pRangeSt
20310 61 72 74 20 29 7b 0a 20 20 20 20 20 20 45 78 70  art ){.      Exp
20320 72 20 2a 70 52 69 67 68 74 20 3d 20 70 52 61 6e  r *pRight = pRan
20330 67 65 53 74 61 72 74 2d 3e 70 45 78 70 72 2d 3e  geStart->pExpr->
20340 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 73 71  pRight;.      sq
20350 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
20360 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72 65  arse, pRight, re
20370 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20  gBase+nEq);.    
20380 20 20 69 66 28 20 28 70 52 61 6e 67 65 53 74 61    if( (pRangeSta
20390 72 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rt->wtFlags & TE
203a0 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a  RM_VNULL)==0 ){.
203b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
203c0 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d  xprCodeIsNullJum
203d0 70 28 76 2c 20 70 52 69 67 68 74 2c 20 72 65 67  p(v, pRight, reg
203e0 42 61 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78  Base+nEq, addrNx
203f0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
20400 20 20 69 66 28 20 7a 53 74 61 72 74 41 66 66 20    if( zStartAff 
20410 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
20420 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
20430 69 6e 69 74 79 28 70 52 69 67 68 74 2c 20 7a 53  inity(pRight, zS
20440 74 61 72 74 41 66 66 5b 6e 45 71 5d 29 3d 3d 53  tartAff[nEq])==S
20450 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 7b  QLITE_AFF_NONE){
20460 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69  .          /* Si
20470 6e 63 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73  nce the comparis
20480 6f 6e 20 69 73 20 74 6f 20 62 65 20 70 65 72 66  on is to be perf
20490 6f 72 6d 65 64 20 77 69 74 68 20 6e 6f 20 63 6f  ormed with no co
204a0 6e 76 65 72 73 69 6f 6e 73 0a 20 20 20 20 20 20  nversions.      
204b0 20 20 20 20 2a 2a 20 61 70 70 6c 69 65 64 20 74      ** applied t
204c0 6f 20 74 68 65 20 6f 70 65 72 61 6e 64 73 2c 20  o the operands, 
204d0 73 65 74 20 74 68 65 20 61 66 66 69 6e 69 74 79  set the affinity
204e0 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 52 69   to apply to pRi
204f0 67 68 74 20 74 6f 20 0a 20 20 20 20 20 20 20 20  ght to .        
20500 20 20 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f    ** SQLITE_AFF_
20510 4e 4f 4e 45 2e 20 20 2a 2f 0a 20 20 20 20 20 20  NONE.  */.      
20520 20 20 20 20 7a 53 74 61 72 74 41 66 66 5b 6e 45      zStartAff[nE
20530 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  q] = SQLITE_AFF_
20540 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  NONE;.        }.
20550 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
20560 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66  te3ExprNeedsNoAf
20570 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 52 69  finityChange(pRi
20580 67 68 74 2c 20 7a 53 74 61 72 74 41 66 66 5b 6e  ght, zStartAff[n
20590 45 71 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Eq]) ){.        
205a0 20 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d    zStartAff[nEq]
205b0 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
205c0 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  NE;.        }.  
205d0 20 20 20 20 7d 20 20 0a 20 20 20 20 20 20 6e 43      }  .      nC
205e0 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20  onstraint++;.   
205f0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61     testcase( pRa
20600 6e 67 65 53 74 61 72 74 2d 3e 77 74 46 6c 61 67  ngeStart->wtFlag
20610 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
20620 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   );.    }else if
20630 28 20 69 73 4d 69 6e 51 75 65 72 79 20 29 7b 0a  ( isMinQuery ){.
20640 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
20650 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
20660 6c 6c 2c 20 30 2c 20 72 65 67 42 61 73 65 2b 6e  ll, 0, regBase+n
20670 45 71 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73  Eq);.      nCons
20680 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  traint++;.      
20690 73 74 61 72 74 45 71 20 3d 20 30 3b 0a 20 20 20  startEq = 0;.   
206a0 20 20 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61     start_constra
206b0 69 6e 74 73 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  ints = 1;.    }.
206c0 20 20 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66      codeApplyAff
206d0 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20 72 65  inity(pParse, re
206e0 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69  gBase, nConstrai
206f0 6e 74 2c 20 7a 53 74 61 72 74 41 66 66 29 3b 0a  nt, zStartAff);.
20700 20 20 20 20 6f 70 20 3d 20 61 53 74 61 72 74 4f      op = aStartO
20710 70 5b 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61  p[(start_constra
20720 69 6e 74 73 3c 3c 32 29 20 2b 20 28 73 74 61 72  ints<<2) + (star
20730 74 45 71 3c 3c 31 29 20 2b 20 62 52 65 76 5d 3b  tEq<<1) + bRev];
20740 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 21  .    assert( op!
20750 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  =0 );.    testca
20760 73 65 28 20 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e  se( op==OP_Rewin
20770 64 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  d );.    testcas
20780 65 28 20 6f 70 3d 3d 4f 50 5f 4c 61 73 74 20 29  e( op==OP_Last )
20790 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
207a0 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 74 20 29 3b  op==OP_SeekGt );
207b0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  .    testcase( o
207c0 70 3d 3d 4f 50 5f 53 65 65 6b 47 65 20 29 3b 0a  p==OP_SeekGe );.
207d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
207e0 3d 3d 4f 50 5f 53 65 65 6b 4c 65 20 29 3b 0a 20  ==OP_SeekLe );. 
207f0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
20800 3d 4f 50 5f 53 65 65 6b 4c 74 20 29 3b 0a 20 20  =OP_SeekLt );.  
20810 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
20820 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49  Op4Int(v, op, iI
20830 64 78 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20  dxCur, addrNxt, 
20840 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72  regBase, nConstr
20850 61 69 6e 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c  aint);..    /* L
20860 6f 61 64 20 74 68 65 20 76 61 6c 75 65 20 66 6f  oad the value fo
20870 72 20 74 68 65 20 69 6e 65 71 75 61 6c 69 74 79  r the inequality
20880 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 74   constraint at t
20890 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20  he end of the.  
208a0 20 20 2a 2a 20 72 61 6e 67 65 20 28 69 66 20 61    ** range (if a
208b0 6e 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ny)..    */.    
208c0 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45  nConstraint = nE
208d0 71 3b 0a 20 20 20 20 69 66 28 20 70 52 61 6e 67  q;.    if( pRang
208e0 65 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 45 78  eEnd ){.      Ex
208f0 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 52 61  pr *pRight = pRa
20900 6e 67 65 45 6e 64 2d 3e 70 45 78 70 72 2d 3e 70  ngeEnd->pExpr->p
20910 52 69 67 68 74 3b 0a 20 20 20 20 20 20 73 71 6c  Right;.      sql
20920 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d  ite3ExprCacheRem
20930 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 42  ove(pParse, regB
20940 61 73 65 2b 6e 45 71 2c 20 31 29 3b 0a 20 20 20  ase+nEq, 1);.   
20950 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
20960 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  de(pParse, pRigh
20970 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b  t, regBase+nEq);
20980 0a 20 20 20 20 20 20 69 66 28 20 28 70 52 61 6e  .      if( (pRan
20990 67 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26  geEnd->wtFlags &
209a0 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20   TERM_VNULL)==0 
209b0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
209c0 65 33 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c  e3ExprCodeIsNull
209d0 4a 75 6d 70 28 76 2c 20 70 52 69 67 68 74 2c 20  Jump(v, pRight, 
209e0 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 61 64 64  regBase+nEq, add
209f0 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rNxt);.      }. 
20a00 20 20 20 20 20 69 66 28 20 7a 45 6e 64 41 66 66       if( zEndAff
20a10 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
20a20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
20a30 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c 20 7a  finity(pRight, z
20a40 45 6e 64 41 66 66 5b 6e 45 71 5d 29 3d 3d 53 51  EndAff[nEq])==SQ
20a50 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 7b 0a  LITE_AFF_NONE){.
20a60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e            /* Sin
20a70 63 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  ce the compariso
20a80 6e 20 69 73 20 74 6f 20 62 65 20 70 65 72 66 6f  n is to be perfo
20a90 72 6d 65 64 20 77 69 74 68 20 6e 6f 20 63 6f 6e  rmed with no con
20aa0 76 65 72 73 69 6f 6e 73 0a 20 20 20 20 20 20 20  versions.       
20ab0 20 20 20 2a 2a 20 61 70 70 6c 69 65 64 20 74 6f     ** applied to
20ac0 20 74 68 65 20 6f 70 65 72 61 6e 64 73 2c 20 73   the operands, s
20ad0 65 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  et the affinity 
20ae0 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 52 69 67  to apply to pRig
20af0 68 74 20 74 6f 20 0a 20 20 20 20 20 20 20 20 20  ht to .         
20b00 20 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e   ** SQLITE_AFF_N
20b10 4f 4e 45 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ONE.  */.       
20b20 20 20 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 20     zEndAff[nEq] 
20b30 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
20b40 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
20b50 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
20b60 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e  ExprNeedsNoAffin
20b70 69 74 79 43 68 61 6e 67 65 28 70 52 69 67 68 74  ityChange(pRight
20b80 2c 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 29 20  , zEndAff[nEq]) 
20b90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 45 6e  ){.          zEn
20ba0 64 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c 49  dAff[nEq] = SQLI
20bb0 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20  TE_AFF_NONE;.   
20bc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 20       }.      }  
20bd0 0a 20 20 20 20 20 20 63 6f 64 65 41 70 70 6c 79  .      codeApply
20be0 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c  Affinity(pParse,
20bf0 20 72 65 67 42 61 73 65 2c 20 6e 45 71 2b 31 2c   regBase, nEq+1,
20c00 20 7a 45 6e 64 41 66 66 29 3b 0a 20 20 20 20 20   zEndAff);.     
20c10 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a   nConstraint++;.
20c20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
20c30 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c 61  pRangeEnd->wtFla
20c40 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
20c50 4c 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  L );.    }.    s
20c60 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
20c70 20 7a 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20   zStartAff);.   
20c80 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
20c90 62 2c 20 7a 45 6e 64 41 66 66 29 3b 0a 0a 20 20  b, zEndAff);..  
20ca0 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
20cb0 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20  loop body */.   
20cc0 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 71   pLevel->p2 = sq
20cd0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
20ce0 41 64 64 72 28 76 29 3b 0a 0a 20 20 20 20 2f 2a  Addr(v);..    /*
20cf0 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 69 6e   Check if the in
20d00 64 65 78 20 63 75 72 73 6f 72 20 69 73 20 70 61  dex cursor is pa
20d10 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
20d20 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20  e range. */.    
20d30 6f 70 20 3d 20 61 45 6e 64 4f 70 5b 28 70 52 61  op = aEndOp[(pRa
20d40 6e 67 65 45 6e 64 20 7c 7c 20 6e 45 71 29 20 2a  ngeEnd || nEq) *
20d50 20 28 31 20 2b 20 62 52 65 76 29 5d 3b 0a 20 20   (1 + bRev)];.  
20d60 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
20d70 4f 50 5f 4e 6f 6f 70 20 29 3b 0a 20 20 20 20 74  OP_Noop );.    t
20d80 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
20d90 49 64 78 47 45 20 29 3b 0a 20 20 20 20 74 65 73  IdxGE );.    tes
20da0 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64  tcase( op==OP_Id
20db0 78 4c 54 20 29 3b 0a 20 20 20 20 69 66 28 20 6f  xLT );.    if( o
20dc0 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20  p!=OP_Noop ){.  
20dd0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
20de0 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20  ddOp4Int(v, op, 
20df0 69 49 64 78 43 75 72 2c 20 61 64 64 72 4e 78 74  iIdxCur, addrNxt
20e00 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73  , regBase, nCons
20e10 74 72 61 69 6e 74 29 3b 0a 20 20 20 20 20 20 73  traint);.      s
20e20 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
20e30 50 35 28 76 2c 20 65 6e 64 45 71 21 3d 62 52 65  P5(v, endEq!=bRe
20e40 76 20 3f 31 3a 30 29 3b 0a 20 20 20 20 7d 0a 0a  v ?1:0);.    }..
20e50 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
20e60 61 72 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63  are inequality c
20e70 6f 6e 73 74 72 61 69 6e 74 73 2c 20 63 68 65 63  onstraints, chec
20e80 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  k that the value
20e90 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 74  .    ** of the t
20ea0 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 74 68 61 74  able column that
20eb0 20 74 68 65 20 69 6e 65 71 75 61 6c 69 74 79 20   the inequality 
20ec0 63 6f 6e 74 72 61 69 6e 73 20 69 73 20 6e 6f 74  contrains is not
20ed0 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 49 66   NULL..    ** If
20ee0 20 69 74 20 69 73 2c 20 6a 75 6d 70 20 74 6f 20   it is, jump to 
20ef0 74 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69  the next iterati
20f00 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a  on of the loop..
20f10 20 20 20 20 2a 2f 0a 20 20 20 20 72 31 20 3d 20      */.    r1 = 
20f20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
20f30 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 74  g(pParse);.    t
20f40 65 73 74 63 61 73 65 28 20 70 4c 6f 6f 70 2d 3e  estcase( pLoop->
20f50 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
20f60 42 54 4d 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20  BTM_LIMIT );.   
20f70 20 74 65 73 74 63 61 73 65 28 20 70 4c 6f 6f 70   testcase( pLoop
20f80 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
20f90 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 3b 0a 20  E_TOP_LIMIT );. 
20fa0 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77     if( (pLoop->w
20fb0 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  sFlags & (WHERE_
20fc0 42 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f  BTM_LIMIT|WHERE_
20fd0 54 4f 50 5f 4c 49 4d 49 54 29 29 21 3d 30 20 29  TOP_LIMIT))!=0 )
20fe0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
20ff0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
21000 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c  Column, iIdxCur,
21010 20 6e 45 71 2c 20 72 31 29 3b 0a 20 20 20 20 20   nEq, r1);.     
21020 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21030 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p2(v, OP_IsNull,
21040 20 72 31 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a   r1, addrCont);.
21050 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
21060 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
21070 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 0a 20 20  pParse, r1);..  
21080 20 20 2f 2a 20 53 65 65 6b 20 74 68 65 20 74 61    /* Seek the ta
21090 62 6c 65 20 63 75 72 73 6f 72 2c 20 69 66 20 72  ble cursor, if r
210a0 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 64  equired */.    d
210b0 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
210c0 6c 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b  l, pRangeStart);
210d0 0a 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d  .    disableTerm
210e0 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 45  (pLevel, pRangeE
210f0 6e 64 29 3b 0a 20 20 20 20 69 66 28 20 21 6f 6d  nd);.    if( !om
21100 69 74 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  itTable ){.     
21110 20 69 52 6f 77 69 64 52 65 67 20 3d 20 69 52 65   iRowidReg = iRe
21120 6c 65 61 73 65 52 65 67 20 3d 20 73 71 6c 69 74  leaseReg = sqlit
21130 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
21140 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
21150 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
21160 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c 20 69 49   OP_IdxRowid, iI
21170 64 78 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67  dxCur, iRowidReg
21180 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
21190 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70  ExprCacheStore(p
211a0 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c  Parse, iCur, -1,
211b0 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20   iRowidReg);.   
211c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
211d0 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 65 6b 2c  dOp2(v, OP_Seek,
211e0 20 69 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67   iCur, iRowidReg
211f0 29 3b 20 20 2f 2a 20 44 65 66 65 72 72 65 64 20  );  /* Deferred 
21200 73 65 65 6b 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20  seek */.    }.. 
21210 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65     /* Record the
21220 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 75 73 65   instruction use
21230 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74  d to terminate t
21240 68 65 20 6c 6f 6f 70 2e 20 44 69 73 61 62 6c 65  he loop. Disable
21250 20 0a 20 20 20 20 2a 2a 20 57 48 45 52 45 20 63   .    ** WHERE c
21260 6c 61 75 73 65 20 74 65 72 6d 73 20 6d 61 64 65  lause terms made
21270 20 72 65 64 75 6e 64 61 6e 74 20 62 79 20 74 68   redundant by th
21280 65 20 69 6e 64 65 78 20 72 61 6e 67 65 20 73 63  e index range sc
21290 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  an..    */.    i
212a0 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
212b0 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57  s & WHERE_ONEROW
212c0 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c   ){.      pLevel
212d0 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a  ->op = OP_Noop;.
212e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62 52      }else if( bR
212f0 65 76 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76  ev ){.      pLev
21300 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 50 72 65 76  el->op = OP_Prev
21310 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
21320 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
21330 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  OP_Next;.    }. 
21340 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
21350 69 49 64 78 43 75 72 3b 0a 20 20 20 20 69 66 28  iIdxCur;.    if(
21360 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
21370 20 26 20 57 48 45 52 45 5f 43 4f 4e 53 54 52 41   & WHERE_CONSTRA
21380 49 4e 54 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  INT)==0 ){.     
21390 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51   pLevel->p5 = SQ
213a0 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
213b0 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20  FULLSCAN_STEP;. 
213c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
213d0 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e  assert( pLevel->
213e0 70 35 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20  p5==0 );.    }. 
213f0 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20   }else..#ifndef 
21400 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f  SQLITE_OMIT_OR_O
21410 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69 66  PTIMIZATION.  if
21420 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
21430 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f   & WHERE_MULTI_O
21440 52 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65  R ){.    /* Case
21450 20 35 3a 20 20 54 77 6f 20 6f 72 20 6d 6f 72 65   5:  Two or more
21460 20 73 65 70 61 72 61 74 65 6c 79 20 69 6e 64 65   separately inde
21470 78 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63  xed terms connec
21480 74 65 64 20 62 79 20 4f 52 0a 20 20 20 20 2a 2a  ted by OR.    **
21490 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a  .    ** Example:
214a0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
214b0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
214c0 28 61 2c 62 2c 63 2c 64 29 3b 0a 20 20 20 20 2a  (a,b,c,d);.    *
214d0 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  *   CREATE INDEX
214e0 20 69 31 20 4f 4e 20 74 31 28 61 29 3b 0a 20 20   i1 ON t1(a);.  
214f0 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e    **   CREATE IN
21500 44 45 58 20 69 32 20 4f 4e 20 74 31 28 62 29 3b  DEX i2 ON t1(b);
21510 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45  .    **   CREATE
21520 20 49 4e 44 45 58 20 69 33 20 4f 4e 20 74 31 28   INDEX i3 ON t1(
21530 63 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  c);.    **.    *
21540 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  *   SELECT * FRO
21550 4d 20 74 31 20 57 48 45 52 45 20 61 3d 35 20 4f  M t1 WHERE a=5 O
21560 52 20 62 3d 37 20 4f 52 20 28 63 3d 31 31 20 41  R b=7 OR (c=11 A
21570 4e 44 20 64 3d 31 33 29 0a 20 20 20 20 2a 2a 0a  ND d=13).    **.
21580 20 20 20 20 2a 2a 20 49 6e 20 74 68 65 20 65 78      ** In the ex
21590 61 6d 70 6c 65 2c 20 74 68 65 72 65 20 61 72 65  ample, there are
215a0 20 74 68 72 65 65 20 69 6e 64 65 78 65 64 20 74   three indexed t
215b0 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62  erms connected b
215c0 79 20 4f 52 2e 0a 20 20 20 20 2a 2a 20 54 68 65  y OR..    ** The
215d0 20 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70   top of the loop
215e0 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73   looks like this
215f0 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
21600 20 20 20 20 20 20 20 20 20 4e 75 6c 6c 20 20 20           Null   
21610 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
21620 20 20 20 20 20 23 20 5a 65 72 6f 20 74 68 65 20       # Zero the 
21630 72 6f 77 73 65 74 20 69 6e 20 72 65 67 20 31 0a  rowset in reg 1.
21640 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
21650 65 6e 2c 20 66 6f 72 20 65 61 63 68 20 69 6e 64  en, for each ind
21660 65 78 65 64 20 74 65 72 6d 2c 20 74 68 65 20 66  exed term, the f
21670 6f 6c 6c 6f 77 69 6e 67 2e 20 54 68 65 20 61 72  ollowing. The ar
21680 67 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20 20 2a  guments to.    *
21690 2a 20 52 6f 77 53 65 74 54 65 73 74 20 61 72 65  * RowSetTest are
216a0 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20 72   such that the r
216b0 6f 77 69 64 20 6f 66 20 74 68 65 20 63 75 72 72  owid of the curr
216c0 65 6e 74 20 72 6f 77 20 69 73 20 69 6e 73 65 72  ent row is inser
216d0 74 65 64 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20  ted.    ** into 
216e0 74 68 65 20 52 6f 77 53 65 74 2e 20 49 66 20 69  the RowSet. If i
216f0 74 20 69 73 20 61 6c 72 65 61 64 79 20 70 72 65  t is already pre
21700 73 65 6e 74 2c 20 63 6f 6e 74 72 6f 6c 20 73 6b  sent, control sk
21710 69 70 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 47  ips the.    ** G
21720 6f 73 75 62 20 6f 70 63 6f 64 65 20 61 6e 64 20  osub opcode and 
21730 6a 75 6d 70 73 20 73 74 72 61 69 67 68 74 20 74  jumps straight t
21740 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  o the code gener
21750 61 74 65 64 20 62 79 20 57 68 65 72 65 45 6e 64  ated by WhereEnd
21760 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ()..    **.    *
21770 2a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  *        sqlite3
21780 57 68 65 72 65 42 65 67 69 6e 28 3c 74 65 72 6d  WhereBegin(<term
21790 3e 29 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  >).    **       
217a0 20 20 20 52 6f 77 53 65 74 54 65 73 74 20 20 20     RowSetTest   
217b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
217c0 20 49 6e 73 65 72 74 20 72 6f 77 69 64 20 69 6e   Insert rowid in
217d0 74 6f 20 72 6f 77 73 65 74 0a 20 20 20 20 2a 2a  to rowset.    **
217e0 20 20 20 20 20 20 20 20 20 20 47 6f 73 75 62 20            Gosub 
217f0 20 20 20 20 20 32 20 41 0a 20 20 20 20 2a 2a 20       2 A.    ** 
21800 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
21810 65 72 65 45 6e 64 28 29 0a 20 20 20 20 2a 2a 0a  ereEnd().    **.
21820 20 20 20 20 2a 2a 20 46 6f 6c 6c 6f 77 69 6e 67      ** Following
21830 20 74 68 65 20 61 62 6f 76 65 2c 20 63 6f 64 65   the above, code
21840 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68   to terminate th
21850 65 20 6c 6f 6f 70 2e 20 4c 61 62 65 6c 20 41 2c  e loop. Label A,
21860 20 74 68 65 20 74 61 72 67 65 74 0a 20 20 20 20   the target.    
21870 2a 2a 20 6f 66 20 74 68 65 20 47 6f 73 75 62 20  ** of the Gosub 
21880 61 62 6f 76 65 2c 20 6a 75 6d 70 73 20 74 6f 20  above, jumps to 
21890 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  the instruction 
218a0 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20  right after the 
218b0 47 6f 74 6f 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  Goto..    **.   
218c0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 4e 75 6c   **          Nul
218d0 6c 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20  l       1       
218e0 20 20 20 20 20 20 20 20 20 23 20 5a 65 72 6f 20           # Zero 
218f0 74 68 65 20 72 6f 77 73 65 74 20 69 6e 20 72 65  the rowset in re
21900 67 20 31 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  g 1.    **      
21910 20 20 20 20 47 6f 74 6f 20 20 20 20 20 20 20 42      Goto       B
21920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21930 23 20 54 68 65 20 6c 6f 6f 70 20 69 73 20 66 69  # The loop is fi
21940 6e 69 73 68 65 64 2e 0a 20 20 20 20 2a 2a 0a 20  nished..    **. 
21950 20 20 20 2a 2a 20 20 20 20 20 20 20 41 3a 20 3c     **       A: <
21960 6c 6f 6f 70 20 62 6f 64 79 3e 20 20 20 20 20 20  loop body>      
21970 20 20 20 20 20 20 20 20 20 20 20 23 20 52 65 74             # Ret
21980 75 72 6e 20 64 61 74 61 2c 20 77 68 61 74 65 76  urn data, whatev
21990 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  er..    **.    *
219a0 2a 20 20 20 20 20 20 20 20 20 20 52 65 74 75 72  *          Retur
219b0 6e 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20  n     2         
219c0 20 20 20 20 20 20 20 23 20 4a 75 6d 70 20 62 61         # Jump ba
219d0 63 6b 20 74 6f 20 74 68 65 20 47 6f 73 75 62 0a  ck to the Gosub.
219e0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
219f0 20 20 20 20 42 3a 20 3c 61 66 74 65 72 20 74 68      B: <after th
21a00 65 20 6c 6f 6f 70 3e 0a 20 20 20 20 2a 2a 0a 20  e loop>.    **. 
21a10 20 20 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 43     */.    WhereC
21a20 6c 61 75 73 65 20 2a 70 4f 72 57 63 3b 20 20 20  lause *pOrWc;   
21a30 20 2f 2a 20 54 68 65 20 4f 52 2d 63 6c 61 75 73   /* The OR-claus
21a40 65 20 62 72 6f 6b 65 6e 20 6f 75 74 20 69 6e 74  e broken out int
21a50 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20  o subterms */.  
21a60 20 20 53 72 63 4c 69 73 74 20 2a 70 4f 72 54 61    SrcList *pOrTa
21a70 62 3b 20 20 20 20 20 20 20 2f 2a 20 53 68 6f 72  b;       /* Shor
21a80 74 65 6e 65 64 20 74 61 62 6c 65 20 6c 69 73 74  tened table list
21a90 20 6f 72 20 4f 52 2d 63 6c 61 75 73 65 20 67 65   or OR-clause ge
21aa0 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  neration */.    
21ab0 49 6e 64 65 78 20 2a 70 43 6f 76 20 3d 20 30 3b  Index *pCov = 0;
21ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21ad0 50 6f 74 65 6e 74 69 61 6c 20 63 6f 76 65 72 69  Potential coveri
21ae0 6e 67 20 69 6e 64 65 78 20 28 6f 72 20 4e 55 4c  ng index (or NUL
21af0 4c 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43  L) */.    int iC
21b00 6f 76 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e  ovCur = pParse->
21b10 6e 54 61 62 2b 2b 3b 20 20 2f 2a 20 43 75 72 73  nTab++;  /* Curs
21b20 6f 72 20 75 73 65 64 20 66 6f 72 20 69 6e 64 65  or used for inde
21b30 78 20 73 63 61 6e 73 20 28 69 66 20 61 6e 79 29  x scans (if any)
21b40 20 2a 2f 0a 0a 20 20 20 20 69 6e 74 20 72 65 67   */..    int reg
21b50 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73  Return = ++pPars
21b60 65 2d 3e 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20  e->nMem;        
21b70 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 75     /* Register u
21b80 73 65 64 20 77 69 74 68 20 4f 50 5f 47 6f 73 75  sed with OP_Gosu
21b90 62 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67  b */.    int reg
21ba0 52 6f 77 73 65 74 20 3d 20 30 3b 20 20 20 20 20  Rowset = 0;     
21bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21bc0 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66     /* Register f
21bd0 6f 72 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74  or RowSet object
21be0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 52   */.    int regR
21bf0 6f 77 69 64 20 3d 20 30 3b 20 20 20 20 20 20 20  owid = 0;       
21c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c10 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
21c20 6c 64 69 6e 67 20 72 6f 77 69 64 20 2a 2f 0a 20  lding rowid */. 
21c30 20 20 20 69 6e 74 20 69 4c 6f 6f 70 42 6f 64 79     int iLoopBody
21c40 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
21c50 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a 20  keLabel(v);  /* 
21c60 53 74 61 72 74 20 6f 66 20 6c 6f 6f 70 20 62 6f  Start of loop bo
21c70 64 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 52  dy */.    int iR
21c80 65 74 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20  etInit;         
21c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ca0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
21cb0 66 20 72 65 67 52 65 74 75 72 6e 20 69 6e 69 74  f regReturn init
21cc0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 6e 74 65   */.    int unte
21cd0 73 74 65 64 54 65 72 6d 73 20 3d 20 30 3b 20 20  stedTerms = 0;  
21ce0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f             /* So
21cf0 6d 65 20 74 65 72 6d 73 20 6e 6f 74 20 63 6f 6d  me terms not com
21d00 70 6c 65 74 65 6c 79 20 74 65 73 74 65 64 20 2a  pletely tested *
21d10 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20  /.    int ii;   
21d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d30 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
21d40 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
21d50 45 78 70 72 20 2a 70 41 6e 64 45 78 70 72 20 3d  Expr *pAndExpr =
21d60 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
21d70 20 20 20 2f 2a 20 41 6e 20 22 2e 2e 20 41 4e 44     /* An ".. AND
21d80 20 28 2e 2e 2e 29 22 20 65 78 70 72 65 73 73 69   (...)" expressi
21d90 6f 6e 20 2a 2f 0a 20 20 20 0a 20 20 20 20 70 54  on */.   .    pT
21da0 65 72 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54  erm = pLoop->aLT
21db0 65 72 6d 5b 30 5d 3b 0a 20 20 20 20 61 73 73 65  erm[0];.    asse
21dc0 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a  rt( pTerm!=0 );.
21dd0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
21de0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
21df0 4f 5f 4f 52 20 29 3b 0a 20 20 20 20 61 73 73 65  O_OR );.    asse
21e00 72 74 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c  rt( (pTerm->wtFl
21e10 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46  ags & TERM_ORINF
21e20 4f 29 21 3d 30 20 29 3b 0a 20 20 20 20 70 4f 72  O)!=0 );.    pOr
21e30 57 63 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70  Wc = &pTerm->u.p
21e40 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20  OrInfo->wc;.    
21e50 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
21e60 52 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c 65 76  Return;.    pLev
21e70 65 6c 2d 3e 70 31 20 3d 20 72 65 67 52 65 74 75  el->p1 = regRetu
21e80 72 6e 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20  rn;..    /* Set 
21e90 75 70 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74  up a new SrcList
21ea0 20 69 6e 20 70 4f 72 54 61 62 20 63 6f 6e 74 61   in pOrTab conta
21eb0 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20  ining the table 
21ec0 62 65 69 6e 67 20 73 63 61 6e 6e 65 64 0a 20 20  being scanned.  
21ed0 20 20 2a 2a 20 62 79 20 74 68 69 73 20 6c 6f 6f    ** by this loo
21ee0 70 20 69 6e 20 74 68 65 20 61 5b 30 5d 20 73 6c  p in the a[0] sl
21ef0 6f 74 20 61 6e 64 20 61 6c 6c 20 6e 6f 74 52 65  ot and all notRe
21f00 61 64 79 20 74 61 62 6c 65 73 20 69 6e 20 61 5b  ady tables in a[
21f10 31 2e 2e 5d 20 73 6c 6f 74 73 2e 0a 20 20 20 20  1..] slots..    
21f20 2a 2a 20 54 68 69 73 20 62 65 63 6f 6d 65 73 20  ** This becomes 
21f30 74 68 65 20 53 72 63 4c 69 73 74 20 69 6e 20 74  the SrcList in t
21f40 68 65 20 72 65 63 75 72 73 69 76 65 20 63 61 6c  he recursive cal
21f50 6c 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72  l to sqlite3Wher
21f60 65 42 65 67 69 6e 28 29 2e 0a 20 20 20 20 2a 2f  eBegin()..    */
21f70 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  .    if( pWInfo-
21f80 3e 6e 4c 65 76 65 6c 3e 31 20 29 7b 0a 20 20 20  >nLevel>1 ){.   
21f90 20 20 20 69 6e 74 20 6e 4e 6f 74 52 65 61 64 79     int nNotReady
21fa0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21fb0 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
21fc0 6f 66 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c  of notReady tabl
21fd0 65 73 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75  es */.      stru
21fe0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
21ff0 2a 6f 72 69 67 53 72 63 3b 20 20 20 20 20 2f 2a  *origSrc;     /*
22000 20 4f 72 69 67 69 6e 61 6c 20 6c 69 73 74 20 6f   Original list o
22010 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20  f tables */.    
22020 20 20 6e 4e 6f 74 52 65 61 64 79 20 3d 20 70 57    nNotReady = pW
22030 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 2d 20 69  Info->nLevel - i
22040 4c 65 76 65 6c 20 2d 20 31 3b 0a 20 20 20 20 20  Level - 1;.     
22050 20 70 4f 72 54 61 62 20 3d 20 73 71 6c 69 74 65   pOrTab = sqlite
22060 33 53 74 61 63 6b 41 6c 6c 6f 63 52 61 77 28 64  3StackAllocRaw(d
22070 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
22080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
22090 69 7a 65 6f 66 28 2a 70 4f 72 54 61 62 29 2b 20  izeof(*pOrTab)+ 
220a0 6e 4e 6f 74 52 65 61 64 79 2a 73 69 7a 65 6f 66  nNotReady*sizeof
220b0 28 70 4f 72 54 61 62 2d 3e 61 5b 30 5d 29 29 3b  (pOrTab->a[0]));
220c0 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 61  .      if( pOrTa
220d0 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 6e 6f  b==0 ) return no
220e0 74 52 65 61 64 79 3b 0a 20 20 20 20 20 20 70 4f  tReady;.      pO
220f0 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 28  rTab->nAlloc = (
22100 75 38 29 28 6e 4e 6f 74 52 65 61 64 79 20 2b 20  u8)(nNotReady + 
22110 31 29 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62  1);.      pOrTab
22120 2d 3e 6e 53 72 63 20 3d 20 70 4f 72 54 61 62 2d  ->nSrc = pOrTab-
22130 3e 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 6d  >nAlloc;.      m
22140 65 6d 63 70 79 28 70 4f 72 54 61 62 2d 3e 61 2c  emcpy(pOrTab->a,
22150 20 70 54 61 62 49 74 65 6d 2c 20 73 69 7a 65 6f   pTabItem, sizeo
22160 66 28 2a 70 54 61 62 49 74 65 6d 29 29 3b 0a 20  f(*pTabItem));. 
22170 20 20 20 20 20 6f 72 69 67 53 72 63 20 3d 20 70       origSrc = p
22180 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
22190 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d  >a;.      for(k=
221a0 31 3b 20 6b 3c 3d 6e 4e 6f 74 52 65 61 64 79 3b  1; k<=nNotReady;
221b0 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d   k++){.        m
221c0 65 6d 63 70 79 28 26 70 4f 72 54 61 62 2d 3e 61  emcpy(&pOrTab->a
221d0 5b 6b 5d 2c 20 26 6f 72 69 67 53 72 63 5b 70 4c  [k], &origSrc[pL
221e0 65 76 65 6c 5b 6b 5d 2e 69 46 72 6f 6d 5d 2c 20  evel[k].iFrom], 
221f0 73 69 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e 61  sizeof(pOrTab->a
22200 5b 6b 5d 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  [k]));.      }. 
22210 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22220 70 4f 72 54 61 62 20 3d 20 70 57 49 6e 66 6f 2d  pOrTab = pWInfo-
22230 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 7d  >pTabList;.    }
22240 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  ..    /* Initial
22250 69 7a 65 20 74 68 65 20 72 6f 77 73 65 74 20 72  ize the rowset r
22260 65 67 69 73 74 65 72 20 74 6f 20 63 6f 6e 74 61  egister to conta
22270 69 6e 20 4e 55 4c 4c 2e 20 41 6e 20 53 51 4c 20  in NULL. An SQL 
22280 4e 55 4c 4c 20 69 73 20 0a 20 20 20 20 2a 2a 20  NULL is .    ** 
22290 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 61 6e  equivalent to an
222a0 20 65 6d 70 74 79 20 72 6f 77 73 65 74 2e 0a 20   empty rowset.. 
222b0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73     **.    ** Als
222c0 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 72 65 67  o initialize reg
222d0 52 65 74 75 72 6e 20 74 6f 20 63 6f 6e 74 61 69  Return to contai
222e0 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  n the address of
222f0 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e   the instruction
22300 20 0a 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61   .    ** immedia
22310 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  tely following t
22320 68 65 20 4f 50 5f 52 65 74 75 72 6e 20 61 74 20  he OP_Return at 
22330 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68  the bottom of th
22340 65 20 6c 6f 6f 70 2e 20 54 68 69 73 0a 20 20 20  e loop. This.   
22350 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 20   ** is required 
22360 69 6e 20 61 20 66 65 77 20 6f 62 73 63 75 72 65  in a few obscure
22370 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 73 65 73   LEFT JOIN cases
22380 20 77 68 65 72 65 20 63 6f 6e 74 72 6f 6c 20 6a   where control j
22390 75 6d 70 73 0a 20 20 20 20 2a 2a 20 6f 76 65 72  umps.    ** over
223a0 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   the top of the 
223b0 6c 6f 6f 70 20 69 6e 74 6f 20 74 68 65 20 62 6f  loop into the bo
223c0 64 79 20 6f 66 20 69 74 2e 20 49 6e 20 74 68 69  dy of it. In thi
223d0 73 20 63 61 73 65 20 74 68 65 20 0a 20 20 20 20  s case the .    
223e0 2a 2a 20 63 6f 72 72 65 63 74 20 72 65 73 70 6f  ** correct respo
223f0 6e 73 65 20 66 6f 72 20 74 68 65 20 65 6e 64 2d  nse for the end-
22400 6f 66 2d 6c 6f 6f 70 20 63 6f 64 65 20 28 74 68  of-loop code (th
22410 65 20 4f 50 5f 52 65 74 75 72 6e 29 20 69 73 20  e OP_Return) is 
22420 74 6f 20 0a 20 20 20 20 2a 2a 20 66 61 6c 6c 20  to .    ** fall 
22430 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e  through to the n
22440 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c  ext instruction,
22450 20 6a 75 73 74 20 61 73 20 61 6e 20 4f 50 5f 4e   just as an OP_N
22460 65 78 74 20 64 6f 65 73 20 69 66 0a 20 20 20 20  ext does if.    
22470 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20  ** called on an 
22480 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 75  uninitialized cu
22490 72 73 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rsor..    */.   
224a0 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63   if( (pWInfo->wc
224b0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
224c0 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29 3d  _DUPLICATES_OK)=
224d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 67 52  =0 ){.      regR
224e0 6f 77 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65  owset = ++pParse
224f0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65  ->nMem;.      re
22500 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73  gRowid = ++pPars
22510 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73  e->nMem;.      s
22520 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
22530 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
22540 72 65 67 52 6f 77 73 65 74 29 3b 0a 20 20 20 20  regRowset);.    
22550 7d 0a 20 20 20 20 69 52 65 74 49 6e 69 74 20 3d  }.    iRetInit =
22560 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
22570 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
22580 2c 20 30 2c 20 72 65 67 52 65 74 75 72 6e 29 3b  , 0, regReturn);
22590 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
225a0 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20 63  original WHERE c
225b0 6c 61 75 73 65 20 69 73 20 7a 20 6f 66 20 74 68  lause is z of th
225c0 65 20 66 6f 72 6d 3a 20 20 28 78 31 20 4f 52 20  e form:  (x1 OR 
225d0 78 32 20 4f 52 20 2e 2e 2e 29 20 41 4e 44 20 79  x2 OR ...) AND y
225e0 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20 66 6f 72  .    ** Then for
225f0 20 65 76 65 72 79 20 74 65 72 6d 20 78 4e 2c 20   every term xN, 
22600 65 76 61 6c 75 61 74 65 20 61 73 20 74 68 65 20  evaluate as the 
22610 73 75 62 65 78 70 72 65 73 73 69 6f 6e 3a 20 78  subexpression: x
22620 4e 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 20 54  N AND z.    ** T
22630 68 61 74 20 77 61 79 2c 20 74 65 72 6d 73 20 69  hat way, terms i
22640 6e 20 79 20 74 68 61 74 20 61 72 65 20 66 61 63  n y that are fac
22650 74 6f 72 65 64 20 69 6e 74 6f 20 74 68 65 20 64  tored into the d
22660 69 73 6a 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 0a  isjunction will.
22670 20 20 20 20 2a 2a 20 62 65 20 70 69 63 6b 65 64      ** be picked
22680 20 75 70 20 62 79 20 74 68 65 20 72 65 63 75 72   up by the recur
22690 73 69 76 65 20 63 61 6c 6c 73 20 74 6f 20 73 71  sive calls to sq
226a0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
226b0 29 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a 0a  ) below..    **.
226c0 20 20 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c      ** Actually,
226d0 20 65 61 63 68 20 73 75 62 65 78 70 72 65 73 73   each subexpress
226e0 69 6f 6e 20 69 73 20 63 6f 6e 76 65 72 74 65 64  ion is converted
226f0 20 74 6f 20 22 78 4e 20 41 4e 44 20 77 22 20 77   to "xN AND w" w
22700 68 65 72 65 20 77 20 69 73 0a 20 20 20 20 2a 2a  here w is.    **
22710 20 74 68 65 20 22 69 6e 74 65 72 65 73 74 69 6e   the "interestin
22720 67 22 20 74 65 72 6d 73 20 6f 66 20 7a 20 2d 20  g" terms of z - 
22730 74 65 72 6d 73 20 74 68 61 74 20 64 69 64 20 6e  terms that did n
22740 6f 74 20 6f 72 69 67 69 6e 61 74 65 20 69 6e 20  ot originate in 
22750 74 68 65 0a 20 20 20 20 2a 2a 20 4f 4e 20 6f 72  the.    ** ON or
22760 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
22770 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 61 6e   a LEFT JOIN, an
22780 64 20 74 65 72 6d 73 20 74 68 61 74 20 61 72 65  d terms that are
22790 20 75 73 61 62 6c 65 20 61 73 20 0a 20 20 20 20   usable as .    
227a0 2a 2a 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20  ** indices..    
227b0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 6f  **.    ** This o
227c0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 61 6c 73 6f  ptimization also
227d0 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 69 66   only applies if
227e0 20 74 68 65 20 28 78 31 20 4f 52 20 78 32 20 4f   the (x1 OR x2 O
227f0 52 20 2e 2e 2e 29 20 74 65 72 6d 0a 20 20 20 20  R ...) term.    
22800 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69  ** is not contai
22810 6e 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c  ned in the ON cl
22820 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a  ause of a LEFT J
22830 4f 49 4e 2e 0a 20 20 20 20 2a 2a 20 53 65 65 20  OIN..    ** See 
22840 74 69 63 6b 65 74 20 68 74 74 70 3a 2f 2f 77 77  ticket http://ww
22850 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63  w.sqlite.org/src
22860 2f 69 6e 66 6f 2f 66 32 33 36 39 33 30 34 65 34  /info/f2369304e4
22870 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
22880 70 57 43 2d 3e 6e 54 65 72 6d 3e 31 20 29 7b 0a  pWC->nTerm>1 ){.
22890 20 20 20 20 20 20 69 6e 74 20 69 54 65 72 6d 3b        int iTerm;
228a0 0a 20 20 20 20 20 20 66 6f 72 28 69 54 65 72 6d  .      for(iTerm
228b0 3d 30 3b 20 69 54 65 72 6d 3c 70 57 43 2d 3e 6e  =0; iTerm<pWC->n
228c0 54 65 72 6d 3b 20 69 54 65 72 6d 2b 2b 29 7b 0a  Term; iTerm++){.
228d0 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
228e0 78 70 72 20 3d 20 70 57 43 2d 3e 61 5b 69 54 65  xpr = pWC->a[iTe
228f0 72 6d 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm].pExpr;.     
22900 20 20 20 69 66 28 20 26 70 57 43 2d 3e 61 5b 69     if( &pWC->a[i
22910 54 65 72 6d 5d 20 3d 3d 20 70 54 65 72 6d 20 29  Term] == pTerm )
22920 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
22930 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
22940 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
22950 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 63 6f 6e  _FromJoin) ) con
22960 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
22970 66 28 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d  f( pWC->a[iTerm]
22980 2e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d  .wtFlags & (TERM
22990 5f 4f 52 49 4e 46 4f 29 20 29 20 63 6f 6e 74 69  _ORINFO) ) conti
229a0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
229b0 20 28 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e   (pWC->a[iTerm].
229c0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41  eOperator & WO_A
229d0 4c 4c 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  LL)==0 ) continu
229e0 65 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  e;.        pExpr
229f0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
22a00 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b  p(db, pExpr, 0);
22a10 0a 20 20 20 20 20 20 20 20 70 41 6e 64 45 78 70  .        pAndExp
22a20 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  r = sqlite3ExprA
22a30 6e 64 28 64 62 2c 20 70 41 6e 64 45 78 70 72 2c  nd(db, pAndExpr,
22a40 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d   pExpr);.      }
22a50 0a 20 20 20 20 20 20 69 66 28 20 70 41 6e 64 45  .      if( pAndE
22a60 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70  xpr ){.        p
22a70 41 6e 64 45 78 70 72 20 3d 20 73 71 6c 69 74 65  AndExpr = sqlite
22a80 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
22a90 4b 5f 41 4e 44 2c 20 30 2c 20 70 41 6e 64 45 78  K_AND, 0, pAndEx
22aa0 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  pr, 0);.      }.
22ab0 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69      }..    for(i
22ac0 69 3d 30 3b 20 69 69 3c 70 4f 72 57 63 2d 3e 6e  i=0; ii<pOrWc->n
22ad0 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Term; ii++){.   
22ae0 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f     WhereTerm *pO
22af0 72 54 65 72 6d 20 3d 20 26 70 4f 72 57 63 2d 3e  rTerm = &pOrWc->
22b00 61 5b 69 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  a[ii];.      if(
22b10 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75   pOrTerm->leftCu
22b20 72 73 6f 72 3d 3d 69 43 75 72 20 7c 7c 20 28 70  rsor==iCur || (p
22b30 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
22b40 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20 29  r & WO_AND)!=0 )
22b50 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 49  {.        WhereI
22b60 6e 66 6f 20 2a 70 53 75 62 57 49 6e 66 6f 3b 20  nfo *pSubWInfo; 
22b70 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f           /* Info
22b80 20 66 6f 72 20 73 69 6e 67 6c 65 20 4f 52 2d 74   for single OR-t
22b90 65 72 6d 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20  erm scan */.    
22ba0 20 20 20 20 45 78 70 72 20 2a 70 4f 72 45 78 70      Expr *pOrExp
22bb0 72 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78  r = pOrTerm->pEx
22bc0 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  pr;.        if( 
22bd0 70 41 6e 64 45 78 70 72 20 26 26 20 21 45 78 70  pAndExpr && !Exp
22be0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4f 72  rHasProperty(pOr
22bf0 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
22c00 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  n) ){.          
22c10 70 41 6e 64 45 78 70 72 2d 3e 70 4c 65 66 74 20  pAndExpr->pLeft 
22c20 3d 20 70 4f 72 45 78 70 72 3b 0a 20 20 20 20 20  = pOrExpr;.     
22c30 20 20 20 20 20 70 4f 72 45 78 70 72 20 3d 20 70       pOrExpr = p
22c40 41 6e 64 45 78 70 72 3b 0a 20 20 20 20 20 20 20  AndExpr;.       
22c50 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f   }.        /* Lo
22c60 6f 70 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65  op through table
22c70 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 6d 61   entries that ma
22c80 74 63 68 20 74 65 72 6d 20 70 4f 72 54 65 72 6d  tch term pOrTerm
22c90 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 53 75  . */.        pSu
22ca0 62 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  bWInfo = sqlite3
22cb0 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73  WhereBegin(pPars
22cc0 65 2c 20 70 4f 72 54 61 62 2c 20 70 4f 72 45 78  e, pOrTab, pOrEx
22cd0 70 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  pr, 0, 0,.      
22ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22cf0 20 20 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45    WHERE_OMIT_OPE
22d00 4e 5f 43 4c 4f 53 45 20 7c 20 57 48 45 52 45 5f  N_CLOSE | WHERE_
22d10 41 4e 44 5f 4f 4e 4c 59 20 7c 0a 20 20 20 20 20  AND_ONLY |.     
22d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d30 20 20 20 57 48 45 52 45 5f 46 4f 52 43 45 5f 54     WHERE_FORCE_T
22d40 41 42 4c 45 20 7c 20 57 48 45 52 45 5f 4f 4e 45  ABLE | WHERE_ONE
22d50 54 41 42 4c 45 5f 4f 4e 4c 59 2c 20 69 43 6f 76  TABLE_ONLY, iCov
22d60 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73  Cur);.        as
22d70 73 65 72 74 28 20 70 53 75 62 57 49 6e 66 6f 20  sert( pSubWInfo 
22d80 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
22d90 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
22da0 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 69  led );.        i
22db0 66 28 20 70 53 75 62 57 49 6e 66 6f 20 29 7b 0a  f( pSubWInfo ){.
22dc0 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65 4c            WhereL
22dd0 6f 6f 70 20 2a 70 53 75 62 4c 6f 6f 70 3b 0a 20  oop *pSubLoop;. 
22de0 20 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e           explain
22df0 4f 6e 65 53 63 61 6e 28 0a 20 20 20 20 20 20 20  OneScan(.       
22e00 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70         pParse, p
22e10 4f 72 54 61 62 2c 20 26 70 53 75 62 57 49 6e 66  OrTab, &pSubWInf
22e20 6f 2d 3e 61 5b 30 5d 2c 20 69 4c 65 76 65 6c 2c  o->a[0], iLevel,
22e30 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20   pLevel->iFrom, 
22e40 30 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  0.          );. 
22e50 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 57           if( (pW
22e60 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
22e70 20 26 20 57 48 45 52 45 5f 44 55 50 4c 49 43 41   & WHERE_DUPLICA
22e80 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20  TES_OK)==0 ){.  
22e90 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 53            int iS
22ea0 65 74 20 3d 20 28 28 69 69 3d 3d 70 4f 72 57 63  et = ((ii==pOrWc
22eb0 2d 3e 6e 54 65 72 6d 2d 31 29 3f 2d 31 3a 69 69  ->nTerm-1)?-1:ii
22ec0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
22ed0 6e 74 20 72 3b 0a 20 20 20 20 20 20 20 20 20 20  nt r;.          
22ee0 20 20 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70    r = sqlite3Exp
22ef0 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70  rCodeGetColumn(p
22f00 50 61 72 73 65 2c 20 70 54 61 62 49 74 65 6d 2d  Parse, pTabItem-
22f10 3e 70 54 61 62 2c 20 2d 31 2c 20 69 43 75 72 2c  >pTab, -1, iCur,
22f20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
22f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f40 20 20 20 20 20 20 20 20 20 20 20 72 65 67 52 6f             regRo
22f50 77 69 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  wid, 0);.       
22f60 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
22f70 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
22f80 52 6f 77 53 65 74 54 65 73 74 2c 20 72 65 67 52  RowSetTest, regR
22f90 6f 77 73 65 74 2c 0a 20 20 20 20 20 20 20 20 20  owset,.         
22fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
22fc0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
22fd0 29 2b 32 2c 20 72 2c 20 69 53 65 74 29 3b 0a 20  )+2, r, iSet);. 
22fe0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
22ff0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
23000 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
23010 75 62 2c 20 72 65 67 52 65 74 75 72 6e 2c 20 69  ub, regReturn, i
23020 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20 20  LoopBody);..    
23030 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 53 75        /* The pSu
23040 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64  bWInfo->untested
23050 54 65 72 6d 73 20 66 6c 61 67 20 6d 65 61 6e 73  Terms flag means
23060 20 74 68 61 74 20 74 68 69 73 20 4f 52 20 74 65   that this OR te
23070 72 6d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  rm.          ** 
23080 63 6f 6e 74 61 69 6e 65 64 20 6f 6e 65 20 6f 72  contained one or
23090 20 6d 6f 72 65 20 41 4e 44 20 74 65 72 6d 20 66   more AND term f
230a0 72 6f 6d 20 61 20 6e 6f 74 52 65 61 64 79 20 74  rom a notReady t
230b0 61 62 6c 65 2e 20 20 54 68 65 0a 20 20 20 20 20  able.  The.     
230c0 20 20 20 20 20 2a 2a 20 74 65 72 6d 73 20 66 72       ** terms fr
230d0 6f 6d 20 74 68 65 20 6e 6f 74 52 65 61 64 79 20  om the notReady 
230e0 74 61 62 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20  table could not 
230f0 62 65 20 74 65 73 74 65 64 20 61 6e 64 20 77 69  be tested and wi
23100 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ll.          ** 
23110 6e 65 65 64 20 74 6f 20 62 65 20 74 65 73 74 65  need to be teste
23120 64 20 6c 61 74 65 72 2e 0a 20 20 20 20 20 20 20  d later..       
23130 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
23140 69 66 28 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75  if( pSubWInfo->u
23150 6e 74 65 73 74 65 64 54 65 72 6d 73 20 29 20 75  ntestedTerms ) u
23160 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d 20 31  ntestedTerms = 1
23170 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;..          /* 
23180 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 4f 52  If all of the OR
23190 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 73  -connected terms
231a0 20 61 72 65 20 6f 70 74 69 6d 69 7a 65 64 20 75   are optimized u
231b0 73 69 6e 67 20 74 68 65 20 73 61 6d 65 0a 20 20  sing the same.  
231c0 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78          ** index
231d0 2c 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20  , and the index 
231e0 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20  is opened using 
231f0 74 68 65 20 73 61 6d 65 20 63 75 72 73 6f 72 20  the same cursor 
23200 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 20 20 20  number.         
23210 20 2a 2a 20 62 79 20 65 61 63 68 20 63 61 6c 6c   ** by each call
23220 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
23230 42 65 67 69 6e 28 29 20 6d 61 64 65 20 62 79 20  Begin() made by 
23240 74 68 69 73 20 6c 6f 6f 70 2c 20 69 74 20 6d 61  this loop, it ma
23250 79 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  y.          ** b
23260 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73  e possible to us
23270 65 20 74 68 61 74 20 69 6e 64 65 78 20 61 73 20  e that index as 
23280 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  a covering index
23290 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20  ..          **. 
232a0 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74           ** If t
232b0 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
232c0 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 61  e3WhereBegin() a
232d0 62 6f 76 65 20 72 65 73 75 6c 74 65 64 20 69 6e  bove resulted in
232e0 20 61 20 73 63 61 6e 20 74 68 61 74 0a 20 20 20   a scan that.   
232f0 20 20 20 20 20 20 20 2a 2a 20 75 73 65 73 20 61         ** uses a
23300 6e 20 69 6e 64 65 78 2c 20 61 6e 64 20 74 68 69  n index, and thi
23310 73 20 69 73 20 65 69 74 68 65 72 20 74 68 65 20  s is either the 
23320 66 69 72 73 74 20 4f 52 2d 63 6f 6e 6e 65 63 74  first OR-connect
23330 65 64 20 74 65 72 6d 0a 20 20 20 20 20 20 20 20  ed term.        
23340 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 6f    ** processed o
23350 72 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 74  r the index is t
23360 68 65 20 73 61 6d 65 20 61 73 20 74 68 61 74 20  he same as that 
23370 75 73 65 64 20 62 79 20 61 6c 6c 20 70 72 65 76  used by all prev
23380 69 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ious.          *
23390 2a 20 74 65 72 6d 73 2c 20 73 65 74 20 70 43 6f  * terms, set pCo
233a0 76 20 74 6f 20 74 68 65 20 63 61 6e 64 69 64 61  v to the candida
233b0 74 65 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  te covering inde
233c0 78 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65  x. Otherwise, se
233d0 74 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  t .          ** 
233e0 70 43 6f 76 20 74 6f 20 4e 55 4c 4c 20 74 6f 20  pCov to NULL to 
233f0 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 6e 6f  indicate that no
23400 20 63 61 6e 64 69 64 61 74 65 20 63 6f 76 65 72   candidate cover
23410 69 6e 67 20 69 6e 64 65 78 20 77 69 6c 6c 20 0a  ing index will .
23420 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20            ** be 
23430 61 76 61 69 6c 61 62 6c 65 2e 0a 20 20 20 20 20  available..     
23440 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
23450 20 20 70 53 75 62 4c 6f 6f 70 20 3d 20 70 53 75    pSubLoop = pSu
23460 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c  bWInfo->a[0].pWL
23470 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 61  oop;.          a
23480 73 73 65 72 74 28 20 28 70 53 75 62 4c 6f 6f 70  ssert( (pSubLoop
23490 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
234a0 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 3d 3d 30  E_AUTO_INDEX)==0
234b0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
234c0 28 20 28 70 53 75 62 4c 6f 6f 70 2d 3e 77 73 46  ( (pSubLoop->wsF
234d0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
234e0 45 58 45 44 29 21 3d 30 0a 20 20 20 20 20 20 20  EXED)!=0.       
234f0 20 20 20 20 26 26 20 28 69 69 3d 3d 30 20 7c 7c      && (ii==0 ||
23500 20 70 53 75 62 4c 6f 6f 70 2d 3e 75 2e 62 74 72   pSubLoop->u.btr
23510 65 65 2e 70 49 6e 64 65 78 3d 3d 70 43 6f 76 29  ee.pIndex==pCov)
23520 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
23530 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
23540 28 20 70 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30  ( pSubWInfo->a[0
23550 5d 2e 69 49 64 78 43 75 72 3d 3d 69 43 6f 76 43  ].iIdxCur==iCovC
23560 75 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ur );.          
23570 20 20 70 43 6f 76 20 3d 20 70 53 75 62 4c 6f 6f    pCov = pSubLoo
23580 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
23590 78 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  x;.          }el
235a0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
235b0 70 43 6f 76 20 3d 20 30 3b 0a 20 20 20 20 20 20  pCov = 0;.      
235c0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
235d0 20 2f 2a 20 46 69 6e 69 73 68 20 74 68 65 20 6c   /* Finish the l
235e0 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 61 62 6c  oop through tabl
235f0 65 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 6d  e entries that m
23600 61 74 63 68 20 74 65 72 6d 20 70 4f 72 54 65 72  atch term pOrTer
23610 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  m. */.          
23620 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
23630 70 53 75 62 57 49 6e 66 6f 29 3b 0a 20 20 20 20  pSubWInfo);.    
23640 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
23650 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e    }.    pLevel->
23660 75 2e 70 43 6f 76 69 64 78 20 3d 20 70 43 6f 76  u.pCovidx = pCov
23670 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 76 20 29  ;.    if( pCov )
23680 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
23690 20 3d 20 69 43 6f 76 43 75 72 3b 0a 20 20 20 20   = iCovCur;.    
236a0 69 66 28 20 70 41 6e 64 45 78 70 72 20 29 7b 0a  if( pAndExpr ){.
236b0 20 20 20 20 20 20 70 41 6e 64 45 78 70 72 2d 3e        pAndExpr->
236c0 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 20  pLeft = 0;.     
236d0 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
236e0 74 65 28 64 62 2c 20 70 41 6e 64 45 78 70 72 29  te(db, pAndExpr)
236f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
23700 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28  te3VdbeChangeP1(
23710 76 2c 20 69 52 65 74 49 6e 69 74 2c 20 73 71 6c  v, iRetInit, sql
23720 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
23730 64 64 72 28 76 29 29 3b 0a 20 20 20 20 73 71 6c  ddr(v));.    sql
23740 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
23750 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c  , OP_Goto, 0, pL
23760 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a  evel->addrBrk);.
23770 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
23780 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
23790 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20 20  LoopBody);..    
237a0 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  if( pWInfo->nLev
237b0 65 6c 3e 31 20 29 20 73 71 6c 69 74 65 33 53 74  el>1 ) sqlite3St
237c0 61 63 6b 46 72 65 65 28 64 62 2c 20 70 4f 72 54  ackFree(db, pOrT
237d0 61 62 29 3b 0a 20 20 20 20 69 66 28 20 21 75 6e  ab);.    if( !un
237e0 74 65 73 74 65 64 54 65 72 6d 73 20 29 20 64 69  testedTerms ) di
237f0 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
23800 2c 20 70 54 65 72 6d 29 3b 0a 20 20 7d 65 6c 73  , pTerm);.  }els
23810 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  e.#endif /* SQLI
23820 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
23830 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 20 20 7b 0a  IZATION */..  {.
23840 20 20 20 20 2f 2a 20 43 61 73 65 20 36 3a 20 20      /* Case 6:  
23850 54 68 65 72 65 20 69 73 20 6e 6f 20 75 73 61 62  There is no usab
23860 6c 65 20 69 6e 64 65 78 2e 20 20 57 65 20 6d 75  le index.  We mu
23870 73 74 20 64 6f 20 61 20 63 6f 6d 70 6c 65 74 65  st do a complete
23880 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
23890 20 73 63 61 6e 20 6f 66 20 74 68 65 20 65 6e 74   scan of the ent
238a0 69 72 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  ire table..    *
238b0 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  /.    static con
238c0 73 74 20 75 38 20 61 53 74 65 70 5b 5d 20 3d 20  st u8 aStep[] = 
238d0 7b 20 4f 50 5f 4e 65 78 74 2c 20 4f 50 5f 50 72  { OP_Next, OP_Pr
238e0 65 76 20 7d 3b 0a 20 20 20 20 73 74 61 74 69 63  ev };.    static
238f0 20 63 6f 6e 73 74 20 75 38 20 61 53 74 61 72 74   const u8 aStart
23900 5b 5d 20 3d 20 7b 20 4f 50 5f 52 65 77 69 6e 64  [] = { OP_Rewind
23910 2c 20 4f 50 5f 4c 61 73 74 20 7d 3b 0a 20 20 20  , OP_Last };.   
23920 20 61 73 73 65 72 74 28 20 62 52 65 76 3d 3d 30   assert( bRev==0
23930 20 7c 7c 20 62 52 65 76 3d 3d 31 20 29 3b 0a 20   || bRev==1 );. 
23940 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
23950 61 53 74 65 70 5b 62 52 65 76 5d 3b 0a 20 20 20  aStep[bRev];.   
23960 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43   pLevel->p1 = iC
23970 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ur;.    pLevel->
23980 70 32 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33  p2 = 1 + sqlite3
23990 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 61 53  VdbeAddOp2(v, aS
239a0 74 61 72 74 5b 62 52 65 76 5d 2c 20 69 43 75 72  tart[bRev], iCur
239b0 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20  , addrBrk);.    
239c0 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c  pLevel->p5 = SQL
239d0 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46  ITE_STMTSTATUS_F
239e0 55 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20  ULLSCAN_STEP;.  
239f0 7d 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 63  }..  /* Insert c
23a00 6f 64 65 20 74 6f 20 74 65 73 74 20 65 76 65 72  ode to test ever
23a10 79 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  y subexpression 
23a20 74 68 61 74 20 63 61 6e 20 62 65 20 63 6f 6d 70  that can be comp
23a30 6c 65 74 65 6c 79 0a 20 20 2a 2a 20 63 6f 6d 70  letely.  ** comp
23a40 75 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 63  uted using the c
23a50 75 72 72 65 6e 74 20 73 65 74 20 6f 66 20 74 61  urrent set of ta
23a60 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  bles..  */.  for
23a70 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a  (pTerm=pWC->a, j
23a80 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30  =pWC->nTerm; j>0
23a90 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; j--, pTerm++){
23aa0 0a 20 20 20 20 45 78 70 72 20 2a 70 45 3b 0a 20  .    Expr *pE;. 
23ab0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
23ac0 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
23ad0 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20  RM_VIRTUAL );.  
23ae0 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
23af0 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
23b00 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20 20 69  M_CODED );.    i
23b10 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  f( pTerm->wtFlag
23b20 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41  s & (TERM_VIRTUA
23b30 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20  L|TERM_CODED) ) 
23b40 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
23b50 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
23b60 41 6c 6c 20 26 20 70 4c 65 76 65 6c 2d 3e 6e 6f  All & pLevel->no
23b70 74 52 65 61 64 79 29 21 3d 30 20 29 7b 0a 20 20  tReady)!=0 ){.  
23b80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 57      testcase( pW
23b90 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65  Info->untestedTe
23ba0 72 6d 73 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  rms==0.         
23bb0 20 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f        && (pWInfo
23bc0 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
23bd0 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ONETABLE_ON
23be0 4c 59 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  LY)!=0 );.      
23bf0 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64  pWInfo->untested
23c00 54 65 72 6d 73 20 3d 20 31 3b 0a 20 20 20 20 20  Terms = 1;.     
23c10 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
23c20 0a 20 20 20 20 70 45 20 3d 20 70 54 65 72 6d 2d  .    pE = pTerm-
23c30 3e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65  >pExpr;.    asse
23c40 72 74 28 20 70 45 21 3d 30 20 29 3b 0a 20 20 20  rt( pE!=0 );.   
23c50 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65   if( pLevel->iLe
23c60 66 74 4a 6f 69 6e 20 26 26 20 21 45 78 70 72 48  ftJoin && !ExprH
23c70 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45  asProperty(pE, E
23c80 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20  P_FromJoin) ){. 
23c90 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
23ca0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
23cb0 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
23cc0 73 65 2c 20 70 45 2c 20 61 64 64 72 43 6f 6e 74  se, pE, addrCont
23cd0 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
23ce0 55 4c 4c 29 3b 0a 20 20 20 20 70 54 65 72 6d 2d  ULL);.    pTerm-
23cf0 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
23d00 5f 43 4f 44 45 44 3b 0a 20 20 7d 0a 0a 20 20 2f  _CODED;.  }..  /
23d10 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20 74 6f  * Insert code to
23d20 20 74 65 73 74 20 66 6f 72 20 69 6d 70 6c 69 65   test for implie
23d30 64 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 61  d constraints ba
23d40 73 65 64 20 6f 6e 20 74 72 61 6e 73 69 74 69 76  sed on transitiv
23d50 69 74 79 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  ity.  ** of the 
23d60 22 3d 3d 22 20 6f 70 65 72 61 74 6f 72 2e 0a 20  "==" operator.. 
23d70 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65   **.  ** Example
23d80 3a 20 49 66 20 74 68 65 20 57 48 45 52 45 20 63  : If the WHERE c
23d90 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 22  lause contains "
23da0 74 31 2e 61 3d 74 32 2e 62 22 20 61 6e 64 20 22  t1.a=t2.b" and "
23db0 74 32 2e 62 3d 31 32 33 22 0a 20 20 2a 2a 20 61  t2.b=123".  ** a
23dc0 6e 64 20 77 65 20 61 72 65 20 63 6f 64 69 6e 67  nd we are coding
23dd0 20 74 68 65 20 74 31 20 6c 6f 6f 70 20 61 6e 64   the t1 loop and
23de0 20 74 68 65 20 74 32 20 6c 6f 6f 70 20 68 61 73   the t2 loop has
23df0 20 6e 6f 74 20 79 65 74 20 63 6f 64 65 64 2c 0a   not yet coded,.
23e00 20 20 2a 2a 20 74 68 65 6e 20 77 65 20 63 61 6e    ** then we can
23e10 6e 6f 74 20 75 73 65 20 74 68 65 20 22 74 31 2e  not use the "t1.
23e20 61 3d 74 32 2e 62 22 20 63 6f 6e 73 74 72 61 69  a=t2.b" constrai
23e30 6e 74 2c 20 62 75 74 20 77 65 20 63 61 6e 20 63  nt, but we can c
23e40 6f 64 65 0a 20 20 2a 2a 20 74 68 65 20 69 6d 70  ode.  ** the imp
23e50 6c 69 65 64 20 22 74 31 2e 61 3d 31 32 33 22 20  lied "t1.a=123" 
23e60 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 2a 2f  constraint..  */
23e70 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43  .  for(pTerm=pWC
23e80 2d 3e 61 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72  ->a, j=pWC->nTer
23e90 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65  m; j>0; j--, pTe
23ea0 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20  rm++){.    Expr 
23eb0 2a 70 45 2c 20 2a 70 45 41 6c 74 3b 0a 20 20 20  *pE, *pEAlt;.   
23ec0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 41 6c 74   WhereTerm *pAlt
23ed0 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
23ee0 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d  >wtFlags & (TERM
23ef0 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f  _VIRTUAL|TERM_CO
23f00 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  DED) ) continue;
23f10 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
23f20 65 4f 70 65 72 61 74 6f 72 21 3d 28 57 4f 5f 45  eOperator!=(WO_E
23f30 51 55 49 56 7c 57 4f 5f 45 51 29 20 29 20 63 6f  QUIV|WO_EQ) ) co
23f40 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
23f50 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
23f60 72 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e  r!=iCur ) contin
23f70 75 65 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76  ue;.    if( pLev
23f80 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 20  el->iLeftJoin ) 
23f90 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 45  continue;.    pE
23fa0 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
23fb0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
23fc0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
23fd0 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
23fe0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
23ff0 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
24000 74 20 26 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52  t & pLevel->notR
24010 65 61 64 79 29 21 3d 30 20 29 3b 0a 20 20 20 20  eady)!=0 );.    
24020 70 41 6c 74 20 3d 20 66 69 6e 64 54 65 72 6d 28  pAlt = findTerm(
24030 70 57 43 2c 20 69 43 75 72 2c 20 70 54 65 72 6d  pWC, iCur, pTerm
24040 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 2c 20  ->u.leftColumn, 
24050 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c  notReady, WO_EQ|
24060 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20 20 20 69  WO_IN, 0);.    i
24070 66 28 20 70 41 6c 74 3d 3d 30 20 29 20 63 6f 6e  f( pAlt==0 ) con
24080 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
24090 41 6c 74 2d 3e 77 74 46 6c 61 67 73 20 26 20 28  Alt->wtFlags & (
240a0 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f  TERM_CODED) ) co
240b0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 74 65 73 74  ntinue;.    test
240c0 63 61 73 65 28 20 70 41 6c 74 2d 3e 65 4f 70 65  case( pAlt->eOpe
240d0 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b  rator & WO_EQ );
240e0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
240f0 41 6c 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  Alt->eOperator &
24100 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 56 64   WO_IN );.    Vd
24110 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
24120 2c 20 22 62 65 67 69 6e 20 74 72 61 6e 73 69 74  , "begin transit
24130 69 76 65 20 63 6f 6e 73 74 72 61 69 6e 74 22 29  ive constraint")
24140 29 3b 0a 20 20 20 20 70 45 41 6c 74 20 3d 20 73  );.    pEAlt = s
24150 71 6c 69 74 65 33 53 74 61 63 6b 41 6c 6c 6f 63  qlite3StackAlloc
24160 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  Raw(db, sizeof(*
24170 70 45 41 6c 74 29 29 3b 0a 20 20 20 20 69 66 28  pEAlt));.    if(
24180 20 70 45 41 6c 74 20 29 7b 0a 20 20 20 20 20 20   pEAlt ){.      
24190 2a 70 45 41 6c 74 20 3d 20 2a 70 41 6c 74 2d 3e  *pEAlt = *pAlt->
241a0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70 45 41  pExpr;.      pEA
241b0 6c 74 2d 3e 70 4c 65 66 74 20 3d 20 70 45 2d 3e  lt->pLeft = pE->
241c0 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 73 71 6c  pLeft;.      sql
241d0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
241e0 70 50 61 72 73 65 2c 20 70 45 41 6c 74 2c 20 61  pParse, pEAlt, a
241f0 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f  ddrCont, SQLITE_
24200 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
24210 20 20 20 73 71 6c 69 74 65 33 53 74 61 63 6b 46     sqlite3StackF
24220 72 65 65 28 64 62 2c 20 70 45 41 6c 74 29 3b 0a  ree(db, pEAlt);.
24230 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
24240 46 6f 72 20 61 20 4c 45 46 54 20 4f 55 54 45 52  For a LEFT OUTER
24250 20 4a 4f 49 4e 2c 20 67 65 6e 65 72 61 74 65 20   JOIN, generate 
24260 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 72  code that will r
24270 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
24280 68 61 74 0a 20 20 2a 2a 20 61 74 20 6c 65 61 73  hat.  ** at leas
24290 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65  t one row of the
242a0 20 72 69 67 68 74 20 74 61 62 6c 65 20 68 61 73   right table has
242b0 20 6d 61 74 63 68 65 64 20 74 68 65 20 6c 65 66   matched the lef
242c0 74 20 74 61 62 6c 65 2e 20 20 0a 20 20 2a 2f 0a  t table.  .  */.
242d0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c    if( pLevel->iL
242e0 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 70  eftJoin ){.    p
242f0 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74  Level->addrFirst
24300 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
24310 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
24320 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
24330 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
24340 72 2c 20 31 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c  r, 1, pLevel->iL
24350 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64  eftJoin);.    Vd
24360 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72  beComment((v, "r
24370 65 63 6f 72 64 20 4c 45 46 54 20 4a 4f 49 4e 20  ecord LEFT JOIN 
24380 68 69 74 22 29 29 3b 0a 20 20 20 20 73 71 6c 69  hit"));.    sqli
24390 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
243a0 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 66  r(pParse);.    f
243b0 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c  or(pTerm=pWC->a,
243c0 20 6a 3d 30 3b 20 6a 3c 70 57 43 2d 3e 6e 54 65   j=0; j<pWC->nTe
243d0 72 6d 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b  rm; j++, pTerm++
243e0 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
243f0 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  e( pTerm->wtFlag
24400 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
24410 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
24420 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  se( pTerm->wtFla
24430 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 20  gs & TERM_CODED 
24440 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  );.      if( pTe
24450 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54  rm->wtFlags & (T
24460 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
24470 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e  _CODED) ) contin
24480 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  ue;.      if( (p
24490 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
244a0 26 20 70 4c 65 76 65 6c 2d 3e 6e 6f 74 52 65 61  & pLevel->notRea
244b0 64 79 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  dy)!=0 ){.      
244c0 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f    assert( pWInfo
244d0 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d 73 20  ->untestedTerms 
244e0 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  );.        conti
244f0 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
24500 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
24510 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->pExpr );.     
24520 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
24530 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54 65 72  lse(pParse, pTer
24540 6d 2d 3e 70 45 78 70 72 2c 20 61 64 64 72 43 6f  m->pExpr, addrCo
24550 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  nt, SQLITE_JUMPI
24560 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 70 54  FNULL);.      pT
24570 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20  erm->wtFlags |= 
24580 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20  TERM_CODED;.    
24590 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  }.  }.  sqlite3R
245a0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
245b0 61 72 73 65 2c 20 69 52 65 6c 65 61 73 65 52 65  arse, iReleaseRe
245c0 67 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70 4c  g);..  return pL
245d0 65 76 65 6c 2d 3e 6e 6f 74 52 65 61 64 79 3b 0a  evel->notReady;.
245e0 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 57  }..#if defined(W
245f0 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
24600 44 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  D) && defined(SQ
24610 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45  LITE_ENABLE_TREE
24620 5f 45 58 50 4c 41 49 4e 29 0a 2f 2a 0a 2a 2a 20  _EXPLAIN)./*.** 
24630 47 65 6e 65 72 61 74 65 20 22 45 78 70 6c 61 6e  Generate "Explan
24640 61 74 69 6f 6e 22 20 74 65 78 74 20 66 6f 72 20  ation" text for 
24650 61 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2f 0a  a WhereTerm..*/.
24660 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
24670 65 45 78 70 6c 61 69 6e 54 65 72 6d 28 56 64 62  eExplainTerm(Vdb
24680 65 20 2a 76 2c 20 57 68 65 72 65 54 65 72 6d 20  e *v, WhereTerm 
24690 2a 70 54 65 72 6d 29 7b 0a 20 20 63 68 61 72 20  *pTerm){.  char 
246a0 7a 54 79 70 65 5b 34 5d 3b 0a 20 20 6d 65 6d 63  zType[4];.  memc
246b0 70 79 28 7a 54 79 70 65 2c 20 22 2e 2e 2e 22 2c  py(zType, "...",
246c0 20 34 29 3b 0a 20 20 69 66 28 20 70 54 65 72 6d   4);.  if( pTerm
246d0 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
246e0 5f 56 49 52 54 55 41 4c 20 29 20 7a 54 79 70 65  _VIRTUAL ) zType
246f0 5b 30 5d 20 3d 20 27 56 27 3b 0a 20 20 69 66 28  [0] = 'V';.  if(
24700 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
24710 72 20 26 20 57 4f 5f 45 51 55 49 56 20 20 29 20  r & WO_EQUIV  ) 
24720 7a 54 79 70 65 5b 31 5d 20 3d 20 27 45 27 3b 0a  zType[1] = 'E';.
24730 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
24740 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78  perty(pTerm->pEx
24750 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
24760 20 29 20 7a 54 79 70 65 5b 32 5d 20 3d 20 27 4c   ) zType[2] = 'L
24770 27 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c  ';.  sqlite3Expl
24780 61 69 6e 50 72 69 6e 74 66 28 76 2c 20 22 25 73  ainPrintf(v, "%s
24790 20 22 2c 20 7a 54 79 70 65 29 3b 0a 20 20 73 71   ", zType);.  sq
247a0 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
247b0 28 76 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  (v, pTerm->pExpr
247c0 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 57  );.}.#endif /* W
247d0 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
247e0 44 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  D && SQLITE_ENAB
247f0 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 20  LE_TREE_EXPLAIN 
24800 2a 2f 0a 0a 0a 23 69 66 64 65 66 20 57 48 45 52  */...#ifdef WHER
24810 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f  ETRACE_ENABLED./
24820 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 57 68 65  *.** Print a Whe
24830 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 66 6f  reLoop object fo
24840 72 20 64 65 62 75 67 67 69 6e 67 20 70 75 72 70  r debugging purp
24850 6f 73 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76  oses.*/.static v
24860 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 50 72 69  oid whereLoopPri
24870 6e 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c  nt(WhereLoop *p,
24880 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
24890 43 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  C){.  WhereInfo 
248a0 2a 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70  *pWInfo = pWC->p
248b0 57 49 6e 66 6f 3b 0a 20 20 69 6e 74 20 6e 62 20  WInfo;.  int nb 
248c0 3d 20 31 2b 28 70 57 49 6e 66 6f 2d 3e 70 54 61  = 1+(pWInfo->pTa
248d0 62 4c 69 73 74 2d 3e 6e 53 72 63 2b 37 29 2f 38  bList->nSrc+7)/8
248e0 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
248f0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
24900 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
24910 74 2d 3e 61 20 2b 20 70 2d 3e 69 54 61 62 3b 0a  t->a + p->iTab;.
24920 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
24930 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 73  pItem->pTab;.  s
24940 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
24950 66 28 22 25 63 25 32 64 2e 25 30 2a 6c 6c 78 2e  f("%c%2d.%0*llx.
24960 25 30 2a 6c 6c 78 22 2c 20 70 2d 3e 63 49 64 2c  %0*llx", p->cId,
24970 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24980 20 20 20 20 20 20 70 2d 3e 69 54 61 62 2c 20 6e        p->iTab, n
24990 62 2c 20 70 2d 3e 6d 61 73 6b 53 65 6c 66 2c 20  b, p->maskSelf, 
249a0 6e 62 2c 20 70 2d 3e 70 72 65 72 65 71 29 3b 0a  nb, p->prereq);.
249b0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
249c0 69 6e 74 66 28 22 20 25 31 32 73 22 2c 0a 20 20  intf(" %12s",.  
249d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
249e0 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73     pItem->zAlias
249f0 20 3f 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73   ? pItem->zAlias
24a00 20 3a 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b   : pTab->zName);
24a10 0a 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61  .  if( (p->wsFla
24a20 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
24a30 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20  ALTABLE)==0 ){. 
24a40 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
24a50 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 69 66 28 20  zName;.     if( 
24a60 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
24a70 78 20 26 26 20 28 7a 4e 61 6d 65 20 3d 20 70 2d  x && (zName = p-
24a80 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d  >u.btree.pIndex-
24a90 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20  >zName)!=0 ){.  
24aa0 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
24ab0 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 61  zName, "sqlite_a
24ac0 75 74 6f 69 6e 64 65 78 5f 22 2c 20 31 37 29 3d  utoindex_", 17)=
24ad0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  =0 ){.        in
24ae0 74 20 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72  t i = sqlite3Str
24af0 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 20 2d 20 31  len30(zName) - 1
24b00 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
24b10 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27 5f 27 20 29   zName[i]!='_' )
24b20 20 69 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7a 4e   i--;.        zN
24b30 61 6d 65 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20  ame += i;.      
24b40 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  }.      sqlite3D
24b50 65 62 75 67 50 72 69 6e 74 66 28 22 2e 25 2d 31  ebugPrintf(".%-1
24b60 36 73 20 25 32 64 22 2c 20 7a 4e 61 6d 65 2c 20  6s %2d", zName, 
24b70 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29 3b  p->u.btree.nEq);
24b80 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
24b90 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
24ba0 69 6e 74 66 28 22 25 32 30 73 22 2c 22 22 29 3b  intf("%20s","");
24bb0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
24bc0 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20      char *z;.   
24bd0 20 69 66 28 20 70 2d 3e 75 2e 76 74 61 62 2e 69   if( p->u.vtab.i
24be0 64 78 53 74 72 20 29 7b 0a 20 20 20 20 20 20 7a  dxStr ){.      z
24bf0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
24c00 74 66 28 22 28 25 64 2c 5c 22 25 73 5c 22 2c 25  tf("(%d,\"%s\",%
24c10 78 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  x)",.           
24c20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69       p->u.vtab.i
24c30 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61 62  dxNum, p->u.vtab
24c40 2e 69 64 78 53 74 72 2c 20 70 2d 3e 75 2e 76 74  .idxStr, p->u.vt
24c50 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20  ab.omitMask);.  
24c60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
24c70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
24c80 74 66 28 22 28 25 64 2c 25 78 29 22 2c 20 70 2d  tf("(%d,%x)", p-
24c90 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20  >u.vtab.idxNum, 
24ca0 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61  p->u.vtab.omitMa
24cb0 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  sk);.    }.    s
24cc0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
24cd0 66 28 22 20 25 2d 31 39 73 22 2c 20 7a 29 3b 0a  f(" %-19s", z);.
24ce0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
24cf0 28 7a 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  (z);.  }.  sqlit
24d00 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
24d10 66 20 25 30 34 78 20 4e 20 25 64 22 2c 20 70 2d  f %04x N %d", p-
24d20 3e 77 73 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54  >wsFlags, p->nLT
24d30 65 72 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  erm);.  sqlite3D
24d40 65 62 75 67 50 72 69 6e 74 66 28 22 20 63 6f 73  ebugPrintf(" cos
24d50 74 20 25 64 2c 25 64 2c 25 64 5c 6e 22 2c 20 70  t %d,%d,%d\n", p
24d60 2d 3e 72 53 65 74 75 70 2c 20 70 2d 3e 72 52 75  ->rSetup, p->rRu
24d70 6e 2c 20 70 2d 3e 6e 4f 75 74 29 3b 0a 23 69 66  n, p->nOut);.#if
24d80 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
24d90 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 0a 20  E_TREE_EXPLAIN. 
24da0 20 2f 2a 20 49 66 20 74 68 65 20 30 78 31 30 30   /* If the 0x100
24db0 20 62 69 74 20 6f 66 20 77 68 65 72 65 74 72 61   bit of wheretra
24dc0 63 69 6e 67 20 69 73 20 73 65 74 2c 20 74 68 65  cing is set, the
24dd0 6e 20 73 68 6f 77 20 61 6c 6c 20 6f 66 20 74 68  n show all of th
24de0 65 20 63 6f 6e 73 74 72 61 69 6e 74 0a 20 20 2a  e constraint.  *
24df0 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  * expressions in
24e00 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 61   the WhereLoop.a
24e10 4c 54 65 72 6d 5b 5d 20 61 72 72 61 79 2e 0a 20  LTerm[] array.. 
24e20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 54   */.  if( p->nLT
24e30 65 72 6d 20 26 26 20 28 73 71 6c 69 74 65 33 57  erm && (sqlite3W
24e40 68 65 72 65 54 72 61 63 65 20 26 20 30 78 31 30  hereTrace & 0x10
24e50 30 29 21 3d 30 20 29 7b 20 20 2f 2a 20 57 48 45  0)!=0 ){  /* WHE
24e60 52 45 54 52 41 43 45 20 30 78 31 30 30 20 2a 2f  RETRACE 0x100 */
24e70 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
24e80 56 64 62 65 20 2a 76 20 3d 20 70 57 49 6e 66 6f  Vdbe *v = pWInfo
24e90 2d 3e 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  ->pParse->pVdbe;
24ea0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
24eb0 61 69 6e 42 65 67 69 6e 28 76 29 3b 0a 20 20 20  ainBegin(v);.   
24ec0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
24ed0 4c 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  LTerm; i++){.   
24ee0 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54     WhereTerm *pT
24ef0 65 72 6d 20 3d 20 70 2d 3e 61 4c 54 65 72 6d 5b  erm = p->aLTerm[
24f00 69 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  i];.      sqlite
24f10 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 76  3ExplainPrintf(v
24f20 2c 20 22 20 20 28 25 64 29 20 23 25 2d 32 64 20  , "  (%d) #%-2d 
24f30 22 2c 20 69 2b 31 2c 20 28 69 6e 74 29 28 70 54  ", i+1, (int)(pT
24f40 65 72 6d 2d 70 57 43 2d 3e 61 29 29 3b 0a 20 20  erm-pWC->a));.  
24f50 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
24f60 69 6e 50 75 73 68 28 76 29 3b 0a 20 20 20 20 20  inPush(v);.     
24f70 20 77 68 65 72 65 45 78 70 6c 61 69 6e 54 65 72   whereExplainTer
24f80 6d 28 76 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20  m(v, pTerm);.   
24f90 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
24fa0 6e 50 6f 70 28 76 29 3b 0a 20 20 20 20 20 20 73  nPop(v);.      s
24fb0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28  qlite3ExplainNL(
24fc0 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  v);.    }.    sq
24fd0 6c 69 74 65 33 45 78 70 6c 61 69 6e 46 69 6e 69  lite3ExplainFini
24fe0 73 68 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  sh(v);.    sqlit
24ff0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25  e3DebugPrintf("%
25000 73 22 2c 20 73 71 6c 69 74 65 33 56 64 62 65 45  s", sqlite3VdbeE
25010 78 70 6c 61 6e 61 74 69 6f 6e 28 76 29 29 3b 0a  xplanation(v));.
25020 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 23 65 6e    }.#endif.}.#en
25030 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  dif../*.** Conve
25040 72 74 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 69  rt bulk memory i
25050 6e 74 6f 20 61 20 76 61 6c 69 64 20 57 68 65 72  nto a valid Wher
25060 65 4c 6f 6f 70 20 74 68 61 74 20 63 61 6e 20 62  eLoop that can b
25070 65 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 77  e passed.** to w
25080 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 20 68 61  hereLoopClear ha
25090 72 6d 6c 65 73 73 6c 79 2e 0a 2a 2f 0a 73 74 61  rmlessly..*/.sta
250a0 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f  tic void whereLo
250b0 6f 70 49 6e 69 74 28 57 68 65 72 65 4c 6f 6f 70  opInit(WhereLoop
250c0 20 2a 70 29 7b 0a 20 20 70 2d 3e 61 4c 54 65 72   *p){.  p->aLTer
250d0 6d 20 3d 20 70 2d 3e 61 4c 54 65 72 6d 53 70 61  m = p->aLTermSpa
250e0 63 65 3b 0a 20 20 70 2d 3e 6e 4c 54 65 72 6d 20  ce;.  p->nLTerm 
250f0 3d 20 30 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74  = 0;.  p->nLSlot
25100 20 3d 20 41 72 72 61 79 53 69 7a 65 28 70 2d 3e   = ArraySize(p->
25110 61 4c 54 65 72 6d 53 70 61 63 65 29 3b 0a 20 20  aLTermSpace);.  
25120 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a  p->wsFlags = 0;.
25130 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74  }../*.** Clear t
25140 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 75 20 75  he WhereLoop.u u
25150 6e 69 6f 6e 2e 20 20 4c 65 61 76 65 20 57 68 65  nion.  Leave Whe
25160 72 65 4c 6f 6f 70 2e 70 4c 54 65 72 6d 20 69 6e  reLoop.pLTerm in
25170 74 61 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tact..*/.static 
25180 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c  void whereLoopCl
25190 65 61 72 55 6e 69 6f 6e 28 73 71 6c 69 74 65 33  earUnion(sqlite3
251a0 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20   *db, WhereLoop 
251b0 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 77 73  *p){.  if( p->ws
251c0 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 56  Flags & (WHERE_V
251d0 49 52 54 55 41 4c 54 41 42 4c 45 7c 57 48 45 52  IRTUALTABLE|WHER
251e0 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 20 29 7b  E_AUTO_INDEX) ){
251f0 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 77 73 46  .    if( (p->wsF
25200 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
25210 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20 26 26  TUALTABLE)!=0 &&
25220 20 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46   p->u.vtab.needF
25230 72 65 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ree ){.      sql
25240 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 75 2e 76  ite3_free(p->u.v
25250 74 61 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20  tab.idxStr);.   
25260 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 6e 65 65     p->u.vtab.nee
25270 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20  dFree = 0;.     
25280 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74   p->u.vtab.idxSt
25290 72 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  r = 0;.    }else
252a0 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73   if( (p->wsFlags
252b0 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e   & WHERE_AUTO_IN
252c0 44 45 58 29 21 3d 30 20 26 26 20 70 2d 3e 75 2e  DEX)!=0 && p->u.
252d0 62 74 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 20  btree.pIndex!=0 
252e0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
252f0 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e  DbFree(db, p->u.
25300 62 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 43  btree.pIndex->zC
25310 6f 6c 41 66 66 29 3b 0a 20 20 20 20 20 20 73 71  olAff);.      sq
25320 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
25330 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
25340 78 29 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62  x);.      p->u.b
25350 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b  tree.pIndex = 0;
25360 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
25370 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 69  .** Deallocate i
25380 6e 74 65 72 6e 61 6c 20 6d 65 6d 6f 72 79 20 75  nternal memory u
25390 73 65 64 20 62 79 20 61 20 57 68 65 72 65 4c 6f  sed by a WhereLo
253a0 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61  op object.*/.sta
253b0 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f  tic void whereLo
253c0 6f 70 43 6c 65 61 72 28 73 71 6c 69 74 65 33 20  opClear(sqlite3 
253d0 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  *db, WhereLoop *
253e0 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54  p){.  if( p->aLT
253f0 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70  erm!=p->aLTermSp
25400 61 63 65 20 29 20 73 71 6c 69 74 65 33 44 62 46  ace ) sqlite3DbF
25410 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72  ree(db, p->aLTer
25420 6d 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43  m);.  whereLoopC
25430 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c 20 70 29  learUnion(db, p)
25440 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69  ;.  whereLoopIni
25450 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  t(p);.}../*.** I
25460 6e 63 72 65 61 73 65 20 74 68 65 20 6d 65 6d 6f  ncrease the memo
25470 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f  ry allocation fo
25480 72 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  r pLoop->aLTerm[
25490 5d 20 74 6f 20 62 65 20 61 74 20 6c 65 61 73 74  ] to be at least
254a0 20 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   n..*/.static in
254b0 74 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a  t whereLoopResiz
254c0 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  e(sqlite3 *db, W
254d0 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 69 6e 74  hereLoop *p, int
254e0 20 6e 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d   n){.  WhereTerm
254f0 20 2a 2a 70 61 4e 65 77 3b 0a 20 20 69 66 28 20   **paNew;.  if( 
25500 70 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 20 29 20 72  p->nLSlot>=n ) r
25510 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
25520 0a 20 20 6e 20 3d 20 28 6e 2b 37 29 26 7e 37 3b  .  n = (n+7)&~7;
25530 0a 20 20 70 61 4e 65 77 20 3d 20 73 71 6c 69 74  .  paNew = sqlit
25540 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
25550 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65  , sizeof(p->aLTe
25560 72 6d 5b 30 5d 29 2a 6e 29 3b 0a 20 20 69 66 28  rm[0])*n);.  if(
25570 20 70 61 4e 65 77 3d 3d 30 20 29 20 72 65 74 75   paNew==0 ) retu
25580 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
25590 0a 20 20 6d 65 6d 63 70 79 28 70 61 4e 65 77 2c  .  memcpy(paNew,
255a0 20 70 2d 3e 61 4c 54 65 72 6d 2c 20 73 69 7a 65   p->aLTerm, size
255b0 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 29  of(p->aLTerm[0])
255c0 2a 70 2d 3e 6e 4c 53 6c 6f 74 29 3b 0a 20 20 69  *p->nLSlot);.  i
255d0 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21 3d 70 2d  f( p->aLTerm!=p-
255e0 3e 61 4c 54 65 72 6d 53 70 61 63 65 20 29 20 73  >aLTermSpace ) s
255f0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
25600 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a 20 20 70   p->aLTerm);.  p
25610 2d 3e 61 4c 54 65 72 6d 20 3d 20 70 61 4e 65 77  ->aLTerm = paNew
25620 3b 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20  ;.  p->nLSlot = 
25630 6e 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  n;.  return SQLI
25640 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
25650 54 72 61 6e 73 66 65 72 20 63 6f 6e 74 65 6e 74  Transfer content
25660 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64   from the second
25670 20 70 4c 6f 6f 70 20 69 6e 74 6f 20 74 68 65 20   pLoop into the 
25680 66 69 72 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  first..*/.static
25690 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 58 66   int whereLoopXf
256a0 65 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  er(sqlite3 *db, 
256b0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 6f 2c 20  WhereLoop *pTo, 
256c0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 46 72 6f 6d  WhereLoop *pFrom
256d0 29 7b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c  ){.  whereLoopCl
256e0 65 61 72 55 6e 69 6f 6e 28 64 62 2c 20 70 54 6f  earUnion(db, pTo
256f0 29 3b 0a 20 20 69 66 28 20 77 68 65 72 65 4c 6f  );.  if( whereLo
25700 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70 54 6f  opResize(db, pTo
25710 2c 20 70 46 72 6f 6d 2d 3e 6e 4c 54 65 72 6d 29  , pFrom->nLTerm)
25720 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   ){.    memset(&
25730 70 54 6f 2d 3e 75 2c 20 30 2c 20 73 69 7a 65 6f  pTo->u, 0, sizeo
25740 66 28 70 54 6f 2d 3e 75 29 29 3b 0a 20 20 20 20  f(pTo->u));.    
25750 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
25760 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70  MEM;.  }.  memcp
25770 79 28 70 54 6f 2c 20 70 46 72 6f 6d 2c 20 57 48  y(pTo, pFrom, WH
25780 45 52 45 5f 4c 4f 4f 50 5f 58 46 45 52 5f 53 5a  ERE_LOOP_XFER_SZ
25790 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d  );.  memcpy(pTo-
257a0 3e 61 4c 54 65 72 6d 2c 20 70 46 72 6f 6d 2d 3e  >aLTerm, pFrom->
257b0 61 4c 54 65 72 6d 2c 20 70 54 6f 2d 3e 6e 4c 54  aLTerm, pTo->nLT
257c0 65 72 6d 2a 73 69 7a 65 6f 66 28 70 54 6f 2d 3e  erm*sizeof(pTo->
257d0 61 4c 54 65 72 6d 5b 30 5d 29 29 3b 0a 20 20 69  aLTerm[0]));.  i
257e0 66 28 20 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67  f( pFrom->wsFlag
257f0 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
25800 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20 20 70 46  LTABLE ){.    pF
25810 72 6f 6d 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64  rom->u.vtab.need
25820 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Free = 0;.  }els
25830 65 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e 77 73  e if( (pFrom->ws
25840 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55  Flags & WHERE_AU
25850 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a  TO_INDEX)!=0 ){.
25860 20 20 20 20 70 46 72 6f 6d 2d 3e 75 2e 62 74 72      pFrom->u.btr
25870 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20  ee.pIndex = 0;. 
25880 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
25890 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
258a0 44 65 6c 65 74 65 20 61 20 57 68 65 72 65 4c 6f  Delete a WhereLo
258b0 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61  op object.*/.sta
258c0 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f  tic void whereLo
258d0 6f 70 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  opDelete(sqlite3
258e0 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20   *db, WhereLoop 
258f0 2a 70 29 7b 0a 20 20 77 68 65 72 65 4c 6f 6f 70  *p){.  whereLoop
25900 43 6c 65 61 72 28 64 62 2c 20 70 29 3b 0a 20 20  Clear(db, p);.  
25910 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
25920 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  , p);.}../*.** F
25930 72 65 65 20 61 20 57 68 65 72 65 49 6e 66 6f 20  ree a WhereInfo 
25940 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a 73 74 61  structure.*/.sta
25950 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 49 6e  tic void whereIn
25960 66 6f 46 72 65 65 28 73 71 6c 69 74 65 33 20 2a  foFree(sqlite3 *
25970 64 62 2c 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  db, WhereInfo *p
25980 57 49 6e 66 6f 29 7b 0a 20 20 69 66 28 20 41 4c  WInfo){.  if( AL
25990 57 41 59 53 28 70 57 49 6e 66 6f 29 20 29 7b 0a  WAYS(pWInfo) ){.
259a0 20 20 20 20 77 68 65 72 65 43 6c 61 75 73 65 43      whereClauseC
259b0 6c 65 61 72 28 26 70 57 49 6e 66 6f 2d 3e 73 57  lear(&pWInfo->sW
259c0 43 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  C);.    while( p
259d0 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20 29 7b  WInfo->pLoops ){
259e0 0a 20 20 20 20 20 20 57 68 65 72 65 4c 6f 6f 70  .      WhereLoop
259f0 20 2a 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4c   *p = pWInfo->pL
25a00 6f 6f 70 73 3b 0a 20 20 20 20 20 20 70 57 49 6e  oops;.      pWIn
25a10 66 6f 2d 3e 70 4c 6f 6f 70 73 20 3d 20 70 2d 3e  fo->pLoops = p->
25a20 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 20  pNextLoop;.     
25a30 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65   whereLoopDelete
25a40 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20  (db, p);.    }. 
25a50 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
25a60 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20  (db, pWInfo);.  
25a70 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72  }.}../*.** Inser
25a80 74 20 6f 72 20 72 65 70 6c 61 63 65 20 61 20 57  t or replace a W
25a90 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 79 20 75  hereLoop entry u
25aa0 73 69 6e 67 20 74 68 65 20 74 65 6d 70 6c 61 74  sing the templat
25ab0 65 20 73 75 70 70 6c 69 65 64 2e 0a 2a 2a 0a 2a  e supplied..**.*
25ac0 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 57 68  * An existing Wh
25ad0 65 72 65 4c 6f 6f 70 20 65 6e 74 72 79 20 6d 69  ereLoop entry mi
25ae0 67 68 74 20 62 65 20 6f 76 65 72 77 72 69 74 74  ght be overwritt
25af0 65 6e 20 69 66 20 74 68 65 20 6e 65 77 20 74 65  en if the new te
25b00 6d 70 6c 61 74 65 0a 2a 2a 20 69 73 20 62 65 74  mplate.** is bet
25b10 74 65 72 20 61 6e 64 20 68 61 73 20 66 65 77 65  ter and has fewe
25b20 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2e 20  r dependencies. 
25b30 20 4f 72 20 74 68 65 20 74 65 6d 70 6c 61 74 65   Or the template
25b40 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64   will be ignored
25b50 0a 2a 2a 20 61 6e 64 20 6e 6f 20 69 6e 73 65 72  .** and no inser
25b60 74 20 77 69 6c 6c 20 6f 63 63 75 72 20 69 66 20  t will occur if 
25b70 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65 72  an existing Wher
25b80 65 4c 6f 6f 70 20 69 73 20 66 61 73 74 65 72 20  eLoop is faster 
25b90 61 6e 64 20 68 61 73 0a 2a 2a 20 66 65 77 65 72  and has.** fewer
25ba0 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74 68   dependencies th
25bb0 61 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65 2e  an the template.
25bc0 20 20 4f 74 68 65 72 77 69 73 65 20 61 20 6e 65    Otherwise a ne
25bd0 77 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 0a 2a  w WhereLoop is.*
25be0 2a 20 61 64 64 65 64 20 62 61 73 65 64 20 6f 6e  * added based on
25bf0 20 74 68 65 20 74 65 6d 70 6c 61 74 65 2e 0a 2a   the template..*
25c00 2a 0a 2a 2a 20 49 66 20 70 42 75 69 6c 64 65 72  *.** If pBuilder
25c10 2d 3e 70 4f 72 53 65 74 20 69 73 20 6e 6f 74 20  ->pOrSet is not 
25c20 4e 55 4c 4c 20 74 68 65 6e 20 77 65 20 6f 6e 6c  NULL then we onl
25c30 79 20 63 61 72 65 20 61 62 6f 75 74 20 6f 6e 6c  y care about onl
25c40 79 20 74 68 65 0a 2a 2a 20 70 72 65 72 65 71 75  y the.** prerequ
25c50 69 73 69 74 65 73 20 61 6e 64 20 72 52 75 6e 20  isites and rRun 
25c60 61 6e 64 20 6e 4f 75 74 20 63 6f 73 74 73 20 6f  and nOut costs o
25c70 66 20 74 68 65 20 4e 20 62 65 73 74 20 6c 6f 6f  f the N best loo
25c80 70 73 2e 20 20 54 68 61 74 0a 2a 2a 20 69 6e 66  ps.  That.** inf
25c90 6f 72 6d 61 74 69 6f 6e 20 69 73 20 67 61 74 68  ormation is gath
25ca0 65 72 65 64 20 69 6e 20 74 68 65 20 70 42 75 69  ered in the pBui
25cb0 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 6f 62 6a  lder->pOrSet obj
25cc0 65 63 74 2e 20 20 54 68 69 73 20 73 70 65 63 69  ect.  This speci
25cd0 61 6c 0a 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67  al.** processing
25ce0 20 6d 6f 64 65 20 69 73 20 75 73 65 64 20 6f 6e   mode is used on
25cf0 6c 79 20 66 6f 72 20 4f 52 20 63 6c 61 75 73 65  ly for OR clause
25d00 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a   processing..**.
25d10 2a 2a 20 57 68 65 6e 20 61 63 63 75 6d 75 6c 61  ** When accumula
25d20 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 6c 6f  ting multiple lo
25d30 6f 70 73 20 28 77 68 65 6e 20 70 42 75 69 6c 64  ops (when pBuild
25d40 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 4e 55  er->pOrSet is NU
25d50 4c 4c 29 20 77 65 0a 2a 2a 20 73 74 69 6c 6c 20  LL) we.** still 
25d60 6d 69 67 68 74 20 6f 76 65 72 77 72 69 74 65 20  might overwrite 
25d70 73 69 6d 69 6c 61 72 20 6c 6f 6f 70 73 20 77 69  similar loops wi
25d80 74 68 20 74 68 65 20 6e 65 77 20 74 65 6d 70 6c  th the new templ
25d90 61 74 65 20 69 66 20 74 68 65 0a 2a 2a 20 74 65  ate if the.** te
25da0 6d 70 6c 61 74 65 20 69 73 20 62 65 74 74 65 72  mplate is better
25db0 2e 20 20 4c 6f 6f 70 73 20 6d 61 79 20 62 65 20  .  Loops may be 
25dc0 6f 76 65 72 77 72 69 74 74 65 6e 20 69 66 20 74  overwritten if t
25dd0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a  he following .**
25de0 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 72 65 20   conditions are 
25df0 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31  met:.**.**    (1
25e00 29 20 20 54 68 65 79 20 68 61 76 65 20 74 68 65  )  They have the
25e10 20 73 61 6d 65 20 69 54 61 62 2e 0a 2a 2a 20 20   same iTab..**  
25e20 20 20 28 32 29 20 20 54 68 65 79 20 68 61 76 65    (2)  They have
25e30 20 74 68 65 20 73 61 6d 65 20 69 53 6f 72 74 49   the same iSortI
25e40 64 78 2e 0a 2a 2a 20 20 20 20 28 33 29 20 20 54  dx..**    (3)  T
25e50 68 65 20 74 65 6d 70 6c 61 74 65 20 68 61 73 20  he template has 
25e60 73 61 6d 65 20 6f 72 20 66 65 77 65 72 20 64 65  same or fewer de
25e70 70 65 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20  pendencies than 
25e80 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70  the current loop
25e90 0a 2a 2a 20 20 20 20 28 34 29 20 20 54 68 65 20  .**    (4)  The 
25ea0 74 65 6d 70 6c 61 74 65 20 68 61 73 20 74 68 65  template has the
25eb0 20 73 61 6d 65 20 6f 72 20 6c 6f 77 65 72 20 63   same or lower c
25ec0 6f 73 74 20 74 68 61 6e 20 74 68 65 20 63 75 72  ost than the cur
25ed0 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20  rent loop.**    
25ee0 28 35 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74  (5)  The templat
25ef0 65 20 75 73 65 73 20 6d 6f 72 65 20 74 65 72 6d  e uses more term
25f00 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 69 6e  s of the same in
25f10 64 65 78 20 62 75 74 20 68 61 73 20 6e 6f 20 61  dex but has no a
25f20 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 20 20 20  dditional.**    
25f30 20 20 20 20 20 64 65 70 65 6e 64 65 6e 63 69 65       dependencie
25f40 73 20 20 20 20 20 20 20 20 20 20 0a 2a 2f 0a 73  s          .*/.s
25f50 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
25f60 6f 6f 70 49 6e 73 65 72 74 28 57 68 65 72 65 4c  oopInsert(WhereL
25f70 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
25f80 6c 64 65 72 2c 20 57 68 65 72 65 4c 6f 6f 70 20  lder, WhereLoop 
25f90 2a 70 54 65 6d 70 6c 61 74 65 29 7b 0a 20 20 57  *pTemplate){.  W
25fa0 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 50 72 65  hereLoop **ppPre
25fb0 76 2c 20 2a 70 2c 20 2a 70 4e 65 78 74 20 3d 20  v, *p, *pNext = 
25fc0 30 3b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  0;.  WhereInfo *
25fd0 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
25fe0 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 73 71 6c  r->pWInfo;.  sql
25ff0 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66  ite3 *db = pWInf
26000 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a  o->pParse->db;..
26010 20 20 2f 2a 20 49 66 20 70 42 75 69 6c 64 65 72    /* If pBuilder
26020 2d 3e 70 4f 72 53 65 74 20 69 73 20 64 65 66 69  ->pOrSet is defi
26030 6e 65 64 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 6b  ned, then only k
26040 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65  eep track of the
26050 20 63 6f 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20   costs.  ** and 
26060 70 72 65 72 65 71 73 2e 0a 20 20 2a 2f 0a 20 20  prereqs..  */.  
26070 69 66 28 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f  if( pBuilder->pO
26080 72 53 65 74 21 3d 30 20 29 7b 0a 23 69 66 20 57  rSet!=0 ){.#if W
26090 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
260a0 44 0a 20 20 20 20 75 31 36 20 6e 20 3d 20 70 42  D.    u16 n = pB
260b0 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2d 3e  uilder->pOrSet->
260c0 6e 3b 0a 20 20 20 20 69 6e 74 20 78 20 3d 0a 23  n;.    int x =.#
260d0 65 6e 64 69 66 0a 20 20 20 20 77 68 65 72 65 4f  endif.    whereO
260e0 72 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72  rInsert(pBuilder
260f0 2d 3e 70 4f 72 53 65 74 2c 20 70 54 65 6d 70 6c  ->pOrSet, pTempl
26100 61 74 65 2d 3e 70 72 65 72 65 71 2c 20 70 54 65  ate->prereq, pTe
26110 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c 0a 20 20  mplate->rRun,.  
26120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26140 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75    pTemplate->nOu
26150 74 29 3b 0a 23 69 66 20 57 48 45 52 45 54 52 41  t);.#if WHERETRA
26160 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78  CE_ENABLED /* 0x
26170 38 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c  8 */.    if( sql
26180 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26  ite3WhereTrace &
26190 20 30 78 38 20 29 7b 0a 20 20 20 20 20 20 73 71   0x8 ){.      sq
261a0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
261b0 28 78 3f 22 20 20 20 6f 72 2d 25 64 3a 20 20 22  (x?"   or-%d:  "
261c0 3a 22 20 20 20 6f 72 2d 58 3a 20 20 22 2c 20 6e  :"   or-X:  ", n
261d0 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  );.      whereLo
261e0 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74  opPrint(pTemplat
261f0 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43  e, pBuilder->pWC
26200 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
26210 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
26220 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
26230 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78  Search for an ex
26240 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70  isting WhereLoop
26250 20 74 6f 20 6f 76 65 72 77 72 69 74 65 2c 20 6f   to overwrite, o
26260 72 20 77 68 69 63 68 20 74 61 6b 65 73 0a 20 20  r which takes.  
26270 2a 2a 20 70 72 69 6f 72 69 74 79 20 6f 76 65 72  ** priority over
26280 20 70 54 65 6d 70 6c 61 74 65 2e 0a 20 20 2a 2f   pTemplate..  */
26290 0a 20 20 66 6f 72 28 70 70 50 72 65 76 3d 26 70  .  for(ppPrev=&p
262a0 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70  WInfo->pLoops, p
262b0 3d 2a 70 70 50 72 65 76 3b 20 70 3b 20 70 70 50  =*ppPrev; p; ppP
262c0 72 65 76 3d 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f  rev=&p->pNextLoo
262d0 70 2c 20 70 3d 2a 70 70 50 72 65 76 29 7b 0a 20  p, p=*ppPrev){. 
262e0 20 20 20 69 66 28 20 70 2d 3e 69 54 61 62 21 3d     if( p->iTab!=
262f0 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20  pTemplate->iTab 
26300 7c 7c 20 70 2d 3e 69 53 6f 72 74 49 64 78 21 3d  || p->iSortIdx!=
26310 70 54 65 6d 70 6c 61 74 65 2d 3e 69 53 6f 72 74  pTemplate->iSort
26320 49 64 78 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Idx ){.      /* 
26330 49 66 20 65 69 74 68 65 72 20 74 68 65 20 69 54  If either the iT
26340 61 62 20 6f 72 20 69 53 6f 72 74 49 64 78 20 76  ab or iSortIdx v
26350 61 6c 75 65 73 20 66 6f 72 20 74 77 6f 20 57 68  alues for two Wh
26360 65 72 65 4c 6f 6f 70 20 61 72 65 20 64 69 66 66  ereLoop are diff
26370 65 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74  erent.      ** t
26380 68 65 6e 20 74 68 6f 73 65 20 57 68 65 72 65 4c  hen those WhereL
26390 6f 6f 70 73 20 6e 65 65 64 20 74 6f 20 62 65 20  oops need to be 
263a0 63 6f 6e 73 69 64 65 72 65 64 20 73 65 70 61 72  considered separ
263b0 61 74 65 6c 79 2e 20 20 4e 65 69 74 68 65 72 20  ately.  Neither 
263c0 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 61  is.      ** a ca
263d0 6e 64 69 64 61 74 65 20 74 6f 20 72 65 70 6c 61  ndidate to repla
263e0 63 65 20 74 68 65 20 6f 74 68 65 72 2e 20 2a 2f  ce the other. */
263f0 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
26400 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 6e  .    }.    /* In
26410 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70   the current imp
26420 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68 65  lementation, the
26430 20 72 53 65 74 75 70 20 76 61 6c 75 65 20 69 73   rSetup value is
26440 20 65 69 74 68 65 72 20 7a 65 72 6f 0a 20 20 20   either zero.   
26450 20 2a 2a 20 6f 72 20 74 68 65 20 63 6f 73 74 20   ** or the cost 
26460 6f 66 20 62 75 69 6c 64 69 6e 67 20 61 6e 20 61  of building an a
26470 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 28  utomatic index (
26480 4e 6c 6f 67 4e 29 20 61 6e 64 20 74 68 65 20 4e  NlogN) and the N
26490 6c 6f 67 4e 0a 20 20 20 20 2a 2a 20 69 73 20 74  logN.    ** is t
264a0 68 65 20 73 61 6d 65 20 66 6f 72 20 63 6f 6d 70  he same for comp
264b0 61 74 69 62 6c 65 20 57 68 65 72 65 4c 6f 6f 70  atible WhereLoop
264c0 73 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  s. */.    assert
264d0 28 20 70 2d 3e 72 53 65 74 75 70 3d 3d 30 20 7c  ( p->rSetup==0 |
264e0 7c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65  | pTemplate->rSe
264f0 74 75 70 3d 3d 30 20 0a 20 20 20 20 20 20 20 20  tup==0 .        
26500 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 72           || p->r
26510 53 65 74 75 70 3d 3d 70 54 65 6d 70 6c 61 74 65  Setup==pTemplate
26520 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20 20 20  ->rSetup );..   
26530 20 2f 2a 20 77 68 65 72 65 4c 6f 6f 70 41 64 64   /* whereLoopAdd
26540 42 74 72 65 65 28 29 20 61 6c 77 61 79 73 20 67  Btree() always g
26550 65 6e 65 72 61 74 65 73 20 61 6e 64 20 69 6e 73  enerates and ins
26560 65 72 74 73 20 74 68 65 20 61 75 74 6f 6d 61 74  erts the automat
26570 69 63 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20  ic index.    ** 
26580 63 61 73 65 20 66 69 72 73 74 2e 20 20 48 65 6e  case first.  Hen
26590 63 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 63 61  ce compatible ca
265a0 6e 64 69 64 61 74 65 20 57 68 65 72 65 4c 6f 6f  ndidate WhereLoo
265b0 70 73 20 6e 65 76 65 72 20 68 61 76 65 20 61 20  ps never have a 
265c0 6c 61 72 67 65 72 0a 20 20 20 20 2a 2a 20 72 53  larger.    ** rS
265d0 65 74 75 70 2e 20 43 61 6c 6c 20 74 68 69 73 20  etup. Call this 
265e0 53 45 54 55 50 2d 49 4e 56 41 52 49 41 4e 54 20  SETUP-INVARIANT 
265f0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
26600 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d 70 6c  ->rSetup>=pTempl
26610 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a  ate->rSetup );..
26620 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72      if( (p->prer
26630 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e  eq & pTemplate->
26640 70 72 65 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72  prereq)==p->prer
26650 65 71 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 53  eq.     && p->rS
26660 65 74 75 70 3c 3d 70 54 65 6d 70 6c 61 74 65 2d  etup<=pTemplate-
26670 3e 72 53 65 74 75 70 0a 20 20 20 20 20 26 26 20  >rSetup.     && 
26680 70 2d 3e 72 52 75 6e 3c 3d 70 54 65 6d 70 6c 61  p->rRun<=pTempla
26690 74 65 2d 3e 72 52 75 6e 0a 20 20 20 20 20 26 26  te->rRun.     &&
266a0 20 70 2d 3e 6e 4f 75 74 3c 3d 70 54 65 6d 70 6c   p->nOut<=pTempl
266b0 61 74 65 2d 3e 6e 4f 75 74 0a 20 20 20 20 29 7b  ate->nOut.    ){
266c0 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62  .      /* This b
266d0 72 61 6e 63 68 20 74 61 6b 65 6e 20 77 68 65 6e  ranch taken when
266e0 20 70 20 69 73 20 65 71 75 61 6c 20 6f 72 20 62   p is equal or b
266f0 65 74 74 65 72 20 74 68 61 6e 20 70 54 65 6d 70  etter than pTemp
26700 6c 61 74 65 20 69 6e 20 0a 20 20 20 20 20 20 2a  late in .      *
26710 2a 20 61 6c 6c 20 6f 66 20 28 31 29 20 64 65 70  * all of (1) dep
26720 65 6e 64 65 6e 63 69 65 73 20 28 32 29 20 73 65  endencies (2) se
26730 74 75 70 2d 63 6f 73 74 2c 20 28 33 29 20 72 75  tup-cost, (3) ru
26740 6e 2d 63 6f 73 74 2c 20 61 6e 64 0a 20 20 20 20  n-cost, and.    
26750 20 20 2a 2a 20 28 34 29 20 6e 75 6d 62 65 72 20    ** (4) number 
26760 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 2e 20  of output rows. 
26770 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
26780 20 70 2d 3e 72 53 65 74 75 70 3d 3d 70 54 65 6d   p->rSetup==pTem
26790 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b  plate->rSetup );
267a0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 72  .      if( p->pr
267b0 65 72 65 71 3d 3d 70 54 65 6d 70 6c 61 74 65 2d  ereq==pTemplate-
267c0 3e 70 72 65 72 65 71 0a 20 20 20 20 20 20 20 26  >prereq.       &
267d0 26 20 70 2d 3e 6e 4c 54 65 72 6d 3c 70 54 65 6d  & p->nLTerm<pTem
267e0 70 6c 61 74 65 2d 3e 6e 4c 54 65 72 6d 0a 20 20  plate->nLTerm.  
267f0 20 20 20 20 20 26 26 20 28 70 2d 3e 77 73 46 6c       && (p->wsFl
26800 61 67 73 20 26 20 70 54 65 6d 70 6c 61 74 65 2d  ags & pTemplate-
26810 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
26820 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20  _INDEXED)!=0.   
26830 20 20 20 20 26 26 20 28 70 2d 3e 75 2e 62 74 72      && (p->u.btr
26840 65 65 2e 70 49 6e 64 65 78 3d 3d 70 54 65 6d 70  ee.pIndex==pTemp
26850 6c 61 74 65 2d 3e 75 2e 62 74 72 65 65 2e 70 49  late->u.btree.pI
26860 6e 64 65 78 0a 20 20 20 20 20 20 20 20 20 20 7c  ndex.          |
26870 7c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75  | pTemplate->rRu
26880 6e 2b 70 2d 3e 6e 4c 54 65 72 6d 3c 3d 70 2d 3e  n+p->nLTerm<=p->
26890 72 52 75 6e 2b 70 54 65 6d 70 6c 61 74 65 2d 3e  rRun+pTemplate->
268a0 6e 4c 54 65 72 6d 29 0a 20 20 20 20 20 20 29 7b  nLTerm).      ){
268b0 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 76 65 72  .        /* Over
268c0 77 72 69 74 65 20 61 6e 20 65 78 69 73 74 69 6e  write an existin
268d0 67 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 74 68  g WhereLoop with
268e0 20 61 6e 20 73 69 6d 69 6c 61 72 20 6f 6e 65 20   an similar one 
268f0 74 68 61 74 20 75 73 65 73 0a 20 20 20 20 20 20  that uses.      
26900 20 20 2a 2a 20 6d 6f 72 65 20 74 65 72 6d 73 20    ** more terms 
26910 6f 66 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  of the index */.
26920 20 20 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20          pNext = 
26930 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 20 20  p->pNextLoop;.  
26940 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
26950 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26960 20 20 2f 2a 20 70 54 65 6d 70 6c 61 74 65 20 69    /* pTemplate i
26970 73 20 6e 6f 74 20 68 65 6c 70 66 75 6c 2e 0a 20  s not helpful.. 
26980 20 20 20 20 20 20 20 2a 2a 20 52 65 74 75 72 6e         ** Return
26990 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e   without changin
269a0 67 20 6f 72 20 61 64 64 69 6e 67 20 61 6e 79 74  g or adding anyt
269b0 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20  hing */.        
269c0 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70 49 6e  goto whereLoopIn
269d0 73 65 72 74 5f 6e 6f 6f 70 3b 0a 20 20 20 20 20  sert_noop;.     
269e0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
269f0 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54   (p->prereq & pT
26a00 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29  emplate->prereq)
26a10 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65  ==pTemplate->pre
26a20 72 65 71 0a 20 20 20 20 20 26 26 20 70 2d 3e 72  req.     && p->r
26a30 52 75 6e 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  Run>=pTemplate->
26a40 72 52 75 6e 0a 20 20 20 20 20 26 26 20 70 2d 3e  rRun.     && p->
26a50 6e 4f 75 74 3e 3d 70 54 65 6d 70 6c 61 74 65 2d  nOut>=pTemplate-
26a60 3e 6e 4f 75 74 0a 20 20 20 20 29 7b 0a 20 20 20  >nOut.    ){.   
26a70 20 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20     /* Overwrite 
26a80 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65 72  an existing Wher
26a90 65 4c 6f 6f 70 20 77 69 74 68 20 61 20 62 65 74  eLoop with a bet
26aa0 74 65 72 20 6f 6e 65 3a 20 6f 6e 65 20 74 68 61  ter one: one tha
26ab0 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 62 65  t is.      ** be
26ac0 74 74 65 72 20 61 74 20 6f 6e 65 20 6f 66 20 28  tter at one of (
26ad0 31 29 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2c  1) dependencies,
26ae0 20 28 32 29 20 73 65 74 75 70 2d 63 6f 73 74 2c   (2) setup-cost,
26af0 20 28 33 29 20 72 75 6e 2d 63 6f 73 74 0a 20 20   (3) run-cost.  
26b00 20 20 20 20 2a 2a 20 6f 72 20 28 34 29 20 6e 75      ** or (4) nu
26b10 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72  mber of output r
26b20 6f 77 73 2c 20 61 6e 64 20 69 73 20 6e 6f 20 77  ows, and is no w
26b30 6f 72 73 65 20 69 6e 20 61 6e 79 20 6f 66 20 74  orse in any of t
26b40 68 6f 73 65 0a 20 20 20 20 20 20 2a 2a 20 63 61  hose.      ** ca
26b50 74 65 67 6f 72 69 65 73 2e 20 2a 2f 0a 20 20 20  tegories. */.   
26b60 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53     assert( p->rS
26b70 65 74 75 70 3e 3d 70 54 65 6d 70 6c 61 74 65 2d  etup>=pTemplate-
26b80 3e 72 53 65 74 75 70 20 29 3b 20 2f 2a 20 53 45  >rSetup ); /* SE
26b90 54 55 50 2d 49 4e 56 41 52 49 41 4e 54 20 61 62  TUP-INVARIANT ab
26ba0 6f 76 65 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65  ove */.      pNe
26bb0 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f  xt = p->pNextLoo
26bc0 70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  p;.      break;.
26bd0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
26be0 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
26bf0 20 70 6f 69 6e 74 20 69 74 20 6d 65 61 6e 73 20   point it means 
26c00 74 68 61 74 20 65 69 74 68 65 72 20 70 5b 5d 20  that either p[] 
26c10 73 68 6f 75 6c 64 20 62 65 20 6f 76 65 72 77 72  should be overwr
26c20 69 74 74 65 6e 0a 20 20 2a 2a 20 77 69 74 68 20  itten.  ** with 
26c30 70 54 65 6d 70 6c 61 74 65 5b 5d 20 69 66 20 70  pTemplate[] if p
26c40 5b 5d 20 65 78 69 73 74 73 2c 20 6f 72 20 69 66  [] exists, or if
26c50 20 70 3d 3d 4e 55 4c 4c 20 74 68 65 6e 20 61 6c   p==NULL then al
26c60 6c 6f 63 61 74 65 20 61 20 6e 65 77 0a 20 20 2a  locate a new.  *
26c70 2a 20 57 68 65 72 65 4c 6f 6f 70 20 61 6e 64 20  * WhereLoop and 
26c80 69 6e 73 65 72 74 20 69 74 2e 0a 20 20 2a 2f 0a  insert it..  */.
26c90 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  #if WHERETRACE_E
26ca0 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f  NABLED /* 0x8 */
26cb0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68  .  if( sqlite3Wh
26cc0 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29  ereTrace & 0x8 )
26cd0 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 30 20 29  {.    if( p!=0 )
26ce0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
26cf0 65 62 75 67 50 72 69 6e 74 66 28 22 69 6e 73 2d  ebugPrintf("ins-
26d00 64 65 6c 3a 20 20 22 29 3b 0a 20 20 20 20 20 20  del:  ");.      
26d10 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
26d20 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29  , pBuilder->pWC)
26d30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
26d40 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
26d50 69 6e 73 2d 6e 65 77 3a 20 20 22 29 3b 0a 20 20  ins-new:  ");.  
26d60 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
26d70 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69  (pTemplate, pBui
26d80 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 7d 0a  lder->pWC);.  }.
26d90 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 3d 3d  #endif.  if( p==
26da0 30 20 29 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c  0 ){.    p = sql
26db0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
26dc0 64 62 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65  db, sizeof(Where
26dd0 4c 6f 6f 70 29 29 3b 0a 20 20 20 20 69 66 28 20  Loop));.    if( 
26de0 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  p==0 ) return SQ
26df0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
26e00 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29  whereLoopInit(p)
26e10 3b 0a 20 20 7d 0a 20 20 77 68 65 72 65 4c 6f 6f  ;.  }.  whereLoo
26e20 70 58 66 65 72 28 64 62 2c 20 70 2c 20 70 54 65  pXfer(db, p, pTe
26e30 6d 70 6c 61 74 65 29 3b 0a 20 20 70 2d 3e 70 4e  mplate);.  p->pN
26e40 65 78 74 4c 6f 6f 70 20 3d 20 70 4e 65 78 74 3b  extLoop = pNext;
26e50 0a 20 20 2a 70 70 50 72 65 76 20 3d 20 70 3b 0a  .  *ppPrev = p;.
26e60 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67    if( (p->wsFlag
26e70 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
26e80 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20  LTABLE)==0 ){.  
26e90 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20    Index *pIndex 
26ea0 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  = p->u.btree.pIn
26eb0 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  dex;.    if( pIn
26ec0 64 65 78 20 26 26 20 70 49 6e 64 65 78 2d 3e 74  dex && pIndex->t
26ed0 6e 75 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  num==0 ){.      
26ee0 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
26ef0 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  x = 0;.    }.  }
26f00 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
26f10 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  _OK;..  /* Jump 
26f20 68 65 72 65 20 69 66 20 74 68 65 20 69 6e 73 65  here if the inse
26f30 72 74 20 69 73 20 61 20 6e 6f 2d 6f 70 20 2a 2f  rt is a no-op */
26f40 0a 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74  .whereLoopInsert
26f50 5f 6e 6f 6f 70 3a 0a 23 69 66 20 57 48 45 52 45  _noop:.#if WHERE
26f60 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a  TRACE_ENABLED /*
26f70 20 30 78 38 20 2a 2f 0a 20 20 69 66 28 20 73 71   0x8 */.  if( sq
26f80 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
26f90 26 20 30 78 38 20 29 7b 0a 20 20 20 20 73 71 6c  & 0x8 ){.    sql
26fa0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
26fb0 22 69 6e 73 2d 6e 6f 6f 70 3a 20 22 29 3b 0a 20  "ins-noop: ");. 
26fc0 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e     whereLoopPrin
26fd0 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75  t(pTemplate, pBu
26fe0 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 7d  ilder->pWC);.  }
26ff0 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
27000 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 0a 7d 0a   SQLITE_OK;  .}.
27010 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68  ./*.** Adjust th
27020 65 20 57 68 65 72 65 4c 6f 6f 70 2e 6e 4f 75 74  e WhereLoop.nOut
27030 20 76 61 6c 75 65 20 64 6f 77 6e 77 61 72 64 20   value downward 
27040 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74  to account for t
27050 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 57  erms of the.** W
27060 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
27070 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 6c   reference the l
27080 6f 6f 70 20 62 75 74 20 77 68 69 63 68 20 61 72  oop but which ar
27090 65 20 6e 6f 74 20 75 73 65 64 20 62 79 20 61 6e  e not used by an
270a0 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a  .** index..**.**
270b0 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   In the current 
270c0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20  implementation, 
270d0 74 68 65 20 66 69 72 73 74 20 65 78 74 72 61 20  the first extra 
270e0 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
270f0 6d 20 72 65 64 75 63 65 73 0a 2a 2a 20 74 68 65  m reduces.** the
27100 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
27110 74 20 72 6f 77 73 20 62 79 20 61 20 66 61 63 74  t rows by a fact
27120 6f 72 20 6f 66 20 31 30 20 61 6e 64 20 65 61 63  or of 10 and eac
27130 68 20 61 64 64 69 74 69 6f 6e 61 6c 20 74 65 72  h additional ter
27140 6d 0a 2a 2a 20 72 65 64 75 63 65 73 20 74 68 65  m.** reduces the
27150 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
27160 74 20 72 6f 77 73 20 62 79 20 73 71 72 74 28 32  t rows by sqrt(2
27170 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
27180 64 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75  d whereLoopOutpu
27190 74 41 64 6a 75 73 74 28 57 68 65 72 65 43 6c 61  tAdjust(WhereCla
271a0 75 73 65 20 2a 70 57 43 2c 20 57 68 65 72 65 4c  use *pWC, WhereL
271b0 6f 6f 70 20 2a 70 4c 6f 6f 70 29 7b 0a 20 20 57  oop *pLoop){.  W
271c0 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c  hereTerm *pTerm,
271d0 20 2a 70 58 3b 0a 20 20 42 69 74 6d 61 73 6b 20   *pX;.  Bitmask 
271e0 6e 6f 74 41 6c 6c 6f 77 65 64 20 3d 20 7e 28 70  notAllowed = ~(p
271f0 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 7c 70 4c 6f  Loop->prereq|pLo
27200 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 3b 0a 20  op->maskSelf);. 
27210 20 69 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20 69 66   int i, j;..  if
27220 28 20 21 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  ( !OptimizationE
27230 6e 61 62 6c 65 64 28 70 57 43 2d 3e 70 57 49 6e  nabled(pWC->pWIn
27240 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20  fo->pParse->db, 
27250 53 51 4c 49 54 45 5f 41 64 6a 75 73 74 4f 75 74  SQLITE_AdjustOut
27260 45 73 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75  Est) ){.    retu
27270 72 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  rn;.  }.  for(i=
27280 70 57 43 2d 3e 6e 54 65 72 6d 2c 20 70 54 65 72  pWC->nTerm, pTer
27290 6d 3d 70 57 43 2d 3e 61 3b 20 69 3e 30 3b 20 69  m=pWC->a; i>0; i
272a0 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  --, pTerm++){.  
272b0 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 77 74    if( (pTerm->wt
272c0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
272d0 54 55 41 4c 29 21 3d 30 20 29 20 62 72 65 61 6b  TUAL)!=0 ) break
272e0 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  ;.    if( (pTerm
272f0 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c  ->prereqAll & pL
27300 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 3d 3d  oop->maskSelf)==
27310 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
27320 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
27330 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74 41 6c 6c  ereqAll & notAll
27340 6f 77 65 64 29 21 3d 30 20 29 20 63 6f 6e 74 69  owed)!=0 ) conti
27350 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 70  nue;.    for(j=p
27360 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20  Loop->nLTerm-1; 
27370 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20  j>=0; j--){.    
27380 20 20 70 58 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c    pX = pLoop->aL
27390 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 20 20 69  Term[j];.      i
273a0 66 28 20 70 58 3d 3d 70 54 65 72 6d 20 29 20 62  f( pX==pTerm ) b
273b0 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  reak;.      if( 
273c0 70 58 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20 26  pX->iParent>=0 &
273d0 26 20 28 26 70 57 43 2d 3e 61 5b 70 58 2d 3e 69  & (&pWC->a[pX->i
273e0 50 61 72 65 6e 74 5d 29 3d 3d 70 54 65 72 6d 20  Parent])==pTerm 
273f0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
27400 20 20 20 69 66 28 20 6a 3c 30 20 29 20 70 4c 6f     if( j<0 ) pLo
27410 6f 70 2d 3e 6e 4f 75 74 20 2b 3d 20 70 54 65 72  op->nOut += pTer
27420 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20 20  m->truthProb;.  
27430 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 68 61  }.}../*.** We ha
27440 76 65 20 73 6f 20 66 61 72 20 6d 61 74 63 68 65  ve so far matche
27450 64 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  d pBuilder->pNew
27460 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 74 65  ->u.btree.nEq te
27470 72 6d 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  rms of the index
27480 20 70 49 6e 64 65 78 2e 0a 2a 2a 20 54 72 79 20   pIndex..** Try 
27490 74 6f 20 6d 61 74 63 68 20 6f 6e 65 20 6d 6f 72  to match one mor
274a0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 50 72 6f  e..**.** If pPro
274b0 62 65 2d 3e 74 6e 75 6d 3d 3d 30 2c 20 74 68 61  be->tnum==0, tha
274c0 74 20 6d 65 61 6e 73 20 70 49 6e 64 65 78 20 69  t means pIndex i
274d0 73 20 61 20 66 61 6b 65 20 69 6e 64 65 78 20 75  s a fake index u
274e0 73 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 49  sed for the.** I
274f0 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
27500 45 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  EY..*/.static in
27510 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  t whereLoopAddBt
27520 72 65 65 49 6e 64 65 78 28 0a 20 20 57 68 65 72  reeIndex(.  Wher
27530 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
27540 75 69 6c 64 65 72 2c 20 20 20 20 20 2f 2a 20 54  uilder,     /* T
27550 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 66 61 63  he WhereLoop fac
27560 74 6f 72 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  tory */.  struct
27570 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
27580 53 72 63 2c 20 20 20 20 20 20 2f 2a 20 46 52 4f  Src,      /* FRO
27590 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 62 65  M clause term be
275a0 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a  ing analyzed */.
275b0 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 2c    Index *pProbe,
275c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
275d0 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6f 6e    /* An index on
275e0 20 70 53 72 63 20 2a 2f 0a 20 20 4c 6f 67 45 73   pSrc */.  LogEs
275f0 74 20 6e 49 6e 4d 75 6c 20 20 20 20 20 20 20 20  t nInMul        
27600 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f             /* lo
27610 67 28 4e 75 6d 62 65 72 20 6f 66 20 69 74 65 72  g(Number of iter
27620 61 74 69 6f 6e 73 20 64 75 65 20 74 6f 20 49 4e  ations due to IN
27630 29 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49  ) */.){.  WhereI
27640 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42  nfo *pWInfo = pB
27650 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 20  uilder->pWInfo; 
27660 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73   /* WHERE analys
27670 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50  e context */.  P
27680 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
27690 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20  WInfo->pParse;  
276a0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
276b0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71   context */.  sq
276c0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
276d0 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a  se->db;       /*
276e0 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
276f0 74 69 6f 6e 20 6d 61 6c 6c 6f 63 20 63 6f 6e 74  tion malloc cont
27700 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  ext */.  WhereLo
27710 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  op *pNew;       
27720 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
27730 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 75  late WhereLoop u
27740 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
27750 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  n */.  WhereTerm
27760 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20   *pTerm;        
27770 20 20 20 20 20 20 20 2f 2a 20 41 20 57 68 65 72         /* A Wher
27780 65 54 65 72 6d 20 75 6e 64 65 72 20 63 6f 6e 73  eTerm under cons
27790 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  ideration */.  i
277a0 6e 74 20 6f 70 4d 61 73 6b 3b 20 20 20 20 20 20  nt opMask;      
277b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
277c0 2a 20 56 61 6c 69 64 20 6f 70 65 72 61 74 6f 72  * Valid operator
277d0 73 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74  s for constraint
277e0 73 20 2a 2f 0a 20 20 57 68 65 72 65 53 63 61 6e  s */.  WhereScan
277f0 20 73 63 61 6e 3b 20 20 20 20 20 20 20 20 20 20   scan;          
27800 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
27810 6f 72 20 66 6f 72 20 57 48 45 52 45 20 74 65 72  or for WHERE ter
27820 6d 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ms */.  Bitmask 
27830 73 61 76 65 64 5f 70 72 65 72 65 71 3b 20 20 20  saved_prereq;   
27840 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
27850 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
27860 77 2d 3e 70 72 65 72 65 71 20 2a 2f 0a 20 20 75  w->prereq */.  u
27870 31 36 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b  16 saved_nLTerm;
27880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27890 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
278a0 20 6f 66 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d   of pNew->nLTerm
278b0 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 5f   */.  int saved_
278c0 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  nEq;            
278d0 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61        /* Origina
278e0 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d  l value of pNew-
278f0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 2a 2f 0a  >u.btree.nEq */.
27900 20 20 75 33 32 20 73 61 76 65 64 5f 77 73 46 6c    u32 saved_wsFl
27910 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
27920 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
27930 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 77 73 46  lue of pNew->wsF
27940 6c 61 67 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  lags */.  LogEst
27950 20 73 61 76 65 64 5f 6e 4f 75 74 3b 20 20 20 20   saved_nOut;    
27960 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
27970 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  ginal value of p
27980 4e 65 77 2d 3e 6e 4f 75 74 20 2a 2f 0a 20 20 69  New->nOut */.  i
27990 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt iCol;        
279a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
279b0 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 63  * Index of the c
279c0 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62  olumn in the tab
279d0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  le */.  int rc =
279e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
279f0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
27a00 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4c 6f 67 45  n code */.  LogE
27a10 73 74 20 6e 52 6f 77 45 73 74 3b 20 20 20 20 20  st nRowEst;     
27a20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
27a30 73 74 69 6d 61 74 65 64 20 69 6e 64 65 78 20 73  stimated index s
27a40 65 6c 65 63 74 69 76 69 74 79 20 2a 2f 0a 20 20  electivity */.  
27a50 4c 6f 67 45 73 74 20 72 4c 6f 67 53 69 7a 65 3b  LogEst rLogSize;
27a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a70 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20  /* Logarithm of 
27a80 74 61 62 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20  table size */.  
27a90 57 68 65 72 65 54 65 72 6d 20 2a 70 54 6f 70 20  WhereTerm *pTop 
27aa0 3d 20 30 2c 20 2a 70 42 74 6d 20 3d 20 30 3b 20  = 0, *pBtm = 0; 
27ab0 2f 2a 20 54 6f 70 20 61 6e 64 20 62 6f 74 74 6f  /* Top and botto
27ac0 6d 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  m range constrai
27ad0 6e 74 73 20 2a 2f 0a 0a 20 20 70 4e 65 77 20 3d  nts */..  pNew =
27ae0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b   pBuilder->pNew;
27af0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
27b00 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
27b10 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a   SQLITE_NOMEM;..
27b20 20 20 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d    assert( (pNew-
27b30 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
27b40 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d  _VIRTUALTABLE)==
27b50 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  0 );.  assert( (
27b60 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
27b70 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29  WHERE_TOP_LIMIT)
27b80 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  ==0 );.  if( pNe
27b90 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
27ba0 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a  RE_BTM_LIMIT ){.
27bb0 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f      opMask = WO_
27bc0 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65 6c 73  LT|WO_LE;.  }els
27bd0 65 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 74 6e  e if( pProbe->tn
27be0 75 6d 3c 3d 30 20 7c 7c 20 28 70 53 72 63 2d 3e  um<=0 || (pSrc->
27bf0 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45  jointype & JT_LE
27c00 46 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 6f 70  FT)!=0 ){.    op
27c10 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f  Mask = WO_EQ|WO_
27c20 49 4e 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57  IN|WO_GT|WO_GE|W
27c30 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65  O_LT|WO_LE;.  }e
27c40 6c 73 65 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20  lse{.    opMask 
27c50 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f  = WO_EQ|WO_IN|WO
27c60 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 47 54 7c 57 4f  _ISNULL|WO_GT|WO
27c70 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b  _GE|WO_LT|WO_LE;
27c80 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72 6f 62  .  }.  if( pProb
27c90 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 20  e->bUnordered ) 
27ca0 6f 70 4d 61 73 6b 20 26 3d 20 7e 28 57 4f 5f 47  opMask &= ~(WO_G
27cb0 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f  T|WO_GE|WO_LT|WO
27cc0 5f 4c 45 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  _LE);..  assert(
27cd0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
27ce0 45 71 3c 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c  Eq<=pProbe->nCol
27cf0 75 6d 6e 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  umn );.  if( pNe
27d00 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3c  w->u.btree.nEq <
27d10 20 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e   pProbe->nColumn
27d20 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70   ){.    iCol = p
27d30 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Probe->aiColumn[
27d40 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
27d50 71 5d 3b 0a 20 20 20 20 6e 52 6f 77 45 73 74 20  q];.    nRowEst 
27d60 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
27d70 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74  pProbe->aiRowEst
27d80 5b 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e  [pNew->u.btree.n
27d90 45 71 2b 31 5d 29 3b 0a 20 20 20 20 69 66 28 20  Eq+1]);.    if( 
27da0 6e 52 6f 77 45 73 74 3d 3d 30 20 26 26 20 70 50  nRowEst==0 && pP
27db0 72 6f 62 65 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  robe->onError==O
27dc0 45 5f 4e 6f 6e 65 20 29 20 6e 52 6f 77 45 73 74  E_None ) nRowEst
27dd0 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
27de0 20 20 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20     iCol = -1;.  
27df0 20 20 6e 52 6f 77 45 73 74 20 3d 20 30 3b 0a 20    nRowEst = 0;. 
27e00 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20 77 68 65   }.  pTerm = whe
27e10 72 65 53 63 61 6e 49 6e 69 74 28 26 73 63 61 6e  reScanInit(&scan
27e20 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 2c  , pBuilder->pWC,
27e30 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20   pSrc->iCursor, 
27e40 69 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  iCol,.          
27e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70                op
27e60 4d 61 73 6b 2c 20 70 50 72 6f 62 65 29 3b 0a 20  Mask, pProbe);. 
27e70 20 73 61 76 65 64 5f 6e 45 71 20 3d 20 70 4e 65   saved_nEq = pNe
27e80 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a  w->u.btree.nEq;.
27e90 20 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 20 3d    saved_nLTerm =
27ea0 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3b 0a 20   pNew->nLTerm;. 
27eb0 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 20 3d   saved_wsFlags =
27ec0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 3b 0a   pNew->wsFlags;.
27ed0 20 20 73 61 76 65 64 5f 70 72 65 72 65 71 20 3d    saved_prereq =
27ee0 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 3b 0a 20   pNew->prereq;. 
27ef0 20 73 61 76 65 64 5f 6e 4f 75 74 20 3d 20 70 4e   saved_nOut = pN
27f00 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20 70 4e 65 77  ew->nOut;.  pNew
27f10 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20  ->rSetup = 0;.  
27f20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f  rLogSize = estLo
27f30 67 28 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  g(sqlite3LogEst(
27f40 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74  pProbe->aiRowEst
27f50 5b 30 5d 29 29 3b 0a 20 20 66 6f 72 28 3b 20 72  [0]));.  for(; r
27f60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
27f70 70 54 65 72 6d 21 3d 30 3b 20 70 54 65 72 6d 20  pTerm!=0; pTerm 
27f80 3d 20 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28  = whereScanNext(
27f90 26 73 63 61 6e 29 29 7b 0a 20 20 20 20 69 6e 74  &scan)){.    int
27fa0 20 6e 49 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66   nIn = 0;.#ifdef
27fb0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
27fc0 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
27fd0 20 20 69 6e 74 20 6e 52 65 63 56 61 6c 69 64 20    int nRecValid 
27fe0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63  = pBuilder->nRec
27ff0 56 61 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20  Valid;.#endif.  
28000 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
28010 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 53 4e 55  perator==WO_ISNU
28020 4c 4c 20 7c 7c 20 28 70 54 65 72 6d 2d 3e 77 74  LL || (pTerm->wt
28030 46 6c 61 67 73 26 54 45 52 4d 5f 56 4e 55 4c 4c  Flags&TERM_VNULL
28040 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20 28 69  )!=0).     && (i
28050 43 6f 6c 3c 30 20 7c 7c 20 70 53 72 63 2d 3e 70  Col<0 || pSrc->p
28060 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
28070 6e 6f 74 4e 75 6c 6c 29 0a 20 20 20 20 29 7b 0a  notNull).    ){.
28080 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20        continue; 
28090 2f 2a 20 69 67 6e 6f 72 65 20 49 53 20 5b 4e 4f  /* ignore IS [NO
280a0 54 5d 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69  T] NULL constrai
280b0 6e 74 73 20 6f 6e 20 4e 4f 54 20 4e 55 4c 4c 20  nts on NOT NULL 
280c0 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 7d  columns */.    }
280d0 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
280e0 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70 4e  prereqRight & pN
280f0 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63  ew->maskSelf ) c
28100 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 61 73  ontinue;..    as
28110 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75 74  sert( pNew->nOut
28120 3d 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b 0a  ==saved_nOut );.
28130 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61  .    pNew->wsFla
28140 67 73 20 3d 20 73 61 76 65 64 5f 77 73 46 6c 61  gs = saved_wsFla
28150 67 73 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e  gs;.    pNew->u.
28160 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65  btree.nEq = save
28170 64 5f 6e 45 71 3b 0a 20 20 20 20 70 4e 65 77 2d  d_nEq;.    pNew-
28180 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65 64 5f  >nLTerm = saved_
28190 6e 4c 54 65 72 6d 3b 0a 20 20 20 20 69 66 28 20  nLTerm;.    if( 
281a0 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28  whereLoopResize(
281b0 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e  db, pNew, pNew->
281c0 6e 4c 54 65 72 6d 2b 31 29 20 29 20 62 72 65 61  nLTerm+1) ) brea
281d0 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20 20  k; /* OOM */.   
281e0 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e   pNew->aLTerm[pN
281f0 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20  ew->nLTerm++] = 
28200 70 54 65 72 6d 3b 0a 20 20 20 20 70 4e 65 77 2d  pTerm;.    pNew-
28210 3e 70 72 65 72 65 71 20 3d 20 28 73 61 76 65 64  >prereq = (saved
28220 5f 70 72 65 72 65 71 20 7c 20 70 54 65 72 6d 2d  _prereq | pTerm-
28230 3e 70 72 65 72 65 71 52 69 67 68 74 29 20 26 20  >prereqRight) & 
28240 7e 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b  ~pNew->maskSelf;
28250 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20  .    pNew->rRun 
28260 3d 20 72 4c 6f 67 53 69 7a 65 3b 20 2f 2a 20 42  = rLogSize; /* B
28270 61 73 65 6c 69 6e 65 20 63 6f 73 74 20 69 73 20  aseline cost is 
28280 6c 6f 67 32 28 4e 29 2e 20 20 41 64 6a 75 73 74  log2(N).  Adjust
28290 6d 65 6e 74 73 20 62 65 6c 6f 77 20 2a 2f 0a 20  ments below */. 
282a0 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
282b0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20  perator & WO_IN 
282c0 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
282d0 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45  Expr = pTerm->pE
282e0 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  xpr;.      pNew-
282f0 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
28300 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20  E_COLUMN_IN;.   
28310 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
28320 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
28330 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
28340 20 20 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20         /* "x IN 
28350 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 3a 20 20  (SELECT ...)":  
28360 54 55 4e 49 4e 47 3a 20 74 68 65 20 53 45 4c 45  TUNING: the SELE
28370 43 54 20 72 65 74 75 72 6e 73 20 32 35 20 72 6f  CT returns 25 ro
28380 77 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 49  ws */.        nI
28390 6e 20 3d 20 34 36 3b 20 20 61 73 73 65 72 74 28  n = 46;  assert(
283a0 20 34 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   46==sqlite3LogE
283b0 73 74 28 32 35 29 20 29 3b 0a 20 20 20 20 20 20  st(25) );.      
283c0 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53  }else if( ALWAYS
283d0 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20  (pExpr->x.pList 
283e0 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  && pExpr->x.pLis
283f0 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20  t->nExpr) ){.   
28400 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 76       /* "x IN (v
28410 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e  alue, value, ...
28420 29 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 49  )" */.        nI
28430 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  n = sqlite3LogEs
28440 74 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  t(pExpr->x.pList
28450 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->nExpr);.      
28460 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52  }.      pNew->rR
28470 75 6e 20 2b 3d 20 6e 49 6e 3b 0a 20 20 20 20 20  un += nIn;.     
28480 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
28490 45 71 2b 2b 3b 0a 20 20 20 20 20 20 70 4e 65 77  Eq++;.      pNew
284a0 2d 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77 45 73 74  ->nOut = nRowEst
284b0 20 2b 20 6e 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b   + nInMul + nIn;
284c0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
284d0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
284e0 26 20 28 57 4f 5f 45 51 29 20 29 7b 0a 20 20 20  & (WO_EQ) ){.   
284f0 20 20 20 61 73 73 65 72 74 28 20 28 70 4e 65 77     assert( (pNew
28500 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45  ->wsFlags & (WHE
28510 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 7c 57  RE_COLUMN_NULL|W
28520 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 29  HERE_COLUMN_IN))
28530 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  !=0.            
28540 20 20 20 20 20 20 7c 7c 20 6e 49 6e 4d 75 6c 3d        || nInMul=
28550 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  =0 );.      pNew
28560 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
28570 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20  RE_COLUMN_EQ;.  
28580 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 20      if( iCol<0  
28590 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 72 6f  .       || (pPro
285a0 62 65 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  be->onError!=OE_
285b0 4e 6f 6e 65 20 26 26 20 6e 49 6e 4d 75 6c 3d 3d  None && nInMul==
285c0 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  0.           && 
285d0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
285e0 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75  q==pProbe->nColu
285f0 6d 6e 2d 31 29 0a 20 20 20 20 20 20 29 7b 0a 20  mn-1).      ){. 
28600 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
28610 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
28620 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29  WHERE_COLUMN_IN)
28630 3d 3d 30 20 7c 7c 20 69 43 6f 6c 3c 30 20 29 3b  ==0 || iCol<0 );
28640 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  .        pNew->w
28650 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
28660 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 20 20 7d 0a  ONEROW;.      }.
28670 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74        pNew->u.bt
28680 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20 20  ree.nEq++;.     
28690 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 6e 52   pNew->nOut = nR
286a0 6f 77 45 73 74 20 2b 20 6e 49 6e 4d 75 6c 3b 0a  owEst + nInMul;.
286b0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54      }else if( pT
286c0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
286d0 20 28 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 7b 0a   (WO_ISNULL) ){.
286e0 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
286f0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
28700 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20  UMN_NULL;.      
28710 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
28720 71 2b 2b 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55  q++;.      /* TU
28730 4e 49 4e 47 3a 20 49 53 20 4e 55 4c 4c 20 73 65  NING: IS NULL se
28740 6c 65 63 74 73 20 32 20 72 6f 77 73 20 2a 2f 0a  lects 2 rows */.
28750 20 20 20 20 20 20 6e 49 6e 20 3d 20 31 30 3b 20        nIn = 10; 
28760 20 61 73 73 65 72 74 28 20 31 30 3d 3d 73 71 6c   assert( 10==sql
28770 69 74 65 33 4c 6f 67 45 73 74 28 32 29 20 29 3b  ite3LogEst(2) );
28780 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75  .      pNew->nOu
28790 74 20 3d 20 6e 52 6f 77 45 73 74 20 2b 20 6e 49  t = nRowEst + nI
287a0 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20 20  nMul + nIn;.    
287b0 7d 65 6c 73 65 20 69 66 28 20 70 54 65 72 6d 2d  }else if( pTerm-
287c0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
287d0 5f 47 54 7c 57 4f 5f 47 45 29 20 29 7b 0a 20 20  _GT|WO_GE) ){.  
287e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
287f0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
28800 20 57 4f 5f 47 54 20 29 3b 0a 20 20 20 20 20 20   WO_GT );.      
28810 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
28820 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
28830 47 45 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  GE );.      pNew
28840 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
28850 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c  RE_COLUMN_RANGE|
28860 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b  WHERE_BTM_LIMIT;
28870 0a 20 20 20 20 20 20 70 42 74 6d 20 3d 20 70 54  .      pBtm = pT
28880 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 6f 70 20  erm;.      pTop 
28890 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
288a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
288b0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
288c0 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 20 29   (WO_LT|WO_LE) )
288d0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
288e0 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
288f0 6f 72 20 26 20 57 4f 5f 4c 54 20 29 3b 0a 20 20  or & WO_LT );.  
28900 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
28910 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
28920 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20   WO_LE );.      
28930 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
28940 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41   WHERE_COLUMN_RA
28950 4e 47 45 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49  NGE|WHERE_TOP_LI
28960 4d 49 54 3b 0a 20 20 20 20 20 20 70 54 6f 70 20  MIT;.      pTop 
28970 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  = pTerm;.      p
28980 42 74 6d 20 3d 20 28 70 4e 65 77 2d 3e 77 73 46  Btm = (pNew->wsF
28990 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d  lags & WHERE_BTM
289a0 5f 4c 49 4d 49 54 29 21 3d 30 20 3f 0a 20 20 20  _LIMIT)!=0 ?.   
289b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
289c0 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70    pNew->aLTerm[p
289d0 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2d 32 5d 20 3a  New->nLTerm-2] :
289e0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
289f0 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20  ( pNew->wsFlags 
28a00 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52  & WHERE_COLUMN_R
28a10 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ANGE ){.      /*
28a20 20 41 64 6a 75 73 74 20 6e 4f 75 74 20 61 6e 64   Adjust nOut and
28a30 20 72 52 75 6e 20 66 6f 72 20 53 54 41 54 33 20   rRun for STAT3 
28a40 72 61 6e 67 65 20 76 61 6c 75 65 73 20 2a 2f 0a  range values */.
28a50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e        assert( pN
28a60 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65 64 5f  ew->nOut==saved_
28a70 6e 4f 75 74 20 29 3b 0a 20 20 20 20 20 20 77 68  nOut );.      wh
28a80 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28  ereRangeScanEst(
28a90 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72  pParse, pBuilder
28aa0 2c 20 70 42 74 6d 2c 20 70 54 6f 70 2c 20 70 4e  , pBtm, pTop, pN
28ab0 65 77 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  ew);.    }.#ifde
28ac0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
28ad0 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
28ae0 20 20 20 69 66 28 20 6e 49 6e 4d 75 6c 3d 3d 30     if( nInMul==0
28af0 20 0a 20 20 20 20 20 26 26 20 70 50 72 6f 62 65   .     && pProbe
28b00 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20 20 20 20 20  ->nSample .     
28b10 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  && pNew->u.btree
28b20 2e 6e 45 71 3c 3d 70 50 72 6f 62 65 2d 3e 6e 53  .nEq<=pProbe->nS
28b30 61 6d 70 6c 65 43 6f 6c 0a 20 20 20 20 20 26 26  ampleCol.     &&
28b40 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
28b50 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
28b60 53 74 61 74 33 29 20 0a 20 20 20 20 29 7b 0a 20  Stat3) .    ){. 
28b70 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
28b80 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
28b90 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 6e  .      tRowcnt n
28ba0 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  Out = 0;.      i
28bb0 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
28bc0 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f  ator & (WO_EQ|WO
28bd0 5f 49 53 4e 55 4c 4c 29 29 21 3d 30 20 29 7b 0a  _ISNULL))!=0 ){.
28be0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
28bf0 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
28c00 6f 72 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20  or & WO_EQ );.  
28c10 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
28c20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
28c30 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a   & WO_ISNULL );.
28c40 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
28c50 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 70  reEqualScanEst(p
28c60 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c  Parse, pBuilder,
28c70 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
28c80 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 7d 65  &nOut);.      }e
28c90 6c 73 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e  lse if( (pTerm->
28ca0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
28cb0 4e 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  N).             
28cc0 26 26 20 20 21 45 78 70 72 48 61 73 50 72 6f 70  &&  !ExprHasProp
28cd0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
28ce0 49 73 53 65 6c 65 63 74 29 20 20 29 7b 0a 20 20  IsSelect)  ){.  
28cf0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
28d00 49 6e 53 63 61 6e 45 73 74 28 70 50 61 72 73 65  InScanEst(pParse
28d10 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 45 78 70  , pBuilder, pExp
28d20 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 4f 75  r->x.pList, &nOu
28d30 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
28d40 20 20 61 73 73 65 72 74 28 20 6e 4f 75 74 3d 3d    assert( nOut==
28d50 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  0 || rc==SQLITE_
28d60 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OK );.      if( 
28d70 6e 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20  nOut ){.        
28d80 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c  pNew->nOut = sql
28d90 69 74 65 33 4c 6f 67 45 73 74 28 6e 4f 75 74 29  ite3LogEst(nOut)
28da0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
28db0 65 77 2d 3e 6e 4f 75 74 3e 73 61 76 65 64 5f 6e  ew->nOut>saved_n
28dc0 4f 75 74 20 29 20 70 4e 65 77 2d 3e 6e 4f 75 74  Out ) pNew->nOut
28dd0 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20   = saved_nOut;. 
28de0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
28df0 64 69 66 0a 20 20 20 20 69 66 28 20 28 70 4e 65  dif.    if( (pNe
28e00 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48  w->wsFlags & (WH
28e10 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45  ERE_IDX_ONLY|WHE
28e20 52 45 5f 49 50 4b 29 29 3d 3d 30 20 29 7b 0a 20  RE_IPK))==0 ){. 
28e30 20 20 20 20 20 2f 2a 20 45 61 63 68 20 72 6f 77       /* Each row
28e40 20 69 6e 76 6f 6c 76 65 73 20 61 20 73 74 65 70   involves a step
28e50 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2c 20 74   of the index, t
28e60 68 65 6e 20 61 20 62 69 6e 61 72 79 20 73 65 61  hen a binary sea
28e70 72 63 68 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  rch of.      ** 
28e80 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 20 2a  the main table *
28e90 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52  /.      pNew->rR
28ea0 75 6e 20 3d 20 20 73 71 6c 69 74 65 33 4c 6f 67  un =  sqlite3Log
28eb0 45 73 74 41 64 64 28 70 4e 65 77 2d 3e 72 52 75  EstAdd(pNew->rRu
28ec0 6e 2c 72 4c 6f 67 53 69 7a 65 3e 32 37 20 3f 20  n,rLogSize>27 ? 
28ed0 72 4c 6f 67 53 69 7a 65 2d 31 37 20 3a 20 31 30  rLogSize-17 : 10
28ee0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  );.    }.    /* 
28ef0 53 74 65 70 20 63 6f 73 74 20 66 6f 72 20 65 61  Step cost for ea
28f00 63 68 20 6f 75 74 70 75 74 20 72 6f 77 20 2a 2f  ch output row */
28f10 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20  .    pNew->rRun 
28f20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
28f30 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70  dd(pNew->rRun, p
28f40 4e 65 77 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20 20  New->nOut);.    
28f50 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41  whereLoopOutputA
28f60 64 6a 75 73 74 28 70 42 75 69 6c 64 65 72 2d 3e  djust(pBuilder->
28f70 70 57 43 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  pWC, pNew);.    
28f80 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e  rc = whereLoopIn
28f90 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70  sert(pBuilder, p
28fa0 4e 65 77 29 3b 0a 20 20 20 20 69 66 28 20 28 70  New);.    if( (p
28fb0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
28fc0 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 3d  HERE_TOP_LIMIT)=
28fd0 3d 30 0a 20 20 20 20 20 26 26 20 70 4e 65 77 2d  =0.     && pNew-
28fe0 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 28 70 50  >u.btree.nEq<(pP
28ff0 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 2b 20  robe->nColumn + 
29000 28 70 50 72 6f 62 65 2d 3e 7a 4e 61 6d 65 21 3d  (pProbe->zName!=
29010 30 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  0)).    ){.     
29020 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72   whereLoopAddBtr
29030 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65 72  eeIndex(pBuilder
29040 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c 20  , pSrc, pProbe, 
29050 6e 49 6e 4d 75 6c 2b 6e 49 6e 29 3b 0a 20 20 20  nInMul+nIn);.   
29060 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75   }.    pNew->nOu
29070 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a  t = saved_nOut;.
29080 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
29090 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
290a0 41 54 34 0a 20 20 20 20 70 42 75 69 6c 64 65 72  AT4.    pBuilder
290b0 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e 52  ->nRecValid = nR
290c0 65 63 56 61 6c 69 64 3b 0a 23 65 6e 64 69 66 0a  ecValid;.#endif.
290d0 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72    }.  pNew->prer
290e0 65 71 20 3d 20 73 61 76 65 64 5f 70 72 65 72 65  eq = saved_prere
290f0 71 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  q;.  pNew->u.btr
29100 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e  ee.nEq = saved_n
29110 45 71 3b 0a 20 20 70 4e 65 77 2d 3e 77 73 46 6c  Eq;.  pNew->wsFl
29120 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73 46 6c  ags = saved_wsFl
29130 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4f 75  ags;.  pNew->nOu
29140 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a  t = saved_nOut;.
29150 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
29160 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a 20   saved_nLTerm;. 
29170 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
29180 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 72 75 65  *.** Return True
29190 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62   if it is possib
291a0 6c 65 20 74 68 61 74 20 70 49 6e 64 65 78 20 6d  le that pIndex m
291b0 69 67 68 74 20 62 65 20 75 73 65 66 75 6c 20 69  ight be useful i
291c0 6e 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 69 6e  n.** implementin
291d0 67 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  g the ORDER BY c
291e0 6c 61 75 73 65 20 69 6e 20 70 42 75 69 6c 64 65  lause in pBuilde
291f0 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  r..**.** Return 
29200 46 61 6c 73 65 20 69 66 20 70 42 75 69 6c 64 65  False if pBuilde
29210 72 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  r does not conta
29220 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  in an ORDER BY c
29230 6c 61 75 73 65 20 6f 72 0a 2a 2a 20 69 66 20 74  lause or.** if t
29240 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 66  here is no way f
29250 6f 72 20 70 49 6e 64 65 78 20 74 6f 20 62 65 20  or pIndex to be 
29260 75 73 65 66 75 6c 20 69 6e 20 69 6d 70 6c 65 6d  useful in implem
29270 65 6e 74 69 6e 67 20 74 68 61 74 0a 2a 2a 20 4f  enting that.** O
29280 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a  RDER BY clause..
29290 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
292a0 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69 74 68  dexMightHelpWith
292b0 4f 72 64 65 72 42 79 28 0a 20 20 57 68 65 72 65  OrderBy(.  Where
292c0 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
292d0 69 6c 64 65 72 2c 0a 20 20 49 6e 64 65 78 20 2a  ilder,.  Index *
292e0 70 49 6e 64 65 78 2c 0a 20 20 69 6e 74 20 69 43  pIndex,.  int iC
292f0 75 72 73 6f 72 0a 29 7b 0a 20 20 45 78 70 72 4c  ursor.){.  ExprL
29300 69 73 74 20 2a 70 4f 42 3b 0a 20 20 69 6e 74 20  ist *pOB;.  int 
29310 69 69 2c 20 6a 6a 3b 0a 0a 20 20 69 66 28 20 70  ii, jj;..  if( p
29320 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65  Index->bUnordere
29330 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  d ) return 0;.  
29340 69 66 28 20 28 70 4f 42 20 3d 20 70 42 75 69 6c  if( (pOB = pBuil
29350 64 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70 4f 72  der->pWInfo->pOr
29360 64 65 72 42 79 29 3d 3d 30 20 29 20 72 65 74 75  derBy)==0 ) retu
29370 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30  rn 0;.  for(ii=0
29380 3b 20 69 69 3c 70 4f 42 2d 3e 6e 45 78 70 72 3b  ; ii<pOB->nExpr;
29390 20 69 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72   ii++){.    Expr
293a0 20 2a 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65   *pExpr = sqlite
293b0 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
293c0 28 70 4f 42 2d 3e 61 5b 69 69 5d 2e 70 45 78 70  (pOB->a[ii].pExp
293d0 72 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70  r);.    if( pExp
293e0 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
293f0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
29400 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62   if( pExpr->iTab
29410 6c 65 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20  le==iCursor ){. 
29420 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a       for(jj=0; j
29430 6a 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d  j<pIndex->nColum
29440 6e 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  n; jj++){.      
29450 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
29460 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e 61 69  lumn==pIndex->ai
29470 43 6f 6c 75 6d 6e 5b 6a 6a 5d 20 29 20 72 65 74  Column[jj] ) ret
29480 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
29490 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
294a0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
294b0 74 75 72 6e 20 61 20 62 69 74 6d 61 73 6b 20 77  turn a bitmask w
294c0 68 65 72 65 20 31 73 20 69 6e 64 69 63 61 74 65  here 1s indicate
294d0 20 74 68 61 74 20 74 68 65 20 63 6f 72 72 65 73   that the corres
294e0 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f  ponding column o
294f0 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 69  f.** the table i
29500 73 20 75 73 65 64 20 62 79 20 61 6e 20 69 6e 64  s used by an ind
29510 65 78 2e 20 20 4f 6e 6c 79 20 74 68 65 20 66 69  ex.  Only the fi
29520 72 73 74 20 36 33 20 63 6f 6c 75 6d 6e 73 20 61  rst 63 columns a
29530 72 65 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a 2a  re considered..*
29540 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  /.static Bitmask
29550 20 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28   columnsInIndex(
29560 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20  Index *pIdx){.  
29570 42 69 74 6d 61 73 6b 20 6d 20 3d 20 30 3b 0a 20  Bitmask m = 0;. 
29580 20 69 6e 74 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d   int j;.  for(j=
29590 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31 3b  pIdx->nColumn-1;
295a0 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20   j>=0; j--){.   
295b0 20 69 6e 74 20 78 20 3d 20 70 49 64 78 2d 3e 61   int x = pIdx->a
295c0 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20  iColumn[j];.    
295d0 61 73 73 65 72 74 28 20 78 3e 3d 30 20 29 3b 0a  assert( x>=0 );.
295e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d      testcase( x=
295f0 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 74 65  =BMS-1 );.    te
29600 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d 32  stcase( x==BMS-2
29610 20 29 3b 0a 20 20 20 20 69 66 28 20 78 3c 42 4d   );.    if( x<BM
29620 53 2d 31 20 29 20 6d 20 7c 3d 20 4d 41 53 4b 42  S-1 ) m |= MASKB
29630 49 54 28 78 29 3b 0a 20 20 7d 0a 20 20 72 65 74  IT(x);.  }.  ret
29640 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 20 43 68 65  urn m;.}../* Che
29650 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 20 70  ck to see if a p
29660 61 72 74 69 61 6c 20 69 6e 64 65 78 20 77 69 74  artial index wit
29670 68 20 70 50 61 72 74 49 6e 64 65 78 57 68 65 72  h pPartIndexWher
29680 65 20 63 61 6e 20 62 65 20 75 73 65 64 0a 2a 2a  e can be used.**
29690 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
296a0 71 75 65 72 79 2e 20 20 52 65 74 75 72 6e 20 74  query.  Return t
296b0 72 75 65 20 69 66 20 69 74 20 63 61 6e 20 62 65  rue if it can be
296c0 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f   and false if no
296d0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
296e0 20 77 68 65 72 65 55 73 61 62 6c 65 50 61 72 74   whereUsablePart
296f0 69 61 6c 49 6e 64 65 78 28 69 6e 74 20 69 54 61  ialIndex(int iTa
29700 62 2c 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  b, WhereClause *
29710 70 57 43 2c 20 45 78 70 72 20 2a 70 57 68 65 72  pWC, Expr *pWher
29720 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57  e){.  int i;.  W
29730 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
29740 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 54 65 72  .  for(i=0, pTer
29750 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d  m=pWC->a; i<pWC-
29760 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65  >nTerm; i++, pTe
29770 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73  rm++){.    if( s
29780 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65  qlite3ExprImplie
29790 73 45 78 70 72 28 70 54 65 72 6d 2d 3e 70 45 78  sExpr(pTerm->pEx
297a0 70 72 2c 20 70 57 68 65 72 65 2c 20 69 54 61 62  pr, pWhere, iTab
297b0 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
297c0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
297d0 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57  ./*.** Add all W
297e0 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
297f0 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74 61   for a single ta
29800 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20  ble of the join 
29810 77 68 65 72 65 20 74 68 65 20 74 61 62 6c 65 0a  where the table.
29820 2a 2a 20 69 73 20 69 64 65 6e 66 69 65 64 20 62  ** is idenfied b
29830 79 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  y pBuilder->pNew
29840 2d 3e 69 54 61 62 2e 20 20 54 68 61 74 20 74 61  ->iTab.  That ta
29850 62 6c 65 20 69 73 20 67 75 61 72 61 6e 74 65 65  ble is guarantee
29860 64 20 74 6f 20 62 65 0a 2a 2a 20 61 20 62 2d 74  d to be.** a b-t
29870 72 65 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61  ree table, not a
29880 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a   virtual table..
29890 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
298a0 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28  ereLoopAddBtree(
298b0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
298c0 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 2f  der *pBuilder, /
298d0 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  * WHERE clause i
298e0 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20  nformation */.  
298f0 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 20 20  Bitmask mExtra  
29900 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
29910 78 74 72 61 20 70 72 65 72 65 71 75 65 73 69 74  xtra prerequesit
29920 65 73 20 66 6f 72 20 75 73 69 6e 67 20 74 68 69  es for using thi
29930 73 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20  s table */.){.  
29940 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
29950 6f 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  o;          /* W
29960 48 45 52 45 20 61 6e 61 6c 79 73 69 73 20 63 6f  HERE analysis co
29970 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78  ntext */.  Index
29980 20 2a 70 50 72 6f 62 65 3b 20 20 20 20 20 20 20   *pProbe;       
29990 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64         /* An ind
299a0 65 78 20 77 65 20 61 72 65 20 65 76 61 6c 75 61  ex we are evalua
299b0 74 69 6e 67 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ting */.  Index 
299c0 73 50 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  sPk;            
299d0 20 20 20 20 20 20 2f 2a 20 41 20 66 61 6b 65 20        /* A fake 
299e0 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 66 6f 72  index object for
299f0 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
29a00 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 61 69   */.  tRowcnt ai
29a10 52 6f 77 45 73 74 50 6b 5b 32 5d 3b 20 20 20 20  RowEstPk[2];    
29a20 20 20 2f 2a 20 54 68 65 20 61 69 52 6f 77 45 73    /* The aiRowEs
29a30 74 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68  t[] value for th
29a40 65 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20  e sPk index */. 
29a50 20 69 6e 74 20 61 69 43 6f 6c 75 6d 6e 50 6b 20   int aiColumnPk 
29a60 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 2f 2a 20  = -1;        /* 
29a70 54 68 65 20 61 43 6f 6c 75 6d 6e 5b 5d 20 76 61  The aColumn[] va
29a80 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20  lue for the sPk 
29a90 69 6e 64 65 78 20 2a 2f 0a 20 20 53 72 63 4c 69  index */.  SrcLi
29aa0 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20  st *pTabList;   
29ab0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52         /* The FR
29ac0 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  OM clause */.  s
29ad0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
29ae0 65 6d 20 2a 70 53 72 63 3b 20 20 2f 2a 20 54 68  em *pSrc;  /* Th
29af0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 62 74  e FROM clause bt
29b00 72 65 65 20 74 65 72 6d 20 74 6f 20 61 64 64 20  ree term to add 
29b10 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
29b20 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  pNew;           
29b30 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20 57 68 65   /* Template Whe
29b40 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f  reLoop object */
29b50 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
29b60 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f  TE_OK;         /
29b70 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
29b80 0a 20 20 69 6e 74 20 69 53 6f 72 74 49 64 78 20  .  int iSortIdx 
29b90 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 1;           /
29ba0 2a 20 49 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a  * Index number *
29bb0 2f 0a 20 20 69 6e 74 20 62 3b 20 20 20 20 20 20  /.  int b;      
29bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29bd0 2f 2a 20 41 20 62 6f 6f 6c 65 61 6e 20 76 61 6c  /* A boolean val
29be0 75 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72  ue */.  LogEst r
29bf0 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
29c00 20 20 20 20 2f 2a 20 6e 75 6d 62 65 72 20 6f 66      /* number of
29c10 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
29c20 6c 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72  le */.  LogEst r
29c30 4c 6f 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20  LogSize;        
29c40 20 20 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d      /* Logarithm
29c50 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
29c60 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  f rows in the ta
29c70 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ble */.  WhereCl
29c80 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20  ause *pWC;      
29c90 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
29ca0 65 64 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ed WHERE clause 
29cb0 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
29cc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29cd0 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20   /* Table being 
29ce0 71 75 65 72 69 65 64 20 2a 2f 0a 20 20 0a 20 20  queried */.  .  
29cf0 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d  pNew = pBuilder-
29d00 3e 70 4e 65 77 3b 0a 20 20 70 57 49 6e 66 6f 20  >pNew;.  pWInfo 
29d10 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
29d20 66 6f 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d  fo;.  pTabList =
29d30 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
29d40 74 3b 0a 20 20 70 53 72 63 20 3d 20 70 54 61 62  t;.  pSrc = pTab
29d50 4c 69 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e  List->a + pNew->
29d60 69 54 61 62 3b 0a 20 20 70 54 61 62 20 3d 20 70  iTab;.  pTab = p
29d70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 70 57 43  Src->pTab;.  pWC
29d80 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43   = pBuilder->pWC
29d90 3b 0a 20 20 61 73 73 65 72 74 28 20 21 49 73 56  ;.  assert( !IsV
29da0 69 72 74 75 61 6c 28 70 53 72 63 2d 3e 70 54 61  irtual(pSrc->pTa
29db0 62 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 72  b) );..  if( pSr
29dc0 63 2d 3e 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  c->pIndex ){.   
29dd0 20 2f 2a 20 41 6e 20 49 4e 44 45 58 45 44 20 42   /* An INDEXED B
29de0 59 20 63 6c 61 75 73 65 20 73 70 65 63 69 66 69  Y clause specifi
29df0 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  es a particular 
29e00 69 6e 64 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a  index to use */.
29e10 20 20 20 20 70 50 72 6f 62 65 20 3d 20 70 53 72      pProbe = pSr
29e20 63 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 7d 65 6c  c->pIndex;.  }el
29e30 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65  se{.    /* There
29e40 20 69 73 20 6e 6f 20 49 4e 44 45 58 45 44 20 42   is no INDEXED B
29e50 59 20 63 6c 61 75 73 65 2e 20 20 43 72 65 61 74  Y clause.  Creat
29e60 65 20 61 20 66 61 6b 65 20 49 6e 64 65 78 20 6f  e a fake Index o
29e70 62 6a 65 63 74 20 69 6e 20 6c 6f 63 61 6c 0a 20  bject in local. 
29e80 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 73     ** variable s
29e90 50 6b 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20  Pk to represent 
29ea0 74 68 65 20 72 6f 77 69 64 20 70 72 69 6d 61 72  the rowid primar
29eb0 79 20 6b 65 79 20 69 6e 64 65 78 2e 20 20 4d 61  y key index.  Ma
29ec0 6b 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 66  ke this.    ** f
29ed0 61 6b 65 20 69 6e 64 65 78 20 74 68 65 20 66 69  ake index the fi
29ee0 72 73 74 20 69 6e 20 61 20 63 68 61 69 6e 20 6f  rst in a chain o
29ef0 66 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 73 20  f Index objects 
29f00 77 69 74 68 20 61 6c 6c 20 6f 66 20 74 68 65 20  with all of the 
29f10 72 65 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 64 69  real.    ** indi
29f20 63 65 73 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f  ces to follow */
29f30 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 46 69 72  .    Index *pFir
29f40 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
29f50 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6f 66       /* First of
29f60 20 72 65 61 6c 20 69 6e 64 69 63 65 73 20 6f 6e   real indices on
29f70 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
29f80 20 20 6d 65 6d 73 65 74 28 26 73 50 6b 2c 20 30    memset(&sPk, 0
29f90 2c 20 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29  , sizeof(Index))
29fa0 3b 0a 20 20 20 20 73 50 6b 2e 6e 43 6f 6c 75 6d  ;.    sPk.nColum
29fb0 6e 20 3d 20 31 3b 0a 20 20 20 20 73 50 6b 2e 61  n = 1;.    sPk.a
29fc0 69 43 6f 6c 75 6d 6e 20 3d 20 26 61 69 43 6f 6c  iColumn = &aiCol
29fd0 75 6d 6e 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 61  umnPk;.    sPk.a
29fe0 69 52 6f 77 45 73 74 20 3d 20 61 69 52 6f 77 45  iRowEst = aiRowE
29ff0 73 74 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e  stPk;.    sPk.on
2a000 45 72 72 6f 72 20 3d 20 4f 45 5f 52 65 70 6c 61  Error = OE_Repla
2a010 63 65 3b 0a 20 20 20 20 73 50 6b 2e 70 54 61 62  ce;.    sPk.pTab
2a020 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 61  le = pTab;.    a
2a030 69 52 6f 77 45 73 74 50 6b 5b 30 5d 20 3d 20 70  iRowEstPk[0] = p
2a040 54 61 62 2d 3e 6e 52 6f 77 45 73 74 3b 0a 20 20  Tab->nRowEst;.  
2a050 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 31 5d 20    aiRowEstPk[1] 
2a060 3d 20 31 3b 0a 20 20 20 20 70 46 69 72 73 74 20  = 1;.    pFirst 
2a070 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 70 49  = pSrc->pTab->pI
2a080 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 53  ndex;.    if( pS
2a090 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d  rc->notIndexed==
2a0a0 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
2a0b0 65 20 72 65 61 6c 20 69 6e 64 69 63 65 73 20 6f  e real indices o
2a0c0 66 20 74 68 65 20 74 61 62 6c 65 20 61 72 65 20  f the table are 
2a0d0 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 65 64 20  only considered 
2a0e0 69 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  if the.      ** 
2a0f0 4e 4f 54 20 49 4e 44 45 58 45 44 20 71 75 61 6c  NOT INDEXED qual
2a100 69 66 69 65 72 20 69 73 20 6f 6d 69 74 74 65 64  ifier is omitted
2a110 20 66 72 6f 6d 20 74 68 65 20 46 52 4f 4d 20 63   from the FROM c
2a120 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 73  lause */.      s
2a130 50 6b 2e 70 4e 65 78 74 20 3d 20 70 46 69 72 73  Pk.pNext = pFirs
2a140 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 72  t;.    }.    pPr
2a150 6f 62 65 20 3d 20 26 73 50 6b 3b 0a 20 20 7d 0a  obe = &sPk;.  }.
2a160 20 20 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65    rSize = sqlite
2a170 33 4c 6f 67 45 73 74 28 70 54 61 62 2d 3e 6e 52  3LogEst(pTab->nR
2a180 6f 77 45 73 74 29 3b 0a 20 20 72 4c 6f 67 53 69  owEst);.  rLogSi
2a190 7a 65 20 3d 20 65 73 74 4c 6f 67 28 72 53 69 7a  ze = estLog(rSiz
2a1a0 65 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  e);..#ifndef SQL
2a1b0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
2a1c0 49 43 5f 49 4e 44 45 58 0a 20 20 2f 2a 20 41 75  IC_INDEX.  /* Au
2a1d0 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 65 73 20  tomatic indexes 
2a1e0 2a 2f 0a 20 20 69 66 28 20 21 70 42 75 69 6c 64  */.  if( !pBuild
2a1f0 65 72 2d 3e 70 4f 72 53 65 74 0a 20 20 20 26 26  er->pOrSet.   &&
2a200 20 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65   (pWInfo->pParse
2a210 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
2a220 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65 78 29 21  LITE_AutoIndex)!
2a230 3d 30 0a 20 20 20 26 26 20 70 53 72 63 2d 3e 70  =0.   && pSrc->p
2a240 49 6e 64 65 78 3d 3d 30 0a 20 20 20 26 26 20 21  Index==0.   && !
2a250 70 53 72 63 2d 3e 76 69 61 43 6f 72 6f 75 74 69  pSrc->viaCorouti
2a260 6e 65 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e  ne.   && !pSrc->
2a270 6e 6f 74 49 6e 64 65 78 65 64 0a 20 20 20 26 26  notIndexed.   &&
2a280 20 21 70 53 72 63 2d 3e 69 73 43 6f 72 72 65 6c   !pSrc->isCorrel
2a290 61 74 65 64 0a 20 20 29 7b 0a 20 20 20 20 2f 2a  ated.  ){.    /*
2a2a0 20 47 65 6e 65 72 61 74 65 20 61 75 74 6f 2d 69   Generate auto-i
2a2b0 6e 64 65 78 20 57 68 65 72 65 4c 6f 6f 70 73 20  ndex WhereLoops 
2a2c0 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  */.    WhereTerm
2a2d0 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 57 68 65   *pTerm;.    Whe
2a2e0 72 65 54 65 72 6d 20 2a 70 57 43 45 6e 64 20 3d  reTerm *pWCEnd =
2a2f0 20 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e   pWC->a + pWC->n
2a300 54 65 72 6d 3b 0a 20 20 20 20 66 6f 72 28 70 54  Term;.    for(pT
2a310 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 72 63 3d 3d  erm=pWC->a; rc==
2a320 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 54 65  SQLITE_OK && pTe
2a330 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d  rm<pWCEnd; pTerm
2a340 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
2a350 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
2a360 74 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65  t & pNew->maskSe
2a370 6c 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  lf ) continue;. 
2a380 20 20 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e       if( termCan
2a390 44 72 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d  DriveIndex(pTerm
2a3a0 2c 20 70 53 72 63 2c 20 30 29 20 29 7b 0a 20 20  , pSrc, 0) ){.  
2a3b0 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74        pNew->u.bt
2a3c0 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20  ree.nEq = 1;.   
2a3d0 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72       pNew->u.btr
2a3e0 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20  ee.pIndex = 0;. 
2a3f0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54         pNew->nLT
2a400 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  erm = 1;.       
2a410 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d   pNew->aLTerm[0]
2a420 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
2a430 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4f 6e 65    /* TUNING: One
2a440 2d 74 69 6d 65 20 63 6f 73 74 20 66 6f 72 20 63  -time cost for c
2a450 6f 6d 70 75 74 69 6e 67 20 74 68 65 20 61 75 74  omputing the aut
2a460 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69 73 0a  omatic index is.
2a470 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70 72 6f          ** appro
2a480 78 69 6d 61 74 65 6c 79 20 37 2a 4e 2a 6c 6f 67  ximately 7*N*log
2a490 32 28 4e 29 20 77 68 65 72 65 20 4e 20 69 73 20  2(N) where N is 
2a4a0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
2a4b0 77 73 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ws in.        **
2a4c0 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
2a4d0 20 69 6e 64 65 78 65 64 2e 20 2a 2f 0a 20 20 20   indexed. */.   
2a4e0 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75       pNew->rSetu
2a4f0 70 20 3d 20 72 4c 6f 67 53 69 7a 65 20 2b 20 72  p = rLogSize + r
2a500 53 69 7a 65 20 2b 20 32 38 3b 20 20 61 73 73 65  Size + 28;  asse
2a510 72 74 28 20 32 38 3d 3d 73 71 6c 69 74 65 33 4c  rt( 28==sqlite3L
2a520 6f 67 45 73 74 28 37 29 20 29 3b 0a 20 20 20 20  ogEst(7) );.    
2a530 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45      /* TUNING: E
2a540 61 63 68 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70  ach index lookup
2a550 20 79 69 65 6c 64 73 20 32 30 20 72 6f 77 73 20   yields 20 rows 
2a560 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54  in the table.  T
2a570 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  his.        ** i
2a580 73 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20  s more than the 
2a590 75 73 75 61 6c 20 67 75 65 73 73 20 6f 66 20 31  usual guess of 1
2a5a0 30 20 72 6f 77 73 2c 20 73 69 6e 63 65 20 77 65  0 rows, since we
2a5b0 20 68 61 76 65 20 6e 6f 20 77 61 79 0a 20 20 20   have no way.   
2a5c0 20 20 20 20 20 2a 2a 20 6f 66 20 6b 6e 6f 77 6e       ** of known
2a5d0 69 6e 67 20 68 6f 77 20 73 65 6c 65 63 74 69 76  ing how selectiv
2a5e0 65 20 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c  e the index will
2a5f0 20 75 6c 74 69 6d 61 74 65 6c 79 20 62 65 2e 20   ultimately be. 
2a600 20 49 74 20 77 6f 75 6c 64 0a 20 20 20 20 20 20   It would.      
2a610 20 20 2a 2a 20 6e 6f 74 20 62 65 20 75 6e 72 65    ** not be unre
2a620 61 73 6f 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65  asonable to make
2a630 20 74 68 69 73 20 76 61 6c 75 65 20 6d 75 63 68   this value much
2a640 20 6c 61 72 67 65 72 2e 20 2a 2f 0a 20 20 20 20   larger. */.    
2a650 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
2a660 20 34 33 3b 20 20 61 73 73 65 72 74 28 20 34 33   43;  assert( 43
2a670 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
2a680 32 30 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70  20) );.        p
2a690 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69  New->rRun = sqli
2a6a0 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72 4c 6f  te3LogEstAdd(rLo
2a6b0 67 53 69 7a 65 2c 70 4e 65 77 2d 3e 6e 4f 75 74  gSize,pNew->nOut
2a6c0 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
2a6d0 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
2a6e0 5f 41 55 54 4f 5f 49 4e 44 45 58 3b 0a 20 20 20  _AUTO_INDEX;.   
2a6f0 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65       pNew->prere
2a700 71 20 3d 20 6d 45 78 74 72 61 20 7c 20 70 54 65  q = mExtra | pTe
2a710 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b  rm->prereqRight;
2a720 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68  .        rc = wh
2a730 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42  ereLoopInsert(pB
2a740 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20  uilder, pNew);. 
2a750 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2a760 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2a770 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
2a780 5f 49 4e 44 45 58 20 2a 2f 0a 0a 20 20 2f 2a 20  _INDEX */..  /* 
2a790 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e  Loop over all in
2a7a0 64 69 63 65 73 0a 20 20 2a 2f 0a 20 20 66 6f 72  dices.  */.  for
2a7b0 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  (; rc==SQLITE_OK
2a7c0 20 26 26 20 70 50 72 6f 62 65 3b 20 70 50 72 6f   && pProbe; pPro
2a7d0 62 65 3d 70 50 72 6f 62 65 2d 3e 70 4e 65 78 74  be=pProbe->pNext
2a7e0 2c 20 69 53 6f 72 74 49 64 78 2b 2b 29 7b 0a 20  , iSortIdx++){. 
2a7f0 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 70     if( pProbe->p
2a800 50 61 72 74 49 64 78 57 68 65 72 65 21 3d 30 0a  PartIdxWhere!=0.
2a810 20 20 20 20 20 26 26 20 21 77 68 65 72 65 55 73       && !whereUs
2a820 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64 65 78  ablePartialIndex
2a830 28 70 4e 65 77 2d 3e 69 54 61 62 2c 20 70 57 43  (pNew->iTab, pWC
2a840 2c 20 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49  , pProbe->pPartI
2a850 64 78 57 68 65 72 65 29 20 29 7b 0a 20 20 20 20  dxWhere) ){.    
2a860 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20    continue;  /* 
2a870 50 61 72 74 69 61 6c 20 69 6e 64 65 78 20 69 6e  Partial index in
2a880 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
2a890 74 68 69 73 20 71 75 65 72 79 20 2a 2f 0a 20 20  this query */.  
2a8a0 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e    }.    pNew->u.
2a8b0 62 74 72 65 65 2e 6e 45 71 20 3d 20 30 3b 0a 20  btree.nEq = 0;. 
2a8c0 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20     pNew->nLTerm 
2a8d0 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69  = 0;.    pNew->i
2a8e0 53 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20 20 20  SortIdx = 0;.   
2a8f0 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20   pNew->rSetup = 
2a900 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72 65  0;.    pNew->pre
2a910 72 65 71 20 3d 20 6d 45 78 74 72 61 3b 0a 20 20  req = mExtra;.  
2a920 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72    pNew->nOut = r
2a930 53 69 7a 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Size;.    pNew->
2a940 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d  u.btree.pIndex =
2a950 20 70 50 72 6f 62 65 3b 0a 20 20 20 20 62 20 3d   pProbe;.    b =
2a960 20 69 6e 64 65 78 4d 69 67 68 74 48 65 6c 70 57   indexMightHelpW
2a970 69 74 68 4f 72 64 65 72 42 79 28 70 42 75 69 6c  ithOrderBy(pBuil
2a980 64 65 72 2c 20 70 50 72 6f 62 65 2c 20 70 53 72  der, pProbe, pSr
2a990 63 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  c->iCursor);.   
2a9a0 20 2f 2a 20 54 68 65 20 4f 4e 45 50 41 53 53 5f   /* The ONEPASS_
2a9b0 44 45 53 49 52 45 44 20 66 6c 61 67 73 20 6e 65  DESIRED flags ne
2a9c0 76 65 72 20 6f 63 63 75 72 73 20 74 6f 67 65 74  ver occurs toget
2a9d0 68 65 72 20 77 69 74 68 20 4f 52 44 45 52 20 42  her with ORDER B
2a9e0 59 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  Y */.    assert(
2a9f0 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
2aa00 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
2aa10 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30  PASS_DESIRED)==0
2aa20 20 7c 7c 20 62 3d 3d 30 20 29 3b 0a 20 20 20 20   || b==0 );.    
2aa30 69 66 28 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d  if( pProbe->tnum
2aa40 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  <=0 ){.      /* 
2aa50 49 6e 74 65 67 65 72 20 70 72 69 6d 61 72 79 20  Integer primary 
2aa60 6b 65 79 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  key index */.   
2aa70 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
2aa80 20 3d 20 57 48 45 52 45 5f 49 50 4b 3b 0a 0a 20   = WHERE_IPK;.. 
2aa90 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 74 61 62       /* Full tab
2aaa0 6c 65 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20  le scan */.     
2aab0 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20   pNew->iSortIdx 
2aac0 3d 20 62 20 3f 20 69 53 6f 72 74 49 64 78 20 3a  = b ? iSortIdx :
2aad0 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e   0;.      /* TUN
2aae0 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 66 75 6c  ING: Cost of ful
2aaf0 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 69 73 20  l table scan is 
2ab00 33 2a 28 4e 20 2b 20 6c 6f 67 32 28 4e 29 29 2e  3*(N + log2(N)).
2ab10 0a 20 20 20 20 20 20 2a 2a 20 20 2b 20 20 54 68  .      **  +  Th
2ab20 65 20 65 78 74 72 61 20 33 20 66 61 63 74 6f 72  e extra 3 factor
2ab30 20 69 73 20 74 6f 20 65 6e 63 6f 75 72 61 67 65   is to encourage
2ab40 20 74 68 65 20 75 73 65 20 6f 66 20 69 6e 64 65   the use of inde
2ab50 78 65 64 20 6c 6f 6f 6b 75 70 73 0a 20 20 20 20  xed lookups.    
2ab60 20 20 2a 2a 20 20 20 20 20 6f 76 65 72 20 66 75    **     over fu
2ab70 6c 6c 20 73 63 61 6e 73 2e 20 20 46 49 58 4d 45  ll scans.  FIXME
2ab80 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   */.      pNew->
2ab90 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f  rRun = sqlite3Lo
2aba0 67 45 73 74 41 64 64 28 72 53 69 7a 65 2c 72 4c  gEstAdd(rSize,rL
2abb0 6f 67 53 69 7a 65 29 20 2b 20 31 36 3b 0a 20 20  ogSize) + 16;.  
2abc0 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74      whereLoopOut
2abd0 70 75 74 41 64 6a 75 73 74 28 70 57 43 2c 20 70  putAdjust(pWC, p
2abe0 4e 65 77 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  New);.      rc =
2abf0 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74   whereLoopInsert
2ac00 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29  (pBuilder, pNew)
2ac10 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f  ;.      pNew->nO
2ac20 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20  ut = rSize;.    
2ac30 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b    if( rc ) break
2ac40 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2ac50 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 70     Bitmask m = p
2ac60 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 7e  Src->colUsed & ~
2ac70 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 70  columnsInIndex(p
2ac80 50 72 6f 62 65 29 3b 0a 20 20 20 20 20 20 70 4e  Probe);.      pN
2ac90 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 28 6d  ew->wsFlags = (m
2aca0 3d 3d 30 29 20 3f 20 28 57 48 45 52 45 5f 49 44  ==0) ? (WHERE_ID
2acb0 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 4e 44  X_ONLY|WHERE_IND
2acc0 45 58 45 44 29 20 3a 20 57 48 45 52 45 5f 49 4e  EXED) : WHERE_IN
2acd0 44 45 58 45 44 3b 0a 0a 20 20 20 20 20 20 2f 2a  DEXED;..      /*
2ace0 20 46 75 6c 6c 20 73 63 61 6e 20 76 69 61 20 69   Full scan via i
2acf0 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 66  ndex */.      if
2ad00 28 20 62 0a 20 20 20 20 20 20 20 7c 7c 20 28 20  ( b.       || ( 
2ad10 6d 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  m==0.         &&
2ad20 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65   pProbe->bUnorde
2ad30 72 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  red==0.         
2ad40 26 26 20 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78  && pProbe->szIdx
2ad50 52 6f 77 3c 70 54 61 62 2d 3e 73 7a 54 61 62 52  Row<pTab->szTabR
2ad60 6f 77 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  ow.         && (
2ad70 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
2ad80 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
2ad90 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 0a 20  SS_DESIRED)==0. 
2ada0 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
2adb0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
2adc0 55 73 65 43 69 73 0a 20 20 20 20 20 20 20 20 20  UseCis.         
2add0 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
2ade0 6e 61 62 6c 65 64 28 70 57 49 6e 66 6f 2d 3e 70  nabled(pWInfo->p
2adf0 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54  Parse->db, SQLIT
2ae00 45 5f 43 6f 76 65 72 49 64 78 53 63 61 6e 29 0a  E_CoverIdxScan).
2ae10 20 20 20 20 20 20 20 20 20 20 29 0a 20 20 20 20            ).    
2ae20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65    ){.        pNe
2ae30 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20  w->iSortIdx = b 
2ae40 3f 20 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a  ? iSortIdx : 0;.
2ae50 20 20 20 20 20 20 20 20 69 66 28 20 6d 3d 3d 30          if( m==0
2ae60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
2ae70 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66   TUNING: Cost of
2ae80 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
2ae90 78 20 73 63 61 6e 20 69 73 20 4b 2a 28 4e 20 2b  x scan is K*(N +
2aea0 20 6c 6f 67 32 28 4e 29 29 2e 0a 20 20 20 20 20   log2(N))..     
2aeb0 20 20 20 20 20 2a 2a 20 20 2b 20 20 54 68 65 20       **  +  The 
2aec0 65 78 74 72 61 20 66 61 63 74 6f 72 20 4b 20 6f  extra factor K o
2aed0 66 20 62 65 74 77 65 65 6e 20 31 2e 31 20 61 6e  f between 1.1 an
2aee0 64 20 33 2e 30 20 74 68 61 74 20 64 65 70 65 6e  d 3.0 that depen
2aef0 64 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ds.          ** 
2af00 20 20 20 20 6f 6e 20 74 68 65 20 72 65 6c 61 74      on the relat
2af10 69 76 65 20 73 69 7a 65 73 20 6f 66 20 74 68 65  ive sizes of the
2af20 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65 20 69   table and the i
2af30 6e 64 65 78 2e 20 20 4b 0a 20 20 20 20 20 20 20  ndex.  K.       
2af40 20 20 20 2a 2a 20 20 20 20 20 69 73 20 73 6d 61     **     is sma
2af50 6c 6c 65 72 20 66 6f 72 20 73 6d 61 6c 6c 65 72  ller for smaller
2af60 20 69 6e 64 69 63 65 73 2c 20 74 68 75 73 20 66   indices, thus f
2af70 61 76 6f 72 69 6e 67 20 74 68 65 6d 2e 0a 20 20  avoring them..  
2af80 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2af90 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20       pNew->rRun 
2afa0 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
2afb0 64 64 28 72 53 69 7a 65 2c 72 4c 6f 67 53 69 7a  dd(rSize,rLogSiz
2afc0 65 29 20 2b 20 31 20 2b 0a 20 20 20 20 20 20 20  e) + 1 +.       
2afd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2afe0 20 28 31 35 2a 70 50 72 6f 62 65 2d 3e 73 7a 49   (15*pProbe->szI
2aff0 64 78 52 6f 77 29 2f 70 54 61 62 2d 3e 73 7a 54  dxRow)/pTab->szT
2b000 61 62 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 7d  abRow;.        }
2b010 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2b020 61 73 73 65 72 74 28 20 62 21 3d 30 20 29 3b 20  assert( b!=0 ); 
2b030 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 55  .          /* TU
2b040 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 73 63  NING: Cost of sc
2b050 61 6e 6e 69 6e 67 20 61 20 6e 6f 6e 2d 63 6f 76  anning a non-cov
2b060 65 72 69 6e 67 20 69 6e 64 65 78 20 69 73 20 28  ering index is (
2b070 4e 2b 31 29 2a 6c 6f 67 32 28 4e 29 0a 20 20 20  N+1)*log2(N).   
2b080 20 20 20 20 20 20 20 2a 2a 20 77 68 69 63 68 20         ** which 
2b090 77 65 20 77 69 6c 6c 20 73 69 6d 70 6c 69 66 79  we will simplify
2b0a0 20 74 6f 20 6a 75 73 74 20 4e 2a 6c 6f 67 32 28   to just N*log2(
2b0b0 4e 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  N) */.          
2b0c0 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72 53 69  pNew->rRun = rSi
2b0d0 7a 65 20 2b 20 72 4c 6f 67 53 69 7a 65 3b 0a 20  ze + rLogSize;. 
2b0e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b0f0 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74   whereLoopOutput
2b100 41 64 6a 75 73 74 28 70 57 43 2c 20 70 4e 65 77  Adjust(pWC, pNew
2b110 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2b120 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28  whereLoopInsert(
2b130 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b  pBuilder, pNew);
2b140 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  .        pNew->n
2b150 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20  Out = rSize;.   
2b160 20 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72       if( rc ) br
2b170 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
2b180 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 77 68 65   }..    rc = whe
2b190 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e  reLoopAddBtreeIn
2b1a0 64 65 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53  dex(pBuilder, pS
2b1b0 72 63 2c 20 70 50 72 6f 62 65 2c 20 30 29 3b 0a  rc, pProbe, 0);.
2b1c0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
2b1d0 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
2b1e0 41 54 34 0a 20 20 20 20 73 71 6c 69 74 65 33 53  AT4.    sqlite3S
2b1f0 74 61 74 34 50 72 6f 62 65 46 72 65 65 28 70 42  tat4ProbeFree(pB
2b200 75 69 6c 64 65 72 2d 3e 70 52 65 63 29 3b 0a 20  uilder->pRec);. 
2b210 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65     pBuilder->nRe
2b220 63 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20  cValid = 0;.    
2b230 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d  pBuilder->pRec =
2b240 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20   0;.#endif..    
2b250 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20  /* If there was 
2b260 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  an INDEXED BY cl
2b270 61 75 73 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20  ause, then only 
2b280 74 68 61 74 20 6f 6e 65 20 69 6e 64 65 78 20 69  that one index i
2b290 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65  s.    ** conside
2b2a0 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  red. */.    if( 
2b2b0 70 53 72 63 2d 3e 70 49 6e 64 65 78 20 29 20 62  pSrc->pIndex ) b
2b2c0 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
2b2d0 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
2b2e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
2b2f0 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a  RTUALTABLE./*.**
2b300 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f   Add all WhereLo
2b310 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61  op objects for a
2b320 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f   table of the jo
2b330 69 6e 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  in identified by
2b340 0a 2a 2a 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  .** pBuilder->pN
2b350 65 77 2d 3e 69 54 61 62 2e 20 20 54 68 61 74 20  ew->iTab.  That 
2b360 74 61 62 6c 65 20 69 73 20 67 75 61 72 61 6e 74  table is guarant
2b370 65 65 64 20 74 6f 20 62 65 20 61 20 76 69 72 74  eed to be a virt
2b380 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  ual table..*/.st
2b390 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
2b3a0 6f 70 41 64 64 56 69 72 74 75 61 6c 28 0a 20 20  opAddVirtual(.  
2b3b0 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
2b3c0 20 2a 70 42 75 69 6c 64 65 72 20 20 20 2f 2a 20   *pBuilder   /* 
2b3d0 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 66  WHERE clause inf
2b3e0 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20  ormation */.){. 
2b3f0 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
2b400 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  fo;           /*
2b410 20 57 48 45 52 45 20 61 6e 61 6c 79 73 69 73 20   WHERE analysis 
2b420 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61 72  context */.  Par
2b430 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20  se *pParse;     
2b440 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2b450 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
2b460 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
2b470 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20  e *pWC;         
2b480 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
2b490 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
2b4a0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
2b4b0 2a 70 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20  *pSrc;   /* The 
2b4c0 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
2b4d0 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20   to search */.  
2b4e0 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73  Table *pTab;.  s
2b4f0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 71  qlite3 *db;.  sq
2b500 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
2b510 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 20 20 73 74   *pIdxInfo;.  st
2b520 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
2b530 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70  ex_constraint *p
2b540 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63  IdxCons;.  struc
2b550 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
2b560 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65  constraint_usage
2b570 20 2a 70 55 73 61 67 65 3b 0a 20 20 57 68 65 72   *pUsage;.  Wher
2b580 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20  eTerm *pTerm;.  
2b590 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20  int i, j;.  int 
2b5a0 69 54 65 72 6d 2c 20 6d 78 54 65 72 6d 3b 0a 20  iTerm, mxTerm;. 
2b5b0 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74   int nConstraint
2b5c0 3b 0a 20 20 69 6e 74 20 73 65 65 6e 49 6e 20 3d  ;.  int seenIn =
2b5d0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2b5e0 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20 49   /* True if an I
2b5f0 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 73 65  N operator is se
2b600 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 65 65 6e  en */.  int seen
2b610 56 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Var = 0;        
2b620 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2b630 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 20 63  a non-constant c
2b640 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 73 65 65  onstraint is see
2b650 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 50 68 61 73  n */.  int iPhas
2b660 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2b670 20 20 20 20 2f 2a 20 30 3a 20 63 6f 6e 73 74 20      /* 0: const 
2b680 77 2f 6f 20 49 4e 2c 20 31 3a 20 63 6f 6e 73 74  w/o IN, 1: const
2b690 2c 20 32 3a 20 6e 6f 20 49 4e 2c 20 20 32 3a 20  , 2: no IN,  2: 
2b6a0 49 4e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  IN */.  WhereLoo
2b6b0 70 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72  p *pNew;.  int r
2b6c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
2b6d0 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c    pWInfo = pBuil
2b6e0 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70  der->pWInfo;.  p
2b6f0 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e  Parse = pWInfo->
2b700 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70  pParse;.  db = p
2b710 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 57 43  Parse->db;.  pWC
2b720 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43   = pBuilder->pWC
2b730 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c  ;.  pNew = pBuil
2b740 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 53 72  der->pNew;.  pSr
2b750 63 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61  c = &pWInfo->pTa
2b760 62 4c 69 73 74 2d 3e 61 5b 70 4e 65 77 2d 3e 69  bList->a[pNew->i
2b770 54 61 62 5d 3b 0a 20 20 70 54 61 62 20 3d 20 70  Tab];.  pTab = p
2b780 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 61 73 73  Src->pTab;.  ass
2b790 65 72 74 28 20 49 73 56 69 72 74 75 61 6c 28 70  ert( IsVirtual(p
2b7a0 54 61 62 29 20 29 3b 0a 20 20 70 49 64 78 49 6e  Tab) );.  pIdxIn
2b7b0 66 6f 20 3d 20 61 6c 6c 6f 63 61 74 65 49 6e 64  fo = allocateInd
2b7c0 65 78 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  exInfo(pParse, p
2b7d0 57 43 2c 20 70 53 72 63 2c 20 70 42 75 69 6c 64  WC, pSrc, pBuild
2b7e0 65 72 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20  er->pOrderBy);. 
2b7f0 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30   if( pIdxInfo==0
2b800 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2b810 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 4e 65 77 2d 3e  _NOMEM;.  pNew->
2b820 70 72 65 72 65 71 20 3d 20 30 3b 0a 20 20 70 4e  prereq = 0;.  pN
2b830 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a  ew->rSetup = 0;.
2b840 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
2b850 3d 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  = WHERE_VIRTUALT
2b860 41 42 4c 45 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c  ABLE;.  pNew->nL
2b870 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 4e 65 77  Term = 0;.  pNew
2b880 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
2b890 65 20 3d 20 30 3b 0a 20 20 70 55 73 61 67 65 20  e = 0;.  pUsage 
2b8a0 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  = pIdxInfo->aCon
2b8b0 73 74 72 61 69 6e 74 55 73 61 67 65 3b 0a 20 20  straintUsage;.  
2b8c0 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49  nConstraint = pI
2b8d0 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61  dxInfo->nConstra
2b8e0 69 6e 74 3b 0a 20 20 69 66 28 20 77 68 65 72 65  int;.  if( where
2b8f0 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20 70  LoopResize(db, p
2b900 4e 65 77 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74  New, nConstraint
2b910 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
2b920 44 62 46 72 65 65 28 64 62 2c 20 70 49 64 78 49  DbFree(db, pIdxI
2b930 6e 66 6f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  nfo);.    return
2b940 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2b950 20 7d 0a 0a 20 20 66 6f 72 28 69 50 68 61 73 65   }..  for(iPhase
2b960 3d 30 3b 20 69 50 68 61 73 65 3c 3d 33 3b 20 69  =0; iPhase<=3; i
2b970 50 68 61 73 65 2b 2b 29 7b 0a 20 20 20 20 69 66  Phase++){.    if
2b980 28 20 21 73 65 65 6e 49 6e 20 26 26 20 28 69 50  ( !seenIn && (iP
2b990 68 61 73 65 26 31 29 21 3d 30 20 29 7b 0a 20 20  hase&1)!=0 ){.  
2b9a0 20 20 20 20 69 50 68 61 73 65 2b 2b 3b 0a 20 20      iPhase++;.  
2b9b0 20 20 20 20 69 66 28 20 69 50 68 61 73 65 3e 33      if( iPhase>3
2b9c0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
2b9d0 20 20 20 20 69 66 28 20 21 73 65 65 6e 56 61 72      if( !seenVar
2b9e0 20 26 26 20 69 50 68 61 73 65 3e 31 20 29 20 62   && iPhase>1 ) b
2b9f0 72 65 61 6b 3b 0a 20 20 20 20 70 49 64 78 43 6f  reak;.    pIdxCo
2ba00 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71  ns = *(struct sq
2ba10 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
2ba20 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e  traint**)&pIdxIn
2ba30 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->aConstraint;
2ba40 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2ba50 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74  pIdxInfo->nConst
2ba60 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78  raint; i++, pIdx
2ba70 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 20 20 6a  Cons++){.      j
2ba80 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65   = pIdxCons->iTe
2ba90 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  rmOffset;.      
2baa0 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
2bab0 6a 5d 3b 0a 20 20 20 20 20 20 73 77 69 74 63 68  j];.      switch
2bac0 28 20 69 50 68 61 73 65 20 29 7b 0a 20 20 20 20  ( iPhase ){.    
2bad0 20 20 20 20 63 61 73 65 20 30 3a 20 20 20 20 2f      case 0:    /
2bae0 2a 20 43 6f 6e 73 74 61 6e 74 73 20 77 69 74 68  * Constants with
2baf0 6f 75 74 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  out IN operator 
2bb00 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 49 64  */.          pId
2bb10 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20  xCons->usable = 
2bb20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  0;.          if(
2bb30 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
2bb40 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29  or & WO_IN)!=0 )
2bb50 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  {.            se
2bb60 65 6e 49 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  enIn = 1;.      
2bb70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2bb80 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  if( pTerm->prere
2bb90 71 52 69 67 68 74 21 3d 30 20 29 7b 0a 20 20 20  qRight!=0 ){.   
2bba0 20 20 20 20 20 20 20 20 20 73 65 65 6e 56 61 72           seenVar
2bbb0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
2bbc0 7d 65 6c 73 65 20 69 66 28 20 28 70 54 65 72 6d  }else if( (pTerm
2bbd0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
2bbe0 5f 49 4e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  _IN)==0 ){.     
2bbf0 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d         pIdxCons-
2bc00 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  >usable = 1;.   
2bc10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2bc20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2bc30 20 20 63 61 73 65 20 31 3a 20 20 20 20 2f 2a 20    case 1:    /* 
2bc40 43 6f 6e 73 74 61 6e 74 73 20 77 69 74 68 20 49  Constants with I
2bc50 4e 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20  N operators */. 
2bc60 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2bc70 20 73 65 65 6e 49 6e 20 29 3b 0a 20 20 20 20 20   seenIn );.     
2bc80 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75       pIdxCons->u
2bc90 73 61 62 6c 65 20 3d 20 28 70 54 65 72 6d 2d 3e  sable = (pTerm->
2bca0 70 72 65 72 65 71 52 69 67 68 74 3d 3d 30 29 3b  prereqRight==0);
2bcb0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
2bcc0 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 32  ;.        case 2
2bcd0 3a 20 20 20 20 2f 2a 20 56 61 72 69 61 62 6c 65  :    /* Variable
2bce0 73 20 77 69 74 68 6f 75 74 20 49 4e 20 2a 2f 0a  s without IN */.
2bcf0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2bd00 28 20 73 65 65 6e 56 61 72 20 29 3b 0a 20 20 20  ( seenVar );.   
2bd10 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d         pIdxCons-
2bd20 3e 75 73 61 62 6c 65 20 3d 20 28 70 54 65 72 6d  >usable = (pTerm
2bd30 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
2bd40 5f 49 4e 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20  _IN)==0;.       
2bd50 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2bd60 20 20 64 65 66 61 75 6c 74 3a 20 20 20 2f 2a 20    default:   /* 
2bd70 56 61 72 69 61 62 6c 65 73 20 77 69 74 68 20 49  Variables with I
2bd80 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  N */.          a
2bd90 73 73 65 72 74 28 20 73 65 65 6e 56 61 72 20 26  ssert( seenVar &
2bda0 26 20 73 65 65 6e 49 6e 20 29 3b 0a 20 20 20 20  & seenIn );.    
2bdb0 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e        pIdxCons->
2bdc0 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  usable = 1;.    
2bdd0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2bde0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6d     }.    }.    m
2bdf0 65 6d 73 65 74 28 70 55 73 61 67 65 2c 20 30 2c  emset(pUsage, 0,
2be00 20 73 69 7a 65 6f 66 28 70 55 73 61 67 65 5b 30   sizeof(pUsage[0
2be10 5d 29 2a 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f  ])*pIdxInfo->nCo
2be20 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 20 20 69  nstraint);.    i
2be30 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65  f( pIdxInfo->nee
2be40 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 29 20  dToFreeIdxStr ) 
2be50 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64  sqlite3_free(pId
2be60 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a  xInfo->idxStr);.
2be70 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64      pIdxInfo->id
2be80 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 70 49  xStr = 0;.    pI
2be90 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d  dxInfo->idxNum =
2bea0 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f   0;.    pIdxInfo
2beb0 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
2bec0 74 72 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78  tr = 0;.    pIdx
2bed0 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e  Info->orderByCon
2bee0 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20 70  sumed = 0;.    p
2bef0 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
2bf00 65 64 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f  edCost = SQLITE_
2bf10 42 49 47 5f 44 42 4c 20 2f 20 28 64 6f 75 62 6c  BIG_DBL / (doubl
2bf20 65 29 32 3b 0a 20 20 20 20 72 63 20 3d 20 76 74  e)2;.    rc = vt
2bf30 61 62 42 65 73 74 49 6e 64 65 78 28 70 50 61 72  abBestIndex(pPar
2bf40 73 65 2c 20 70 54 61 62 2c 20 70 49 64 78 49 6e  se, pTab, pIdxIn
2bf50 66 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  fo);.    if( rc 
2bf60 29 20 67 6f 74 6f 20 77 68 65 72 65 4c 6f 6f 70  ) goto whereLoop
2bf70 41 64 64 56 74 61 62 5f 65 78 69 74 3b 0a 20 20  AddVtab_exit;.  
2bf80 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73    pIdxCons = *(s
2bf90 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
2bfa0 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a  dex_constraint**
2bfb0 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  )&pIdxInfo->aCon
2bfc0 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 70 4e 65  straint;.    pNe
2bfd0 77 2d 3e 70 72 65 72 65 71 20 3d 20 30 3b 0a 20  w->prereq = 0;. 
2bfe0 20 20 20 6d 78 54 65 72 6d 20 3d 20 2d 31 3b 0a     mxTerm = -1;.
2bff0 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
2c000 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43 6f 6e 73 74  ->nLSlot>=nConst
2c010 72 61 69 6e 74 20 29 3b 0a 20 20 20 20 66 6f 72  raint );.    for
2c020 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61  (i=0; i<nConstra
2c030 69 6e 74 3b 20 69 2b 2b 29 20 70 4e 65 77 2d 3e  int; i++) pNew->
2c040 61 4c 54 65 72 6d 5b 69 5d 20 3d 20 30 3b 0a 20  aLTerm[i] = 0;. 
2c050 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e     pNew->u.vtab.
2c060 6f 6d 69 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20  omitMask = 0;.  
2c070 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
2c080 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70  nstraint; i++, p
2c090 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20  IdxCons++){.    
2c0a0 20 20 69 66 28 20 28 69 54 65 72 6d 20 3d 20 70    if( (iTerm = p
2c0b0 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64  Usage[i].argvInd
2c0c0 65 78 20 2d 20 31 29 3e 3d 30 20 29 7b 0a 20 20  ex - 1)>=0 ){.  
2c0d0 20 20 20 20 20 20 6a 20 3d 20 70 49 64 78 43 6f        j = pIdxCo
2c0e0 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b  ns->iTermOffset;
2c0f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 54 65  .        if( iTe
2c100 72 6d 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 0a  rm>=nConstraint.
2c110 20 20 20 20 20 20 20 20 20 7c 7c 20 6a 3c 30 0a           || j<0.
2c120 20 20 20 20 20 20 20 20 20 7c 7c 20 6a 3e 3d 70           || j>=p
2c130 57 43 2d 3e 6e 54 65 72 6d 0a 20 20 20 20 20 20  WC->nTerm.      
2c140 20 20 20 7c 7c 20 70 4e 65 77 2d 3e 61 4c 54 65     || pNew->aLTe
2c150 72 6d 5b 69 54 65 72 6d 5d 21 3d 30 0a 20 20 20  rm[iTerm]!=0.   
2c160 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2c170 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
2c180 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ROR;.          s
2c190 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
2c1a0 50 61 72 73 65 2c 20 22 25 73 2e 78 42 65 73 74  Parse, "%s.xBest
2c1b0 49 6e 64 65 78 28 29 20 6d 61 6c 66 75 6e 63 74  Index() malfunct
2c1c0 69 6f 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  ion", pTab->zNam
2c1d0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  e);.          go
2c1e0 74 6f 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56  to whereLoopAddV
2c1f0 74 61 62 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  tab_exit;.      
2c200 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74    }.        test
2c210 63 61 73 65 28 20 69 54 65 72 6d 3d 3d 6e 43 6f  case( iTerm==nCo
2c220 6e 73 74 72 61 69 6e 74 2d 31 20 29 3b 0a 20 20  nstraint-1 );.  
2c230 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2c240 6a 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  j==0 );.        
2c250 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 70 57 43  testcase( j==pWC
2c260 2d 3e 6e 54 65 72 6d 2d 31 20 29 3b 0a 20 20 20  ->nTerm-1 );.   
2c270 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
2c280 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  C->a[j];.       
2c290 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 7c 3d   pNew->prereq |=
2c2a0 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
2c2b0 67 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ght;.        ass
2c2c0 65 72 74 28 20 69 54 65 72 6d 3c 70 4e 65 77 2d  ert( iTerm<pNew-
2c2d0 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20  >nLSlot );.     
2c2e0 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
2c2f0 69 54 65 72 6d 5d 20 3d 20 70 54 65 72 6d 3b 0a  iTerm] = pTerm;.
2c300 20 20 20 20 20 20 20 20 69 66 28 20 69 54 65 72          if( iTer
2c310 6d 3e 6d 78 54 65 72 6d 20 29 20 6d 78 54 65 72  m>mxTerm ) mxTer
2c320 6d 20 3d 20 69 54 65 72 6d 3b 0a 20 20 20 20 20  m = iTerm;.     
2c330 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65     testcase( iTe
2c340 72 6d 3d 3d 31 35 20 29 3b 0a 20 20 20 20 20 20  rm==15 );.      
2c350 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65 72    testcase( iTer
2c360 6d 3d 3d 31 36 20 29 3b 0a 20 20 20 20 20 20 20  m==16 );.       
2c370 20 69 66 28 20 69 54 65 72 6d 3c 31 36 20 26 26   if( iTerm<16 &&
2c380 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 20   pUsage[i].omit 
2c390 29 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f  ) pNew->u.vtab.o
2c3a0 6d 69 74 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 54  mitMask |= 1<<iT
2c3b0 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  erm;.        if(
2c3c0 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
2c3d0 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29  or & WO_IN)!=0 )
2c3e0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2c3f0 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 3d 3d  pUsage[i].omit==
2c400 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2c410 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d   /* Do not attem
2c420 70 74 20 74 6f 20 75 73 65 20 61 6e 20 49 4e 20  pt to use an IN 
2c430 63 6f 6e 73 74 72 61 69 6e 74 20 69 66 20 74 68  constraint if th
2c440 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 0a  e virtual table.
2c450 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73              ** s
2c460 61 79 73 20 74 68 61 74 20 74 68 65 20 65 71 75  ays that the equ
2c470 69 76 61 6c 65 6e 74 20 45 51 20 63 6f 6e 73 74  ivalent EQ const
2c480 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20  raint cannot be 
2c490 73 61 66 65 6c 79 20 6f 6d 69 74 74 65 64 2e 0a  safely omitted..
2c4a0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49              ** I
2c4b0 66 20 77 65 20 64 6f 20 61 74 74 65 6d 70 74 20  f we do attempt 
2c4c0 74 6f 20 75 73 65 20 73 75 63 68 20 61 20 63 6f  to use such a co
2c4d0 6e 73 74 72 61 69 6e 74 2c 20 73 6f 6d 65 20 72  nstraint, some r
2c4e0 6f 77 73 20 6d 69 67 68 74 20 62 65 0a 20 20 20  ows might be.   
2c4f0 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65 70 65           ** repe
2c500 61 74 65 64 20 69 6e 20 74 68 65 20 6f 75 74 70  ated in the outp
2c510 75 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ut. */.         
2c520 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2c530 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2c540 2f 2a 20 41 20 76 69 72 74 75 61 6c 20 74 61 62  /* A virtual tab
2c550 6c 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74  le that is const
2c560 72 61 69 6e 65 64 20 62 79 20 61 6e 20 49 4e 20  rained by an IN 
2c570 63 6c 61 75 73 65 20 6d 61 79 20 6e 6f 74 0a 20  clause may not. 
2c580 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73           ** cons
2c590 75 6d 65 20 74 68 65 20 4f 52 44 45 52 20 42 59  ume the ORDER BY
2c5a0 20 63 6c 61 75 73 65 20 62 65 63 61 75 73 65 20   clause because 
2c5b0 28 31 29 20 74 68 65 20 6f 72 64 65 72 20 6f 66  (1) the order of
2c5c0 20 49 4e 20 74 65 72 6d 73 0a 20 20 20 20 20 20   IN terms.      
2c5d0 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6e 65      ** is not ne
2c5e0 63 65 73 73 61 72 69 6c 79 20 72 65 6c 61 74 65  cessarily relate
2c5f0 64 20 74 6f 20 74 68 65 20 6f 72 64 65 72 20 6f  d to the order o
2c600 66 20 6f 75 74 70 75 74 20 74 65 72 6d 73 20 61  f output terms a
2c610 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nd.          ** 
2c620 28 32 29 20 4d 75 6c 74 69 70 6c 65 20 6f 75 74  (2) Multiple out
2c630 70 75 74 73 20 66 72 6f 6d 20 61 20 73 69 6e 67  puts from a sing
2c640 6c 65 20 49 4e 20 76 61 6c 75 65 20 77 69 6c 6c  le IN value will
2c650 20 6e 6f 74 20 6d 65 72 67 65 0a 20 20 20 20 20   not merge.     
2c660 20 20 20 20 20 2a 2a 20 74 6f 67 65 74 68 65 72       ** together
2c670 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
2c680 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42  pIdxInfo->orderB
2c690 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20  yConsumed = 0;. 
2c6a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2c6b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
2c6c0 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 7b  >=nConstraint ){
2c6d0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54  .      pNew->nLT
2c6e0 65 72 6d 20 3d 20 6d 78 54 65 72 6d 2b 31 3b 0a  erm = mxTerm+1;.
2c6f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e        assert( pN
2c700 65 77 2d 3e 6e 4c 54 65 72 6d 3c 3d 70 4e 65 77  ew->nLTerm<=pNew
2c710 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20  ->nLSlot );.    
2c720 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69    pNew->u.vtab.i
2c730 64 78 4e 75 6d 20 3d 20 70 49 64 78 49 6e 66 6f  dxNum = pIdxInfo
2c740 2d 3e 69 64 78 4e 75 6d 3b 0a 20 20 20 20 20 20  ->idxNum;.      
2c750 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  pNew->u.vtab.nee
2c760 64 46 72 65 65 20 3d 20 70 49 64 78 49 6e 66 6f  dFree = pIdxInfo
2c770 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
2c780 74 72 3b 0a 20 20 20 20 20 20 70 49 64 78 49 6e  tr;.      pIdxIn
2c790 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
2c7a0 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  xStr = 0;.      
2c7b0 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78  pNew->u.vtab.idx
2c7c0 53 74 72 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e  Str = pIdxInfo->
2c7d0 69 64 78 53 74 72 3b 0a 20 20 20 20 20 20 70 4e  idxStr;.      pN
2c7e0 65 77 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64  ew->u.vtab.isOrd
2c7f0 65 72 65 64 20 3d 20 28 75 38 29 28 28 70 49 64  ered = (u8)((pId
2c800 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 21  xInfo->nOrderBy!
2c810 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  =0).            
2c820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c830 20 20 20 20 20 20 20 20 20 26 26 20 70 49 64 78           && pIdx
2c840 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e  Info->orderByCon
2c850 73 75 6d 65 64 29 3b 0a 20 20 20 20 20 20 70 4e  sumed);.      pN
2c860 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a  ew->rSetup = 0;.
2c870 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e        pNew->rRun
2c880 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
2c890 46 72 6f 6d 44 6f 75 62 6c 65 28 70 49 64 78 49  FromDouble(pIdxI
2c8a0 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  nfo->estimatedCo
2c8b0 73 74 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55  st);.      /* TU
2c8c0 4e 49 4e 47 3a 20 45 76 65 72 79 20 76 69 72 74  NING: Every virt
2c8d0 75 61 6c 20 74 61 62 6c 65 20 71 75 65 72 79 20  ual table query 
2c8e0 72 65 74 75 72 6e 73 20 32 35 20 72 6f 77 73 20  returns 25 rows 
2c8f0 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  */.      pNew->n
2c900 4f 75 74 20 3d 20 34 36 3b 20 20 61 73 73 65 72  Out = 46;  asser
2c910 74 28 20 34 36 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 46==sqlite3Lo
2c920 67 45 73 74 28 32 35 29 20 29 3b 0a 20 20 20 20  gEst(25) );.    
2c930 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72    whereLoopInser
2c940 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77  t(pBuilder, pNew
2c950 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65  );.      if( pNe
2c960 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  w->u.vtab.needFr
2c970 65 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ee ){.        sq
2c980 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 2d  lite3_free(pNew-
2c990 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b  >u.vtab.idxStr);
2c9a0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
2c9b0 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d  .vtab.needFree =
2c9c0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
2c9d0 7d 0a 20 20 7d 20 20 0a 0a 77 68 65 72 65 4c 6f  }.  }  ..whereLo
2c9e0 6f 70 41 64 64 56 74 61 62 5f 65 78 69 74 3a 0a  opAddVtab_exit:.
2c9f0 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e    if( pIdxInfo->
2ca00 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
2ca10 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28   ) sqlite3_free(
2ca20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72  pIdxInfo->idxStr
2ca30 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
2ca40 65 65 28 64 62 2c 20 70 49 64 78 49 6e 66 6f 29  ee(db, pIdxInfo)
2ca50 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2ca60 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2ca70 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
2ca80 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 64  BLE */../*.** Ad
2ca90 64 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72  d WhereLoop entr
2caa0 69 65 73 20 74 6f 20 68 61 6e 64 6c 65 20 4f 52  ies to handle OR
2cab0 20 74 65 72 6d 73 2e 20 20 54 68 69 73 20 77 6f   terms.  This wo
2cac0 72 6b 73 20 66 6f 72 20 65 69 74 68 65 72 0a 2a  rks for either.*
2cad0 2a 20 62 74 72 65 65 73 20 6f 72 20 76 69 72 74  * btrees or virt
2cae0 75 61 6c 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73  ual tables..*/.s
2caf0 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
2cb00 6f 6f 70 41 64 64 4f 72 28 57 68 65 72 65 4c 6f  oopAddOr(WhereLo
2cb10 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
2cb20 64 65 72 2c 20 42 69 74 6d 61 73 6b 20 6d 45 78  der, Bitmask mEx
2cb30 74 72 61 29 7b 0a 20 20 57 68 65 72 65 49 6e 66  tra){.  WhereInf
2cb40 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69  o *pWInfo = pBui
2cb50 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20  lder->pWInfo;.  
2cb60 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
2cb70 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  ;.  WhereLoop *p
2cb80 4e 65 77 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  New;.  WhereTerm
2cb90 20 2a 70 54 65 72 6d 2c 20 2a 70 57 43 45 6e 64   *pTerm, *pWCEnd
2cba0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2cbb0 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 43  ITE_OK;.  int iC
2cbc0 75 72 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73  ur;.  WhereClaus
2cbd0 65 20 74 65 6d 70 57 43 3b 0a 20 20 57 68 65 72  e tempWC;.  Wher
2cbe0 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73 53 75  eLoopBuilder sSu
2cbf0 62 42 75 69 6c 64 3b 0a 20 20 57 68 65 72 65 4f  bBuild;.  WhereO
2cc00 72 53 65 74 20 73 53 75 6d 2c 20 73 43 75 72 2c  rSet sSum, sCur,
2cc10 20 73 50 72 65 76 3b 0a 20 20 73 74 72 75 63 74   sPrev;.  struct
2cc20 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
2cc30 49 74 65 6d 3b 0a 20 20 0a 20 20 70 57 43 20 3d  Item;.  .  pWC =
2cc40 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a   pBuilder->pWC;.
2cc50 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63    if( pWInfo->wc
2cc60 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
2cc70 5f 41 4e 44 5f 4f 4e 4c 59 20 29 20 72 65 74 75  _AND_ONLY ) retu
2cc80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2cc90 70 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20  pWCEnd = pWC->a 
2cca0 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20  + pWC->nTerm;.  
2ccb0 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d  pNew = pBuilder-
2ccc0 3e 70 4e 65 77 3b 0a 20 20 6d 65 6d 73 65 74 28  >pNew;.  memset(
2ccd0 26 73 53 75 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  &sSum, 0, sizeof
2cce0 28 73 53 75 6d 29 29 3b 0a 20 20 70 49 74 65 6d  (sSum));.  pItem
2ccf0 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
2cd00 69 73 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69  ist->a + pNew->i
2cd10 54 61 62 3b 0a 20 20 69 43 75 72 20 3d 20 70 49  Tab;.  iCur = pI
2cd20 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 0a 20  tem->iCursor;.. 
2cd30 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
2cd40 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 20  a; pTerm<pWCEnd 
2cd50 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
2cd60 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; pTerm++){.    
2cd70 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
2cd80 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 29 21 3d  rator & WO_OR)!=
2cd90 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 72 6d  0.     && (pTerm
2cda0 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64  ->u.pOrInfo->ind
2cdb0 65 78 61 62 6c 65 20 26 20 70 4e 65 77 2d 3e 6d  exable & pNew->m
2cdc0 61 73 6b 53 65 6c 66 29 21 3d 30 20 0a 20 20 20  askSelf)!=0 .   
2cdd0 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 43   ){.      WhereC
2cde0 6c 61 75 73 65 20 2a 20 63 6f 6e 73 74 20 70 4f  lause * const pO
2cdf0 72 57 43 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e  rWC = &pTerm->u.
2ce00 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20  pOrInfo->wc;.   
2ce10 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 20 63     WhereTerm * c
2ce20 6f 6e 73 74 20 70 4f 72 57 43 45 6e 64 20 3d 20  onst pOrWCEnd = 
2ce30 26 70 4f 72 57 43 2d 3e 61 5b 70 4f 72 57 43 2d  &pOrWC->a[pOrWC-
2ce40 3e 6e 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 57  >nTerm];.      W
2ce50 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72  hereTerm *pOrTer
2ce60 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e 63  m;.      int onc
2ce70 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 6e 74  e = 1;.      int
2ce80 20 69 2c 20 6a 3b 0a 20 20 20 20 0a 20 20 20 20   i, j;.    .    
2ce90 20 20 73 53 75 62 42 75 69 6c 64 20 3d 20 2a 70    sSubBuild = *p
2cea0 42 75 69 6c 64 65 72 3b 0a 20 20 20 20 20 20 73  Builder;.      s
2ceb0 53 75 62 42 75 69 6c 64 2e 70 4f 72 64 65 72 42  SubBuild.pOrderB
2cec0 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 53 75  y = 0;.      sSu
2ced0 62 42 75 69 6c 64 2e 70 4f 72 53 65 74 20 3d 20  bBuild.pOrSet = 
2cee0 26 73 43 75 72 3b 0a 0a 20 20 20 20 20 20 66 6f  &sCur;..      fo
2cef0 72 28 70 4f 72 54 65 72 6d 3d 70 4f 72 57 43 2d  r(pOrTerm=pOrWC-
2cf00 3e 61 3b 20 70 4f 72 54 65 72 6d 3c 70 4f 72 57  >a; pOrTerm<pOrW
2cf10 43 45 6e 64 3b 20 70 4f 72 54 65 72 6d 2b 2b 29  CEnd; pOrTerm++)
2cf20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  {.        if( (p
2cf30 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
2cf40 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20 29  r & WO_AND)!=0 )
2cf50 7b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 62  {.          sSub
2cf60 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 70 4f 72  Build.pWC = &pOr
2cf70 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f  Term->u.pAndInfo
2cf80 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 7d 65  ->wc;.        }e
2cf90 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d  lse if( pOrTerm-
2cfa0 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
2cfb0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  r ){.          t
2cfc0 65 6d 70 57 43 2e 70 57 49 6e 66 6f 20 3d 20 70  empWC.pWInfo = p
2cfd0 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 20 20  WC->pWInfo;.    
2cfe0 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70 4f 75        tempWC.pOu
2cff0 74 65 72 20 3d 20 70 57 43 3b 0a 20 20 20 20 20  ter = pWC;.     
2d000 20 20 20 20 20 74 65 6d 70 57 43 2e 6f 70 20 3d       tempWC.op =
2d010 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20   TK_AND;.       
2d020 20 20 20 74 65 6d 70 57 43 2e 6e 54 65 72 6d 20     tempWC.nTerm 
2d030 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 74  = 1;.          t
2d040 65 6d 70 57 43 2e 61 20 3d 20 70 4f 72 54 65 72  empWC.a = pOrTer
2d050 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75  m;.          sSu
2d060 62 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 74 65  bBuild.pWC = &te
2d070 6d 70 57 43 3b 0a 20 20 20 20 20 20 20 20 7d 65  mpWC;.        }e
2d080 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63  lse{.          c
2d090 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2d0a0 20 7d 0a 20 20 20 20 20 20 20 20 73 43 75 72 2e   }.        sCur.
2d0b0 6e 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  n = 0;.#ifndef S
2d0c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
2d0d0 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20  ALTABLE.        
2d0e0 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 49  if( IsVirtual(pI
2d0f0 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20  tem->pTab) ){.  
2d100 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
2d110 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c  reLoopAddVirtual
2d120 28 26 73 53 75 62 42 75 69 6c 64 29 3b 0a 20 20  (&sSubBuild);.  
2d130 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
2d140 20 69 3c 73 43 75 72 2e 6e 3b 20 69 2b 2b 29 20   i<sCur.n; i++) 
2d150 73 43 75 72 2e 61 5b 69 5d 2e 70 72 65 72 65 71  sCur.a[i].prereq
2d160 20 7c 3d 20 6d 45 78 74 72 61 3b 0a 20 20 20 20   |= mExtra;.    
2d170 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
2d180 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
2d190 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
2d1a0 6f 6f 70 41 64 64 42 74 72 65 65 28 26 73 53 75  oopAddBtree(&sSu
2d1b0 62 42 75 69 6c 64 2c 20 6d 45 78 74 72 61 29 3b  bBuild, mExtra);
2d1c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2d1d0 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
2d1e0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 43 75 72  QLITE_OK || sCur
2d1f0 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  .n==0 );.       
2d200 20 69 66 28 20 73 43 75 72 2e 6e 3d 3d 30 20 29   if( sCur.n==0 )
2d210 7b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 6d  {.          sSum
2d220 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  .n = 0;.        
2d230 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2d240 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e 63 65 20   }else if( once 
2d250 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 65  ){.          whe
2d260 72 65 4f 72 4d 6f 76 65 28 26 73 53 75 6d 2c 20  reOrMove(&sSum, 
2d270 26 73 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20  &sCur);.        
2d280 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20    once = 0;.    
2d290 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2d2a0 20 20 20 20 20 77 68 65 72 65 4f 72 4d 6f 76 65       whereOrMove
2d2b0 28 26 73 50 72 65 76 2c 20 26 73 53 75 6d 29 3b  (&sPrev, &sSum);
2d2c0 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 6d 2e  .          sSum.
2d2d0 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  n = 0;.         
2d2e0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 50 72 65   for(i=0; i<sPre
2d2f0 76 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  v.n; i++){.     
2d300 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
2d310 6a 3c 73 43 75 72 2e 6e 3b 20 6a 2b 2b 29 7b 0a  j<sCur.n; j++){.
2d320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
2d330 65 72 65 4f 72 49 6e 73 65 72 74 28 26 73 53 75  ereOrInsert(&sSu
2d340 6d 2c 20 73 50 72 65 76 2e 61 5b 69 5d 2e 70 72  m, sPrev.a[i].pr
2d350 65 72 65 71 20 7c 20 73 43 75 72 2e 61 5b 6a 5d  ereq | sCur.a[j]
2d360 2e 70 72 65 72 65 71 2c 0a 20 20 20 20 20 20 20  .prereq,.       
2d370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d380 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 67 45       sqlite3LogE
2d390 73 74 41 64 64 28 73 50 72 65 76 2e 61 5b 69 5d  stAdd(sPrev.a[i]
2d3a0 2e 72 52 75 6e 2c 20 73 43 75 72 2e 61 5b 6a 5d  .rRun, sCur.a[j]
2d3b0 2e 72 52 75 6e 29 2c 0a 20 20 20 20 20 20 20 20  .rRun),.        
2d3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d3d0 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73      sqlite3LogEs
2d3e0 74 41 64 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e  tAdd(sPrev.a[i].
2d3f0 6e 4f 75 74 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e  nOut, sCur.a[j].
2d400 6e 4f 75 74 29 29 3b 0a 20 20 20 20 20 20 20 20  nOut));.        
2d410 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2d420 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2d430 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e    }.      pNew->
2d440 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  nLTerm = 1;.    
2d450 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30    pNew->aLTerm[0
2d460 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  ] = pTerm;.     
2d470 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
2d480 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b   WHERE_MULTI_OR;
2d490 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65  .      pNew->rSe
2d4a0 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  tup = 0;.      p
2d4b0 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20  New->iSortIdx = 
2d4c0 30 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  0;.      memset(
2d4d0 26 70 4e 65 77 2d 3e 75 2c 20 30 2c 20 73 69 7a  &pNew->u, 0, siz
2d4e0 65 6f 66 28 70 4e 65 77 2d 3e 75 29 29 3b 0a 20  eof(pNew->u));. 
2d4f0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63       for(i=0; rc
2d500 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
2d510 3c 73 53 75 6d 2e 6e 3b 20 69 2b 2b 29 7b 0a 20  <sSum.n; i++){. 
2d520 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47         /* TUNING
2d530 3a 20 4d 75 6c 74 69 70 6c 65 20 62 79 20 33 2e  : Multiple by 3.
2d540 35 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64  5 for the second
2d550 61 72 79 20 74 61 62 6c 65 20 6c 6f 6f 6b 75 70  ary table lookup
2d560 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77   */.        pNew
2d570 2d 3e 72 52 75 6e 20 3d 20 73 53 75 6d 2e 61 5b  ->rRun = sSum.a[
2d580 69 5d 2e 72 52 75 6e 20 2b 20 31 38 3b 0a 20 20  i].rRun + 18;.  
2d590 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
2d5a0 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 6e 4f 75   = sSum.a[i].nOu
2d5b0 74 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  t;.        pNew-
2d5c0 3e 70 72 65 72 65 71 20 3d 20 73 53 75 6d 2e 61  >prereq = sSum.a
2d5d0 5b 69 5d 2e 70 72 65 72 65 71 3b 0a 20 20 20 20  [i].prereq;.    
2d5e0 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
2d5f0 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
2d600 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  r, pNew);.      
2d610 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
2d620 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2d630 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c  * Add all WhereL
2d640 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20  oop objects for 
2d650 61 6c 6c 20 74 61 62 6c 65 73 20 0a 2a 2f 0a 73  all tables .*/.s
2d660 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
2d670 6f 6f 70 41 64 64 41 6c 6c 28 57 68 65 72 65 4c  oopAddAll(WhereL
2d680 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69  oopBuilder *pBui
2d690 6c 64 65 72 29 7b 0a 20 20 57 68 65 72 65 49 6e  lder){.  WhereIn
2d6a0 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75  fo *pWInfo = pBu
2d6b0 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20  ilder->pWInfo;. 
2d6c0 20 42 69 74 6d 61 73 6b 20 6d 45 78 74 72 61 20   Bitmask mExtra 
2d6d0 3d 20 30 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  = 0;.  Bitmask m
2d6e0 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 69 6e 74  Prior = 0;.  int
2d6f0 20 69 54 61 62 3b 0a 20 20 53 72 63 4c 69 73 74   iTab;.  SrcList
2d700 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49   *pTabList = pWI
2d710 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20  nfo->pTabList;. 
2d720 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2d730 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73  item *pItem;.  s
2d740 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49  qlite3 *db = pWI
2d750 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b  nfo->pParse->db;
2d760 0a 20 20 69 6e 74 20 6e 54 61 62 4c 69 73 74 20  .  int nTabList 
2d770 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  = pWInfo->nLevel
2d780 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2d790 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 70 72 69  ITE_OK;.  u8 pri
2d7a0 6f 72 4a 6f 69 6e 54 79 70 65 20 3d 20 30 3b 0a  orJoinType = 0;.
2d7b0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65    WhereLoop *pNe
2d7c0 77 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76  w;..  /* Loop ov
2d7d0 65 72 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e  er the tables in
2d7e0 20 74 68 65 20 6a 6f 69 6e 2c 20 66 72 6f 6d 20   the join, from 
2d7f0 6c 65 66 74 20 74 6f 20 72 69 67 68 74 20 2a 2f  left to right */
2d800 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64  .  pNew = pBuild
2d810 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 77 68 65 72  er->pNew;.  wher
2d820 65 4c 6f 6f 70 49 6e 69 74 28 70 4e 65 77 29 3b  eLoopInit(pNew);
2d830 0a 20 20 66 6f 72 28 69 54 61 62 3d 30 2c 20 70  .  for(iTab=0, p
2d840 49 74 65 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61  Item=pTabList->a
2d850 3b 20 69 54 61 62 3c 6e 54 61 62 4c 69 73 74 3b  ; iTab<nTabList;
2d860 20 69 54 61 62 2b 2b 2c 20 70 49 74 65 6d 2b 2b   iTab++, pItem++
2d870 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 54 61  ){.    pNew->iTa
2d880 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 4e  b = iTab;.    pN
2d890 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 67  ew->maskSelf = g
2d8a0 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e  etMask(&pWInfo->
2d8b0 73 4d 61 73 6b 53 65 74 2c 20 70 49 74 65 6d 2d  sMaskSet, pItem-
2d8c0 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 69  >iCursor);.    i
2d8d0 66 28 20 28 28 70 49 74 65 6d 2d 3e 6a 6f 69 6e  f( ((pItem->join
2d8e0 74 79 70 65 7c 70 72 69 6f 72 4a 6f 69 6e 54 79  type|priorJoinTy
2d8f0 70 65 29 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a  pe) & (JT_LEFT|J
2d900 54 5f 43 52 4f 53 53 29 29 21 3d 30 20 29 7b 0a  T_CROSS))!=0 ){.
2d910 20 20 20 20 20 20 6d 45 78 74 72 61 20 3d 20 6d        mExtra = m
2d920 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  Prior;.    }.   
2d930 20 70 72 69 6f 72 4a 6f 69 6e 54 79 70 65 20 3d   priorJoinType =
2d940 20 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65   pItem->jointype
2d950 3b 0a 20 20 20 20 69 66 28 20 49 73 56 69 72 74  ;.    if( IsVirt
2d960 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62 29  ual(pItem->pTab)
2d970 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   ){.      rc = w
2d980 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75  hereLoopAddVirtu
2d990 61 6c 28 70 42 75 69 6c 64 65 72 29 3b 0a 20 20  al(pBuilder);.  
2d9a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
2d9b0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
2d9c0 42 74 72 65 65 28 70 42 75 69 6c 64 65 72 2c 20  Btree(pBuilder, 
2d9d0 6d 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20  mExtra);.    }. 
2d9e0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2d9f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
2da00 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f   = whereLoopAddO
2da10 72 28 70 42 75 69 6c 64 65 72 2c 20 6d 45 78 74  r(pBuilder, mExt
2da20 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  ra);.    }.    m
2da30 50 72 69 6f 72 20 7c 3d 20 70 4e 65 77 2d 3e 6d  Prior |= pNew->m
2da40 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 69 66 28  askSelf;.    if(
2da50 20 72 63 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f   rc || db->mallo
2da60 63 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b  cFailed ) break;
2da70 0a 20 20 7d 0a 20 20 77 68 65 72 65 4c 6f 6f 70  .  }.  whereLoop
2da80 43 6c 65 61 72 28 64 62 2c 20 70 4e 65 77 29 3b  Clear(db, pNew);
2da90 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2daa0 0a 2f 2a 0a 2a 2a 20 45 78 61 6d 69 6e 65 20 61  ./*.** Examine a
2dab0 20 57 68 65 72 65 50 61 74 68 20 28 77 69 74 68   WherePath (with
2dac0 20 74 68 65 20 61 64 64 69 74 69 6f 6e 20 6f 66   the addition of
2dad0 20 74 68 65 20 65 78 74 72 61 20 57 68 65 72 65   the extra Where
2dae0 4c 6f 6f 70 20 6f 66 20 74 68 65 20 35 74 68 0a  Loop of the 5th.
2daf0 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 29 20 74  ** parameters) t
2db00 6f 20 73 65 65 20 69 66 20 69 74 20 6f 75 74 70  o see if it outp
2db10 75 74 73 20 72 6f 77 73 20 69 6e 20 74 68 65 20  uts rows in the 
2db20 72 65 71 75 65 73 74 65 64 20 4f 52 44 45 52 20  requested ORDER 
2db30 42 59 0a 2a 2a 20 28 6f 72 20 47 52 4f 55 50 20  BY.** (or GROUP 
2db40 42 59 29 20 77 69 74 68 6f 75 74 20 72 65 71 75  BY) without requ
2db50 69 72 69 6e 67 20 61 20 73 65 70 61 72 61 74 65  iring a separate
2db60 20 73 6f 72 74 20 6f 70 65 72 61 74 69 6f 6e 2e   sort operation.
2db70 20 20 52 65 74 75 72 6e 3a 0a 2a 2a 20 0a 2a 2a    Return:.** .**
2db80 20 20 20 20 30 3a 20 20 4f 52 44 45 52 20 42 59      0:  ORDER BY
2db90 20 69 73 20 6e 6f 74 20 73 61 74 69 73 66 69 65   is not satisfie
2dba0 64 2e 20 20 53 6f 72 74 69 6e 67 20 72 65 71 75  d.  Sorting requ
2dbb0 69 72 65 64 0a 2a 2a 20 20 20 20 31 3a 20 20 4f  ired.**    1:  O
2dbc0 52 44 45 52 20 42 59 20 69 73 20 73 61 74 69 73  RDER BY is satis
2dbd0 66 69 65 64 2e 20 20 20 20 20 20 4f 6d 69 74 20  fied.      Omit 
2dbe0 73 6f 72 74 69 6e 67 0a 2a 2a 20 20 20 2d 31 3a  sorting.**   -1:
2dbf0 20 20 55 6e 6b 6e 6f 77 6e 20 61 74 20 74 68 69    Unknown at thi
2dc00 73 20 74 69 6d 65 0a 2a 2a 0a 2a 2a 20 4e 6f 74  s time.**.** Not
2dc10 65 20 74 68 61 74 20 70 72 6f 63 65 73 73 69 6e  e that processin
2dc20 67 20 66 6f 72 20 57 48 45 52 45 5f 47 52 4f 55  g for WHERE_GROU
2dc30 50 42 59 20 61 6e 64 20 57 48 45 52 45 5f 44 49  PBY and WHERE_DI
2dc40 53 54 49 4e 43 54 42 59 20 69 73 20 6e 6f 74 20  STINCTBY is not 
2dc50 61 73 0a 2a 2a 20 73 74 72 69 63 74 2e 20 20 57  as.** strict.  W
2dc60 69 74 68 20 47 52 4f 55 50 20 42 59 20 61 6e 64  ith GROUP BY and
2dc70 20 44 49 53 54 49 4e 43 54 20 74 68 65 20 6f 6e   DISTINCT the on
2dc80 6c 79 20 72 65 71 75 69 72 65 6d 65 6e 74 20 69  ly requirement i
2dc90 73 20 74 68 61 74 0a 2a 2a 20 65 71 75 69 76 61  s that.** equiva
2dca0 6c 65 6e 74 20 72 6f 77 73 20 61 70 70 65 61 72  lent rows appear
2dcb0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 64 6a   immediately adj
2dcc0 61 63 65 6e 74 20 74 6f 20 6f 6e 65 20 61 6e 6f  acent to one ano
2dcd0 74 68 65 72 2e 20 20 47 52 4f 55 50 20 42 59 0a  ther.  GROUP BY.
2dce0 2a 2a 20 61 6e 64 20 44 49 53 54 49 4e 54 20 64  ** and DISTINT d
2dcf0 6f 20 6e 6f 74 20 72 65 71 75 69 72 65 20 72 6f  o not require ro
2dd00 77 73 20 74 6f 20 61 70 70 65 61 72 20 69 6e 20  ws to appear in 
2dd10 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20 6f  any particular o
2dd20 72 64 65 72 20 61 73 20 6c 6f 6e 67 0a 2a 2a 20  rder as long.** 
2dd30 61 73 20 65 71 75 69 76 65 6c 65 6e 74 20 72 6f  as equivelent ro
2dd40 77 73 20 61 72 65 20 67 72 6f 75 70 65 64 20 74  ws are grouped t
2dd50 6f 67 65 74 68 65 72 2e 20 20 54 68 75 73 20 66  ogether.  Thus f
2dd60 6f 72 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20  or GROUP BY and 
2dd70 44 49 53 54 49 4e 43 54 0a 2a 2a 20 74 68 65 20  DISTINCT.** the 
2dd80 70 4f 72 64 65 72 42 79 20 74 65 72 6d 73 20 63  pOrderBy terms c
2dd90 61 6e 20 62 65 20 6d 61 74 63 68 65 64 20 69 6e  an be matched in
2dda0 20 61 6e 79 20 6f 72 64 65 72 2e 20 20 57 69 74   any order.  Wit
2ddb0 68 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20  h ORDER BY, the 
2ddc0 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20 74 65 72  .** pOrderBy ter
2ddd0 6d 73 20 6d 75 73 74 20 62 65 20 6d 61 74 63 68  ms must be match
2dde0 65 64 20 69 6e 20 73 74 72 69 63 74 20 6c 65 66  ed in strict lef
2ddf0 74 2d 74 6f 2d 72 69 67 68 74 20 6f 72 64 65 72  t-to-right order
2de00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2de10 77 68 65 72 65 50 61 74 68 53 61 74 69 73 66 69  wherePathSatisfi
2de20 65 73 4f 72 64 65 72 42 79 28 0a 20 20 57 68 65  esOrderBy(.  Whe
2de30 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20  reInfo *pWInfo, 
2de40 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
2de50 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
2de60 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
2de70 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 6f 72    /* ORDER BY or
2de80 20 47 52 4f 55 50 20 42 59 20 6f 72 20 44 49 53   GROUP BY or DIS
2de90 54 49 4e 43 54 20 63 6c 61 75 73 65 20 74 6f 20  TINCT clause to 
2dea0 63 68 65 63 6b 20 2a 2f 0a 20 20 57 68 65 72 65  check */.  Where
2deb0 50 61 74 68 20 2a 70 50 61 74 68 2c 20 20 20 20  Path *pPath,    
2dec0 20 2f 2a 20 54 68 65 20 57 68 65 72 65 50 61 74   /* The WherePat
2ded0 68 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  h to check */.  
2dee0 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 2c 20  u16 wctrlFlags, 
2def0 20 20 20 20 20 20 2f 2a 20 4d 69 67 68 74 20 63        /* Might c
2df00 6f 6e 74 61 69 6e 20 57 48 45 52 45 5f 47 52 4f  ontain WHERE_GRO
2df10 55 50 42 59 20 6f 72 20 57 48 45 52 45 5f 44 49  UPBY or WHERE_DI
2df20 53 54 49 4e 43 54 42 59 20 2a 2f 0a 20 20 75 31  STINCTBY */.  u1
2df30 36 20 6e 4c 6f 6f 70 2c 20 20 20 20 20 20 20 20  6 nLoop,        
2df40 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2df50 20 65 6e 74 72 69 65 73 20 69 6e 20 70 50 61 74   entries in pPat
2df60 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20  h->aLoop[] */.  
2df70 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73 74  WhereLoop *pLast
2df80 2c 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69  ,     /* Add thi
2df90 73 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 74  s WhereLoop to t
2dfa0 68 65 20 65 6e 64 20 6f 66 20 70 50 61 74 68 2d  he end of pPath-
2dfb0 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 42 69  >aLoop[] */.  Bi
2dfc0 74 6d 61 73 6b 20 2a 70 52 65 76 4d 61 73 6b 20  tmask *pRevMask 
2dfd0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 73 6b      /* OUT: Mask
2dfe0 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 73 20 74   of WhereLoops t
2dff0 6f 20 72 75 6e 20 69 6e 20 72 65 76 65 72 73 65  o run in reverse
2e000 20 6f 72 64 65 72 20 2a 2f 0a 29 7b 0a 20 20 75   order */.){.  u
2e010 38 20 72 65 76 53 65 74 3b 20 20 20 20 20 20 20  8 revSet;       
2e020 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2e030 72 65 76 20 69 73 20 6b 6e 6f 77 6e 20 2a 2f 0a  rev is known */.
2e040 20 20 75 38 20 72 65 76 3b 20 20 20 20 20 20 20    u8 rev;       
2e050 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6f          /* Compo
2e060 73 69 74 65 20 73 6f 72 74 20 6f 72 64 65 72 20  site sort order 
2e070 2a 2f 0a 20 20 75 38 20 72 65 76 49 64 78 3b 20  */.  u8 revIdx; 
2e080 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2e090 64 65 78 20 73 6f 72 74 20 6f 72 64 65 72 20 2a  dex sort order *
2e0a0 2f 0a 20 20 75 38 20 69 73 4f 72 64 65 72 44 69  /.  u8 isOrderDi
2e0b0 73 74 69 6e 63 74 3b 20 20 20 2f 2a 20 41 6c 6c  stinct;   /* All
2e0c0 20 70 72 69 6f 72 20 57 68 65 72 65 4c 6f 6f 70   prior WhereLoop
2e0d0 73 20 61 72 65 20 6f 72 64 65 72 2d 64 69 73 74  s are order-dist
2e0e0 69 6e 63 74 20 2a 2f 0a 20 20 75 38 20 64 69 73  inct */.  u8 dis
2e0f0 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3b 20 20 20  tinctColumns;   
2e100 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 6c  /* True if the l
2e110 6f 6f 70 20 68 61 73 20 55 4e 49 51 55 45 20 4e  oop has UNIQUE N
2e120 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20  OT NULL columns 
2e130 2a 2f 0a 20 20 75 38 20 69 73 4d 61 74 63 68 3b  */.  u8 isMatch;
2e140 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 43             /* iC
2e150 6f 6c 75 6d 6e 20 6d 61 74 63 68 65 73 20 61 20  olumn matches a 
2e160 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44 45  term of the ORDE
2e170 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
2e180 20 75 31 36 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20   u16 nColumn;   
2e190 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2e1a0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70   of columns in p
2e1b0 49 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e  Index */.  u16 n
2e1c0 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20  OrderBy;        
2e1d0 20 2f 2a 20 4e 75 6d 62 65 72 20 74 65 72 6d 73   /* Number terms
2e1e0 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
2e1f0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
2e200 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20   iLoop;         
2e210 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 57     /* Index of W
2e220 68 65 72 65 4c 6f 6f 70 20 69 6e 20 70 50 61 74  hereLoop in pPat
2e230 68 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65  h being processe
2e240 64 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  d */.  int i, j;
2e250 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e260 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
2e270 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20  .  int iCur;    
2e280 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
2e290 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 63 75  or number for cu
2e2a0 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20  rrent WhereLoop 
2e2b0 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  */.  int iColumn
2e2c0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ;          /* A 
2e2d0 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77 69  column number wi
2e2e0 74 68 69 6e 20 74 61 62 6c 65 20 69 43 75 72 20  thin table iCur 
2e2f0 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
2e300 70 4c 6f 6f 70 20 3d 20 30 3b 20 2f 2a 20 43 75  pLoop = 0; /* Cu
2e310 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20  rrent WhereLoop 
2e320 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2e  being processed.
2e330 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
2e340 2a 70 54 65 72 6d 3b 20 20 20 20 20 2f 2a 20 41  *pTerm;     /* A
2e350 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20   single term of 
2e360 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2e370 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 42 45   */.  Expr *pOBE
2e380 78 70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 41  xpr;        /* A
2e390 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f  n expression fro
2e3a0 6d 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  m the ORDER BY c
2e3b0 6c 61 75 73 65 20 2a 2f 0a 20 20 43 6f 6c 6c 53  lause */.  CollS
2e3c0 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20  eq *pColl;      
2e3d0 20 2f 2a 20 43 4f 4c 4c 41 54 45 20 66 75 6e 63   /* COLLATE func
2e3e0 74 69 6f 6e 20 66 72 6f 6d 20 61 6e 20 4f 52 44  tion from an ORD
2e3f0 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65 72  ER BY clause ter
2e400 6d 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  m */.  Index *pI
2e410 6e 64 65 78 3b 20 20 20 20 20 20 20 20 2f 2a 20  ndex;        /* 
2e420 54 68 65 20 69 6e 64 65 78 20 61 73 73 6f 63 69  The index associ
2e430 61 74 65 64 20 77 69 74 68 20 70 4c 6f 6f 70 20  ated with pLoop 
2e440 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
2e450 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
2e460 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62  e->db;  /* Datab
2e470 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
2e480 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62 53 61  /.  Bitmask obSa
2e490 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4d 61 73  t = 0;    /* Mas
2e4a0 6b 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65  k of ORDER BY te
2e4b0 72 6d 73 20 73 61 74 69 73 66 69 65 64 20 73 6f  rms satisfied so
2e4c0 20 66 61 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73   far */.  Bitmas
2e4d0 6b 20 6f 62 44 6f 6e 65 3b 20 20 20 20 20 20 20  k obDone;       
2e4e0 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 4f  /* Mask of all O
2e4f0 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f  RDER BY terms */
2e500 0a 20 20 42 69 74 6d 61 73 6b 20 6f 72 64 65 72  .  Bitmask order
2e510 44 69 73 74 69 6e 63 74 4d 61 73 6b 3b 20 20 2f  DistinctMask;  /
2e520 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 77 65  * Mask of all we
2e530 6c 6c 2d 6f 72 64 65 72 65 64 20 6c 6f 6f 70 73  ll-ordered loops
2e540 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 72 65   */.  Bitmask re
2e550 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  ady;            
2e560 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 69 6e 6e    /* Mask of inn
2e570 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a 0a 20 20 2f  er loops */..  /
2e580 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79 20 74 68  *.  ** We say th
2e590 65 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 22  e WhereLoop is "
2e5a0 6f 6e 65 2d 72 6f 77 22 20 69 66 20 69 74 20 67  one-row" if it g
2e5b0 65 6e 65 72 61 74 65 73 20 6e 6f 20 6d 6f 72 65  enerates no more
2e5c0 20 74 68 61 6e 20 6f 6e 65 0a 20 20 2a 2a 20 72   than one.  ** r
2e5d0 6f 77 20 6f 66 20 6f 75 74 70 75 74 2e 20 20 41  ow of output.  A
2e5e0 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 6f 6e   WhereLoop is on
2e5f0 65 2d 72 6f 77 20 69 66 20 61 6c 6c 20 6f 66 20  e-row if all of 
2e600 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
2e610 65 20 74 72 75 65 3a 0a 20 20 2a 2a 20 20 28 61  e true:.  **  (a
2e620 29 20 41 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75  ) All index colu
2e630 6d 6e 73 20 6d 61 74 63 68 20 77 69 74 68 20 57  mns match with W
2e640 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 2e 0a  HERE_COLUMN_EQ..
2e650 20 20 2a 2a 20 20 28 62 29 20 54 68 65 20 69 6e    **  (b) The in
2e660 64 65 78 20 69 73 20 75 6e 69 71 75 65 0a 20 20  dex is unique.  
2e670 2a 2a 20 41 6e 79 20 57 68 65 72 65 4c 6f 6f 70  ** Any WhereLoop
2e680 20 77 69 74 68 20 61 6e 20 57 48 45 52 45 5f 43   with an WHERE_C
2e690 4f 4c 55 4d 4e 5f 45 51 20 63 6f 6e 73 74 72 61  OLUMN_EQ constra
2e6a0 69 6e 74 20 6f 6e 20 74 68 65 20 72 6f 77 69 64  int on the rowid
2e6b0 20 69 73 20 6f 6e 65 2d 72 6f 77 2e 0a 20 20 2a   is one-row..  *
2e6c0 2a 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20  * Every one-row 
2e6d0 57 68 65 72 65 4c 6f 6f 70 20 77 69 6c 6c 20 68  WhereLoop will h
2e6e0 61 76 65 20 74 68 65 20 57 48 45 52 45 5f 4f 4e  ave the WHERE_ON
2e6f0 45 52 4f 57 20 62 69 74 20 73 65 74 20 69 6e 20  EROW bit set in 
2e700 77 73 46 6c 61 67 73 2e 0a 20 20 2a 2a 0a 20 20  wsFlags..  **.  
2e710 2a 2a 20 57 65 20 73 61 79 20 74 68 65 20 57 68  ** We say the Wh
2e720 65 72 65 4c 6f 6f 70 20 69 73 20 22 6f 72 64 65  ereLoop is "orde
2e730 72 2d 64 69 73 74 69 6e 63 74 22 20 69 66 20 74  r-distinct" if t
2e740 68 65 20 73 65 74 20 6f 66 20 63 6f 6c 75 6d 6e  he set of column
2e750 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 61 74  s from.  ** that
2e760 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20   WhereLoop that 
2e770 61 72 65 20 69 6e 20 74 68 65 20 4f 52 44 45 52  are in the ORDER
2e780 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 64   BY clause are d
2e790 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65  ifferent for eve
2e7a0 72 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74  ry.  ** row of t
2e7b0 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 20 20 45  he WhereLoop.  E
2e7c0 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68 65  very one-row Whe
2e7d0 72 65 4c 6f 6f 70 20 69 73 20 61 75 74 6f 6d 61  reLoop is automa
2e7e0 74 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 6f 72 64  tically.  ** ord
2e7f0 65 72 2d 64 69 73 74 69 6e 63 74 2e 20 20 20 41  er-distinct.   A
2e800 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20   WhereLoop that 
2e810 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 73 20 69  has no columns i
2e820 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
2e830 6c 61 75 73 65 0a 20 20 2a 2a 20 69 73 20 6e 6f  lause.  ** is no
2e840 74 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  t order-distinct
2e850 2e 20 54 6f 20 62 65 20 6f 72 64 65 72 2d 64 69  . To be order-di
2e860 73 74 69 6e 63 74 20 69 73 20 6e 6f 74 20 71 75  stinct is not qu
2e870 69 74 65 20 74 68 65 20 73 61 6d 65 20 61 73 20  ite the same as 
2e880 62 65 69 6e 67 0a 20 20 2a 2a 20 55 4e 49 51 55  being.  ** UNIQU
2e890 45 20 73 69 6e 63 65 20 61 20 55 4e 49 51 55 45  E since a UNIQUE
2e8a0 20 63 6f 6c 75 6d 6e 20 6f 72 20 69 6e 64 65 78   column or index
2e8b0 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 69 70   can have multip
2e8c0 6c 65 20 72 6f 77 73 20 74 68 61 74 20 0a 20 20  le rows that .  
2e8d0 2a 2a 20 61 72 65 20 4e 55 4c 4c 20 61 6e 64 20  ** are NULL and 
2e8e0 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20  NULL values are 
2e8f0 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 20 74  equivalent for t
2e900 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 6f 72  he purpose of or
2e910 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20 20  der-distinct..  
2e920 2a 2a 20 54 6f 20 62 65 20 6f 72 64 65 72 2d 64  ** To be order-d
2e930 69 73 74 69 6e 63 74 2c 20 74 68 65 20 63 6f 6c  istinct, the col
2e940 75 6d 6e 73 20 6d 75 73 74 20 62 65 20 55 4e 49  umns must be UNI
2e950 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c  QUE and NOT NULL
2e960 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
2e970 72 6f 77 69 64 20 66 6f 72 20 61 20 74 61 62 6c  rowid for a tabl
2e980 65 20 69 73 20 61 6c 77 61 79 73 20 55 4e 49 51  e is always UNIQ
2e990 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c 20  UE and NOT NULL 
2e9a0 73 6f 20 77 68 65 6e 65 76 65 72 20 74 68 65 0a  so whenever the.
2e9b0 20 20 2a 2a 20 72 6f 77 69 64 20 61 70 70 65 61    ** rowid appea
2e9c0 72 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  rs in the ORDER 
2e9d0 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 20 63  BY clause, the c
2e9e0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68 65  orresponding Whe
2e9f0 72 65 4c 6f 6f 70 20 69 73 0a 20 20 2a 2a 20 61  reLoop is.  ** a
2ea00 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 6f 72 64  utomatically ord
2ea10 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20 20 2a  er-distinct..  *
2ea20 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72  /..  assert( pOr
2ea30 64 65 72 42 79 21 3d 30 20 29 3b 0a 0a 20 20 2f  derBy!=0 );..  /
2ea40 2a 20 53 6f 72 74 61 62 69 6c 69 74 79 20 6f 66  * Sortability of
2ea50 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20   virtual tables 
2ea60 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  is determined by
2ea70 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 20   the xBestIndex 
2ea80 6d 65 74 68 6f 64 0a 20 20 2a 2a 20 6f 66 20 74  method.  ** of t
2ea90 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
2eaa0 20 69 74 73 65 6c 66 20 2a 2f 0a 20 20 69 66 28   itself */.  if(
2eab0 20 70 4c 61 73 74 2d 3e 77 73 46 6c 61 67 73 20   pLast->wsFlags 
2eac0 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
2ead0 41 42 4c 45 20 29 7b 0a 20 20 20 20 74 65 73 74  ABLE ){.    test
2eae0 63 61 73 65 28 20 6e 4c 6f 6f 70 3e 30 20 29 3b  case( nLoop>0 );
2eaf0 20 20 2f 2a 20 54 72 75 65 20 77 68 65 6e 20 6f    /* True when o
2eb00 75 74 65 72 20 6c 6f 6f 70 73 20 61 72 65 20 6f  uter loops are o
2eb10 6e 65 2d 72 6f 77 20 61 6e 64 20 6d 61 74 63 68  ne-row and match
2eb20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
2eb30 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e              ** n
2eb40 6f 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  o ORDER BY terms
2eb50 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 70   */.    return p
2eb60 4c 61 73 74 2d 3e 75 2e 76 74 61 62 2e 69 73 4f  Last->u.vtab.isO
2eb70 72 64 65 72 65 64 3b 0a 20 20 7d 0a 20 20 69 66  rdered;.  }.  if
2eb80 28 20 6e 4c 6f 6f 70 20 26 26 20 4f 70 74 69 6d  ( nLoop && Optim
2eb90 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28  izationDisabled(
2eba0 64 62 2c 20 53 51 4c 49 54 45 5f 4f 72 64 65 72  db, SQLITE_Order
2ebb0 42 79 49 64 78 4a 6f 69 6e 29 20 29 20 72 65 74  ByIdxJoin) ) ret
2ebc0 75 72 6e 20 30 3b 0a 0a 20 20 6e 4f 72 64 65 72  urn 0;..  nOrder
2ebd0 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e  By = pOrderBy->n
2ebe0 45 78 70 72 3b 0a 20 20 74 65 73 74 63 61 73 65  Expr;.  testcase
2ebf0 28 20 6e 4f 72 64 65 72 42 79 3d 3d 42 4d 53 2d  ( nOrderBy==BMS-
2ec00 31 20 29 3b 0a 20 20 69 66 28 20 6e 4f 72 64 65  1 );.  if( nOrde
2ec10 72 42 79 3e 42 4d 53 2d 31 20 29 20 72 65 74 75  rBy>BMS-1 ) retu
2ec20 72 6e 20 30 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74  rn 0;  /* Cannot
2ec30 20 6f 70 74 69 6d 69 7a 65 20 6f 76 65 72 6c 79   optimize overly
2ec40 20 6c 61 72 67 65 20 4f 52 44 45 52 20 42 59 73   large ORDER BYs
2ec50 20 2a 2f 0a 20 20 69 73 4f 72 64 65 72 44 69 73   */.  isOrderDis
2ec60 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20 6f 62 44  tinct = 1;.  obD
2ec70 6f 6e 65 20 3d 20 4d 41 53 4b 42 49 54 28 6e 4f  one = MASKBIT(nO
2ec80 72 64 65 72 42 79 29 2d 31 3b 0a 20 20 6f 72 64  rderBy)-1;.  ord
2ec90 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 20 3d  erDistinctMask =
2eca0 20 30 3b 0a 20 20 72 65 61 64 79 20 3d 20 30 3b   0;.  ready = 0;
2ecb0 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20  .  for(iLoop=0; 
2ecc0 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
2ecd0 26 26 20 6f 62 53 61 74 3c 6f 62 44 6f 6e 65 20  && obSat<obDone 
2ece0 26 26 20 69 4c 6f 6f 70 3c 3d 6e 4c 6f 6f 70 3b  && iLoop<=nLoop;
2ecf0 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 69   iLoop++){.    i
2ed00 66 28 20 69 4c 6f 6f 70 3e 30 20 29 20 72 65 61  f( iLoop>0 ) rea
2ed10 64 79 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73  dy |= pLoop->mas
2ed20 6b 53 65 6c 66 3b 0a 20 20 20 20 70 4c 6f 6f 70  kSelf;.    pLoop
2ed30 20 3d 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 20 3f   = iLoop<nLoop ?
2ed40 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 4c   pPath->aLoop[iL
2ed50 6f 6f 70 5d 20 3a 20 70 4c 61 73 74 3b 0a 20 20  oop] : pLast;.  
2ed60 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70    assert( (pLoop
2ed70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
2ed80 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d  E_VIRTUALTABLE)=
2ed90 3d 30 20 29 3b 0a 20 20 20 20 69 43 75 72 20 3d  =0 );.    iCur =
2eda0 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
2edb0 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62  t->a[pLoop->iTab
2edc0 5d 2e 69 43 75 72 73 6f 72 3b 0a 0a 20 20 20 20  ].iCursor;..    
2edd0 2f 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79 20  /* Mark off any 
2ede0 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 58 20  ORDER BY term X 
2edf0 74 68 61 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e  that is a column
2ee00 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 66   in the table of
2ee10 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72  .    ** the curr
2ee20 65 6e 74 20 6c 6f 6f 70 20 66 6f 72 20 77 68 69  ent loop for whi
2ee30 63 68 20 74 68 65 72 65 20 69 73 20 74 65 72 6d  ch there is term
2ee40 20 69 6e 20 74 68 65 20 57 48 45 52 45 0a 20 20   in the WHERE.  
2ee50 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 74    ** clause of t
2ee60 68 65 20 66 6f 72 6d 20 58 20 49 53 20 4e 55 4c  he form X IS NUL
2ee70 4c 20 6f 72 20 58 3d 3f 20 74 68 61 74 20 72 65  L or X=? that re
2ee80 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 75 74  ference only out
2ee90 65 72 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70 73 2e  er.    ** loops.
2eea0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
2eeb0 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b  i=0; i<nOrderBy;
2eec0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
2eed0 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f 62   MASKBIT(i) & ob
2eee0 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Sat ) continue;.
2eef0 20 20 20 20 20 20 70 4f 42 45 78 70 72 20 3d 20        pOBExpr = 
2ef00 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
2ef10 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72 42 79 2d  ollate(pOrderBy-
2ef20 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
2ef30 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d      if( pOBExpr-
2ef40 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op!=TK_COLUMN )
2ef50 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2ef60 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 54   if( pOBExpr->iT
2ef70 61 62 6c 65 21 3d 69 43 75 72 20 29 20 63 6f 6e  able!=iCur ) con
2ef80 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 54 65  tinue;.      pTe
2ef90 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 26 70  rm = findTerm(&p
2efa0 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 69 43 75 72  WInfo->sWC, iCur
2efb0 2c 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75  , pOBExpr->iColu
2efc0 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  mn,.            
2efd0 20 20 20 20 20 20 20 20 20 20 20 7e 72 65 61 64             ~read
2efe0 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55  y, WO_EQ|WO_ISNU
2eff0 4c 4c 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  LL, 0);.      if
2f000 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 63 6f 6e  ( pTerm==0 ) con
2f010 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
2f020 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
2f030 6f 72 26 57 4f 5f 45 51 29 21 3d 30 20 26 26 20  or&WO_EQ)!=0 && 
2f040 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  pOBExpr->iColumn
2f050 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  >=0 ){.        c
2f060 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 2c 20 2a  onst char *z1, *
2f070 7a 32 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  z2;.        pCol
2f080 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
2f090 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70  ollSeq(pWInfo->p
2f0a0 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2d  Parse, pOrderBy-
2f0b0 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
2f0c0 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
2f0d0 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   ) pColl = db->p
2f0e0 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
2f0f0 20 20 7a 31 20 3d 20 70 43 6f 6c 6c 2d 3e 7a 4e    z1 = pColl->zN
2f100 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  ame;.        pCo
2f110 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
2f120 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e  CollSeq(pWInfo->
2f130 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70  pParse, pTerm->p
2f140 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69  Expr);.        i
2f150 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c  f( !pColl ) pCol
2f160 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
2f170 6c 3b 0a 20 20 20 20 20 20 20 20 7a 32 20 3d 20  l;.        z2 = 
2f180 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  pColl->zName;.  
2f190 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
2f1a0 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29  3StrICmp(z1, z2)
2f1b0 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
2f1c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6f 62        }.      ob
2f1d0 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69  Sat |= MASKBIT(i
2f1e0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
2f1f0 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
2f200 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57  s & WHERE_ONEROW
2f210 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )==0 ){.      if
2f220 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
2f230 20 26 20 57 48 45 52 45 5f 49 50 4b 20 29 7b 0a   & WHERE_IPK ){.
2f240 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 20 3d          pIndex =
2f250 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c   0;.        nCol
2f260 75 6d 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  umn = 0;.      }
2f270 65 6c 73 65 20 69 66 28 20 28 70 49 6e 64 65 78  else if( (pIndex
2f280 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   = pLoop->u.btre
2f290 65 2e 70 49 6e 64 65 78 29 3d 3d 30 20 7c 7c 20  e.pIndex)==0 || 
2f2a0 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72  pIndex->bUnorder
2f2b0 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ed ){.        re
2f2c0 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65  turn 0;.      }e
2f2d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 43 6f  lse{.        nCo
2f2e0 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 6e  lumn = pIndex->n
2f2f0 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
2f300 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
2f310 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  = pIndex->onErro
2f320 72 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20 20 20 20  r!=OE_None;.    
2f330 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4c 6f    }..      /* Lo
2f340 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 63  op through all c
2f350 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e  olumns of the in
2f360 64 65 78 20 61 6e 64 20 64 65 61 6c 20 77 69 74  dex and deal wit
2f370 68 20 74 68 65 20 6f 6e 65 73 0a 20 20 20 20 20  h the ones.     
2f380 20 2a 2a 20 74 68 61 74 20 61 72 65 20 6e 6f 74   ** that are not
2f390 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20   constrained by 
2f3a0 3d 3d 20 6f 72 20 49 4e 2e 0a 20 20 20 20 20 20  == or IN..      
2f3b0 2a 2f 0a 20 20 20 20 20 20 72 65 76 20 3d 20 72  */.      rev = r
2f3c0 65 76 53 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  evSet = 0;.     
2f3d0 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73   distinctColumns
2f3e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28   = 0;.      for(
2f3f0 6a 3d 30 3b 20 6a 3c 3d 6e 43 6f 6c 75 6d 6e 3b  j=0; j<=nColumn;
2f400 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75   j++){.        u
2f410 38 20 62 4f 6e 63 65 3b 20 20 20 2f 2a 20 54 72  8 bOnce;   /* Tr
2f420 75 65 20 74 6f 20 72 75 6e 20 74 68 65 20 4f 52  ue to run the OR
2f430 44 45 52 20 42 59 20 73 65 61 72 63 68 20 6c 6f  DER BY search lo
2f440 6f 70 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f  op */..        /
2f450 2a 20 53 6b 69 70 20 6f 76 65 72 20 3d 3d 20 61  * Skip over == a
2f460 6e 64 20 49 53 20 4e 55 4c 4c 20 74 65 72 6d 73  nd IS NULL terms
2f470 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
2f480 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  j<pLoop->u.btree
2f490 2e 6e 45 71 0a 20 20 20 20 20 20 20 20 20 26 26  .nEq.         &&
2f4a0 20 28 28 69 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c   ((i = pLoop->aL
2f4b0 54 65 72 6d 5b 6a 5d 2d 3e 65 4f 70 65 72 61 74  Term[j]->eOperat
2f4c0 6f 72 29 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f  or) & (WO_EQ|WO_
2f4d0 49 53 4e 55 4c 4c 29 29 21 3d 30 0a 20 20 20 20  ISNULL))!=0.    
2f4e0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
2f4f0 20 69 66 28 20 69 20 26 20 57 4f 5f 49 53 4e 55   if( i & WO_ISNU
2f500 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  LL ){.          
2f510 20 20 74 65 73 74 63 61 73 65 28 20 69 73 4f 72    testcase( isOr
2f520 64 65 72 44 69 73 74 69 6e 63 74 20 29 3b 0a 20  derDistinct );. 
2f530 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
2f540 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a  erDistinct = 0;.
2f550 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2f560 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20        continue; 
2f570 20 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20   .        }..   
2f580 20 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20       /* Get the 
2f590 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 69 6e  column number in
2f5a0 20 74 68 65 20 74 61 62 6c 65 20 28 69 43 6f 6c   the table (iCol
2f5b0 75 6d 6e 29 20 61 6e 64 20 73 6f 72 74 20 6f 72  umn) and sort or
2f5c0 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 28  der.        ** (
2f5d0 72 65 76 49 64 78 29 20 66 6f 72 20 74 68 65 20  revIdx) for the 
2f5e0 6a 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  j-th column of t
2f5f0 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20  he index..      
2f600 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
2f610 20 6a 3c 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20   j<nColumn ){.  
2f620 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 72 6d 61          /* Norma
2f630 6c 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20  l index columns 
2f640 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f  */.          iCo
2f650 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 61  lumn = pIndex->a
2f660 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20  iColumn[j];.    
2f670 20 20 20 20 20 20 72 65 76 49 64 78 20 3d 20 70        revIdx = p
2f680 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65  Index->aSortOrde
2f690 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  r[j];.          
2f6a0 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e  if( iColumn==pIn
2f6b0 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b  dex->pTable->iPK
2f6c0 65 79 20 29 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d  ey ) iColumn = -
2f6d0 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
2f6e0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
2f6f0 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20  he ROWID column 
2f700 61 74 20 74 68 65 20 65 6e 64 20 2a 2f 0a 20 20  at the end */.  
2f710 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2f720 6a 3d 3d 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20  j==nColumn );.  
2f730 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20          iColumn 
2f740 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  = -1;.          
2f750 72 65 76 49 64 78 20 3d 20 30 3b 0a 20 20 20 20  revIdx = 0;.    
2f760 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
2f770 2a 20 41 6e 20 75 6e 63 6f 6e 73 74 72 61 69 6e  * An unconstrain
2f780 65 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 6d  ed column that m
2f790 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 6d 65 61  ight be NULL mea
2f7a0 6e 73 20 74 68 61 74 20 74 68 69 73 0a 20 20 20  ns that this.   
2f7b0 20 20 20 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f       ** WhereLoo
2f7c0 70 20 69 73 20 6e 6f 74 20 77 65 6c 6c 2d 6f 72  p is not well-or
2f7d0 64 65 72 65 64 20 0a 20 20 20 20 20 20 20 20 2a  dered .        *
2f7e0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  /.        if( is
2f7f0 4f 72 64 65 72 44 69 73 74 69 6e 63 74 0a 20 20  OrderDistinct.  
2f800 20 20 20 20 20 20 20 26 26 20 69 43 6f 6c 75 6d         && iColum
2f810 6e 3e 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  n>=0.         &&
2f820 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72   j>=pLoop->u.btr
2f830 65 65 2e 6e 45 71 0a 20 20 20 20 20 20 20 20 20  ee.nEq.         
2f840 26 26 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  && pIndex->pTabl
2f850 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d  e->aCol[iColumn]
2f860 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a 20 20 20 20  .notNull==0.    
2f870 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
2f880 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
2f890 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
2f8a0 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64  .        /* Find
2f8b0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 74 65   the ORDER BY te
2f8c0 72 6d 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f  rm that correspo
2f8d0 6e 64 73 20 74 6f 20 74 68 65 20 6a 2d 74 68 20  nds to the j-th 
2f8e0 63 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20 20 2a  column.        *
2f8f0 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61  * of the index a
2f900 6e 64 20 61 6e 64 20 6d 61 72 6b 20 74 68 61 74  nd and mark that
2f910 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 6f   ORDER BY term o
2f920 66 66 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ff .        */. 
2f930 20 20 20 20 20 20 20 62 4f 6e 63 65 20 3d 20 31         bOnce = 1
2f940 3b 0a 20 20 20 20 20 20 20 20 69 73 4d 61 74 63  ;.        isMatc
2f950 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66  h = 0;.        f
2f960 6f 72 28 69 3d 30 3b 20 62 4f 6e 63 65 20 26 26  or(i=0; bOnce &&
2f970 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b   i<nOrderBy; i++
2f980 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2f990 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f 62   MASKBIT(i) & ob
2f9a0 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Sat ) continue;.
2f9b0 20 20 20 20 20 20 20 20 20 20 70 4f 42 45 78 70            pOBExp
2f9c0 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  r = sqlite3ExprS
2f9d0 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65  kipCollate(pOrde
2f9e0 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  rBy->a[i].pExpr)
2f9f0 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
2fa00 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61 67 73  case( wctrlFlags
2fa10 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59   & WHERE_GROUPBY
2fa20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65   );.          te
2fa30 73 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61  stcase( wctrlFla
2fa40 67 73 20 26 20 57 48 45 52 45 5f 44 49 53 54 49  gs & WHERE_DISTI
2fa50 4e 43 54 42 59 20 29 3b 0a 20 20 20 20 20 20 20  NCTBY );.       
2fa60 20 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61     if( (wctrlFla
2fa70 67 73 20 26 20 28 57 48 45 52 45 5f 47 52 4f 55  gs & (WHERE_GROU
2fa80 50 42 59 7c 57 48 45 52 45 5f 44 49 53 54 49 4e  PBY|WHERE_DISTIN
2fa90 43 54 42 59 29 29 3d 3d 30 20 29 20 62 4f 6e 63  CTBY))==0 ) bOnc
2faa0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
2fab0 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70   if( pOBExpr->op
2fac0 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f  !=TK_COLUMN ) co
2fad0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2fae0 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69    if( pOBExpr->i
2faf0 54 61 62 6c 65 21 3d 69 43 75 72 20 29 20 63 6f  Table!=iCur ) co
2fb00 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2fb10 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69    if( pOBExpr->i
2fb20 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20  Column!=iColumn 
2fb30 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2fb40 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d        if( iColum
2fb50 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n>=0 ){.        
2fb60 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
2fb70 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
2fb80 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70  WInfo->pParse, p
2fb90 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
2fba0 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
2fbb0 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70    if( !pColl ) p
2fbc0 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
2fbd0 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  Coll;.          
2fbe0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
2fbf0 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  ICmp(pColl->zNam
2fc00 65 2c 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c  e, pIndex->azCol
2fc10 6c 5b 6a 5d 29 21 3d 30 20 29 20 63 6f 6e 74 69  l[j])!=0 ) conti
2fc20 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nue;.          }
2fc30 0a 20 20 20 20 20 20 20 20 20 20 69 73 4d 61 74  .          isMat
2fc40 63 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ch = 1;.        
2fc50 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2fc60 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   }.        if( i
2fc70 73 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20  sMatch ){.      
2fc80 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3c      if( iColumn<
2fc90 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2fca0 20 74 65 73 74 63 61 73 65 28 20 64 69 73 74 69   testcase( disti
2fcb0 6e 63 74 43 6f 6c 75 6d 6e 73 3d 3d 30 20 29 3b  nctColumns==0 );
2fcc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73  .            dis
2fcd0 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 31  tinctColumns = 1
2fce0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2fcf0 20 20 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d          obSat |=
2fd00 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20   MASKBIT(i);.   
2fd10 20 20 20 20 20 20 20 69 66 28 20 28 70 57 49 6e         if( (pWIn
2fd20 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
2fd30 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 29 3d   WHERE_GROUPBY)=
2fd40 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2fd50 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
2fd60 68 65 20 73 6f 72 74 20 6f 72 64 65 72 20 69 73  he sort order is
2fd70 20 63 6f 6d 70 61 74 69 62 6c 65 20 69 6e 20 61   compatible in a
2fd80 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
2fd90 65 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  e..            *
2fda0 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 69 73 20  * Sort order is 
2fdb0 69 72 72 65 6c 65 76 61 6e 74 20 66 6f 72 20 61  irrelevant for a
2fdc0 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
2fdd0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
2fde0 20 69 66 28 20 72 65 76 53 65 74 20 29 7b 0a 20   if( revSet ){. 
2fdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2fe00 20 28 72 65 76 20 5e 20 72 65 76 49 64 78 29 21   (rev ^ revIdx)!
2fe10 3d 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e  =pOrderBy->a[i].
2fe20 73 6f 72 74 4f 72 64 65 72 20 29 20 72 65 74 75  sortOrder ) retu
2fe30 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20  rn 0;.          
2fe40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2fe50 20 20 20 20 20 20 20 72 65 76 20 3d 20 72 65 76         rev = rev
2fe60 49 64 78 20 5e 20 70 4f 72 64 65 72 42 79 2d 3e  Idx ^ pOrderBy->
2fe70 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a  a[i].sortOrder;.
2fe80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2fe90 28 20 72 65 76 20 29 20 2a 70 52 65 76 4d 61 73  ( rev ) *pRevMas
2fea0 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 4c 6f  k |= MASKBIT(iLo
2feb0 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  op);.           
2fec0 20 20 20 72 65 76 53 65 74 20 3d 20 31 3b 0a 20     revSet = 1;. 
2fed0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2fee0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2fef0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2ff00 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 66 6f    /* No match fo
2ff10 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  und */.         
2ff20 20 69 66 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3c 6e   if( j==0 || j<n
2ff30 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
2ff40 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2ff50 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 21  isOrderDistinct!
2ff60 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
2ff70 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63    isOrderDistinc
2ff80 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
2ff90 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65   }.          bre
2ffa0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
2ffb0 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 4c 6f 6f      } /* end Loo
2ffc0 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 65 78  p over all index
2ffd0 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20   columns */.    
2ffe0 20 20 69 66 28 20 64 69 73 74 69 6e 63 74 43 6f    if( distinctCo
2fff0 6c 75 6d 6e 73 20 29 7b 0a 20 20 20 20 20 20 20  lumns ){.       
30000 20 74 65 73 74 63 61 73 65 28 20 69 73 4f 72 64   testcase( isOrd
30010 65 72 44 69 73 74 69 6e 63 74 3d 3d 30 20 29 3b  erDistinct==0 );
30020 0a 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72  .        isOrder
30030 44 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20  Distinct = 1;.  
30040 20 20 20 20 7d 0a 20 20 20 20 7d 20 2f 2a 20 65      }.    } /* e
30050 6e 64 2d 69 66 20 6e 6f 74 20 6f 6e 65 2d 72 6f  nd-if not one-ro
30060 77 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 72  w */..    /* Mar
30070 6b 20 6f 66 66 20 61 6e 79 20 6f 74 68 65 72 20  k off any other 
30080 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 74  ORDER BY terms t
30090 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 70 4c  hat reference pL
300a0 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 66 28 20 69  oop */.    if( i
300b0 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 29  sOrderDistinct )
300c0 7b 0a 20 20 20 20 20 20 6f 72 64 65 72 44 69 73  {.      orderDis
300d0 74 69 6e 63 74 4d 61 73 6b 20 7c 3d 20 70 4c 6f  tinctMask |= pLo
300e0 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20  op->maskSelf;.  
300f0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
30100 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
30110 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 3b 0a         Expr *p;.
30120 20 20 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b          if( MASK
30130 42 49 54 28 69 29 20 26 20 6f 62 53 61 74 20 29  BIT(i) & obSat )
30140 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
30150 20 20 20 70 20 3d 20 70 4f 72 64 65 72 42 79 2d     p = pOrderBy-
30160 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
30170 20 20 20 20 20 69 66 28 20 28 65 78 70 72 54 61       if( (exprTa
30180 62 6c 65 55 73 61 67 65 28 26 70 57 49 6e 66 6f  bleUsage(&pWInfo
30190 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 29 26 7e  ->sMaskSet, p)&~
301a0 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73  orderDistinctMas
301b0 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)==0 ){.       
301c0 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b     obSat |= MASK
301d0 42 49 54 28 69 29 3b 0a 20 20 20 20 20 20 20 20  BIT(i);.        
301e0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
301f0 20 20 7d 20 2f 2a 20 45 6e 64 20 74 68 65 20 6c    } /* End the l
30200 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 57 68 65  oop over all Whe
30210 72 65 4c 6f 6f 70 73 20 66 72 6f 6d 20 6f 75 74  reLoops from out
30220 65 72 2d 6d 6f 73 74 20 64 6f 77 6e 20 74 6f 20  er-most down to 
30230 69 6e 6e 65 72 2d 6d 6f 73 74 20 2a 2f 0a 20 20  inner-most */.  
30240 69 66 28 20 6f 62 53 61 74 3d 3d 6f 62 44 6f 6e  if( obSat==obDon
30250 65 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  e ) return 1;.  
30260 69 66 28 20 21 69 73 4f 72 64 65 72 44 69 73 74  if( !isOrderDist
30270 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b  inct ) return 0;
30280 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a  .  return -1;.}.
30290 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
302a0 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 20 46 6f  CE_ENABLED./* Fo
302b0 72 20 64 65 62 75 67 67 69 6e 67 20 75 73 65 20  r debugging use 
302c0 6f 6e 6c 79 3a 20 2a 2f 0a 73 74 61 74 69 63 20  only: */.static 
302d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 68 65 72  const char *wher
302e0 65 50 61 74 68 4e 61 6d 65 28 57 68 65 72 65 50  ePathName(WhereP
302f0 61 74 68 20 2a 70 50 61 74 68 2c 20 69 6e 74 20  ath *pPath, int 
30300 6e 4c 6f 6f 70 2c 20 57 68 65 72 65 4c 6f 6f 70  nLoop, WhereLoop
30310 20 2a 70 4c 61 73 74 29 7b 0a 20 20 73 74 61 74   *pLast){.  stat
30320 69 63 20 63 68 61 72 20 7a 4e 61 6d 65 5b 36 35  ic char zName[65
30330 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ];.  int i;.  fo
30340 72 28 69 3d 30 3b 20 69 3c 6e 4c 6f 6f 70 3b 20  r(i=0; i<nLoop; 
30350 69 2b 2b 29 7b 20 7a 4e 61 6d 65 5b 69 5d 20 3d  i++){ zName[i] =
30360 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 5d   pPath->aLoop[i]
30370 2d 3e 63 49 64 3b 20 7d 0a 20 20 69 66 28 20 70  ->cId; }.  if( p
30380 4c 61 73 74 20 29 20 7a 4e 61 6d 65 5b 69 2b 2b  Last ) zName[i++
30390 5d 20 3d 20 70 4c 61 73 74 2d 3e 63 49 64 3b 0a  ] = pLast->cId;.
303a0 20 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b 0a    zName[i] = 0;.
303b0 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a    return zName;.
303c0 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
303d0 20 47 69 76 65 6e 20 74 68 65 20 6c 69 73 74 20   Given the list 
303e0 6f 66 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  of WhereLoop obj
303f0 65 63 74 73 20 61 74 20 70 57 49 6e 66 6f 2d 3e  ects at pWInfo->
30400 70 4c 6f 6f 70 73 2c 20 74 68 69 73 20 72 6f 75  pLoops, this rou
30410 74 69 6e 65 0a 2a 2a 20 61 74 74 65 6d 70 74 73  tine.** attempts
30420 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6c 6f 77   to find the low
30430 65 73 74 20 63 6f 73 74 20 70 61 74 68 20 74 68  est cost path th
30440 61 74 20 76 69 73 69 74 73 20 65 61 63 68 20 57  at visits each W
30450 68 65 72 65 4c 6f 6f 70 0a 2a 2a 20 6f 6e 63 65  hereLoop.** once
30460 2e 20 20 54 68 69 73 20 70 61 74 68 20 69 73 20  .  This path is 
30470 74 68 65 6e 20 6c 6f 61 64 65 64 20 69 6e 74 6f  then loaded into
30480 20 74 68 65 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d   the pWInfo->a[]
30490 2e 70 57 4c 6f 6f 70 20 66 69 65 6c 64 73 2e 0a  .pWLoop fields..
304a0 2a 2a 0a 2a 2a 20 41 73 73 75 6d 65 20 74 68 61  **.** Assume tha
304b0 74 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  t the total numb
304c0 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77  er of output row
304d0 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 65 64  s that will need
304e0 20 74 6f 20 62 65 20 73 6f 72 74 65 64 0a 2a 2a   to be sorted.**
304f0 20 77 69 6c 6c 20 62 65 20 6e 52 6f 77 45 73 74   will be nRowEst
30500 20 28 69 6e 20 74 68 65 20 31 30 2a 6c 6f 67 32   (in the 10*log2
30510 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 29   representation)
30520 2e 20 20 4f 72 2c 20 69 67 6e 6f 72 65 20 73 6f  .  Or, ignore so
30530 72 74 69 6e 67 0a 2a 2a 20 63 6f 73 74 73 20 69  rting.** costs i
30540 66 20 6e 52 6f 77 45 73 74 3d 3d 30 2e 0a 2a 2a  f nRowEst==0..**
30550 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
30560 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
30570 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  or SQLITE_NOMEM 
30580 6f 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  of a memory allo
30590 63 61 74 69 6f 6e 0a 2a 2a 20 65 72 72 6f 72 20  cation.** error 
305a0 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  occurs..*/.stati
305b0 63 20 69 6e 74 20 77 68 65 72 65 50 61 74 68 53  c int wherePathS
305c0 6f 6c 76 65 72 28 57 68 65 72 65 49 6e 66 6f 20  olver(WhereInfo 
305d0 2a 70 57 49 6e 66 6f 2c 20 4c 6f 67 45 73 74 20  *pWInfo, LogEst 
305e0 6e 52 6f 77 45 73 74 29 7b 0a 20 20 69 6e 74 20  nRowEst){.  int 
305f0 6d 78 43 68 6f 69 63 65 3b 20 20 20 20 20 20 20  mxChoice;       
30600 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
30610 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 75 6c   number of simul
30620 74 61 6e 65 6f 75 73 20 70 61 74 68 73 20 74 72  taneous paths tr
30630 61 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  acked */.  int n
30640 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
30650 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
30660 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 6a  f terms in the j
30670 6f 69 6e 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  oin */.  Parse *
30680 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20  pParse;         
30690 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
306a0 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74  ntext */.  sqlit
306b0 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
306c0 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
306d0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
306e0 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b 20  */.  int iLoop; 
306f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30700 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 6f  * Loop counter o
30710 76 65 72 20 74 68 65 20 74 65 72 6d 73 20 6f 66  ver the terms of
30720 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 69   the join */.  i
30730 6e 74 20 69 69 2c 20 6a 6a 3b 20 20 20 20 20 20  nt ii, jj;      
30740 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
30750 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69   counters */.  i
30760 6e 74 20 6d 78 49 20 3d 20 30 3b 20 20 20 20 20  nt mxI = 0;     
30770 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
30780 78 20 6f 66 20 6e 65 78 74 20 65 6e 74 72 79 20  x of next entry 
30790 74 6f 20 72 65 70 6c 61 63 65 20 2a 2f 0a 20 20  to replace */.  
307a0 4c 6f 67 45 73 74 20 72 43 6f 73 74 3b 20 20 20  LogEst rCost;   
307b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73            /* Cos
307c0 74 20 6f 66 20 61 20 70 61 74 68 20 2a 2f 0a 20  t of a path */. 
307d0 20 4c 6f 67 45 73 74 20 6e 4f 75 74 3b 20 20 20   LogEst nOut;   
307e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
307f0 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 73 20  mber of outputs 
30800 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6d 78 43 6f  */.  LogEst mxCo
30810 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  st = 0;        /
30820 2a 20 4d 61 78 69 6d 75 6d 20 63 6f 73 74 20 6f  * Maximum cost o
30830 66 20 61 20 73 65 74 20 6f 66 20 70 61 74 68 73  f a set of paths
30840 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6d 78 4f   */.  LogEst mxO
30850 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ut = 0;         
30860 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 4f 75 74 20  /* Maximum nOut 
30870 76 61 6c 75 65 20 6f 6e 20 74 68 65 20 73 65 74  value on the set
30880 20 6f 66 20 70 61 74 68 73 20 2a 2f 0a 20 20 4c   of paths */.  L
30890 6f 67 45 73 74 20 72 53 6f 72 74 43 6f 73 74 3b  ogEst rSortCost;
308a0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74           /* Cost
308b0 20 74 6f 20 64 6f 20 61 20 73 6f 72 74 20 2a 2f   to do a sort */
308c0 0a 20 20 69 6e 74 20 6e 54 6f 2c 20 6e 46 72 6f  .  int nTo, nFro
308d0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m;           /* 
308e0 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20  Number of valid 
308f0 65 6e 74 72 69 65 73 20 69 6e 20 61 54 6f 5b 5d  entries in aTo[]
30900 20 61 6e 64 20 61 46 72 6f 6d 5b 5d 20 2a 2f 0a   and aFrom[] */.
30910 20 20 57 68 65 72 65 50 61 74 68 20 2a 61 46 72    WherePath *aFr
30920 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  om;         /* A
30930 6c 6c 20 6e 46 72 6f 6d 20 70 61 74 68 73 20 61  ll nFrom paths a
30940 74 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c  t the previous l
30950 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50  evel */.  WhereP
30960 61 74 68 20 2a 61 54 6f 3b 20 20 20 20 20 20 20  ath *aTo;       
30970 20 20 20 20 2f 2a 20 54 68 65 20 6e 54 6f 20 62      /* The nTo b
30980 65 73 74 20 70 61 74 68 73 20 61 74 20 74 68 65  est paths at the
30990 20 63 75 72 72 65 6e 74 20 6c 65 76 65 6c 20 2a   current level *
309a0 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70  /.  WherePath *p
309b0 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a  From;         /*
309c0 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61   An element of a
309d0 46 72 6f 6d 5b 5d 20 74 68 61 74 20 77 65 20 61  From[] that we a
309e0 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f  re working on */
309f0 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 54  .  WherePath *pT
30a00 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o;           /* 
30a10 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 54  An element of aT
30a20 6f 5b 5d 20 74 68 61 74 20 77 65 20 61 72 65 20  o[] that we are 
30a30 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20  working on */.  
30a40 57 68 65 72 65 4c 6f 6f 70 20 2a 70 57 4c 6f 6f  WhereLoop *pWLoo
30a50 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  p;        /* One
30a60 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f   of the WhereLoo
30a70 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 57  p objects */.  W
30a80 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 58 3b 20 20  hereLoop **pX;  
30a90 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
30aa0 20 74 6f 20 64 69 76 79 20 75 70 20 74 68 65 20   to divy up the 
30ab0 70 53 70 61 63 65 20 6d 65 6d 6f 72 79 20 2a 2f  pSpace memory */
30ac0 0a 20 20 63 68 61 72 20 2a 70 53 70 61 63 65 3b  .  char *pSpace;
30ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30ae0 54 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79  Temporary memory
30af0 20 75 73 65 64 20 62 79 20 74 68 69 73 20 72 6f   used by this ro
30b00 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 70 50 61 72  utine */..  pPar
30b10 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  se = pWInfo->pPa
30b20 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  rse;.  db = pPar
30b30 73 65 2d 3e 64 62 3b 0a 20 20 6e 4c 6f 6f 70 20  se->db;.  nLoop 
30b40 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  = pWInfo->nLevel
30b50 3b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 46  ;.  /* TUNING: F
30b60 6f 72 20 73 69 6d 70 6c 65 20 71 75 65 72 69 65  or simple querie
30b70 73 2c 20 6f 6e 6c 79 20 74 68 65 20 62 65 73 74  s, only the best
30b80 20 70 61 74 68 20 69 73 20 74 72 61 63 6b 65 64   path is tracked
30b90 2e 0a 20 20 2a 2a 20 46 6f 72 20 32 2d 77 61 79  ..  ** For 2-way
30ba0 20 6a 6f 69 6e 73 2c 20 74 68 65 20 35 20 62 65   joins, the 5 be
30bb0 73 74 20 70 61 74 68 73 20 61 72 65 20 66 6f 6c  st paths are fol
30bc0 6c 6f 77 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20  lowed..  ** For 
30bd0 6a 6f 69 6e 73 20 6f 66 20 33 20 6f 72 20 6d 6f  joins of 3 or mo
30be0 72 65 20 74 61 62 6c 65 73 2c 20 74 72 61 63 6b  re tables, track
30bf0 20 74 68 65 20 31 30 20 62 65 73 74 20 70 61 74   the 10 best pat
30c00 68 73 20 2a 2f 0a 20 20 6d 78 43 68 6f 69 63 65  hs */.  mxChoice
30c10 20 3d 20 28 6e 4c 6f 6f 70 3d 3d 31 29 20 3f 20   = (nLoop==1) ? 
30c20 31 20 3a 20 28 6e 4c 6f 6f 70 3d 3d 32 20 3f 20  1 : (nLoop==2 ? 
30c30 35 20 3a 20 31 30 29 3b 0a 20 20 61 73 73 65 72  5 : 10);.  asser
30c40 74 28 20 6e 4c 6f 6f 70 3c 3d 70 57 49 6e 66 6f  t( nLoop<=pWInfo
30c50 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ->pTabList->nSrc
30c60 20 29 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45   );.  WHERETRACE
30c70 28 30 78 30 30 32 2c 20 28 22 2d 2d 2d 2d 20 62  (0x002, ("---- b
30c80 65 67 69 6e 20 73 6f 6c 76 65 72 5c 6e 22 29 29  egin solver\n"))
30c90 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
30ca0 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
30cb0 73 70 61 63 65 20 66 6f 72 20 61 54 6f 20 61 6e  space for aTo an
30cc0 64 20 61 46 72 6f 6d 20 2a 2f 0a 20 20 69 69 20  d aFrom */.  ii 
30cd0 3d 20 28 73 69 7a 65 6f 66 28 57 68 65 72 65 50  = (sizeof(WhereP
30ce0 61 74 68 29 2b 73 69 7a 65 6f 66 28 57 68 65 72  ath)+sizeof(Wher
30cf0 65 4c 6f 6f 70 2a 29 2a 6e 4c 6f 6f 70 29 2a 6d  eLoop*)*nLoop)*m
30d00 78 43 68 6f 69 63 65 2a 32 3b 0a 20 20 70 53 70  xChoice*2;.  pSp
30d10 61 63 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ace = sqlite3DbM
30d20 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 69 69 29  allocRaw(db, ii)
30d30 3b 0a 20 20 69 66 28 20 70 53 70 61 63 65 3d 3d  ;.  if( pSpace==
30d40 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
30d50 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 61 54 6f 20 3d  E_NOMEM;.  aTo =
30d60 20 28 57 68 65 72 65 50 61 74 68 2a 29 70 53 70   (WherePath*)pSp
30d70 61 63 65 3b 0a 20 20 61 46 72 6f 6d 20 3d 20 61  ace;.  aFrom = a
30d80 54 6f 2b 6d 78 43 68 6f 69 63 65 3b 0a 20 20 6d  To+mxChoice;.  m
30d90 65 6d 73 65 74 28 61 46 72 6f 6d 2c 20 30 2c 20  emset(aFrom, 0, 
30da0 73 69 7a 65 6f 66 28 61 46 72 6f 6d 5b 30 5d 29  sizeof(aFrom[0])
30db0 29 3b 0a 20 20 70 58 20 3d 20 28 57 68 65 72 65  );.  pX = (Where
30dc0 4c 6f 6f 70 2a 2a 29 28 61 46 72 6f 6d 2b 6d 78  Loop**)(aFrom+mx
30dd0 43 68 6f 69 63 65 29 3b 0a 20 20 66 6f 72 28 69  Choice);.  for(i
30de0 69 3d 6d 78 43 68 6f 69 63 65 2a 32 2c 20 70 46  i=mxChoice*2, pF
30df0 72 6f 6d 3d 61 54 6f 3b 20 69 69 3e 30 3b 20 69  rom=aTo; ii>0; i
30e00 69 2d 2d 2c 20 70 46 72 6f 6d 2b 2b 2c 20 70 58  i--, pFrom++, pX
30e10 20 2b 3d 20 6e 4c 6f 6f 70 29 7b 0a 20 20 20 20   += nLoop){.    
30e20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 20 3d 20 70  pFrom->aLoop = p
30e30 58 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65  X;.  }..  /* See
30e40 64 20 74 68 65 20 73 65 61 72 63 68 20 77 69 74  d the search wit
30e50 68 20 61 20 73 69 6e 67 6c 65 20 57 68 65 72 65  h a single Where
30e60 50 61 74 68 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Path containing 
30e70 7a 65 72 6f 20 57 68 65 72 65 4c 6f 6f 70 73 2e  zero WhereLoops.
30e80 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 55 4e 49 4e  .  **.  ** TUNIN
30e90 47 3a 20 44 6f 20 6e 6f 74 20 6c 65 74 20 74 68  G: Do not let th
30ea0 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 74 65 72  e number of iter
30eb0 61 74 69 6f 6e 73 20 67 6f 20 61 62 6f 76 65 20  ations go above 
30ec0 32 35 2e 20 20 49 66 20 74 68 65 20 63 6f 73 74  25.  If the cost
30ed0 0a 20 20 2a 2a 20 6f 66 20 63 6f 6d 70 75 74 69  .  ** of computi
30ee0 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  ng an automatic 
30ef0 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 70 61 69  index is not pai
30f00 64 20 62 61 63 6b 20 77 69 74 68 69 6e 20 74 68  d back within th
30f10 65 20 66 69 72 73 74 20 32 35 0a 20 20 2a 2a 20  e first 25.  ** 
30f20 72 6f 77 73 2c 20 74 68 65 6e 20 64 6f 20 6e 6f  rows, then do no
30f30 74 20 75 73 65 20 74 68 65 20 61 75 74 6f 6d 61  t use the automa
30f40 74 69 63 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20  tic index. */.  
30f50 61 46 72 6f 6d 5b 30 5d 2e 6e 52 6f 77 20 3d 20  aFrom[0].nRow = 
30f60 4d 49 4e 28 70 50 61 72 73 65 2d 3e 6e 51 75 65  MIN(pParse->nQue
30f70 72 79 4c 6f 6f 70 2c 20 34 36 29 3b 20 20 61 73  ryLoop, 46);  as
30f80 73 65 72 74 28 20 34 36 3d 3d 73 71 6c 69 74 65  sert( 46==sqlite
30f90 33 4c 6f 67 45 73 74 28 32 35 29 20 29 3b 0a 20  3LogEst(25) );. 
30fa0 20 6e 46 72 6f 6d 20 3d 20 31 3b 0a 0a 20 20 2f   nFrom = 1;..  /
30fb0 2a 20 50 72 65 63 6f 6d 70 75 74 65 20 74 68 65  * Precompute the
30fc0 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67   cost of sorting
30fd0 20 74 68 65 20 66 69 6e 61 6c 20 72 65 73 75 6c   the final resul
30fe0 74 20 73 65 74 2c 20 69 66 20 74 68 65 20 63 61  t set, if the ca
30ff0 6c 6c 65 72 0a 20 20 2a 2a 20 74 6f 20 73 71 6c  ller.  ** to sql
31000 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
31010 20 77 61 73 20 63 6f 6e 63 65 72 6e 65 64 20 61   was concerned a
31020 62 6f 75 74 20 73 6f 72 74 69 6e 67 20 2a 2f 0a  bout sorting */.
31030 20 20 72 53 6f 72 74 43 6f 73 74 20 3d 20 30 3b    rSortCost = 0;
31040 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70  .  if( pWInfo->p
31050 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 6e 52  OrderBy==0 || nR
31060 6f 77 45 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  owEst==0 ){.    
31070 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72  aFrom[0].isOrder
31080 65 64 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 7d  edValid = 1;.  }
31090 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 55 4e  else{.    /* TUN
310a0 49 4e 47 3a 20 45 73 74 69 6d 61 74 65 64 20 63  ING: Estimated c
310b0 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 69  ost of sorting i
310c0 73 20 34 38 2a 4e 2a 6c 6f 67 32 28 4e 29 20 77  s 48*N*log2(N) w
310d0 68 65 72 65 20 4e 20 69 73 20 74 68 65 0a 20 20  here N is the.  
310e0 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 6f    ** number of o
310f0 75 74 70 75 74 20 72 6f 77 73 2e 20 54 68 65 20  utput rows. The 
31100 34 38 20 69 73 20 74 68 65 20 65 78 70 65 63 74  48 is the expect
31110 65 64 20 73 69 7a 65 20 6f 66 20 61 20 72 6f 77  ed size of a row
31120 20 74 6f 20 73 6f 72 74 2e 20 0a 20 20 20 20 2a   to sort. .    *
31130 2a 20 46 49 58 4d 45 3a 20 20 63 6f 6d 70 75 74  * FIXME:  comput
31140 65 20 61 20 62 65 74 74 65 72 20 65 73 74 69 6d  e a better estim
31150 61 74 65 20 6f 66 20 74 68 65 20 34 38 20 6d 75  ate of the 48 mu
31160 6c 74 69 70 6c 69 65 72 20 62 61 73 65 64 20 6f  ltiplier based o
31170 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 73  n the.    ** res
31180 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73 69  ult set expressi
31190 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 72 53 6f 72  ons. */.    rSor
311a0 74 43 6f 73 74 20 3d 20 6e 52 6f 77 45 73 74 20  tCost = nRowEst 
311b0 2b 20 65 73 74 4c 6f 67 28 6e 52 6f 77 45 73 74  + estLog(nRowEst
311c0 29 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43  );.    WHERETRAC
311d0 45 28 30 78 30 30 32 2c 28 22 2d 2d 2d 2d 20 73  E(0x002,("---- s
311e0 6f 72 74 20 63 6f 73 74 3d 25 2d 33 64 5c 6e 22  ort cost=%-3d\n"
311f0 2c 20 72 53 6f 72 74 43 6f 73 74 29 29 3b 0a 20  , rSortCost));. 
31200 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65   }..  /* Compute
31210 20 73 75 63 63 65 73 73 69 76 65 6c 79 20 6c 6f   successively lo
31220 6e 67 65 72 20 57 68 65 72 65 50 61 74 68 73 20  nger WherePaths 
31230 75 73 69 6e 67 20 74 68 65 20 70 72 65 76 69 6f  using the previo
31240 75 73 20 67 65 6e 65 72 61 74 69 6f 6e 0a 20 20  us generation.  
31250 2a 2a 20 6f 66 20 57 68 65 72 65 50 61 74 68 73  ** of WherePaths
31260 20 61 73 20 74 68 65 20 62 61 73 69 73 20 66 6f   as the basis fo
31270 72 20 74 68 65 20 6e 65 78 74 2e 20 20 4b 65 65  r the next.  Kee
31280 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6d  p track of the m
31290 78 43 68 6f 69 63 65 0a 20 20 2a 2a 20 62 65 73  xChoice.  ** bes
312a0 74 20 70 61 74 68 73 20 61 74 20 65 61 63 68 20  t paths at each 
312b0 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20  generation */.  
312c0 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f  for(iLoop=0; iLo
312d0 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b  op<nLoop; iLoop+
312e0 2b 29 7b 0a 20 20 20 20 6e 54 6f 20 3d 20 30 3b  +){.    nTo = 0;
312f0 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70  .    for(ii=0, p
31300 46 72 6f 6d 3d 61 46 72 6f 6d 3b 20 69 69 3c 6e  From=aFrom; ii<n
31310 46 72 6f 6d 3b 20 69 69 2b 2b 2c 20 70 46 72 6f  From; ii++, pFro
31320 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  m++){.      for(
31330 70 57 4c 6f 6f 70 3d 70 57 49 6e 66 6f 2d 3e 70  pWLoop=pWInfo->p
31340 4c 6f 6f 70 73 3b 20 70 57 4c 6f 6f 70 3b 20 70  Loops; pWLoop; p
31350 57 4c 6f 6f 70 3d 70 57 4c 6f 6f 70 2d 3e 70 4e  WLoop=pWLoop->pN
31360 65 78 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 20 20  extLoop){.      
31370 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 4e 65    Bitmask maskNe
31380 77 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61  w;.        Bitma
31390 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20 30 3b 0a  sk revMask = 0;.
313a0 20 20 20 20 20 20 20 20 75 38 20 69 73 4f 72 64          u8 isOrd
313b0 65 72 65 64 56 61 6c 69 64 20 3d 20 70 46 72 6f  eredValid = pFro
313c0 6d 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69  m->isOrderedVali
313d0 64 3b 0a 20 20 20 20 20 20 20 20 75 38 20 69 73  d;.        u8 is
313e0 4f 72 64 65 72 65 64 20 3d 20 70 46 72 6f 6d 2d  Ordered = pFrom-
313f0 3e 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20  >isOrdered;.    
31400 20 20 20 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d      if( (pWLoop-
31410 3e 70 72 65 72 65 71 20 26 20 7e 70 46 72 6f 6d  >prereq & ~pFrom
31420 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29  ->maskLoop)!=0 )
31430 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
31440 20 20 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e     if( (pWLoop->
31450 6d 61 73 6b 53 65 6c 66 20 26 20 70 46 72 6f 6d  maskSelf & pFrom
31460 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29  ->maskLoop)!=0 )
31470 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
31480 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
31490 69 6e 74 2c 20 70 57 4c 6f 6f 70 20 69 73 20 61  int, pWLoop is a
314a0 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 62 65   candidate to be
314b0 20 74 68 65 20 6e 65 78 74 20 6c 6f 6f 70 2e 20   the next loop. 
314c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6d 70  .        ** Comp
314d0 75 74 65 20 69 74 73 20 63 6f 73 74 20 2a 2f 0a  ute its cost */.
314e0 20 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20          rCost = 
314f0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
31500 28 70 57 4c 6f 6f 70 2d 3e 72 53 65 74 75 70 2c  (pWLoop->rSetup,
31510 70 57 4c 6f 6f 70 2d 3e 72 52 75 6e 20 2b 20 70  pWLoop->rRun + p
31520 46 72 6f 6d 2d 3e 6e 52 6f 77 29 3b 0a 20 20 20  From->nRow);.   
31530 20 20 20 20 20 72 43 6f 73 74 20 3d 20 73 71 6c       rCost = sql
31540 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72 43  ite3LogEstAdd(rC
31550 6f 73 74 2c 20 70 46 72 6f 6d 2d 3e 72 43 6f 73  ost, pFrom->rCos
31560 74 29 3b 0a 20 20 20 20 20 20 20 20 6e 4f 75 74  t);.        nOut
31570 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 20 2b   = pFrom->nRow +
31580 20 70 57 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20   pWLoop->nOut;. 
31590 20 20 20 20 20 20 20 6d 61 73 6b 4e 65 77 20 3d         maskNew =
315a0 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70   pFrom->maskLoop
315b0 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53   | pWLoop->maskS
315c0 65 6c 66 3b 0a 20 20 20 20 20 20 20 20 69 66 28  elf;.        if(
315d0 20 21 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64   !isOrderedValid
315e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 77   ){.          sw
315f0 69 74 63 68 28 20 77 68 65 72 65 50 61 74 68 53  itch( wherePathS
31600 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28  atisfiesOrderBy(
31610 70 57 49 6e 66 6f 2c 0a 20 20 20 20 20 20 20 20  pWInfo,.        
31620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
31630 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2c  WInfo->pOrderBy,
31640 20 70 46 72 6f 6d 2c 20 70 57 49 6e 66 6f 2d 3e   pFrom, pWInfo->
31650 77 63 74 72 6c 46 6c 61 67 73 2c 0a 20 20 20 20  wctrlFlags,.    
31660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31670 20 20 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70     iLoop, pWLoop
31680 2c 20 26 72 65 76 4d 61 73 6b 29 20 29 7b 0a 20  , &revMask) ){. 
31690 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20             case 
316a0 31 3a 20 20 2f 2a 20 59 65 73 2e 20 20 70 46 72  1:  /* Yes.  pFr
316b0 6f 6d 2b 70 57 4c 6f 6f 70 20 64 6f 65 73 20 73  om+pWLoop does s
316c0 61 74 69 73 66 79 20 74 68 65 20 4f 52 44 45 52  atisfy the ORDER
316d0 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
316e0 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
316f0 64 65 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  dered = 1;.     
31700 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
31710 65 64 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20  edValid = 1;.   
31720 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
31730 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61  ;.            ca
31740 73 65 20 30 3a 20 20 2f 2a 20 4e 6f 2e 20 20 70  se 0:  /* No.  p
31750 46 72 6f 6d 2b 70 57 4c 6f 6f 70 20 77 69 6c 6c  From+pWLoop will
31760 20 72 65 71 75 69 72 65 20 61 20 73 65 70 61 72   require a separ
31770 61 74 65 20 73 6f 72 74 20 2a 2f 0a 20 20 20 20  ate sort */.    
31780 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
31790 72 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  red = 0;.       
317a0 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64         isOrdered
317b0 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 20  Valid = 1;.     
317c0 20 20 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d           rCost =
317d0 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
317e0 64 28 72 43 6f 73 74 2c 20 72 53 6f 72 74 43 6f  d(rCost, rSortCo
317f0 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  st);.           
31800 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
31810 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 2f        default: /
31820 2a 20 43 61 6e 6e 6f 74 20 74 65 6c 6c 20 79 65  * Cannot tell ye
31830 74 2e 20 20 54 72 79 20 61 67 61 69 6e 20 6f 6e  t.  Try again on
31840 20 74 68 65 20 6e 65 78 74 20 69 74 65 72 61 74   the next iterat
31850 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ion */.         
31860 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
31870 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31880 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
31890 20 72 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d   revMask = pFrom
318a0 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 20  ->revLoop;.     
318b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20     }.        /* 
318c0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
318d0 70 57 4c 6f 6f 70 20 73 68 6f 75 6c 64 20 62 65  pWLoop should be
318e0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6d 78   added to the mx
318f0 43 68 6f 69 63 65 20 62 65 73 74 20 73 6f 20 66  Choice best so f
31900 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f  ar */.        fo
31910 72 28 6a 6a 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b  r(jj=0, pTo=aTo;
31920 20 6a 6a 3c 6e 54 6f 3b 20 6a 6a 2b 2b 2c 20 70   jj<nTo; jj++, p
31930 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  To++){.         
31940 20 69 66 28 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f   if( pTo->maskLo
31950 6f 70 3d 3d 6d 61 73 6b 4e 65 77 0a 20 20 20 20  op==maskNew.    
31960 20 20 20 20 20 20 20 26 26 20 70 54 6f 2d 3e 69         && pTo->i
31970 73 4f 72 64 65 72 65 64 56 61 6c 69 64 3d 3d 69  sOrderedValid==i
31980 73 4f 72 64 65 72 65 64 56 61 6c 69 64 0a 20 20  sOrderedValid.  
31990 20 20 20 20 20 20 20 20 20 26 26 20 28 28 70 54           && ((pT
319a0 6f 2d 3e 72 43 6f 73 74 3c 3d 72 43 6f 73 74 20  o->rCost<=rCost 
319b0 26 26 20 70 54 6f 2d 3e 6e 52 6f 77 3c 3d 6e 4f  && pTo->nRow<=nO
319c0 75 74 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ut) ||.         
319d0 20 20 20 20 20 20 20 28 70 54 6f 2d 3e 72 43 6f         (pTo->rCo
319e0 73 74 3e 3d 72 43 6f 73 74 20 26 26 20 70 54 6f  st>=rCost && pTo
319f0 2d 3e 6e 52 6f 77 3e 3d 6e 4f 75 74 29 29 0a 20  ->nRow>=nOut)). 
31a00 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
31a10 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
31a20 28 20 6a 6a 3d 3d 6e 54 6f 2d 31 20 29 3b 0a 20  ( jj==nTo-1 );. 
31a30 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
31a40 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
31a50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31a60 69 66 28 20 6a 6a 3e 3d 6e 54 6f 20 29 7b 0a 20  if( jj>=nTo ){. 
31a70 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f           if( nTo
31a80 3e 3d 6d 78 43 68 6f 69 63 65 20 26 26 20 72 43  >=mxChoice && rC
31a90 6f 73 74 3e 3d 6d 78 43 6f 73 74 20 29 7b 0a 23  ost>=mxCost ){.#
31aa0 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
31ab0 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20  _ENABLED /* 0x4 
31ac0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
31ad0 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
31ae0 72 61 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20  race&0x4 ){.    
31af0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
31b00 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 53 6b  3DebugPrintf("Sk
31b10 69 70 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33  ip   %s cost=%-3
31b20 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e  d,%3d order=%c\n
31b30 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
31b40 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61       wherePathNa
31b50 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c  me(pFrom, iLoop,
31b60 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c   pWLoop), rCost,
31b70 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20   nOut,.         
31b80 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
31b90 65 64 56 61 6c 69 64 20 3f 20 28 69 73 4f 72 64  edValid ? (isOrd
31ba0 65 72 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27  ered ? 'Y' : 'N'
31bb0 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ) : '?');.      
31bc0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
31bd0 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
31be0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nue;.          }
31bf0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  .          /* Ad
31c00 64 20 61 20 6e 65 77 20 50 61 74 68 20 74 6f 20  d a new Path to 
31c10 74 68 65 20 61 54 6f 5b 5d 20 73 65 74 20 2a 2f  the aTo[] set */
31c20 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
31c30 54 6f 3c 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20  To<mxChoice ){. 
31c40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
31c50 63 72 65 61 73 65 20 74 68 65 20 73 69 7a 65 20  crease the size 
31c60 6f 66 20 74 68 65 20 61 54 6f 20 73 65 74 20 62  of the aTo set b
31c70 79 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20 20  y one */.       
31c80 20 20 20 20 20 6a 6a 20 3d 20 6e 54 6f 2b 2b 3b       jj = nTo++;
31c90 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
31ca0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
31cb0 20 4e 65 77 20 70 61 74 68 20 72 65 70 6c 61 63   New path replac
31cc0 65 73 20 74 68 65 20 70 72 69 6f 72 20 77 6f 72  es the prior wor
31cd0 73 74 20 74 6f 20 6b 65 65 70 20 63 6f 75 6e 74  st to keep count
31ce0 20 62 65 6c 6f 77 20 6d 78 43 68 6f 69 63 65 20   below mxChoice 
31cf0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a  */.            j
31d00 6a 20 3d 20 6d 78 49 3b 0a 20 20 20 20 20 20 20  j = mxI;.       
31d10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
31d20 54 6f 20 3d 20 26 61 54 6f 5b 6a 6a 5d 3b 0a 23  To = &aTo[jj];.#
31d30 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
31d40 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20  _ENABLED /* 0x4 
31d50 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
31d60 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
31d70 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20  ce&0x4 ){.      
31d80 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
31d90 75 67 50 72 69 6e 74 66 28 22 4e 65 77 20 20 20  ugPrintf("New   
31da0 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33   %s cost=%-3d,%3
31db0 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20  d order=%c\n",. 
31dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
31dd0 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72  herePathName(pFr
31de0 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f  om, iLoop, pWLoo
31df0 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c  p), rCost, nOut,
31e00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
31e10 20 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20   isOrderedValid 
31e20 3f 20 28 69 73 4f 72 64 65 72 65 64 20 3f 20 27  ? (isOrdered ? '
31e30 59 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29  Y' : 'N') : '?')
31e40 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65  ;.          }.#e
31e50 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d 65 6c  ndif.        }el
31e60 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  se{.          if
31e70 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3c 3d 72 43  ( pTo->rCost<=rC
31e80 6f 73 74 20 26 26 20 70 54 6f 2d 3e 6e 52 6f 77  ost && pTo->nRow
31e90 3c 3d 6e 4f 75 74 20 29 7b 0a 23 69 66 64 65 66  <=nOut ){.#ifdef
31ea0 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
31eb0 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20  LED /* 0x4 */.  
31ec0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
31ed0 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26  lite3WhereTrace&
31ee0 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  0x4 ){.         
31ef0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
31f00 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  gPrintf(.       
31f10 20 20 20 20 20 20 20 20 20 20 20 22 53 6b 69 70             "Skip
31f20 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c     %s cost=%-3d,
31f30 25 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20  %3d order=%c",. 
31f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31f50 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70   wherePathName(p
31f60 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c  From, iLoop, pWL
31f70 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75  oop), rCost, nOu
31f80 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
31f90 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 56 61       isOrderedVa
31fa0 6c 69 64 20 3f 20 28 69 73 4f 72 64 65 72 65 64  lid ? (isOrdered
31fb0 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a 20   ? 'Y' : 'N') : 
31fc0 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  '?');.          
31fd0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
31fe0 50 72 69 6e 74 66 28 22 20 20 20 76 73 20 25 73  Printf("   vs %s
31ff0 20 63 6f 73 74 3d 25 2d 33 64 2c 25 64 20 6f 72   cost=%-3d,%d or
32000 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20  der=%c\n",.     
32010 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
32020 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20  rePathName(pTo, 
32030 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f  iLoop+1, 0), pTo
32040 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52  ->rCost, pTo->nR
32050 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ow,.            
32060 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64        pTo->isOrd
32070 65 72 65 64 56 61 6c 69 64 20 3f 20 28 70 54 6f  eredValid ? (pTo
32080 2d 3e 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59  ->isOrdered ? 'Y
32090 27 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b  ' : 'N') : '?');
320a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 23  .            }.#
320b0 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
320c0 20 20 74 65 73 74 63 61 73 65 28 20 70 54 6f 2d    testcase( pTo-
320d0 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 20 29 3b  >rCost==rCost );
320e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
320f0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
32100 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 65 73   }.          tes
32110 74 63 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73  tcase( pTo->rCos
32120 74 3d 3d 72 43 6f 73 74 2b 31 20 29 3b 0a 20 20  t==rCost+1 );.  
32130 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6e 65 77          /* A new
32140 20 61 6e 64 20 62 65 74 74 65 72 20 73 63 6f 72   and better scor
32150 65 20 66 6f 72 20 61 20 70 72 65 76 69 6f 75 73  e for a previous
32160 6c 79 20 63 72 65 61 74 65 64 20 65 71 75 69 76  ly created equiv
32170 61 6c 65 6e 74 20 70 61 74 68 20 2a 2f 0a 23 69  alent path */.#i
32180 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
32190 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a  ENABLED /* 0x4 *
321a0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
321b0 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
321c0 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20  e&0x4 ){.       
321d0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
321e0 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  gPrintf(.       
321f0 20 20 20 20 20 20 20 20 20 22 55 70 64 61 74 65           "Update
32200 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33   %s cost=%-3d,%3
32210 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20  d order=%c",.   
32220 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
32230 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d  rePathName(pFrom
32240 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29  , iLoop, pWLoop)
32250 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20  , rCost, nOut,. 
32260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
32270 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f 20  sOrderedValid ? 
32280 28 69 73 4f 72 64 65 72 65 64 20 3f 20 27 59 27  (isOrdered ? 'Y'
32290 20 3a 20 27 4e 27 29 20 3a 20 27 3f 27 29 3b 0a   : 'N') : '?');.
322a0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
322b0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
322c0 20 20 77 61 73 20 25 73 20 63 6f 73 74 3d 25 2d    was %s cost=%-
322d0 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c  3d,%3d order=%c\
322e0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
322f0 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
32300 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20  e(pTo, iLoop+1, 
32310 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20  0), pTo->rCost, 
32320 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20  pTo->nRow,.     
32330 20 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e             pTo->
32340 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64 20 3f  isOrderedValid ?
32350 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64   (pTo->isOrdered
32360 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20 3a 20   ? 'Y' : 'N') : 
32370 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  '?');.          
32380 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  }.#endif.       
32390 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 70 57   }.        /* pW
323a0 4c 6f 6f 70 20 69 73 20 61 20 77 69 6e 6e 65 72  Loop is a winner
323b0 2e 20 20 41 64 64 20 69 74 20 74 6f 20 74 68 65  .  Add it to the
323c0 20 73 65 74 20 6f 66 20 62 65 73 74 20 73 6f 20   set of best so 
323d0 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  far */.        p
323e0 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 3d 20 70  To->maskLoop = p
323f0 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c  From->maskLoop |
32400 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c   pWLoop->maskSel
32410 66 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  f;.        pTo->
32420 72 65 76 4c 6f 6f 70 20 3d 20 72 65 76 4d 61 73  revLoop = revMas
32430 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  k;.        pTo->
32440 6e 52 6f 77 20 3d 20 6e 4f 75 74 3b 0a 20 20 20  nRow = nOut;.   
32450 20 20 20 20 20 70 54 6f 2d 3e 72 43 6f 73 74 20       pTo->rCost 
32460 3d 20 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20  = rCost;.       
32470 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 56   pTo->isOrderedV
32480 61 6c 69 64 20 3d 20 69 73 4f 72 64 65 72 65 64  alid = isOrdered
32490 56 61 6c 69 64 3b 0a 20 20 20 20 20 20 20 20 70  Valid;.        p
324a0 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 20 3d 20  To->isOrdered = 
324b0 69 73 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20  isOrdered;.     
324c0 20 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61     memcpy(pTo->a
324d0 4c 6f 6f 70 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f  Loop, pFrom->aLo
324e0 6f 70 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65  op, sizeof(Where
324f0 4c 6f 6f 70 2a 29 2a 69 4c 6f 6f 70 29 3b 0a 20  Loop*)*iLoop);. 
32500 20 20 20 20 20 20 20 70 54 6f 2d 3e 61 4c 6f 6f         pTo->aLoo
32510 70 5b 69 4c 6f 6f 70 5d 20 3d 20 70 57 4c 6f 6f  p[iLoop] = pWLoo
32520 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  p;.        if( n
32530 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 20 29 7b 0a  To>=mxChoice ){.
32540 20 20 20 20 20 20 20 20 20 20 6d 78 49 20 3d 20            mxI = 
32550 30 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 78 43  0;.          mxC
32560 6f 73 74 20 3d 20 61 54 6f 5b 30 5d 2e 72 43 6f  ost = aTo[0].rCo
32570 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 78  st;.          mx
32580 4f 75 74 20 3d 20 61 54 6f 5b 30 5d 2e 6e 52 6f  Out = aTo[0].nRo
32590 77 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  w;.          for
325a0 28 6a 6a 3d 31 2c 20 70 54 6f 3d 26 61 54 6f 5b  (jj=1, pTo=&aTo[
325b0 31 5d 3b 20 6a 6a 3c 6d 78 43 68 6f 69 63 65 3b  1]; jj<mxChoice;
325c0 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20   jj++, pTo++){. 
325d0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
325e0 54 6f 2d 3e 72 43 6f 73 74 3e 6d 78 43 6f 73 74  To->rCost>mxCost
325f0 20 7c 7c 20 28 70 54 6f 2d 3e 72 43 6f 73 74 3d   || (pTo->rCost=
32600 3d 6d 78 43 6f 73 74 20 26 26 20 70 54 6f 2d 3e  =mxCost && pTo->
32610 6e 52 6f 77 3e 6d 78 4f 75 74 29 20 29 7b 0a 20  nRow>mxOut) ){. 
32620 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 78 43               mxC
32630 6f 73 74 20 3d 20 70 54 6f 2d 3e 72 43 6f 73 74  ost = pTo->rCost
32640 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
32650 6d 78 4f 75 74 20 3d 20 70 54 6f 2d 3e 6e 52 6f  mxOut = pTo->nRo
32660 77 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  w;.             
32670 20 6d 78 49 20 3d 20 6a 6a 3b 0a 20 20 20 20 20   mxI = jj;.     
32680 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
32690 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
326a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69       }.    }..#i
326b0 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
326c0 45 4e 41 42 4c 45 44 20 20 2f 2a 20 3e 3d 32 20  ENABLED  /* >=2 
326d0 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
326e0 65 33 57 68 65 72 65 54 72 61 63 65 3e 3d 32 20  e3WhereTrace>=2 
326f0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
32700 44 65 62 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d  DebugPrintf("---
32710 2d 20 61 66 74 65 72 20 72 6f 75 6e 64 20 25 64  - after round %d
32720 20 2d 2d 2d 2d 5c 6e 22 2c 20 69 4c 6f 6f 70 29   ----\n", iLoop)
32730 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30  ;.      for(ii=0
32740 2c 20 70 54 6f 3d 61 54 6f 3b 20 69 69 3c 6e 54  , pTo=aTo; ii<nT
32750 6f 3b 20 69 69 2b 2b 2c 20 70 54 6f 2b 2b 29 7b  o; ii++, pTo++){
32760 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
32770 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 25 73  DebugPrintf(" %s
32780 20 63 6f 73 74 3d 25 2d 33 64 20 6e 72 6f 77 3d   cost=%-3d nrow=
32790 25 2d 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a  %-3d order=%c",.
327a0 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
327b0 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c  PathName(pTo, iL
327c0 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e  oop+1, 0), pTo->
327d0 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77  rCost, pTo->nRow
327e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 6f  ,.           pTo
327f0 2d 3e 69 73 4f 72 64 65 72 65 64 56 61 6c 69 64  ->isOrderedValid
32800 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72   ? (pTo->isOrder
32810 65 64 20 3f 20 27 59 27 20 3a 20 27 4e 27 29 20  ed ? 'Y' : 'N') 
32820 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20  : '?');.        
32830 69 66 28 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72  if( pTo->isOrder
32840 65 64 56 61 6c 69 64 20 26 26 20 70 54 6f 2d 3e  edValid && pTo->
32850 69 73 4f 72 64 65 72 65 64 20 29 7b 0a 20 20 20  isOrdered ){.   
32860 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
32870 62 75 67 50 72 69 6e 74 66 28 22 20 72 65 76 3d  bugPrintf(" rev=
32880 30 78 25 6c 6c 78 5c 6e 22 2c 20 70 54 6f 2d 3e  0x%llx\n", pTo->
32890 72 65 76 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  revLoop);.      
328a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
328b0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
328c0 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20  rintf("\n");.   
328d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
328e0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
328f0 20 2f 2a 20 53 77 61 70 20 74 68 65 20 72 6f 6c   /* Swap the rol
32900 65 73 20 6f 66 20 61 46 72 6f 6d 20 61 6e 64 20  es of aFrom and 
32910 61 54 6f 20 66 6f 72 20 74 68 65 20 6e 65 78 74  aTo for the next
32920 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20   generation */. 
32930 20 20 20 70 46 72 6f 6d 20 3d 20 61 54 6f 3b 0a     pFrom = aTo;.
32940 20 20 20 20 61 54 6f 20 3d 20 61 46 72 6f 6d 3b      aTo = aFrom;
32950 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20 70 46 72  .    aFrom = pFr
32960 6f 6d 3b 0a 20 20 20 20 6e 46 72 6f 6d 20 3d 20  om;.    nFrom = 
32970 6e 54 6f 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  nTo;.  }..  if( 
32980 6e 46 72 6f 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  nFrom==0 ){.    
32990 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
329a0 70 50 61 72 73 65 2c 20 22 6e 6f 20 71 75 65 72  pParse, "no quer
329b0 79 20 73 6f 6c 75 74 69 6f 6e 22 29 3b 0a 20 20  y solution");.  
329c0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
329d0 64 62 2c 20 70 53 70 61 63 65 29 3b 0a 20 20 20  db, pSpace);.   
329e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
329f0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  RROR;.  }.  .  /
32a00 2a 20 46 69 6e 64 20 74 68 65 20 6c 6f 77 65 73  * Find the lowes
32a10 74 20 63 6f 73 74 20 70 61 74 68 2e 20 20 70 46  t cost path.  pF
32a20 72 6f 6d 20 77 69 6c 6c 20 62 65 20 6c 65 66 74  rom will be left
32a30 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 61   pointing to tha
32a40 74 20 70 61 74 68 20 2a 2f 0a 20 20 70 46 72 6f  t path */.  pFro
32a50 6d 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 66 6f 72  m = aFrom;.  for
32a60 28 69 69 3d 31 3b 20 69 69 3c 6e 46 72 6f 6d 3b  (ii=1; ii<nFrom;
32a70 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20   ii++){.    if( 
32a80 70 46 72 6f 6d 2d 3e 72 43 6f 73 74 3e 61 46 72  pFrom->rCost>aFr
32a90 6f 6d 5b 69 69 5d 2e 72 43 6f 73 74 20 29 20 70  om[ii].rCost ) p
32aa0 46 72 6f 6d 20 3d 20 26 61 46 72 6f 6d 5b 69 69  From = &aFrom[ii
32ab0 5d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  ];.  }.  assert(
32ac0 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d   pWInfo->nLevel=
32ad0 3d 6e 4c 6f 6f 70 20 29 3b 0a 20 20 2f 2a 20 4c  =nLoop );.  /* L
32ae0 6f 61 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63  oad the lowest c
32af0 6f 73 74 20 70 61 74 68 20 69 6e 74 6f 20 70 57  ost path into pW
32b00 49 6e 66 6f 20 2a 2f 0a 20 20 66 6f 72 28 69 4c  Info */.  for(iL
32b10 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f  oop=0; iLoop<nLo
32b20 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20  op; iLoop++){.  
32b30 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
32b40 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61  evel = pWInfo->a
32b50 20 2b 20 69 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c   + iLoop;.    pL
32b60 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20 3d 20 70  evel->pWLoop = p
32b70 57 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 61  WLoop = pFrom->a
32b80 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20  Loop[iLoop];.   
32b90 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d   pLevel->iFrom =
32ba0 20 70 57 4c 6f 6f 70 2d 3e 69 54 61 62 3b 0a 20   pWLoop->iTab;. 
32bb0 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43     pLevel->iTabC
32bc0 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  ur = pWInfo->pTa
32bd0 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
32be0 3e 69 46 72 6f 6d 5d 2e 69 43 75 72 73 6f 72 3b  >iFrom].iCursor;
32bf0 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 57 49 6e  .  }.  if( (pWIn
32c00 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
32c10 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54   WHERE_WANT_DIST
32c20 49 4e 43 54 29 21 3d 30 0a 20 20 20 26 26 20 28  INCT)!=0.   && (
32c30 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
32c40 67 73 20 26 20 57 48 45 52 45 5f 44 49 53 54 49  gs & WHERE_DISTI
32c50 4e 43 54 42 59 29 3d 3d 30 0a 20 20 20 26 26 20  NCTBY)==0.   && 
32c60 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
32c70 74 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43  t==WHERE_DISTINC
32c80 54 5f 4e 4f 4f 50 0a 20 20 20 26 26 20 6e 52 6f  T_NOOP.   && nRo
32c90 77 45 73 74 0a 20 20 29 7b 0a 20 20 20 20 42 69  wEst.  ){.    Bi
32ca0 74 6d 61 73 6b 20 6e 6f 74 55 73 65 64 3b 0a 20  tmask notUsed;. 
32cb0 20 20 20 69 6e 74 20 72 63 20 3d 20 77 68 65 72     int rc = wher
32cc0 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72  ePathSatisfiesOr
32cd0 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 20 70 57  derBy(pWInfo, pW
32ce0 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74  Info->pResultSet
32cf0 2c 20 70 46 72 6f 6d 2c 0a 20 20 20 20 20 20 20  , pFrom,.       
32d00 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f            WHERE_
32d10 44 49 53 54 49 4e 43 54 42 59 2c 20 6e 4c 6f 6f  DISTINCTBY, nLoo
32d20 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f  p-1, pFrom->aLoo
32d30 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6e 6f 74  p[nLoop-1], &not
32d40 55 73 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72  Used);.    if( r
32d50 63 3d 3d 31 20 29 20 70 57 49 6e 66 6f 2d 3e 65  c==1 ) pWInfo->e
32d60 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45  Distinct = WHERE
32d70 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45  _DISTINCT_ORDERE
32d80 44 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 72  D;.  }.  if( pFr
32d90 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 20 29 7b  om->isOrdered ){
32da0 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  .    if( pWInfo-
32db0 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
32dc0 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 29  ERE_DISTINCTBY )
32dd0 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  {.      pWInfo->
32de0 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52  eDistinct = WHER
32df0 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52  E_DISTINCT_ORDER
32e00 45 44 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ED;.    }else{. 
32e10 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 62 4f 42       pWInfo->bOB
32e20 53 61 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  Sat = 1;.      p
32e30 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d  WInfo->revMask =
32e40 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b   pFrom->revLoop;
32e50 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 57 49  .    }.  }.  pWI
32e60 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 70  nfo->nRowOut = p
32e70 46 72 6f 6d 2d 3e 6e 52 6f 77 3b 0a 0a 20 20 2f  From->nRow;..  /
32e80 2a 20 46 72 65 65 20 74 65 6d 70 6f 72 61 72 79  * Free temporary
32e90 20 6d 65 6d 6f 72 79 20 61 6e 64 20 72 65 74 75   memory and retu
32ea0 72 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 20 20  rn success */.  
32eb0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
32ec0 2c 20 70 53 70 61 63 65 29 3b 0a 20 20 72 65 74  , pSpace);.  ret
32ed0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
32ee0 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 73 74 20 71 75 65  ../*.** Most que
32ef0 72 69 65 73 20 75 73 65 20 6f 6e 6c 79 20 61 20  ries use only a 
32f00 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 28 74 68  single table (th
32f10 65 79 20 61 72 65 20 6e 6f 74 20 6a 6f 69 6e 73  ey are not joins
32f20 29 20 61 6e 64 20 68 61 76 65 0a 2a 2a 20 73 69  ) and have.** si
32f30 6d 70 6c 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69  mple == constrai
32f40 6e 74 73 20 61 67 61 69 6e 73 74 20 69 6e 64 65  nts against inde
32f50 78 65 64 20 66 69 65 6c 64 73 2e 20 20 54 68 69  xed fields.  Thi
32f60 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70  s routine attemp
32f70 74 73 0a 2a 2a 20 74 6f 20 70 6c 61 6e 20 74 68  ts.** to plan th
32f80 6f 73 65 20 73 69 6d 70 6c 65 20 63 61 73 65 73  ose simple cases
32f90 20 75 73 69 6e 67 20 6d 75 63 68 20 6c 65 73 73   using much less
32fa0 20 63 65 72 65 6d 6f 6e 79 20 74 68 61 6e 20 74   ceremony than t
32fb0 68 65 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75  he.** general-pu
32fc0 72 70 6f 73 65 20 71 75 65 72 79 20 70 6c 61 6e  rpose query plan
32fd0 6e 65 72 2c 20 61 6e 64 20 74 68 65 72 65 62 79  ner, and thereby
32fe0 20 79 69 65 6c 64 20 66 61 73 74 65 72 20 73 71   yield faster sq
32ff0 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 29 0a  lite3_prepare().
33000 2a 2a 20 74 69 6d 65 73 20 66 6f 72 20 74 68 65  ** times for the
33010 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 2a 2a   common case..**
33020 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  .** Return non-z
33030 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  ero on success, 
33040 69 66 20 74 68 69 73 20 71 75 65 72 79 20 63 61  if this query ca
33050 6e 20 62 65 20 68 61 6e 64 6c 65 64 20 62 79 20  n be handled by 
33060 74 68 69 73 0a 2a 2a 20 6e 6f 2d 66 72 69 6c 6c  this.** no-frill
33070 73 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e  s query planner.
33080 20 20 52 65 74 75 72 6e 20 7a 65 72 6f 20 69 66    Return zero if
33090 20 74 68 69 73 20 71 75 65 72 79 20 6e 65 65 64   this query need
330a0 73 20 74 68 65 20 0a 2a 2a 20 67 65 6e 65 72 61  s the .** genera
330b0 6c 2d 70 75 72 70 6f 73 65 20 71 75 65 72 79 20  l-purpose query 
330c0 70 6c 61 6e 6e 65 72 2e 0a 2a 2f 0a 73 74 61 74  planner..*/.stat
330d0 69 63 20 69 6e 74 20 77 68 65 72 65 53 68 6f 72  ic int whereShor
330e0 74 43 75 74 28 57 68 65 72 65 4c 6f 6f 70 42 75  tCut(WhereLoopBu
330f0 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 29  ilder *pBuilder)
33100 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  {.  WhereInfo *p
33110 57 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20  WInfo;.  struct 
33120 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
33130 74 65 6d 3b 0a 20 20 57 68 65 72 65 43 6c 61 75  tem;.  WhereClau
33140 73 65 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65  se *pWC;.  Where
33150 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 57  Term *pTerm;.  W
33160 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b  hereLoop *pLoop;
33170 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 69  .  int iCur;.  i
33180 6e 74 20 6a 3b 0a 20 20 54 61 62 6c 65 20 2a 70  nt j;.  Table *p
33190 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49  Tab;.  Index *pI
331a0 64 78 3b 0a 20 20 0a 20 20 70 57 49 6e 66 6f 20  dx;.  .  pWInfo 
331b0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
331c0 66 6f 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f  fo;.  if( pWInfo
331d0 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
331e0 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45  HERE_FORCE_TABLE
331f0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61   ) return 0;.  a
33200 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 70  ssert( pWInfo->p
33210 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 31  TabList->nSrc>=1
33220 20 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 57   );.  pItem = pW
33230 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
33240 61 3b 0a 20 20 70 54 61 62 20 3d 20 70 49 74 65  a;.  pTab = pIte
33250 6d 2d 3e 70 54 61 62 3b 0a 20 20 69 66 28 20 49  m->pTab;.  if( I
33260 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
33270 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
33280 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 20 29   pItem->zIndex )
33290 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 43 75   return 0;.  iCu
332a0 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  r = pItem->iCurs
332b0 6f 72 3b 0a 20 20 70 57 43 20 3d 20 26 70 57 49  or;.  pWC = &pWI
332c0 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 70 4c 6f 6f  nfo->sWC;.  pLoo
332d0 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  p = pBuilder->pN
332e0 65 77 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46  ew;.  pLoop->wsF
332f0 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70 54 65 72  lags = 0;.  pTer
33300 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43  m = findTerm(pWC
33310 2c 20 69 43 75 72 2c 20 2d 31 2c 20 30 2c 20 57  , iCur, -1, 0, W
33320 4f 5f 45 51 2c 20 30 29 3b 0a 20 20 69 66 28 20  O_EQ, 0);.  if( 
33330 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 70 4c 6f  pTerm ){.    pLo
33340 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  op->wsFlags = WH
33350 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48  ERE_COLUMN_EQ|WH
33360 45 52 45 5f 49 50 4b 7c 57 48 45 52 45 5f 4f 4e  ERE_IPK|WHERE_ON
33370 45 52 4f 57 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d  EROW;.    pLoop-
33380 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65  >aLTerm[0] = pTe
33390 72 6d 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e  rm;.    pLoop->n
333a0 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 70  LTerm = 1;.    p
333b0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
333c0 71 20 3d 20 31 3b 0a 20 20 20 20 2f 2a 20 54 55  q = 1;.    /* TU
333d0 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20  NING: Cost of a 
333e0 72 6f 77 69 64 20 6c 6f 6f 6b 75 70 20 69 73 20  rowid lookup is 
333f0 31 30 20 2a 2f 0a 20 20 20 20 70 4c 6f 6f 70 2d  10 */.    pLoop-
33400 3e 72 52 75 6e 20 3d 20 33 33 3b 20 20 2f 2a 20  >rRun = 33;  /* 
33410 33 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  33==sqlite3LogEs
33420 74 28 31 30 29 20 2a 2f 0a 20 20 7d 65 6c 73 65  t(10) */.  }else
33430 7b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  {.    for(pIdx=p
33440 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
33450 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
33460 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ext){.      asse
33470 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  rt( pLoop->aLTer
33480 6d 53 70 61 63 65 3d 3d 70 4c 6f 6f 70 2d 3e 61  mSpace==pLoop->a
33490 4c 54 65 72 6d 20 29 3b 0a 20 20 20 20 20 20 61  LTerm );.      a
334a0 73 73 65 72 74 28 20 41 72 72 61 79 53 69 7a 65  ssert( ArraySize
334b0 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70  (pLoop->aLTermSp
334c0 61 63 65 29 3d 3d 34 20 29 3b 0a 20 20 20 20 20  ace)==4 );.     
334d0 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72   if( pIdx->onErr
334e0 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 0a 20 20 20  or==OE_None .   
334f0 20 20 20 20 7c 7c 20 70 49 64 78 2d 3e 70 50 61      || pIdx->pPa
33500 72 74 49 64 78 57 68 65 72 65 21 3d 30 20 0a 20  rtIdxWhere!=0 . 
33510 20 20 20 20 20 20 7c 7c 20 70 49 64 78 2d 3e 6e        || pIdx->n
33520 43 6f 6c 75 6d 6e 3e 41 72 72 61 79 53 69 7a 65  Column>ArraySize
33530 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70  (pLoop->aLTermSp
33540 61 63 65 29 20 0a 20 20 20 20 20 20 29 20 63 6f  ace) .      ) co
33550 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f  ntinue;.      fo
33560 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e  r(j=0; j<pIdx->n
33570 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  Column; j++){.  
33580 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69        pTerm = fi
33590 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
335a0 2c 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  , pIdx->aiColumn
335b0 5b 6a 5d 2c 20 30 2c 20 57 4f 5f 45 51 2c 20 70  [j], 0, WO_EQ, p
335c0 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Idx);.        if
335d0 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 62 72 65  ( pTerm==0 ) bre
335e0 61 6b 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f  ak;.        pLoo
335f0 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 20 3d 20 70  p->aLTerm[j] = p
33600 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Term;.      }.  
33610 20 20 20 20 69 66 28 20 6a 21 3d 70 49 64 78 2d      if( j!=pIdx-
33620 3e 6e 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69  >nColumn ) conti
33630 6e 75 65 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70  nue;.      pLoop
33640 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
33650 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52  E_COLUMN_EQ|WHER
33660 45 5f 4f 4e 45 52 4f 57 7c 57 48 45 52 45 5f 49  E_ONEROW|WHERE_I
33670 4e 44 45 58 45 44 3b 0a 20 20 20 20 20 20 69 66  NDEXED;.      if
33680 28 20 28 70 49 74 65 6d 2d 3e 63 6f 6c 55 73 65  ( (pItem->colUse
33690 64 20 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e  d & ~columnsInIn
336a0 64 65 78 28 70 49 64 78 29 29 3d 3d 30 20 29 7b  dex(pIdx))==0 ){
336b0 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  .        pLoop->
336c0 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
336d0 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20  _IDX_ONLY;.     
336e0 20 7d 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e   }.      pLoop->
336f0 6e 4c 54 65 72 6d 20 3d 20 6a 3b 0a 20 20 20 20  nLTerm = j;.    
33700 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65    pLoop->u.btree
33710 2e 6e 45 71 20 3d 20 6a 3b 0a 20 20 20 20 20 20  .nEq = j;.      
33720 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
33730 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20  Index = pIdx;.  
33740 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43      /* TUNING: C
33750 6f 73 74 20 6f 66 20 61 20 75 6e 69 71 75 65 20  ost of a unique 
33760 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 69 73 20  index lookup is 
33770 31 35 20 2a 2f 0a 20 20 20 20 20 20 70 4c 6f 6f  15 */.      pLoo
33780 70 2d 3e 72 52 75 6e 20 3d 20 33 39 3b 20 20 2f  p->rRun = 39;  /
33790 2a 20 33 39 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  * 39==sqlite3Log
337a0 45 73 74 28 31 35 29 20 2a 2f 0a 20 20 20 20 20  Est(15) */.     
337b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
337c0 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77  }.  if( pLoop->w
337d0 73 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 70 4c  sFlags ){.    pL
337e0 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c 6f 67  oop->nOut = (Log
337f0 45 73 74 29 31 3b 0a 20 20 20 20 70 57 49 6e 66  Est)1;.    pWInf
33800 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 20 3d  o->a[0].pWLoop =
33810 20 70 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c 6f 6f   pLoop;.    pLoo
33820 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 67 65  p->maskSelf = ge
33830 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73  tMask(&pWInfo->s
33840 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a  MaskSet, iCur);.
33850 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d      pWInfo->a[0]
33860 2e 69 54 61 62 43 75 72 20 3d 20 69 43 75 72 3b  .iTabCur = iCur;
33870 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f  .    pWInfo->nRo
33880 77 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 69 66  wOut = 1;.    if
33890 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ( pWInfo->pOrder
338a0 42 79 20 29 20 70 57 49 6e 66 6f 2d 3e 62 4f 42  By ) pWInfo->bOB
338b0 53 61 74 20 3d 20 20 31 3b 0a 20 20 20 20 69 66  Sat =  1;.    if
338c0 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46  ( pWInfo->wctrlF
338d0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e  lags & WHERE_WAN
338e0 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20  T_DISTINCT ){.  
338f0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73      pWInfo->eDis
33900 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49  tinct = WHERE_DI
33910 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20  STINCT_UNIQUE;. 
33920 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
33930 54 45 5f 44 45 42 55 47 0a 20 20 20 20 70 4c 6f  TE_DEBUG.    pLo
33940 6f 70 2d 3e 63 49 64 20 3d 20 27 30 27 3b 0a 23  op->cId = '0';.#
33950 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e  endif.    return
33960 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
33970 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   0;.}../*.** Gen
33980 65 72 61 74 65 20 74 68 65 20 62 65 67 69 6e 6e  erate the beginn
33990 69 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  ing of the loop 
339a0 75 73 65 64 20 66 6f 72 20 57 48 45 52 45 20 63  used for WHERE c
339b0 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
339c0 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  ..** The return 
339d0 76 61 6c 75 65 20 69 73 20 61 20 70 6f 69 6e 74  value is a point
339e0 65 72 20 74 6f 20 61 6e 20 6f 70 61 71 75 65 20  er to an opaque 
339f0 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 63  structure that c
33a00 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72  ontains.** infor
33a10 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f  mation needed to
33a20 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c   terminate the l
33a30 6f 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74 68 65  oop.  Later, the
33a40 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
33a50 0a 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b  .** should invok
33a60 65 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  e sqlite3WhereEn
33a70 64 28 29 20 77 69 74 68 20 74 68 65 20 72 65 74  d() with the ret
33a80 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69  urn value of thi
33a90 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e  s function.** in
33aa0 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65   order to comple
33ab0 74 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  te the WHERE cla
33ac0 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  use processing..
33ad0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
33ae0 72 20 6f 63 63 75 72 73 2c 20 74 68 69 73 20 72  r occurs, this r
33af0 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e  outine returns N
33b00 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62  ULL..**.** The b
33b10 61 73 69 63 20 69 64 65 61 20 69 73 20 74 6f 20  asic idea is to 
33b20 64 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70  do a nested loop
33b30 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65  , one loop for e
33b40 61 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20  ach table in.** 
33b50 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
33b60 6f 66 20 61 20 73 65 6c 65 63 74 2e 20 20 28 49  of a select.  (I
33b70 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45  NSERT and UPDATE
33b80 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20   statements are 
33b90 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61  the.** same as a
33ba0 20 53 45 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c   SELECT with onl
33bb0 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  y a single table
33bc0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
33bd0 75 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78  use.)  For.** ex
33be0 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 53 51  ample, if the SQ
33bf0 4c 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  L is this:.**.**
33c00 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20         SELECT * 
33c10 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20  FROM t1, t2, t3 
33c20 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a  WHERE ...;.**.**
33c30 20 54 68 65 6e 20 74 68 65 20 63 6f 64 65 20 67   Then the code g
33c40 65 6e 65 72 61 74 65 64 20 69 73 20 63 6f 6e 63  enerated is conc
33c50 65 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68  eptually like th
33c60 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
33c70 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20  **      foreach 
33c80 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 20 20 20  row1 in t1 do   
33c90 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65      \    Code ge
33ca0 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20  nerated.**      
33cb0 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69    foreach row2 i
33cc0 6e 20 74 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d  n t2 do      |--
33cd0 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65   by sqlite3Where
33ce0 42 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20  Begin().**      
33cf0 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 33      foreach row3
33d00 20 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a   in t3 do   /.**
33d10 20 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a              ....
33d20 2a 2a 20 20 20 20 20 20 20 20 20 20 65 6e 64 20  **          end 
33d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33d40 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65      \    Code ge
33d50 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20  nerated.**      
33d60 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20    end           
33d70 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 2d 2d               |--
33d80 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65   by sqlite3Where
33d90 45 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e  End().**      en
33da0 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
33db0 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a            /.**.*
33dc0 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
33dd0 6c 6f 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74 20  loops might not 
33de0 62 65 20 6e 65 73 74 65 64 20 69 6e 20 74 68 65  be nested in the
33df0 20 6f 72 64 65 72 20 69 6e 20 77 68 69 63 68 20   order in which 
33e00 74 68 65 79 0a 2a 2a 20 61 70 70 65 61 72 20 69  they.** appear i
33e10 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
33e20 65 20 69 66 20 61 20 64 69 66 66 65 72 65 6e 74  e if a different
33e30 20 6f 72 64 65 72 20 69 73 20 62 65 74 74 65 72   order is better
33e40 20 61 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a   able to make.**
33e50 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73 2e   use of indices.
33e60 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74    Note also that
33e70 20 77 68 65 6e 20 74 68 65 20 49 4e 20 6f 70 65   when the IN ope
33e80 72 61 74 6f 72 20 61 70 70 65 61 72 73 20 69 6e  rator appears in
33e90 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c  .** the WHERE cl
33ea0 61 75 73 65 2c 20 69 74 20 6d 69 67 68 74 20 72  ause, it might r
33eb0 65 73 75 6c 74 20 69 6e 20 61 64 64 69 74 69 6f  esult in additio
33ec0 6e 61 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73  nal nested loops
33ed0 20 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67   for.** scanning
33ee0 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c   through all val
33ef0 75 65 73 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ues on the right
33f00 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68  -hand side of th
33f10 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  e IN..**.** Ther
33f20 65 20 61 72 65 20 42 74 72 65 65 20 63 75 72 73  e are Btree curs
33f30 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ors associated w
33f40 69 74 68 20 65 61 63 68 20 74 61 62 6c 65 2e 20  ith each table. 
33f50 20 74 31 20 75 73 65 73 20 63 75 72 73 6f 72 0a   t1 uses cursor.
33f60 2a 2a 20 6e 75 6d 62 65 72 20 70 54 61 62 4c 69  ** number pTabLi
33f70 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72  st->a[0].iCursor
33f80 2e 20 20 74 32 20 75 73 65 73 20 74 68 65 20 63  .  t2 uses the c
33f90 75 72 73 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e  ursor pTabList->
33fa0 61 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a  a[1].iCursor..**
33fb0 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20   And so forth.  
33fc0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e  This routine gen
33fd0 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20 6f  erates code to o
33fe0 70 65 6e 20 74 68 6f 73 65 20 56 44 42 45 20 63  pen those VDBE c
33ff0 75 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71  ursors.** and sq
34000 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20  lite3WhereEnd() 
34010 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
34020 64 65 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d  de to close them
34030 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65  ..**.** The code
34040 20 74 68 61 74 20 73 71 6c 69 74 65 33 57 68 65   that sqlite3Whe
34050 72 65 42 65 67 69 6e 28 29 20 67 65 6e 65 72 61  reBegin() genera
34060 74 65 73 20 6c 65 61 76 65 73 20 74 68 65 20 63  tes leaves the c
34070 75 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20  ursors named.** 
34080 69 6e 20 70 54 61 62 4c 69 73 74 20 70 6f 69 6e  in pTabList poin
34090 74 69 6e 67 20 61 74 20 74 68 65 69 72 20 61 70  ting at their ap
340a0 70 72 6f 70 72 69 61 74 65 20 65 6e 74 72 69 65  propriate entrie
340b0 73 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f  s.  The [...] co
340c0 64 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50  de.** can use OP
340d0 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52  _Column and OP_R
340e0 6f 77 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20  owid opcodes on 
340f0 74 68 65 73 65 20 63 75 72 73 6f 72 73 20 74 6f  these cursors to
34100 20 65 78 74 72 61 63 74 0a 2a 2a 20 64 61 74 61   extract.** data
34110 20 66 72 6f 6d 20 74 68 65 20 76 61 72 69 6f 75   from the variou
34120 73 20 74 61 62 6c 65 73 20 6f 66 20 74 68 65 20  s tables of the 
34130 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  loop..**.** If t
34140 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
34150 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 66 6f  is empty, the fo
34160 72 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74  reach loops must
34170 20 65 61 63 68 20 73 63 61 6e 20 74 68 65 69 72   each scan their
34180 0a 2a 2a 20 65 6e 74 69 72 65 20 74 61 62 6c 65  .** entire table
34190 73 2e 20 20 54 68 75 73 20 61 20 74 68 72 65 65  s.  Thus a three
341a0 2d 77 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20  -way join is an 
341b0 4f 28 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e  O(N^3) operation
341c0 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20 74 68 65  .  But if.** the
341d0 20 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e 64   tables have ind
341e0 69 63 65 73 20 61 6e 64 20 74 68 65 72 65 20 61  ices and there a
341f0 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  re terms in the 
34200 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
34210 74 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68  t.** refer to th
34220 6f 73 65 20 69 6e 64 69 63 65 73 2c 20 61 20 63  ose indices, a c
34230 6f 6d 70 6c 65 74 65 20 74 61 62 6c 65 20 73 63  omplete table sc
34240 61 6e 20 63 61 6e 20 62 65 20 61 76 6f 69 64 65  an can be avoide
34250 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64  d and the.** cod
34260 65 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20  e will run much 
34270 66 61 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66  faster.  Most of
34280 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 74 68 69   the work of thi
34290 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 68 65  s routine is che
342a0 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20  cking.** to see 
342b0 69 66 20 74 68 65 72 65 20 61 72 65 20 69 6e 64  if there are ind
342c0 69 63 65 73 20 74 68 61 74 20 63 61 6e 20 62 65  ices that can be
342d0 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20 75   used to speed u
342e0 70 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a  p the loop..**.*
342f0 2a 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20 57  * Terms of the W
34300 48 45 52 45 20 63 6c 61 75 73 65 20 61 72 65 20  HERE clause are 
34310 61 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d  also used to lim
34320 69 74 20 77 68 69 63 68 20 72 6f 77 73 20 61 63  it which rows ac
34330 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69  tually.** make i
34340 74 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69  t to the "..." i
34350 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20  n the middle of 
34360 74 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72  the loop.  After
34370 20 65 61 63 68 20 22 66 6f 72 65 61 63 68 22 2c   each "foreach",
34380 0a 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74 68 65  .** terms of the
34390 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
343a0 61 74 20 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d  at use only term
343b0 73 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61  s in that loop a
343c0 6e 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70  nd outer.** loop
343d0 73 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20  s are evaluated 
343e0 61 6e 64 20 69 66 20 66 61 6c 73 65 20 61 20 6a  and if false a j
343f0 75 6d 70 20 69 73 20 6d 61 64 65 20 61 72 6f 75  ump is made arou
34400 6e 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e  nd all subsequen
34410 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73  t.** inner loops
34420 20 28 6f 72 20 61 72 6f 75 6e 64 20 74 68 65 20   (or around the 
34430 22 2e 2e 2e 22 20 69 66 20 74 68 65 20 74 65 73  "..." if the tes
34440 74 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20  t occurs within 
34450 74 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f  the inner-.** mo
34460 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f  st loop).**.** O
34470 55 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a  UTER JOINS.**.**
34480 20 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f   An outer join o
34490 66 20 74 61 62 6c 65 73 20 74 31 20 61 6e 64 20  f tables t1 and 
344a0 74 32 20 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c  t2 is conceptall
344b0 79 20 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f  y coded as follo
344c0 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72  ws:.**.**    for
344d0 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20  each row1 in t1 
344e0 64 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67 20  do.**      flag 
344f0 3d 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65  = 0.**      fore
34500 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64  ach row2 in t2 d
34510 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 74 61 72  o.**        star
34520 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2e  t:.**          .
34530 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66  ...**          f
34540 6c 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20  lag = 1.**      
34550 65 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66 20 66  end.**      if f
34560 6c 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20  lag==0 then.**  
34570 20 20 20 20 20 20 6d 6f 76 65 20 74 68 65 20 72        move the r
34580 6f 77 32 20 63 75 72 73 6f 72 20 74 6f 20 61 20  ow2 cursor to a 
34590 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20  null row.**     
345a0 20 20 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a     goto start.**
345b0 20 20 20 20 20 20 66 69 0a 2a 2a 20 20 20 20 65        fi.**    e
345c0 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42  nd.**.** ORDER B
345d0 59 20 43 4c 41 55 53 45 20 50 52 4f 43 45 53 53  Y CLAUSE PROCESS
345e0 49 4e 47 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72  ING.**.** pOrder
345f0 42 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  By is a pointer 
34600 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  to the ORDER BY 
34610 63 6c 61 75 73 65 20 28 6f 72 20 74 68 65 20 47  clause (or the G
34620 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a 2a  ROUP BY clause.*
34630 2a 20 69 66 20 74 68 65 20 57 48 45 52 45 5f 47  * if the WHERE_G
34640 52 4f 55 50 42 59 20 66 6c 61 67 20 69 73 20 73  ROUPBY flag is s
34650 65 74 20 69 6e 20 77 63 74 72 6c 46 6c 61 67 73  et in wctrlFlags
34660 29 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74  ) of a SELECT st
34670 61 74 65 6d 65 6e 74 0a 2a 2a 20 69 66 20 74 68  atement.** if th
34680 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 49 66 20  ere is one.  If 
34690 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45  there is no ORDE
346a0 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20 69  R BY clause or i
346b0 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  f this routine.*
346c0 2a 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d  * is called from
346d0 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45   an UPDATE or DE
346e0 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20  LETE statement, 
346f0 74 68 65 6e 20 70 4f 72 64 65 72 42 79 20 69 73  then pOrderBy is
34700 20 4e 55 4c 4c 2e 0a 2a 2f 0a 57 68 65 72 65 49   NULL..*/.WhereI
34710 6e 66 6f 20 2a 73 71 6c 69 74 65 33 57 68 65 72  nfo *sqlite3Wher
34720 65 42 65 67 69 6e 28 0a 20 20 50 61 72 73 65 20  eBegin(.  Parse 
34730 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
34740 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
34750 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
34760 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20  st *pTabList,   
34770 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 3a   /* FROM clause:
34780 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74   A list of all t
34790 61 62 6c 65 73 20 74 6f 20 62 65 20 73 63 61 6e  ables to be scan
347a0 6e 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ned */.  Expr *p
347b0 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f  Where,         /
347c0 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
347d0 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
347e0 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a   *pOrderBy,   /*
347f0 20 41 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   An ORDER BY cla
34800 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  use, or NULL */.
34810 20 20 45 78 70 72 4c 69 73 74 20 2a 70 52 65 73    ExprList *pRes
34820 75 6c 74 53 65 74 2c 20 2f 2a 20 52 65 73 75 6c  ultSet, /* Resul
34830 74 20 73 65 74 20 6f 66 20 74 68 65 20 71 75 65  t set of the que
34840 72 79 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72  ry */.  u16 wctr
34850 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20 2f 2a  lFlags,       /*
34860 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52   One of the WHER
34870 45 5f 2a 20 66 6c 61 67 73 20 64 65 66 69 6e 65  E_* flags define
34880 64 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68  d in sqliteInt.h
34890 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 43 75   */.  int iIdxCu
348a0 72 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  r           /* I
348b0 66 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  f WHERE_ONETABLE
348c0 5f 4f 4e 4c 59 20 69 73 20 73 65 74 2c 20 69 6e  _ONLY is set, in
348d0 64 65 78 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  dex cursor numbe
348e0 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42  r */.){.  int nB
348f0 79 74 65 57 49 6e 66 6f 3b 20 20 20 20 20 20 20  yteWInfo;       
34900 20 20 20 20 20 2f 2a 20 4e 75 6d 2e 20 62 79 74       /* Num. byt
34910 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  es allocated for
34920 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63   WhereInfo struc
34930 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 61 62 4c  t */.  int nTabL
34940 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
34950 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
34960 6c 65 6d 65 6e 74 73 20 69 6e 20 70 54 61 62 4c  lements in pTabL
34970 69 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e  ist */.  WhereIn
34980 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20  fo *pWInfo;     
34990 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65 63 6f      /* Will beco
349a0 6d 65 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  me the return va
349b0 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63  lue of this func
349c0 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a  tion */.  Vdbe *
349d0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
349e0 65 3b 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74  e;   /* The virt
349f0 75 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e 67  ual database eng
34a00 69 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ine */.  Bitmask
34a10 20 6e 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20   notReady;      
34a20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20 74      /* Cursors t
34a30 68 61 74 20 61 72 65 20 6e 6f 74 20 79 65 74 20  hat are not yet 
34a40 70 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a 20 20  positioned */.  
34a50 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
34a60 20 73 57 4c 42 3b 20 20 20 20 20 2f 2a 20 54 68   sWLB;     /* Th
34a70 65 20 57 68 65 72 65 4c 6f 6f 70 20 62 75 69 6c  e WhereLoop buil
34a80 64 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61  der */.  WhereMa
34a90 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b  skSet *pMaskSet;
34aa0 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
34ab0 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20 2a  ssion mask set *
34ac0 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
34ad0 70 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20 2f  pLevel;        /
34ae0 2a 20 41 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c  * A single level
34af0 20 69 6e 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20   in pWInfo->a[] 
34b00 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
34b10 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  pLoop;          
34b20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20  /* Pointer to a 
34b30 73 69 6e 67 6c 65 20 57 68 65 72 65 4c 6f 6f 70  single WhereLoop
34b40 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
34b50 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
34b60 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
34b70 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 73 71 6c  counter */.  sql
34b80 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
34b90 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
34ba0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
34bb0 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
34bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
34bd0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
34be0 0a 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c 65  ...  /* Variable
34bf0 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
34c00 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  */.  db = pParse
34c10 2d 3e 64 62 3b 0a 20 20 6d 65 6d 73 65 74 28 26  ->db;.  memset(&
34c20 73 57 4c 42 2c 20 30 2c 20 73 69 7a 65 6f 66 28  sWLB, 0, sizeof(
34c30 73 57 4c 42 29 29 3b 0a 20 20 73 57 4c 42 2e 70  sWLB));.  sWLB.p
34c40 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
34c50 42 79 3b 0a 0a 20 20 2f 2a 20 44 69 73 61 62 6c  By;..  /* Disabl
34c60 65 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6f  e the DISTINCT o
34c70 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20 53  ptimization if S
34c80 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f 70  QLITE_DistinctOp
34c90 74 20 69 73 20 73 65 74 20 76 69 61 0a 20 20 2a  t is set via.  *
34ca0 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  * sqlite3_test_c
34cb0 74 72 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  trl(SQLITE_TESTC
34cc0 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  TRL_OPTIMIZATION
34cd0 53 2c 2e 2e 2e 29 20 2a 2f 0a 20 20 69 66 28 20  S,...) */.  if( 
34ce0 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61  OptimizationDisa
34cf0 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
34d00 44 69 73 74 69 6e 63 74 4f 70 74 29 20 29 7b 0a  DistinctOpt) ){.
34d10 20 20 20 20 77 63 74 72 6c 46 6c 61 67 73 20 26      wctrlFlags &
34d20 3d 20 7e 57 48 45 52 45 5f 57 41 4e 54 5f 44 49  = ~WHERE_WANT_DI
34d30 53 54 49 4e 43 54 3b 0a 20 20 7d 0a 0a 20 20 2f  STINCT;.  }..  /
34d40 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
34d50 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
34d60 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d  OM clause is lim
34d70 69 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62  ited by the numb
34d80 65 72 20 6f 66 0a 20 20 2a 2a 20 62 69 74 73 20  er of.  ** bits 
34d90 69 6e 20 61 20 42 69 74 6d 61 73 6b 20 0a 20 20  in a Bitmask .  
34da0 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  */.  testcase( p
34db0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 42  TabList->nSrc==B
34dc0 4d 53 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62  MS );.  if( pTab
34dd0 4c 69 73 74 2d 3e 6e 53 72 63 3e 42 4d 53 20 29  List->nSrc>BMS )
34de0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
34df0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61  orMsg(pParse, "a
34e00 74 20 6d 6f 73 74 20 25 64 20 74 61 62 6c 65 73  t most %d tables
34e10 20 69 6e 20 61 20 6a 6f 69 6e 22 2c 20 42 4d 53   in a join", BMS
34e20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
34e30 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20  .  }..  /* This 
34e40 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 6d 61 6c 6c  function normall
34e50 79 20 67 65 6e 65 72 61 74 65 73 20 61 20 6e 65  y generates a ne
34e60 73 74 65 64 20 6c 6f 6f 70 20 66 6f 72 20 61 6c  sted loop for al
34e70 6c 20 74 61 62 6c 65 73 20 69 6e 20 0a 20 20 2a  l tables in .  *
34e80 2a 20 70 54 61 62 4c 69 73 74 2e 20 20 42 75 74  * pTabList.  But
34e90 20 69 66 20 74 68 65 20 57 48 45 52 45 5f 4f 4e   if the WHERE_ON
34ea0 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67  ETABLE_ONLY flag
34eb0 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 77 65   is set, then we
34ec0 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6f 6e 6c   should.  ** onl
34ed0 79 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20  y generate code 
34ee0 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 61  for the first ta
34ef0 62 6c 65 20 69 6e 20 70 54 61 62 4c 69 73 74 20  ble in pTabList 
34f00 61 6e 64 20 61 73 73 75 6d 65 20 74 68 61 74 0a  and assume that.
34f10 20 20 2a 2a 20 61 6e 79 20 63 75 72 73 6f 72 73    ** any cursors
34f20 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
34f30 20 73 75 62 73 65 71 75 65 6e 74 20 74 61 62 6c   subsequent tabl
34f40 65 73 20 61 72 65 20 75 6e 69 6e 69 74 69 61 6c  es are uninitial
34f50 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 6e 54 61  ized..  */.  nTa
34f60 62 4c 69 73 74 20 3d 20 28 77 63 74 72 6c 46 6c  bList = (wctrlFl
34f70 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54  ags & WHERE_ONET
34f80 41 42 4c 45 5f 4f 4e 4c 59 29 20 3f 20 31 20 3a  ABLE_ONLY) ? 1 :
34f90 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b   pTabList->nSrc;
34fa0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
34fb0 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74  and initialize t
34fc0 68 65 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72  he WhereInfo str
34fd0 75 63 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c  ucture that will
34fe0 20 62 65 63 6f 6d 65 20 74 68 65 0a 20 20 2a 2a   become the.  **
34ff0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2e 20 41   return value. A
35000 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74 69   single allocati
35010 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 73 74  on is used to st
35020 6f 72 65 20 74 68 65 20 57 68 65 72 65 49 6e 66  ore the WhereInf
35030 6f 0a 20 20 2a 2a 20 73 74 72 75 63 74 2c 20 74  o.  ** struct, t
35040 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 57  he contents of W
35050 68 65 72 65 49 6e 66 6f 2e 61 5b 5d 2c 20 74 68  hereInfo.a[], th
35060 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  e WhereClause st
35070 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 61 6e 64  ructure.  ** and
35080 20 74 68 65 20 57 68 65 72 65 4d 61 73 6b 53 65   the WhereMaskSe
35090 74 20 73 74 72 75 63 74 75 72 65 2e 20 53 69 6e  t structure. Sin
350a0 63 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 63  ce WhereClause c
350b0 6f 6e 74 61 69 6e 73 20 61 6e 20 38 2d 62 79 74  ontains an 8-byt
350c0 65 0a 20 20 2a 2a 20 66 69 65 6c 64 20 28 74 79  e.  ** field (ty
350d0 70 65 20 42 69 74 6d 61 73 6b 29 20 69 74 20 6d  pe Bitmask) it m
350e0 75 73 74 20 62 65 20 61 6c 69 67 6e 65 64 20 6f  ust be aligned o
350f0 6e 20 61 6e 20 38 2d 62 79 74 65 20 62 6f 75 6e  n an 8-byte boun
35100 64 61 72 79 20 6f 6e 0a 20 20 2a 2a 20 73 6f 6d  dary on.  ** som
35110 65 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2e  e architectures.
35120 20 48 65 6e 63 65 20 74 68 65 20 52 4f 55 4e 44   Hence the ROUND
35130 38 28 29 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a  8() below..  */.
35140 20 20 6e 42 79 74 65 57 49 6e 66 6f 20 3d 20 52    nByteWInfo = R
35150 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 57 68 65  OUND8(sizeof(Whe
35160 72 65 49 6e 66 6f 29 2b 28 6e 54 61 62 4c 69 73  reInfo)+(nTabLis
35170 74 2d 31 29 2a 73 69 7a 65 6f 66 28 57 68 65 72  t-1)*sizeof(Wher
35180 65 4c 65 76 65 6c 29 29 3b 0a 20 20 70 57 49 6e  eLevel));.  pWIn
35190 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  fo = sqlite3DbMa
351a0 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79  llocZero(db, nBy
351b0 74 65 57 49 6e 66 6f 20 2b 20 73 69 7a 65 6f 66  teWInfo + sizeof
351c0 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b 0a 20 20  (WhereLoop));.  
351d0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
351e0 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  iled ){.    sqli
351f0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57  te3DbFree(db, pW
35200 49 6e 66 6f 29 3b 0a 20 20 20 20 70 57 49 6e 66  Info);.    pWInf
35210 6f 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20  o = 0;.    goto 
35220 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
35230 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e  .  }.  pWInfo->n
35240 4c 65 76 65 6c 20 3d 20 6e 54 61 62 4c 69 73 74  Level = nTabList
35250 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  ;.  pWInfo->pPar
35260 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70  se = pParse;.  p
35270 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 20  WInfo->pTabList 
35280 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 57  = pTabList;.  pW
35290 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d  Info->pOrderBy =
352a0 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 57 49   pOrderBy;.  pWI
352b0 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74 20  nfo->pResultSet 
352c0 3d 20 70 52 65 73 75 6c 74 53 65 74 3b 0a 20 20  = pResultSet;.  
352d0 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 20 3d  pWInfo->iBreak =
352e0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
352f0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70 57 49 6e  Label(v);.  pWIn
35300 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 3d  fo->wctrlFlags =
35310 20 77 63 74 72 6c 46 6c 61 67 73 3b 0a 20 20 70   wctrlFlags;.  p
35320 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65  WInfo->savedNQue
35330 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d  ryLoop = pParse-
35340 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 70  >nQueryLoop;.  p
35350 4d 61 73 6b 53 65 74 20 3d 20 26 70 57 49 6e 66  MaskSet = &pWInf
35360 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a 20 20 73  o->sMaskSet;.  s
35370 57 4c 42 2e 70 57 49 6e 66 6f 20 3d 20 70 57 49  WLB.pWInfo = pWI
35380 6e 66 6f 3b 0a 20 20 73 57 4c 42 2e 70 57 43 20  nfo;.  sWLB.pWC 
35390 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a  = &pWInfo->sWC;.
353a0 20 20 73 57 4c 42 2e 70 4e 65 77 20 3d 20 28 57    sWLB.pNew = (W
353b0 68 65 72 65 4c 6f 6f 70 2a 29 28 28 28 63 68 61  hereLoop*)(((cha
353c0 72 2a 29 70 57 49 6e 66 6f 29 2b 6e 42 79 74 65  r*)pWInfo)+nByte
353d0 57 49 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74  WInfo);.  assert
353e0 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
353f0 47 4e 4d 45 4e 54 28 73 57 4c 42 2e 70 4e 65 77  GNMENT(sWLB.pNew
35400 29 20 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70  ) );.  whereLoop
35410 49 6e 69 74 28 73 57 4c 42 2e 70 4e 65 77 29 3b  Init(sWLB.pNew);
35420 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
35430 45 42 55 47 0a 20 20 73 57 4c 42 2e 70 4e 65 77  EBUG.  sWLB.pNew
35440 2d 3e 63 49 64 20 3d 20 27 2a 27 3b 0a 23 65 6e  ->cId = '*';.#en
35450 64 69 66 0a 0a 20 20 2f 2a 20 53 70 6c 69 74 20  dif..  /* Split 
35460 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
35470 20 69 6e 74 6f 20 73 65 70 61 72 61 74 65 20 73   into separate s
35480 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 77 68  ubexpressions wh
35490 65 72 65 20 65 61 63 68 0a 20 20 2a 2a 20 73 75  ere each.  ** su
354a0 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73  bexpression is s
354b0 65 70 61 72 61 74 65 64 20 62 79 20 61 6e 20 41  eparated by an A
354c0 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a  ND operator..  *
354d0 2f 0a 20 20 69 6e 69 74 4d 61 73 6b 53 65 74 28  /.  initMaskSet(
354e0 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20 77 68 65  pMaskSet);.  whe
354f0 72 65 43 6c 61 75 73 65 49 6e 69 74 28 26 70 57  reClauseInit(&pW
35500 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 57 49 6e 66  Info->sWC, pWInf
35510 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  o);.  sqlite3Exp
35520 72 43 6f 64 65 43 6f 6e 73 74 61 6e 74 73 28 70  rCodeConstants(p
35530 50 61 72 73 65 2c 20 70 57 68 65 72 65 29 3b 0a  Parse, pWhere);.
35540 20 20 77 68 65 72 65 53 70 6c 69 74 28 26 70 57    whereSplit(&pW
35550 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 57 68 65 72  Info->sWC, pWher
35560 65 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 73 71  e, TK_AND);.  sq
35570 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
35580 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 2d 31  chema(pParse, -1
35590 29 3b 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65  ); /* Insert the
355a0 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 65 72   cookie verifier
355b0 20 47 6f 74 6f 20 2a 2f 0a 20 20 20 20 0a 20 20   Goto */.    .  
355c0 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a  /* Special case:
355d0 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20   a WHERE clause 
355e0 74 68 61 74 20 69 73 20 63 6f 6e 73 74 61 6e 74  that is constant
355f0 2e 20 20 45 76 61 6c 75 61 74 65 20 74 68 65 0a  .  Evaluate the.
35600 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20    ** expression 
35610 61 6e 64 20 65 69 74 68 65 72 20 6a 75 6d 70 20  and either jump 
35620 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20  over all of the 
35630 63 6f 64 65 20 6f 72 20 66 61 6c 6c 20 74 68 72  code or fall thr
35640 75 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 57  u..  */.  if( pW
35650 68 65 72 65 20 26 26 20 28 6e 54 61 62 4c 69 73  here && (nTabLis
35660 74 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 45  t==0 || sqlite3E
35670 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
35680 4a 6f 69 6e 28 70 57 68 65 72 65 29 29 20 29 7b  Join(pWhere)) ){
35690 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
356a0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
356b0 70 57 68 65 72 65 2c 20 70 57 49 6e 66 6f 2d 3e  pWhere, pWInfo->
356c0 69 42 72 65 61 6b 2c 20 53 51 4c 49 54 45 5f 4a  iBreak, SQLITE_J
356d0 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
356e0 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a  pWhere = 0;.  }.
356f0 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61  .  /* Special ca
35700 73 65 3a 20 4e 6f 20 46 52 4f 4d 20 63 6c 61 75  se: No FROM clau
35710 73 65 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 54  se.  */.  if( nT
35720 61 62 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  abList==0 ){.   
35730 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 20   if( pOrderBy ) 
35740 70 57 49 6e 66 6f 2d 3e 62 4f 42 53 61 74 20 3d  pWInfo->bOBSat =
35750 20 31 3b 0a 20 20 20 20 69 66 28 20 77 63 74 72   1;.    if( wctr
35760 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57  lFlags & WHERE_W
35770 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a  ANT_DISTINCT ){.
35780 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44        pWInfo->eD
35790 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f  istinct = WHERE_
357a0 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b  DISTINCT_UNIQUE;
357b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
357c0 20 41 73 73 69 67 6e 20 61 20 62 69 74 20 66 72   Assign a bit fr
357d0 6f 6d 20 74 68 65 20 62 69 74 6d 61 73 6b 20 74  om the bitmask t
357e0 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20  o every term in 
357f0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
35800 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20  .  **.  ** When 
35810 61 73 73 69 67 6e 69 6e 67 20 62 69 74 6d 61 73  assigning bitmas
35820 6b 20 76 61 6c 75 65 73 20 74 6f 20 46 52 4f 4d  k values to FROM
35830 20 63 6c 61 75 73 65 20 63 75 72 73 6f 72 73 2c   clause cursors,
35840 20 69 74 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a   it must be.  **
35850 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20 69   the case that i
35860 66 20 58 20 69 73 20 74 68 65 20 62 69 74 6d 61  f X is the bitma
35870 73 6b 20 66 6f 72 20 74 68 65 20 4e 2d 74 68 20  sk for the N-th 
35880 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
35890 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 62   then.  ** the b
358a0 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 46  itmask for all F
358b0 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ROM clause terms
358c0 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
358d0 74 68 65 20 4e 2d 74 68 20 74 65 72 6d 0a 20 20  the N-th term.  
358e0 2a 2a 20 69 73 20 28 58 2d 31 29 2e 20 20 20 41  ** is (X-1).   A
358f0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f  n expression fro
35900 6d 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20  m the ON clause 
35910 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 63  of a LEFT JOIN c
35920 61 6e 20 75 73 65 0a 20 20 2a 2a 20 69 74 73 20  an use.  ** its 
35930 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54  Expr.iRightJoinT
35940 61 62 6c 65 20 76 61 6c 75 65 20 74 6f 20 66 69  able value to fi
35950 6e 64 20 74 68 65 20 62 69 74 6d 61 73 6b 20 6f  nd the bitmask o
35960 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  f the right tabl
35970 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6a 6f  e.  ** of the jo
35980 69 6e 2e 20 20 53 75 62 74 72 61 63 74 69 6e 67  in.  Subtracting
35990 20 6f 6e 65 20 66 72 6f 6d 20 74 68 65 20 72 69   one from the ri
359a0 67 68 74 20 74 61 62 6c 65 20 62 69 74 6d 61 73  ght table bitmas
359b0 6b 20 67 69 76 65 73 20 61 0a 20 20 2a 2a 20 62  k gives a.  ** b
359c0 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 74  itmask for all t
359d0 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66  ables to the lef
359e0 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20  t of the join.  
359f0 4b 6e 6f 77 69 6e 67 20 74 68 65 20 62 69 74 6d  Knowing the bitm
35a00 61 73 6b 0a 20 20 2a 2a 20 66 6f 72 20 61 6c 6c  ask.  ** for all
35a10 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c   tables to the l
35a20 65 66 74 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f  eft of a left jo
35a30 69 6e 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e  in is important.
35a40 20 20 54 69 63 6b 65 74 20 23 33 30 31 35 2e 0a    Ticket #3015..
35a50 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74    **.  ** Note t
35a60 68 61 74 20 62 69 74 6d 61 73 6b 73 20 61 72 65  hat bitmasks are
35a70 20 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c   created for all
35a80 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20   pTabList->nSrc 
35a90 74 61 62 6c 65 73 20 69 6e 0a 20 20 2a 2a 20 70  tables in.  ** p
35aa0 54 61 62 4c 69 73 74 2c 20 6e 6f 74 20 6a 75 73  TabList, not jus
35ab0 74 20 74 68 65 20 66 69 72 73 74 20 6e 54 61 62  t the first nTab
35ac0 4c 69 73 74 20 74 61 62 6c 65 73 2e 20 20 6e 54  List tables.  nT
35ad0 61 62 4c 69 73 74 20 69 73 20 6e 6f 72 6d 61 6c  abList is normal
35ae0 6c 79 0a 20 20 2a 2a 20 65 71 75 61 6c 20 74 6f  ly.  ** equal to
35af0 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20   pTabList->nSrc 
35b00 62 75 74 20 6d 69 67 68 74 20 62 65 20 73 68 6f  but might be sho
35b10 72 74 65 6e 65 64 20 74 6f 20 31 20 69 66 20 74  rtened to 1 if t
35b20 68 65 0a 20 20 2a 2a 20 57 48 45 52 45 5f 4f 4e  he.  ** WHERE_ON
35b30 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67  ETABLE_ONLY flag
35b40 20 69 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20   is set..  */.  
35b50 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 54 61  for(ii=0; ii<pTa
35b60 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b  bList->nSrc; ii+
35b70 2b 29 7b 0a 20 20 20 20 63 72 65 61 74 65 4d 61  +){.    createMa
35b80 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61  sk(pMaskSet, pTa
35b90 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69 43 75  bList->a[ii].iCu
35ba0 72 73 6f 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  rsor);.  }.#ifnd
35bb0 65 66 20 4e 44 45 42 55 47 0a 20 20 7b 0a 20 20  ef NDEBUG.  {.  
35bc0 20 20 42 69 74 6d 61 73 6b 20 74 6f 54 68 65 4c    Bitmask toTheL
35bd0 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  eft = 0;.    for
35be0 28 69 69 3d 30 3b 20 69 69 3c 70 54 61 62 4c 69  (ii=0; ii<pTabLi
35bf0 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b 29 7b  st->nSrc; ii++){
35c00 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  .      Bitmask m
35c10 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b   = getMask(pMask
35c20 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61  Set, pTabList->a
35c30 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20  [ii].iCursor);. 
35c40 20 20 20 20 20 61 73 73 65 72 74 28 20 28 6d 2d       assert( (m-
35c50 31 29 3d 3d 74 6f 54 68 65 4c 65 66 74 20 29 3b  1)==toTheLeft );
35c60 0a 20 20 20 20 20 20 74 6f 54 68 65 4c 65 66 74  .      toTheLeft
35c70 20 7c 3d 20 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d   |= m;.    }.  }
35c80 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e  .#endif..  /* An
35c90 61 6c 79 7a 65 20 61 6c 6c 20 6f 66 20 74 68 65  alyze all of the
35ca0 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e   subexpressions.
35cb0 20 20 4e 6f 74 65 20 74 68 61 74 20 65 78 70 72    Note that expr
35cc0 41 6e 61 6c 79 7a 65 28 29 20 6d 69 67 68 74 0a  Analyze() might.
35cd0 20 20 2a 2a 20 61 64 64 20 6e 65 77 20 76 69 72    ** add new vir
35ce0 74 75 61 6c 20 74 65 72 6d 73 20 6f 6e 74 6f 20  tual terms onto 
35cf0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57  the end of the W
35d00 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 57 65  HERE clause.  We
35d10 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20 77 61 6e   do not.  ** wan
35d20 74 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65  t to analyze the
35d30 73 65 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73  se virtual terms
35d40 2c 20 73 6f 20 73 74 61 72 74 20 61 6e 61 6c 79  , so start analy
35d50 7a 69 6e 67 20 61 74 20 74 68 65 20 65 6e 64 0a  zing at the end.
35d60 20 20 2a 2a 20 61 6e 64 20 77 6f 72 6b 20 66 6f    ** and work fo
35d70 72 77 61 72 64 20 73 6f 20 74 68 61 74 20 74 68  rward so that th
35d80 65 20 61 64 64 65 64 20 76 69 72 74 75 61 6c 20  e added virtual 
35d90 74 65 72 6d 73 20 61 72 65 20 6e 65 76 65 72 20  terms are never 
35da0 70 72 6f 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a  processed..  */.
35db0 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c    exprAnalyzeAll
35dc0 28 70 54 61 62 4c 69 73 74 2c 20 26 70 57 49 6e  (pTabList, &pWIn
35dd0 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 69 66 28 20  fo->sWC);.  if( 
35de0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
35df0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65   ){.    goto whe
35e00 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20  reBeginError;.  
35e10 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 4f  }..  /* If the O
35e20 52 44 45 52 20 42 59 20 28 6f 72 20 47 52 4f 55  RDER BY (or GROU
35e30 50 20 42 59 29 20 63 6c 61 75 73 65 20 63 6f 6e  P BY) clause con
35e40 74 61 69 6e 73 20 72 65 66 65 72 65 6e 63 65 73  tains references
35e50 20 74 6f 20 67 65 6e 65 72 61 6c 0a 20 20 2a 2a   to general.  **
35e60 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 74 68   expressions, th
35e70 65 6e 20 77 65 20 77 6f 6e 27 74 20 62 65 20 61  en we won't be a
35e80 62 6c 65 20 74 6f 20 73 61 74 69 73 66 79 20 69  ble to satisfy i
35e90 74 20 75 73 69 6e 67 20 69 6e 64 69 63 65 73 2c  t using indices,
35ea0 20 73 6f 0a 20 20 2a 2a 20 67 6f 20 61 68 65 61   so.  ** go ahea
35eb0 64 20 61 6e 64 20 64 69 73 61 62 6c 65 20 69 74  d and disable it
35ec0 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   now..  */.  if(
35ed0 20 70 4f 72 64 65 72 42 79 20 26 26 20 28 77 63   pOrderBy && (wc
35ee0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
35ef0 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 29 21  _WANT_DISTINCT)!
35f00 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 69  =0 ){.    for(ii
35f10 3d 30 3b 20 69 69 3c 70 4f 72 64 65 72 42 79 2d  =0; ii<pOrderBy-
35f20 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20  >nExpr; ii++){. 
35f30 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
35f40 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
35f50 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72  ipCollate(pOrder
35f60 42 79 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29  By->a[ii].pExpr)
35f70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
35f80 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
35f90 20 29 7b 0a 20 20 20 20 20 20 20 20 70 57 49 6e   ){.        pWIn
35fa0 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70  fo->pOrderBy = p
35fb0 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
35fc0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
35fd0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78 70    }else if( pExp
35fe0 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a  r->iColumn<0 ){.
35ff0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
36000 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
36010 0a 0a 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61  ..  if( wctrlFla
36020 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f  gs & WHERE_WANT_
36030 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20  DISTINCT ){.    
36040 69 66 28 20 69 73 44 69 73 74 69 6e 63 74 52 65  if( isDistinctRe
36050 64 75 6e 64 61 6e 74 28 70 50 61 72 73 65 2c 20  dundant(pParse, 
36060 70 54 61 62 4c 69 73 74 2c 20 26 70 57 49 6e 66  pTabList, &pWInf
36070 6f 2d 3e 73 57 43 2c 20 70 52 65 73 75 6c 74 53  o->sWC, pResultS
36080 65 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  et) ){.      /* 
36090 54 68 65 20 44 49 53 54 49 4e 43 54 20 6d 61 72  The DISTINCT mar
360a0 6b 69 6e 67 20 69 73 20 70 6f 69 6e 74 6c 65 73  king is pointles
360b0 73 2e 20 20 49 67 6e 6f 72 65 20 69 74 2e 20 2a  s.  Ignore it. *
360c0 2f 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  /.      pWInfo->
360d0 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52  eDistinct = WHER
360e0 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55  E_DISTINCT_UNIQU
360f0 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  E;.    }else if(
36100 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a   pOrderBy==0 ){.
36110 20 20 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20        /* Try to 
36120 4f 52 44 45 52 20 42 59 20 74 68 65 20 72 65 73  ORDER BY the res
36130 75 6c 74 20 73 65 74 20 74 6f 20 6d 61 6b 65 20  ult set to make 
36140 64 69 73 74 69 6e 63 74 20 70 72 6f 63 65 73 73  distinct process
36150 69 6e 67 20 65 61 73 69 65 72 20 2a 2f 0a 20 20  ing easier */.  
36160 20 20 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72      pWInfo->wctr
36170 6c 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  lFlags |= WHERE_
36180 44 49 53 54 49 4e 43 54 42 59 3b 0a 20 20 20 20  DISTINCTBY;.    
36190 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72    pWInfo->pOrder
361a0 42 79 20 3d 20 70 52 65 73 75 6c 74 53 65 74 3b  By = pResultSet;
361b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
361c0 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 57   Construct the W
361d0 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
361e0 20 2a 2f 0a 20 20 57 48 45 52 45 54 52 41 43 45   */.  WHERETRACE
361f0 28 30 78 66 66 66 66 2c 28 22 2a 2a 2a 20 4f 70  (0xffff,("*** Op
36200 74 69 6d 69 7a 65 72 20 53 74 61 72 74 20 2a 2a  timizer Start **
36210 2a 5c 6e 22 29 29 3b 0a 20 20 2f 2a 20 44 69 73  *\n"));.  /* Dis
36220 70 6c 61 79 20 61 6c 6c 20 74 65 72 6d 73 20 6f  play all terms o
36230 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
36240 73 65 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  se */.#if define
36250 64 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  d(WHERETRACE_ENA
36260 42 4c 45 44 29 20 26 26 20 64 65 66 69 6e 65 64  BLED) && defined
36270 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54  (SQLITE_ENABLE_T
36280 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a 20 20 69  REE_EXPLAIN).  i
36290 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
362a0 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a  race & 0x100 ){.
362b0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 56      int i;.    V
362c0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
362d0 3e 70 56 64 62 65 3b 0a 20 20 20 20 73 71 6c 69  >pVdbe;.    sqli
362e0 74 65 33 45 78 70 6c 61 69 6e 42 65 67 69 6e 28  te3ExplainBegin(
362f0 76 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  v);.    for(i=0;
36300 20 69 3c 73 57 4c 42 2e 70 57 43 2d 3e 6e 54 65   i<sWLB.pWC->nTe
36310 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rm; i++){.      
36320 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
36330 69 6e 74 66 28 76 2c 20 22 23 25 2d 32 64 20 22  intf(v, "#%-2d "
36340 2c 20 69 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , i);.      sqli
36350 74 65 33 45 78 70 6c 61 69 6e 50 75 73 68 28 76  te3ExplainPush(v
36360 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 45 78  );.      whereEx
36370 70 6c 61 69 6e 54 65 72 6d 28 76 2c 20 26 73 57  plainTerm(v, &sW
36380 4c 42 2e 70 57 43 2d 3e 61 5b 69 5d 29 3b 0a 20  LB.pWC->a[i]);. 
36390 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
363a0 61 69 6e 50 6f 70 28 76 29 3b 0a 20 20 20 20 20  ainPop(v);.     
363b0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e   sqlite3ExplainN
363c0 4c 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  L(v);.    }.    
363d0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 46 69  sqlite3ExplainFi
363e0 6e 69 73 68 28 76 29 3b 0a 20 20 20 20 73 71 6c  nish(v);.    sql
363f0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
36400 22 25 73 22 2c 20 73 71 6c 69 74 65 33 56 64 62  "%s", sqlite3Vdb
36410 65 45 78 70 6c 61 6e 61 74 69 6f 6e 28 76 29 29  eExplanation(v))
36420 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
36430 66 28 20 6e 54 61 62 4c 69 73 74 21 3d 31 20 7c  f( nTabList!=1 |
36440 7c 20 77 68 65 72 65 53 68 6f 72 74 43 75 74 28  | whereShortCut(
36450 26 73 57 4c 42 29 3d 3d 30 20 29 7b 0a 20 20 20  &sWLB)==0 ){.   
36460 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
36470 64 64 41 6c 6c 28 26 73 57 4c 42 29 3b 0a 20 20  ddAll(&sWLB);.  
36480 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
36490 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
364a0 0a 20 20 0a 20 20 20 20 2f 2a 20 44 69 73 70 6c  .  .    /* Displ
364b0 61 79 20 61 6c 6c 20 6f 66 20 74 68 65 20 57 68  ay all of the Wh
364c0 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
364d0 69 66 20 77 68 65 72 65 74 72 61 63 65 20 69 73  if wheretrace is
364e0 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 23 69 66 64   enabled */.#ifd
364f0 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
36500 41 42 4c 45 44 20 2f 2a 20 21 3d 30 20 2a 2f 0a  ABLED /* !=0 */.
36510 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
36520 68 65 72 65 54 72 61 63 65 20 29 7b 0a 20 20 20  hereTrace ){.   
36530 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 3b     WhereLoop *p;
36540 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
36550 20 20 20 20 73 74 61 74 69 63 20 63 68 61 72 20      static char 
36560 7a 4c 61 62 65 6c 5b 5d 20 3d 20 22 30 31 32 33  zLabel[] = "0123
36570 34 35 36 37 38 39 61 62 63 64 65 66 67 68 69 6a  456789abcdefghij
36580 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 79 78 7a  klmnopqrstuvwyxz
36590 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
365a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
365b0 20 20 20 20 20 20 20 20 20 22 41 42 43 44 45 46           "ABCDEF
365c0 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56  GHIJKLMNOPQRSTUV
365d0 57 59 58 5a 22 3b 0a 20 20 20 20 20 20 66 6f 72  WYXZ";.      for
365e0 28 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70  (p=pWInfo->pLoop
365f0 73 2c 20 69 3d 30 3b 20 70 3b 20 70 3d 70 2d 3e  s, i=0; p; p=p->
36600 70 4e 65 78 74 4c 6f 6f 70 2c 20 69 2b 2b 29 7b  pNextLoop, i++){
36610 0a 20 20 20 20 20 20 20 20 70 2d 3e 63 49 64 20  .        p->cId 
36620 3d 20 7a 4c 61 62 65 6c 5b 69 25 73 69 7a 65 6f  = zLabel[i%sizeo
36630 66 28 7a 4c 61 62 65 6c 29 5d 3b 0a 20 20 20 20  f(zLabel)];.    
36640 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69      whereLoopPri
36650 6e 74 28 70 2c 20 73 57 4c 42 2e 70 57 43 29 3b  nt(p, sWLB.pWC);
36660 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
36670 65 6e 64 69 66 0a 20 20 0a 20 20 20 20 77 68 65  endif.  .    whe
36680 72 65 50 61 74 68 53 6f 6c 76 65 72 28 70 57 49  rePathSolver(pWI
36690 6e 66 6f 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  nfo, 0);.    if(
366a0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
366b0 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65  d ) goto whereBe
366c0 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 69 66  ginError;.    if
366d0 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ( pWInfo->pOrder
366e0 42 79 20 29 7b 0a 20 20 20 20 20 20 20 77 68 65  By ){.       whe
366f0 72 65 50 61 74 68 53 6f 6c 76 65 72 28 70 57 49  rePathSolver(pWI
36700 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f  nfo, pWInfo->nRo
36710 77 4f 75 74 2b 31 29 3b 0a 20 20 20 20 20 20 20  wOut+1);.       
36720 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
36730 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72  iled ) goto wher
36740 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20  eBeginError;.   
36750 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 49   }.  }.  if( pWI
36760 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  nfo->pOrderBy==0
36770 20 26 26 20 28 64 62 2d 3e 66 6c 61 67 73 20 26   && (db->flags &
36780 20 53 51 4c 49 54 45 5f 52 65 76 65 72 73 65 4f   SQLITE_ReverseO
36790 72 64 65 72 29 21 3d 30 20 29 7b 0a 20 20 20 20  rder)!=0 ){.    
367a0 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b   pWInfo->revMask
367b0 20 3d 20 28 42 69 74 6d 61 73 6b 29 28 2d 31 29   = (Bitmask)(-1)
367c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72  ;.  }.  if( pPar
367d0 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 4e 45 56 45  se->nErr || NEVE
367e0 52 28 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  R(db->mallocFail
367f0 65 64 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ed) ){.    goto 
36800 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
36810 0a 20 20 7d 0a 23 69 66 64 65 66 20 57 48 45 52  .  }.#ifdef WHER
36820 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f  ETRACE_ENABLED /
36830 2a 20 21 3d 30 20 2a 2f 0a 20 20 69 66 28 20 73  * !=0 */.  if( s
36840 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
36850 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a   ){.    int ii;.
36860 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
36870 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 53 6f 6c  Printf("---- Sol
36880 75 74 69 6f 6e 20 6e 52 6f 77 3d 25 64 22 2c 20  ution nRow=%d", 
36890 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29  pWInfo->nRowOut)
368a0 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
368b0 2d 3e 62 4f 42 53 61 74 20 29 7b 0a 20 20 20 20  ->bOBSat ){.    
368c0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
368d0 69 6e 74 66 28 22 20 4f 52 44 45 52 42 59 3d 30  intf(" ORDERBY=0
368e0 78 25 6c 6c 78 22 2c 20 70 57 49 6e 66 6f 2d 3e  x%llx", pWInfo->
368f0 72 65 76 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a  revMask);.    }.
36900 20 20 20 20 73 77 69 74 63 68 28 20 70 57 49 6e      switch( pWIn
36910 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 29 7b  fo->eDistinct ){
36920 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52  .      case WHER
36930 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55  E_DISTINCT_UNIQU
36940 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  E: {.        sql
36950 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
36960 22 20 20 44 49 53 54 49 4e 43 54 3d 75 6e 69 71  "  DISTINCT=uniq
36970 75 65 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72  ue");.        br
36980 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
36990 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49     case WHERE_DI
369a0 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20  STINCT_ORDERED: 
369b0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
369c0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
369d0 44 49 53 54 49 4e 43 54 3d 6f 72 64 65 72 65 64  DISTINCT=ordered
369e0 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ");.        brea
369f0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
36a00 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54   case WHERE_DIST
36a10 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 3a 20  INCT_UNORDERED: 
36a20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
36a30 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
36a40 44 49 53 54 49 4e 43 54 3d 75 6e 6f 72 64 65 72  DISTINCT=unorder
36a50 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72  ed");.        br
36a60 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
36a70 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65   }.    sqlite3De
36a80 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b  bugPrintf("\n");
36a90 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
36aa0 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  i<pWInfo->nLevel
36ab0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 77  ; ii++){.      w
36ac0 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 57  hereLoopPrint(pW
36ad0 49 6e 66 6f 2d 3e 61 5b 69 69 5d 2e 70 57 4c 6f  Info->a[ii].pWLo
36ae0 6f 70 2c 20 73 57 4c 42 2e 70 57 43 29 3b 0a 20  op, sWLB.pWC);. 
36af0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
36b00 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20    /* Attempt to 
36b10 6f 6d 69 74 20 74 61 62 6c 65 73 20 66 72 6f 6d  omit tables from
36b20 20 74 68 65 20 6a 6f 69 6e 20 74 68 61 74 20 64   the join that d
36b30 6f 20 6e 6f 74 20 65 66 66 65 63 74 20 74 68 65  o not effect the
36b40 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 69 66 28   result */.  if(
36b50 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e   pWInfo->nLevel>
36b60 3d 32 0a 20 20 20 26 26 20 70 52 65 73 75 6c 74  =2.   && pResult
36b70 53 65 74 21 3d 30 0a 20 20 20 26 26 20 4f 70 74  Set!=0.   && Opt
36b80 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
36b90 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 6d 69 74  (db, SQLITE_Omit
36ba0 4e 6f 6f 70 4a 6f 69 6e 29 0a 20 20 29 7b 0a 20  NoopJoin).  ){. 
36bb0 20 20 20 42 69 74 6d 61 73 6b 20 74 61 62 55 73     Bitmask tabUs
36bc0 65 64 20 3d 20 65 78 70 72 4c 69 73 74 54 61 62  ed = exprListTab
36bd0 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
36be0 2c 20 70 52 65 73 75 6c 74 53 65 74 29 3b 0a 20  , pResultSet);. 
36bf0 20 20 20 69 66 28 20 73 57 4c 42 2e 70 4f 72 64     if( sWLB.pOrd
36c00 65 72 42 79 20 29 20 74 61 62 55 73 65 64 20 7c  erBy ) tabUsed |
36c10 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  = exprListTableU
36c20 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 73  sage(pMaskSet, s
36c30 57 4c 42 2e 70 4f 72 64 65 72 42 79 29 3b 0a 20  WLB.pOrderBy);. 
36c40 20 20 20 77 68 69 6c 65 28 20 70 57 49 6e 66 6f     while( pWInfo
36c50 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 20 29 7b 0a 20  ->nLevel>=2 ){. 
36c60 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
36c70 70 54 65 72 6d 2c 20 2a 70 45 6e 64 3b 0a 20 20  pTerm, *pEnd;.  
36c80 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 57 49 6e      pLoop = pWIn
36c90 66 6f 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e 6e 4c  fo->a[pWInfo->nL
36ca0 65 76 65 6c 2d 31 5d 2e 70 57 4c 6f 6f 70 3b 0a  evel-1].pWLoop;.
36cb0 20 20 20 20 20 20 69 66 28 20 28 70 57 49 6e 66        if( (pWInf
36cc0 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  o->pTabList->a[p
36cd0 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 6a 6f 69 6e  Loop->iTab].join
36ce0 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 3d  type & JT_LEFT)=
36cf0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
36d00 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67    if( (wctrlFlag
36d10 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44  s & WHERE_WANT_D
36d20 49 53 54 49 4e 43 54 29 3d 3d 30 0a 20 20 20 20  ISTINCT)==0.    
36d30 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73     && (pLoop->ws
36d40 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
36d50 45 52 4f 57 29 3d 3d 30 0a 20 20 20 20 20 20 29  EROW)==0.      )
36d60 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
36d70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
36d80 66 28 20 28 74 61 62 55 73 65 64 20 26 20 70 4c  f( (tabUsed & pL
36d90 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d  oop->maskSelf)!=
36da0 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
36db0 20 70 45 6e 64 20 3d 20 73 57 4c 42 2e 70 57 43   pEnd = sWLB.pWC
36dc0 2d 3e 61 20 2b 20 73 57 4c 42 2e 70 57 43 2d 3e  ->a + sWLB.pWC->
36dd0 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 66 6f 72  nTerm;.      for
36de0 28 70 54 65 72 6d 3d 73 57 4c 42 2e 70 57 43 2d  (pTerm=sWLB.pWC-
36df0 3e 61 3b 20 70 54 65 72 6d 3c 70 45 6e 64 3b 20  >a; pTerm<pEnd; 
36e00 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
36e10 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
36e20 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d  ereqAll & pLoop-
36e30 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 0a 20 20  >maskSelf)!=0.  
36e40 20 20 20 20 20 20 20 26 26 20 21 45 78 70 72 48         && !ExprH
36e50 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d  asProperty(pTerm
36e60 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  ->pExpr, EP_From
36e70 4a 6f 69 6e 29 0a 20 20 20 20 20 20 20 20 29 7b  Join).        ){
36e80 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
36e90 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
36ea0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 54    }.      if( pT
36eb0 65 72 6d 3c 70 45 6e 64 20 29 20 62 72 65 61 6b  erm<pEnd ) break
36ec0 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41  ;.      WHERETRA
36ed0 43 45 28 30 78 66 66 66 66 2c 20 28 22 2d 3e 20  CE(0xffff, ("-> 
36ee0 64 72 6f 70 20 6c 6f 6f 70 20 25 63 20 6e 6f 74  drop loop %c not
36ef0 20 75 73 65 64 5c 6e 22 2c 20 70 4c 6f 6f 70 2d   used\n", pLoop-
36f00 3e 63 49 64 29 29 3b 0a 20 20 20 20 20 20 70 57  >cId));.      pW
36f10 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 2d 3b 0a  Info->nLevel--;.
36f20 20 20 20 20 20 20 6e 54 61 62 4c 69 73 74 2d 2d        nTabList--
36f30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 57 48  ;.    }.  }.  WH
36f40 45 52 45 54 52 41 43 45 28 30 78 66 66 66 66 2c  ERETRACE(0xffff,
36f50 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20  ("*** Optimizer 
36f60 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e 22 29  Finished ***\n")
36f70 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61  );.  pWInfo->pPa
36f80 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20  rse->nQueryLoop 
36f90 2b 3d 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f  += pWInfo->nRowO
36fa0 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  ut;..  /* If the
36fb0 20 63 61 6c 6c 65 72 20 69 73 20 61 6e 20 55 50   caller is an UP
36fc0 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73  DATE or DELETE s
36fd0 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69 73  tatement that is
36fe0 20 72 65 71 75 65 73 74 69 6e 67 0a 20 20 2a 2a   requesting.  **
36ff0 20 74 6f 20 75 73 65 20 61 20 6f 6e 65 2d 70 61   to use a one-pa
37000 73 73 20 61 6c 67 6f 72 69 74 68 6d 2c 20 64 65  ss algorithm, de
37010 74 65 72 6d 69 6e 65 20 69 66 20 74 68 69 73 20  termine if this 
37020 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a  is appropriate..
37030 20 20 2a 2a 20 54 68 65 20 6f 6e 65 2d 70 61 73    ** The one-pas
37040 73 20 61 6c 67 6f 72 69 74 68 6d 20 6f 6e 6c 79  s algorithm only
37050 20 77 6f 72 6b 73 20 69 66 20 74 68 65 20 57 48   works if the WH
37060 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74  ERE clause const
37070 72 61 69 6e 73 0a 20 20 2a 2a 20 74 68 65 20 73  rains.  ** the s
37080 74 61 74 65 6d 65 6e 74 20 74 6f 20 75 70 64 61  tatement to upda
37090 74 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 2e  te a single row.
370a0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
370b0 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
370c0 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49  ERE_ONEPASS_DESI
370d0 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57 49 6e 66  RED)==0 || pWInf
370e0 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b 0a  o->nLevel==1 );.
370f0 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67    if( (wctrlFlag
37100 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  s & WHERE_ONEPAS
37110 53 5f 44 45 53 49 52 45 44 29 21 3d 30 20 0a 20  S_DESIRED)!=0 . 
37120 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 61 5b    && (pWInfo->a[
37130 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61  0].pWLoop->wsFla
37140 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f  gs & WHERE_ONERO
37150 57 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 57 49  W)!=0 ){.    pWI
37160 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 3d  nfo->okOnePass =
37170 20 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e   1;.    pWInfo->
37180 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46  a[0].pWLoop->wsF
37190 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45 5f 49  lags &= ~WHERE_I
371a0 44 58 5f 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a 20 20  DX_ONLY;.  }..  
371b0 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20 74 61 62 6c  /* Open all tabl
371c0 65 73 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69  es in the pTabLi
371d0 73 74 20 61 6e 64 20 61 6e 79 20 69 6e 64 69 63  st and any indic
371e0 65 73 20 73 65 6c 65 63 74 65 64 20 66 6f 72 0a  es selected for.
371f0 20 20 2a 2a 20 73 65 61 72 63 68 69 6e 67 20 74    ** searching t
37200 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a  hose tables..  *
37210 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e  /.  notReady = ~
37220 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f  (Bitmask)0;.  fo
37230 72 28 69 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70  r(ii=0, pLevel=p
37240 57 49 6e 66 6f 2d 3e 61 3b 20 69 69 3c 6e 54 61  WInfo->a; ii<nTa
37250 62 4c 69 73 74 3b 20 69 69 2b 2b 2c 20 70 4c 65  bList; ii++, pLe
37260 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c  vel++){.    Tabl
37270 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a 20  e *pTab;     /* 
37280 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  Table to open */
37290 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20 20 20  .    int iDb;   
372a0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
372b0 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  f database conta
372c0 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e 64 65  ining table/inde
372d0 78 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20  x */.    struct 
372e0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  SrcList_item *pT
372f0 61 62 49 74 65 6d 3b 0a 0a 20 20 20 20 70 54 61  abItem;..    pTa
37300 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  bItem = &pTabLis
37310 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
37320 6f 6d 5d 3b 0a 20 20 20 20 70 54 61 62 20 3d 20  om];.    pTab = 
37330 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a  pTabItem->pTab;.
37340 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
37350 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
37360 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
37370 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70  );.    pLoop = p
37380 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20  Level->pWLoop;. 
37390 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61     if( (pTab->ta
373a0 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65  bFlags & TF_Ephe
373b0 6d 65 72 61 6c 29 21 3d 30 20 7c 7c 20 70 54 61  meral)!=0 || pTa
373c0 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
373d0 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e      /* Do nothin
373e0 67 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23  g */.    }else.#
373f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
37400 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
37410 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e      if( (pLoop->
37420 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
37430 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30  VIRTUALTABLE)!=0
37440 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
37450 63 68 61 72 20 2a 70 56 54 61 62 20 3d 20 28 63  char *pVTab = (c
37460 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69  onst char *)sqli
37470 74 65 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c  te3GetVTable(db,
37480 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 69 6e   pTab);.      in
37490 74 20 69 43 75 72 20 3d 20 70 54 61 62 49 74 65  t iCur = pTabIte
374a0 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  m->iCursor;.    
374b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
374c0 4f 70 34 28 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c  Op4(v, OP_VOpen,
374d0 20 69 43 75 72 2c 20 30 2c 20 30 2c 20 70 56 54   iCur, 0, 0, pVT
374e0 61 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20 20  ab, P4_VTAB);.  
374f0 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73 56 69    }else if( IsVi
37500 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
37510 20 20 20 20 20 2f 2a 20 6e 6f 6f 70 20 2a 2f 0a       /* noop */.
37520 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
37530 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d  .    if( (pLoop-
37540 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
37550 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20  _IDX_ONLY)==0.  
37560 20 20 20 20 20 20 20 26 26 20 28 77 63 74 72 6c         && (wctrl
37570 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4d  Flags & WHERE_OM
37580 49 54 5f 4f 50 45 4e 5f 43 4c 4f 53 45 29 3d 3d  IT_OPEN_CLOSE)==
37590 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f  0 ){.      int o
375a0 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e  p = pWInfo->okOn
375b0 65 50 61 73 73 20 3f 20 4f 50 5f 4f 70 65 6e 57  ePass ? OP_OpenW
375c0 72 69 74 65 20 3a 20 4f 50 5f 4f 70 65 6e 52 65  rite : OP_OpenRe
375d0 61 64 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ad;.      sqlite
375e0 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
375f0 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75  e, pTabItem->iCu
37600 72 73 6f 72 2c 20 69 44 62 2c 20 70 54 61 62 2c  rsor, iDb, pTab,
37610 20 6f 70 29 3b 0a 20 20 20 20 20 20 74 65 73 74   op);.      test
37620 63 61 73 65 28 20 21 70 57 49 6e 66 6f 2d 3e 6f  case( !pWInfo->o
37630 6b 4f 6e 65 50 61 73 73 20 26 26 20 70 54 61 62  kOnePass && pTab
37640 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b  ->nCol==BMS-1 );
37650 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
37660 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50   !pWInfo->okOneP
37670 61 73 73 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f  ass && pTab->nCo
37680 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20  l==BMS );.      
37690 69 66 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f  if( !pWInfo->okO
376a0 6e 65 50 61 73 73 20 26 26 20 70 54 61 62 2d 3e  nePass && pTab->
376b0 6e 43 6f 6c 3c 42 4d 53 20 29 7b 0a 20 20 20 20  nCol<BMS ){.    
376c0 20 20 20 20 42 69 74 6d 61 73 6b 20 62 20 3d 20      Bitmask b = 
376d0 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65  pTabItem->colUse
376e0 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  d;.        int n
376f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f   = 0;.        fo
37700 72 28 3b 20 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e  r(; b; b=b>>1, n
37710 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 73 71  ++){}.        sq
37720 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
37730 34 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65  4(v, sqlite3Vdbe
37740 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31  CurrentAddr(v)-1
37750 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
37760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
37770 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52  QLITE_INT_TO_PTR
37780 28 6e 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a  (n), P4_INT32);.
37790 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
377a0 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  n<=pTab->nCol );
377b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
377c0 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
377d0 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73  3TableLock(pPars
377e0 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e  e, iDb, pTab->tn
377f0 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61  um, 0, pTab->zNa
37800 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  me);.    }.    i
37810 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
37820 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
37830 44 20 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78  D ){.      Index
37840 20 2a 70 49 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75   *pIx = pLoop->u
37850 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20  .btree.pIndex;. 
37860 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
37870 65 79 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65  ey = sqlite3Inde
37880 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c  xKeyinfo(pParse,
37890 20 70 49 78 29 3b 0a 20 20 20 20 20 20 2f 2a 20   pIx);.      /* 
378a0 46 49 58 4d 45 3a 20 20 41 73 20 61 6e 20 6f 70  FIXME:  As an op
378b0 74 69 6d 69 7a 61 74 69 6f 6e 20 75 73 65 20 70  timization use p
378c0 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
378d0 20 69 66 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e   if WHERE_IDX_ON
378e0 4c 59 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  LY */.      int 
378f0 69 49 6e 64 65 78 43 75 72 20 3d 20 70 4c 65 76  iIndexCur = pLev
37900 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 69 49  el->iIdxCur = iI
37910 64 78 43 75 72 20 3f 20 69 49 64 78 43 75 72 20  dxCur ? iIdxCur 
37920 3a 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  : pParse->nTab++
37930 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
37940 70 49 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54  pIx->pSchema==pT
37950 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20  ab->pSchema );. 
37960 20 20 20 20 20 61 73 73 65 72 74 28 20 69 49 6e       assert( iIn
37970 64 65 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20 20  dexCur>=0 );.   
37980 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
37990 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 52  dOp4(v, OP_OpenR
379a0 65 61 64 2c 20 69 49 6e 64 65 78 43 75 72 2c 20  ead, iIndexCur, 
379b0 70 49 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 2c 0a  pIx->tnum, iDb,.
379c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
379d0 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
379e0 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f  Key, P4_KEYINFO_
379f0 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20  HANDOFF);.      
37a00 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
37a10 22 25 73 22 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65  "%s", pIx->zName
37a20 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ));.    }.    sq
37a30 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
37a40 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
37a50 62 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64 79  b);.    notReady
37a60 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28 26 70 57   &= ~getMask(&pW
37a70 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20  Info->sMaskSet, 
37a80 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
37a90 72 29 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f  r);.  }.  pWInfo
37aa0 2d 3e 69 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  ->iTop = sqlite3
37ab0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
37ac0 76 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  v);.  if( db->ma
37ad0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
37ae0 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
37af0 72 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  r;..  /* Generat
37b00 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 64 6f  e the code to do
37b10 20 74 68 65 20 73 65 61 72 63 68 2e 20 20 45 61   the search.  Ea
37b20 63 68 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  ch iteration of 
37b30 74 68 65 20 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f  the for.  ** loo
37b40 70 20 62 65 6c 6f 77 20 67 65 6e 65 72 61 74 65  p below generate
37b50 73 20 63 6f 64 65 20 66 6f 72 20 61 20 73 69 6e  s code for a sin
37b60 67 6c 65 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20  gle nested loop 
37b70 6f 66 20 74 68 65 20 56 4d 0a 20 20 2a 2a 20 70  of the VM.  ** p
37b80 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20 20 6e  rogram..  */.  n
37b90 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d  otReady = ~(Bitm
37ba0 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69 69 3d  ask)0;.  for(ii=
37bb0 30 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b 20  0; ii<nTabList; 
37bc0 69 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 65 76 65  ii++){.    pLeve
37bd0 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69  l = &pWInfo->a[i
37be0 69 5d 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  i];.#ifndef SQLI
37bf0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49  TE_OMIT_AUTOMATI
37c00 43 5f 49 4e 44 45 58 0a 20 20 20 20 69 66 28 20  C_INDEX.    if( 
37c10 28 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d  (pLevel->pWLoop-
37c20 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
37c30 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20  _AUTO_INDEX)!=0 
37c40 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 72 75  ){.      constru
37c50 63 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78  ctAutomaticIndex
37c60 28 70 50 61 72 73 65 2c 20 26 70 57 49 6e 66 6f  (pParse, &pWInfo
37c70 2d 3e 73 57 43 2c 0a 20 20 20 20 20 20 20 20 20  ->sWC,.         
37c80 20 20 20 20 20 20 20 26 70 54 61 62 4c 69 73 74         &pTabList
37c90 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
37ca0 6d 5d 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c  m], notReady, pL
37cb0 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  evel);.      if(
37cc0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
37cd0 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65  d ) goto whereBe
37ce0 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  ginError;.    }.
37cf0 23 65 6e 64 69 66 0a 20 20 20 20 65 78 70 6c 61  #endif.    expla
37d00 69 6e 4f 6e 65 53 63 61 6e 28 70 50 61 72 73 65  inOneScan(pParse
37d10 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 4c 65 76  , pTabList, pLev
37d20 65 6c 2c 20 69 69 2c 20 70 4c 65 76 65 6c 2d 3e  el, ii, pLevel->
37d30 69 46 72 6f 6d 2c 20 77 63 74 72 6c 46 6c 61 67  iFrom, wctrlFlag
37d40 73 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  s);.    pLevel->
37d50 61 64 64 72 42 6f 64 79 20 3d 20 73 71 6c 69 74  addrBody = sqlit
37d60 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
37d70 72 28 76 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61  r(v);.    notRea
37d80 64 79 20 3d 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70  dy = codeOneLoop
37d90 53 74 61 72 74 28 70 57 49 6e 66 6f 2c 20 69 69  Start(pWInfo, ii
37da0 2c 20 6e 6f 74 52 65 61 64 79 29 3b 0a 20 20 20  , notReady);.   
37db0 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e   pWInfo->iContin
37dc0 75 65 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64  ue = pLevel->add
37dd0 72 43 6f 6e 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rCont;.  }..  /*
37de0 20 44 6f 6e 65 2e 20 2a 2f 0a 20 20 72 65 74 75   Done. */.  retu
37df0 72 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a  rn pWInfo;..  /*
37e00 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 6d 61   Jump here if ma
37e10 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68  lloc fails */.wh
37e20 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3a 0a 20  ereBeginError:. 
37e30 20 69 66 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20   if( pWInfo ){. 
37e40 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72     pParse->nQuer
37e50 79 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e  yLoop = pWInfo->
37e60 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b  savedNQueryLoop;
37e70 0a 20 20 20 20 77 68 65 72 65 49 6e 66 6f 46 72  .    whereInfoFr
37e80 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a  ee(db, pWInfo);.
37e90 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
37ea0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
37eb0 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  e the end of the
37ec0 20 57 48 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65   WHERE loop.  Se
37ed0 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a  e comments on .*
37ee0 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  * sqlite3WhereBe
37ef0 67 69 6e 28 29 20 66 6f 72 20 61 64 64 69 74 69  gin() for additi
37f00 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
37f10 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
37f20 33 57 68 65 72 65 45 6e 64 28 57 68 65 72 65 49  3WhereEnd(WhereI
37f30 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20  nfo *pWInfo){.  
37f40 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
37f50 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a  pWInfo->pParse;.
37f60 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
37f70 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
37f80 20 69 3b 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   i;.  WhereLevel
37f90 20 2a 70 4c 65 76 65 6c 3b 0a 20 20 57 68 65 72   *pLevel;.  Wher
37fa0 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20  eLoop *pLoop;.  
37fb0 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
37fc0 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  t = pWInfo->pTab
37fd0 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 20  List;.  sqlite3 
37fe0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
37ff0 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
38000 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f   loop terminatio
38010 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 73  n code..  */.  s
38020 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
38030 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
38040 66 6f 72 28 69 3d 70 57 49 6e 66 6f 2d 3e 6e 4c  for(i=pWInfo->nL
38050 65 76 65 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  evel-1; i>=0; i-
38060 2d 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d  -){.    pLevel =
38070 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a   &pWInfo->a[i];.
38080 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76      pLoop = pLev
38090 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20  el->pWLoop;.    
380a0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
380b0 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65  veLabel(v, pLeve
380c0 6c 2d 3e 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20  l->addrCont);.  
380d0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70    if( pLevel->op
380e0 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20  !=OP_Noop ){.   
380f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
38100 64 4f 70 32 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  dOp2(v, pLevel->
38110 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20  op, pLevel->p1, 
38120 70 4c 65 76 65 6c 2d 3e 70 32 29 3b 0a 20 20 20  pLevel->p2);.   
38130 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
38140 61 6e 67 65 50 35 28 76 2c 20 70 4c 65 76 65 6c  angeP5(v, pLevel
38150 2d 3e 70 35 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ->p5);.    }.   
38160 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
38170 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 5f 41  ags & WHERE_IN_A
38180 42 4c 45 20 26 26 20 70 4c 65 76 65 6c 2d 3e